SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE HOR_INTERPOL_CONF_PROJ(KLUOUT,PFIELDIN,PFIELDOUT) 00003 ! ################################################################################# 00004 !! 00005 !! PURPOSE 00006 !! ------- 00007 !! 00008 !! METHOD 00009 !! ------ 00010 !! 00011 !! EXTERNAL 00012 !! -------- 00013 !! 00014 !! IMPLICIT ARGUMENTS 00015 !! ------------------ 00016 !! 00017 !! REFERENCE 00018 !! --------- 00019 !! 00020 !! AUTHOR 00021 !! ------ 00022 !! 00023 !! MODIFICATION 00024 !! ------------ 00025 !! 00026 !! 02/04/12 M. Tomasini Add an index in the second dimension of the ISBA 00027 !! array variables for BILIN interpolation routine to 00028 !! not bug in case 2D (this is not the more beautiful 00029 !! method; the BILIN routine should better be adapted) 00030 !! Search ! Ajout MT 00031 !------------------------------------------------------------------------------- 00032 ! 00033 ! 00034 USE MODD_PREP, ONLY : XLAT_OUT, XLON_OUT, LINTERP 00035 USE MODD_GRID_CONF_PROJ, ONLY : XX, XY, NX, NY, XLAT0, XLON0, XLATORI, & 00036 XLONORI, XRPK, XBETA 00037 USE MODD_SURF_PAR, ONLY : XUNDEF 00038 ! 00039 USE MODE_GRIDTYPE_CONF_PROJ 00040 USE MODI_BILIN 00041 ! 00042 ! 00043 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00044 USE PARKIND1 ,ONLY : JPRB 00045 ! 00046 IMPLICIT NONE 00047 ! 00048 !* 0.1 declarations of arguments 00049 ! 00050 INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing 00051 REAL, DIMENSION(:,:), INTENT(IN) :: PFIELDIN ! field to interpolate horizontally 00052 REAL, DIMENSION(:,:), INTENT(OUT) :: PFIELDOUT ! interpolated field 00053 ! 00054 !* 0.2 declarations of local variables 00055 ! 00056 REAL, DIMENSION(:), ALLOCATABLE :: ZX,ZY ! coordinate of the output field 00057 REAL, DIMENSION(:), ALLOCATABLE :: ZX_DUPLIQUE ! X coordinate of the output field ! Ajout MT 00058 REAL, DIMENSION(:), ALLOCATABLE :: ZY_DUPLIQUE ! Y coordinate of the output field ! Ajout MT 00059 REAL, DIMENSION(:), ALLOCATABLE :: ZXY_DUPLIQUE ! Y coordinate of the input field ! Ajout MT 00060 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFIELDIN ! input field 00061 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFIELDIN_DUPLIQUE ! input field ! Ajout MT 00062 REAL, DIMENSION(:,:), ALLOCATABLE :: ZFIELDOUT_DUPLIQUE ! interpolated output field ! Ajout MT 00063 ! 00064 INTEGER :: INO ! output number of points 00065 INTEGER :: JI,JJ,JL ! loop index 00066 ! 00067 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00068 ! 00069 LOGICAL, DIMENSION(:), ALLOCATABLE :: GINTERP_DUPLIQUE ! .true. where physical value is needed ! Ajout MT 00070 !------------------------------------------------------------------------------------- 00071 ! 00072 !* 1. Allocations 00073 ! 00074 IF (LHOOK) CALL DR_HOOK('HOR_INTERPOL_CONF_PROJ',0,ZHOOK_HANDLE) 00075 INO = SIZE(XLAT_OUT) 00076 ! 00077 ALLOCATE(ZX (INO)) 00078 ALLOCATE(ZY (INO)) 00079 ! 00080 IF (NY==1) THEN ! Ajout MT 00081 ALLOCATE(ZXY_DUPLIQUE(2),ZFIELDIN_DUPLIQUE(NX,2,SIZE(PFIELDIN,2))) 00082 ALLOCATE(ZX_DUPLIQUE(2*INO),ZY_DUPLIQUE(2*INO),ZFIELDOUT_DUPLIQUE(2*INO,SIZE(PFIELDIN,2))) 00083 ALLOCATE(GINTERP_DUPLIQUE(SIZE(ZFIELDOUT_DUPLIQUE,1))) 00084 END IF 00085 ! 00086 !* 2. Transformation of latitudes/longitudes into metric coordinates of output grid 00087 ! 00088 CALL XY_CONF_PROJ(XLAT0,XLON0,XRPK,XBETA,XLATORI,XLONORI, & 00089 ZX,ZY,XLAT_OUT,XLON_OUT ) 00090 ! 00091 !* 3. Put input field on its squared grid 00092 ! 00093 ALLOCATE(ZFIELDIN(NX,NY,SIZE(PFIELDIN,2))) 00094 ! 00095 DO JJ=1,NY 00096 DO JI=1,NX 00097 ZFIELDIN(JI,JJ,:) = PFIELDIN(JI+NX*(JJ-1),:) 00098 END DO 00099 END DO 00100 ! 00101 IF (NY==1) THEN ! Ajout MT 00102 ZFIELDIN_DUPLIQUE(:,1,:)=ZFIELDIN(:,1,:) 00103 ZFIELDIN_DUPLIQUE(:,2,:)=ZFIELDIN(:,1,:) 00104 ZXY_DUPLIQUE(1)=XY(1) 00105 ZXY_DUPLIQUE(2)=XY(1)+10000. 00106 ZX_DUPLIQUE(1:INO) =ZX(:) 00107 ZX_DUPLIQUE(INO+1:2*INO)=ZX(:) 00108 ZY_DUPLIQUE(1:INO) =ZY(:) 00109 ZY_DUPLIQUE(INO+1:2*INO)=ZY(:)+10000. 00110 GINTERP_DUPLIQUE(1:INO) =LINTERP(1:INO) 00111 GINTERP_DUPLIQUE(INO+1:2*INO)=LINTERP(1:INO) 00112 END IF 00113 ! 00114 !* 4. Interpolation with bilinear 00115 ! 00116 IF (NY==1) THEN ! Ajout MT 00117 DO JL=1,SIZE(PFIELDIN,2) 00118 CALL BILIN(KLUOUT,XX,ZXY_DUPLIQUE,ZFIELDIN_DUPLIQUE(:,:,JL), & 00119 ZX_DUPLIQUE,ZY_DUPLIQUE,ZFIELDOUT_DUPLIQUE(:,JL),GINTERP_DUPLIQUE) 00120 00121 PFIELDOUT(1:INO,JL)=ZFIELDOUT_DUPLIQUE(1:INO,JL) 00122 END DO 00123 ELSE 00124 DO JL=1,SIZE(PFIELDIN,2) 00125 CALL BILIN(KLUOUT,XX,XY,ZFIELDIN(:,:,JL),ZX,ZY,PFIELDOUT(:,JL),LINTERP) 00126 END DO 00127 END IF 00128 ! 00129 ! 00130 !* 5. Deallocations 00131 ! 00132 ! 00133 DEALLOCATE(ZX,ZY) 00134 DEALLOCATE(ZFIELDIN) 00135 IF (NY==1) DEALLOCATE(ZXY_DUPLIQUE,ZX_DUPLIQUE,ZY_DUPLIQUE, & 00136 ZFIELDIN_DUPLIQUE,ZFIELDOUT_DUPLIQUE,GINTERP_DUPLIQUE) ! Ajout MT 00137 ! 00138 IF (LHOOK) CALL DR_HOOK('HOR_INTERPOL_CONF_PROJ',1,ZHOOK_HANDLE) 00139 ! 00140 !------------------------------------------------------------------------------------- 00141 END SUBROUTINE HOR_INTERPOL_CONF_PROJ