Changeset 2299 for LMDZ5/trunk/libf/dynlonlat_phylonlat
- Timestamp:
- Jun 15, 2015, 8:48:31 PM (10 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/dynlonlat_phylonlat/grid_atob_m.f90
r2298 r2299 21 21 !------------------------------------------------------------------------------- 22 22 ! Arguments: 23 REAL, INTENT(IN) :: x_i(:), y_i(:) !- IN X&Y COORD.24 REAL, INTENT(IN) :: x_o(:), y_o(:) !- OUT X&Y COORD.25 DOUBLE PRECISION, INTENT(OUT) :: d_o1(:,:) !- OUT FLD(mo,no)26 REAL, OPTIONAL, INTENT(IN) :: d_i (:,:) !- INP FLD(mi,ni)27 LOGICAL, OPTIONAL, INTENT(IN) :: msk (:,:) !- MASK(mi,ni)28 DOUBLE PRECISION, OPTIONAL, INTENT(OUT) :: d_o2(:,:) !- OUT FOR d_i^223 REAL, INTENT(IN) :: x_i(:), y_i(:) !-- INPUT X&Y COOR. (mi)(ni) 24 REAL, INTENT(IN) :: x_o(:), y_o(:) !-- OUTPUT X&Y COOR. (mi)(ni) 25 REAL, INTENT(OUT) :: d_o1(:,:) !-- OUTPUT FIELD (mo,no) 26 REAL, OPTIONAL, INTENT(IN) :: d_i (:,:) !-- INPUT FIELD (mi,ni) 27 LOGICAL, OPTIONAL, INTENT(IN) :: msk (:,:) !-- MASK (mi,ni) 28 REAL, OPTIONAL, INTENT(OUT) :: d_o2(:,:) !-- OUTPUT FOR d_i^2 (mo,no) 29 29 !------------------------------------------------------------------------------- 30 30 ! Local variables: 31 31 CHARACTER(LEN=256) :: modname="fine2coarse" 32 DOUBLE PRECISION :: inc33 32 INTEGER :: mi, ni, ii, ji, mo, no, io, jo, nr(2), m1, n1, m2, n2, nn 34 33 INTEGER :: num_tot(SIZE(x_o),SIZE(y_o)) … … 36 35 LOGICAL :: mask (SIZE(x_i),SIZE(y_i)), lo 37 36 REAL :: dist (SIZE(x_o),SIZE(y_o)) 38 REAL :: a(SIZE(x_o)), b(SIZE(x_o)), c(SIZE(y_o)), d(SIZE(y_o)) 37 REAL :: a(SIZE(x_o)), b(SIZE(x_o)), c(SIZE(y_o)), d(SIZE(y_o)), inc 39 38 REAL, PARAMETER :: thresh=1.E-5 40 39 !------------------------------------------------------------------------------- … … 56 55 57 56 !--- ACCUMULATE INPUT POINTS ON OUTPUT GRID 58 d_o1(:,:)=0.; num_tot(:,:)=0; inc=1.0 d057 d_o1(:,:)=0.; num_tot(:,:)=0; inc=1.0 59 58 IF(lo) d_o2(:,:)=0. 60 59 DO ji = 1, ni 61 60 DO ii = 1, mi 62 IF(li) inc= DBLE(d_i(ii,ji))61 IF(li) inc=d_i(ii,ji) 63 62 DO jo = 1, no 64 63 IF((y_i(ji)-c(jo)<thresh.OR.y_i(ji)-d(jo)>thresh).AND. & … … 78 77 !--- CHECK INPUT POINTS HAVE BEEN FOUND IN EACH OUTPUT CELL 79 78 found(:,:)=num_tot(:,:)/=0 80 WHERE(found.AND.mask) d_o1(:,:)=d_o1(:,:)/ DBLE(num_tot(:,:))79 WHERE(found.AND.mask) d_o1(:,:)=d_o1(:,:)/REAL(num_tot(:,:)) 81 80 IF(PRESENT(d_o2)) THEN 82 WHERE(found.AND.mask) d_o2(:,:)=d_o2(:,:)/ DBLE(num_tot(:,:))81 WHERE(found.AND.mask) d_o2(:,:)=d_o2(:,:)/REAL(num_tot(:,:)) 83 82 RETURN 84 83 END IF … … 92 91 CALL dist_sphe(x_o(io),y_o(jo),x_i,y_i,dist(:,:)) 93 92 nr=MINLOC(dist(:,:))!; IF(prt_level>=1) PRINT*, "Solution: ", nr 94 inc=1.0; IF(li) inc= DBLE(d_i(nr(1),nr(2)))93 inc=1.0; IF(li) inc=d_i(nr(1),nr(2)) 95 94 IF(mask(nr(1),nr(2))) d_o1(io,jo)=inc 96 95 END DO … … 133 132 REAL, INTENT(OUT) :: sortie(SIZE(x),SIZE(y)) !--- OUTPUT FIELD 134 133 !------------------------------------------------------------------------------- 135 ! Local variable: 136 DOUBLE PRECISION :: out(SIZE(x),SIZE(y)) 137 !------------------------------------------------------------------------------- 138 ! CALL fine2coarse(xdata,ydata,x,y,out,DBLE(entree)) 139 CALL fine2coarse(xdata,ydata,x,y,out,entree) 140 sortie=REAL(out) 134 CALL fine2coarse(xdata,ydata,x,y,sortie,entree) 141 135 142 136 END SUBROUTINE grille_m … … 152 146 ! Author: Z.X. Li (april 1st 1994) 153 147 !------------------------------------------------------------------------------- 154 ! Purpose: From topography field, compute ocean/land mask (land: 1 ; ocean: 0)148 ! Purpose: Remap rugosity length ; constant value (0.001) on oceans. 155 149 ! Naive method (see grille_m) 156 150 !------------------------------------------------------------------------------- … … 164 158 REAL, INTENT(IN) :: mask (SIZE(x),SIZE(y)) !--- MASK 165 159 !------------------------------------------------------------------------------- 166 ! Local variable: 167 DOUBLE PRECISION :: out (SIZE(x),SIZE(y)) 168 !------------------------------------------------------------------------------- 169 CALL fine2coarse(xdata,ydata,x,y,out,LOG(entree)) 160 CALL fine2coarse(xdata,ydata,x,y,sortie,LOG(entree)) 170 161 WHERE(NINT(mask)==1) 171 out(:,:)=EXP(out(:,:))162 sortie(:,:)=EXP(sortie(:,:)) 172 163 ELSE WHERE 173 out(:,:)=0.001164 sortie(:,:)=0.001 174 165 END WHERE 175 sortie=REAL(out)176 166 177 167 END SUBROUTINE rugosite … … 198 188 REAL, INTENT(OUT) :: frac_ice(SIZE(x),SIZE(y)) !--- OUTPUT FIELD 199 189 !------------------------------------------------------------------------------- 200 ! Local variable: 201 DOUBLE PRECISION :: out (SIZE(x),SIZE(y)) 202 !------------------------------------------------------------------------------- 203 CALL fine2coarse(xdata,ydata,x,y,out,msk=NINT(glace01)==1) 204 frac_ice=REAL(out) 190 CALL fine2coarse(xdata,ydata,x,y,frac_ice,msk=NINT(glace01)==1) 205 191 206 192 END SUBROUTINE sea_ice … … 228 214 INTEGER :: k, nn 229 215 INTEGER, PARAMETER:: itmp=360, jtmp=180 230 DOUBLE PRECISION :: out(SIZE(xmod),SIZE(xmod)), amin, amax 231 DOUBLE PRECISION :: cham1tmp(itmp,jtmp), cham2tmp(itmp,jtmp) 232 REAL :: xtmp(itmp), ytmp(jtmp) 216 REAL :: out(SIZE(xmod),SIZE(xmod)), amin, amax 217 REAL :: cham1tmp(itmp,jtmp), cham2tmp(itmp,jtmp), xtmp(itmp), ytmp(jtmp) 233 218 !------------------------------------------------------------------------------- 234 219 … … 245 230 nn=COUNT(cham2tmp<0) 246 231 IF(nn/=0) PRINT*,'Problem for rugsoro ; std**2 < 0. for several points: ',nn 247 WHERE(cham2tmp<0.0) cham2tmp=0.0 d0232 WHERE(cham2tmp<0.0) cham2tmp=0.0 248 233 cham2tmp(:,:)=SQRT(cham2tmp(:,:)) 249 234 amin=MINVAL(cham2tmp); amax=MAXVAL(cham2tmp) … … 251 236 252 237 !--- COMPUTE RUGOSITY AT REQUIRED SCALE 253 WHERE(cham2tmp<0.001 d0) cham2tmp=0.001d0238 WHERE(cham2tmp<0.001) cham2tmp=0.001 254 239 CALL fine2coarse(xtmp,ytmp,xmod,ymod,out,REAL(LOG(cham2tmp))) 255 240 out=EXP(out) 256 241 amin=MINVAL(out); amax=MAXVAL(out) 257 242 PRINT*, 'Ecart-type du modele:', amin, amax 258 out=out/amax*20.0 d0243 out=out/amax*20.0 259 244 amin=MINVAL(out); amax=MAXVAL(out) 260 245 PRINT*, 'Longueur de rugosite du modele:', amin, amax
Note: See TracChangeset
for help on using the changeset viewer.