Changeset 2665 for LMDZ5/trunk/libf/phylmd/grid_noro_m.F90
- Timestamp:
- Oct 12, 2016, 2:53:20 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/phylmd/grid_noro_m.F90
r2576 r2665 6 6 USE assert_eq_m, ONLY: assert_eq 7 7 PRIVATE 8 PUBLIC :: grid_noro, grid_noro0 8 PUBLIC :: grid_noro, grid_noro0, read_noro 9 9 10 10 … … 71 71 ! CORRELATIONS OF USN OROGRAPHY GRADIENTS ! dim (imar+2*iext,jmdp+2) 72 72 REAL, ALLOCATABLE :: zxtzxusn(:,:), zytzyusn(:,:), zxtzyusn(:,:) 73 REAL, ALLOCATABLE :: mask_tmp(:,:), zmea0(:,:) ! dim (imar+1,jmar) 74 REAL, ALLOCATABLE :: num_tot(:,:), num_lan(:,:) ! dim (imax,jmax) 75 REAL, ALLOCATABLE :: a(:), b(:) ! dim (imax) 76 REAL, ALLOCATABLE :: c(:), d(:) ! dim (jmax) 73 REAL, ALLOCATABLE :: num_tot(:,:), num_lan(:,:) ! dim (imar+1,jmar) 74 REAL, ALLOCATABLE :: a(:), b(:) ! dim (imar+1) 75 REAL, ALLOCATABLE :: c(:), d(:) ! dim (jmar) 77 76 LOGICAL :: masque_lu 78 77 INTEGER :: i, ii, imdp, imar, iext 79 78 INTEGER :: j, jj, jmdp, jmar, nn 80 REAL :: xpi, zdeltax, zlenx, weighx, xincr, z meanor081 REAL :: rad, zdeltay, zleny, weighy, masque, z measud082 REAL :: zbordnor, zmeanor, zstdnor, zsignor, zweinor, zpicnor, zvalnor 83 REAL :: zbordsud, zmeasud, zstdsud, zsigsud, zweisud, zpicsud, zvalsud 84 REAL :: zbordest, zbordoue, xk, xl, xm, xp, xq, xw 79 REAL :: xpi, zdeltax, zlenx, weighx, xincr, zweinor, xk, xl, xm 80 REAL :: rad, zdeltay, zleny, weighy, masque, zweisud, xp, xq, xw 81 82 83 85 84 !------------------------------------------------------------------------------- 86 85 imdp=assert_eq(SIZE(xd),SIZE(zd,1),TRIM(modname)//" imdp") … … 170 169 DO jj = 1, jmar 171 170 DO j = 2,jmdp+1 172 zlenx =zleny*COS(yusn(j))171 zlenx=zleny*COS(yusn(j)) 173 172 zdeltax=zdeltay*COS(yusn(j)) 174 zbordnor=(xincr+c(jj)-yusn(j))*rad175 zbordsud=(xincr-d(jj)+yusn(j))*rad176 weighy=AMAX1(0.,AMIN1(zbordnor,zbordsud,zleny)) 173 weighy=(xincr+AMIN1(c(jj)-yusn(j),yusn(j)-d(jj)))*rad 174 weighy=AMAX1(0.,AMIN1(weighy,zleny)) 175 177 176 IF(weighy==0.) CYCLE 178 177 DO i = 2, imdp+2*iext-1 179 zbordest=(xusn(i)-a(ii)+xincr)*rad*COS(yusn(j))180 zbordoue=(b(ii)+xincr-xusn(i))*rad*COS(yusn(j))181 weighx=AMAX1(0.,AMIN1(zbordest,zbordoue,zlenx)) 178 weighx=(xincr+AMIN1(xusn(i)-a(ii),b(ii)-xusn(i)))*rad*COS(yusn(j)) 179 weighx=AMAX1(0.,AMIN1(weighx,zlenx)) 180 182 181 IF(weighx==0.) CYCLE 183 182 num_tot(ii,jj)=num_tot(ii,jj)+1.0 … … 198 197 !--- COMPUTE PARAMETERS NEEDED BY LOTT & MILLER (1997) AND LOTT (1999) SSO SCHEME 199 198 IF(.NOT.masque_lu) THEN 200 WHERE(weight(:, 1:jmar-1)/=0.0) mask=num_lan(:,:)/num_tot(:,:)199 WHERE(weight(:,:)/=0.0) mask=num_lan(:,:)/num_tot(:,:) 201 200 END IF 202 nn=COUNT(weight(:, 1:jmar-1)==0.0)201 nn=COUNT(weight(:,:)==0.0) 203 202 IF(nn/=0) WRITE(lunout,*)'Problem with weight ; vanishing occurrences: ',nn 204 203 WHERE(weight(:,:)/=0.0) … … 224 223 !--- FIRST FILTER, MOVING AVERAGE OVER 9 POINTS. 225 224 !------------------------------------------------------------------------------- 226 ALLOCATE(zmea0(imar+1,jmar))227 zmea0(:,:)=zmea(:,:) ! GK211005 (CG) UNSMOOTHED TOPO 225 zphi(:,:)=zmea(:,:) ! GK211005 (CG) UNSMOOTHED TOPO 226 228 227 CALL MVA9(zmea); CALL MVA9(zstd); CALL MVA9(zpic); CALL MVA9(zval) 229 228 CALL MVA9(zxtzx); CALL MVA9(zxtzy); CALL MVA9(zytzy) 230 229 231 230 !--- MASK BASED ON GROUND MAXIMUM, 10% THRESHOLD. (SURFACE PARAMS MEANINGLESS) 232 ALLOCATE(mask_tmp(imar+1,jmar)); mask_tmp(:,:)=0.0 233 WHERE(mask>=0.1) mask_tmp = 1. 234 WHERE(weight(:,:)/=0.0) 235 ! zphi (:,:)= mask_tmp(:,:)*zmea (:,:) ! GK211005 (CG) not necessarly smoothed 236 zphi (:,:)= mask_tmp(:,:)*zmea0(:,:) 237 zmea0(:,:)= mask_tmp(:,:)*zmea0(:,:) 238 zmea (:,:)= mask_tmp(:,:)*zmea (:,:) 239 zpic (:,:)= mask_tmp(:,:)*zpic (:,:) 240 zval (:,:)= mask_tmp(:,:)*zval (:,:) 241 zstd (:,:)= mask_tmp(:,:)*zstd (:,:) 231 WHERE(weight(:,:)==0.0.OR.mask<0.1) 232 zphi(:,:)=0.0; zmea(:,:)=0.0; zpic(:,:)=0.0; zval(:,:)=0.0; zstd(:,:)=0.0 242 233 END WHERE 243 234 DO ii = 1, imar 244 235 DO jj = 1, jmar 245 IF (weight(ii,jj)/=0.0) THEN 246 !--- Coefficients K, L et M: 247 xk=(zxtzx(ii,jj)+zytzy(ii,jj))/2. 248 xl=(zxtzx(ii,jj)-zytzy(ii,jj))/2. 249 xm=zxtzy(ii,jj) 250 xp=xk-SQRT(xl**2+xm**2) 251 xq=xk+SQRT(xl**2+xm**2) 252 xw=1.e-8 253 IF(xp<=xw) xp=0. 254 IF(xq<=xw) xq=xw 255 IF(ABS(xm)<=xw) xm=xw*SIGN(1.,xm) 256 !--- SLOPE 257 zsig(ii,jj)=SQRT(xq)*mask_tmp(ii,jj) 258 !---ISOTROPY 259 zgam(ii,jj)=xp/xq*mask_tmp(ii,jj) 260 !--- THETA ANGLE 261 zthe(ii,jj)=57.29577951*ATAN2(xm,xl)/2.*mask_tmp(ii,jj) 262 END IF 236 IF(weight(ii,jj)==0.0) CYCLE 237 !--- Coefficients K, L et M: 238 xk=(zxtzx(ii,jj)+zytzy(ii,jj))/2. 239 xl=(zxtzx(ii,jj)-zytzy(ii,jj))/2. 240 xm=zxtzy(ii,jj) 241 xp=xk-SQRT(xl**2+xm**2) 242 xq=xk+SQRT(xl**2+xm**2) 243 xw=1.e-8 244 IF(xp<=xw) xp=0. 245 IF(xq<=xw) xq=xw 246 IF(ABS(xm)<=xw) xm=xw*SIGN(1.,xm) 247 !--- SLOPE, ANISOTROPY AND THETA ANGLE 248 zsig(ii,jj)=SQRT(xq) 249 zgam(ii,jj)=xp/xq 250 zthe(ii,jj)=90.*ATAN2(xm,xl)/xpi 263 251 END DO 264 252 END DO 253 WHERE(weight(:,:)==0.0.OR.mask<0.1) 254 zsig(:,:)=0.0; zgam(:,:)=0.0; zthe(:,:)=0.0 255 END WHERE 256 265 257 WRITE(lunout,*)' MEAN ORO:' ,MAXVAL(zmea) 266 258 WRITE(lunout,*)' ST. DEV.:' ,MAXVAL(zstd) … … 271 263 WRITE(lunout,*)' val:' ,MAXVAL(zval) 272 264 273 !--- Values at poles 274 zmea0(imar+1,:)=zmea0(1,:) 275 zmea (imar+1,:)=zmea (1,:) 276 zphi (imar+1,:)=zphi (1,:) 277 zpic (imar+1,:)=zpic (1,:) 278 zval (imar+1,:)=zval (1,:) 279 zstd (imar+1,:)=zstd (1,:) 280 zsig (imar+1,:)=zsig (1,:) 281 zgam (imar+1,:)=zgam (1,:) 282 zthe (imar+1,:)=zthe (1,:) 283 284 zweinor =SUM(weight(1:imar, 1),DIM=1) 285 zweisud =SUM(weight(1:imar,jmar),DIM=1) 286 zmeanor0=SUM(weight(1:imar, 1)*zmea0(1:imar, 1),DIM=1) 287 zmeasud0=SUM(weight(1:imar,jmar)*zmea0(1:imar,jmar),DIM=1) 288 zmeanor =SUM(weight(1:imar, 1)*zmea (1:imar, 1),DIM=1) 289 zmeasud =SUM(weight(1:imar,jmar)*zmea (1:imar,jmar),DIM=1) 290 zstdnor =SUM(weight(1:imar, 1)*zstd (1:imar, 1),DIM=1) 291 zstdsud =SUM(weight(1:imar,jmar)*zstd (1:imar,jmar),DIM=1) 292 zsignor =SUM(weight(1:imar, 1)*zsig (1:imar, 1),DIM=1) 293 zsigsud =SUM(weight(1:imar,jmar)*zsig (1:imar,jmar),DIM=1) 294 zpicnor =SUM(weight(1:imar, 1)*zpic (1:imar, 1),DIM=1) 295 zpicsud =SUM(weight(1:imar,jmar)*zpic (1:imar,jmar),DIM=1) 296 zvalnor =SUM(weight(1:imar, 1)*zval (1:imar, 1),DIM=1) 297 zvalsud =SUM(weight(1:imar,jmar)*zval (1:imar,jmar),DIM=1) 298 299 zmea(:,1)=zmeanor /zweinor; zmea(:,jmar)=zmeasud /zweisud 300 ! zphi(:,1)=zmeanor0/zweinor; zphi(:,jmar)=zmeasud0/zweisud TO COMMIT 301 zphi(:,1)=zmeanor /zweinor; zphi(:,jmar)=zmeasud /zweisud 302 zpic(:,1)=zpicnor /zweinor; zpic(:,jmar)=zpicsud /zweisud 303 zval(:,1)=zvalnor /zweinor; zval(:,jmar)=zvalsud /zweisud 304 zstd(:,1)=zstdnor /zweinor; zstd(:,jmar)=zstdsud /zweisud 305 zsig(:,1)=zsignor /zweinor; zsig(:,jmar)=zsigsud /zweisud 306 zgam(:,1)=1.; zgam(:,jmar)=1. 307 zthe(:,1)=0.; zthe(:,jmar)=0. 265 !--- Values at redundant longitude 266 zmea(imar+1,:)=zmea(1,:) 267 zphi(imar+1,:)=zphi(1,:) 268 zpic(imar+1,:)=zpic(1,:) 269 zval(imar+1,:)=zval(1,:) 270 zstd(imar+1,:)=zstd(1,:) 271 zsig(imar+1,:)=zsig(1,:) 272 zgam(imar+1,:)=zgam(1,:) 273 zthe(imar+1,:)=zthe(1,:) 274 275 !--- Values at north pole 276 zweinor =SUM(weight(1:imar,1)) 277 zmea(:,1)=SUM(weight(1:imar,1)*zmea(1:imar,1))/zweinor 278 zphi(:,1)=SUM(weight(1:imar,1)*zphi(1:imar,1))/zweinor 279 zpic(:,1)=SUM(weight(1:imar,1)*zpic(1:imar,1))/zweinor 280 zval(:,1)=SUM(weight(1:imar,1)*zval(1:imar,1))/zweinor 281 zstd(:,1)=SUM(weight(1:imar,1)*zstd(1:imar,1))/zweinor 282 zsig(:,1)=SUM(weight(1:imar,1)*zsig(1:imar,1))/zweinor 283 zgam(:,1)=1.; zthe(:,1)=0. 284 285 !--- Values at south pole 286 zweisud =SUM(weight(1:imar,jmar),DIM=1) 287 zmea(:,jmar)=SUM(weight(1:imar,jmar)*zmea(1:imar,jmar))/zweisud 288 zphi(:,jmar)=SUM(weight(1:imar,jmar)*zphi(1:imar,jmar))/zweisud 289 zpic(:,jmar)=SUM(weight(1:imar,jmar)*zpic(1:imar,jmar))/zweisud 290 zval(:,jmar)=SUM(weight(1:imar,jmar)*zval(1:imar,jmar))/zweisud 291 zstd(:,jmar)=SUM(weight(1:imar,jmar)*zstd(1:imar,jmar))/zweisud 292 zsig(:,jmar)=SUM(weight(1:imar,jmar)*zsig(1:imar,jmar))/zweisud 293 zgam(:,jmar)=1.; zthe(:,jmar)=0. 308 294 309 295 END SUBROUTINE grid_noro … … 323 309 !------------------------------------------------------------------------------- 324 310 ! Arguments: 325 REAL, INTENT(IN) 326 REAL, INTENT(IN) :: zd(:,:) !--- INPUT FIELD (imdp,jmdp)327 REAL, INTENT(IN) 328 REAL, INTENT(OUT) 329 REAL, INTENT( INOUT):: mask(:,:) !--- MASK (imar+1,jmar)311 REAL, INTENT(IN) :: xd(:), yd(:) !--- INPUT COORDINATES (imdp) (jmdp) 312 REAL, INTENT(IN) :: zd(:,:) !--- INPUT FIELD (imdp, jmdp) 313 REAL, INTENT(IN) :: x(:), y(:) !--- OUTPUT COORDINATES (imar+1) (jmar) 314 REAL, INTENT(OUT) :: zphi(:,:) !--- GEOPOTENTIAL (imar+1,jmar) 315 REAL, INTENT(OUT) :: mask(:,:) !--- MASK (imar+1,jmar) 330 316 !------------------------------------------------------------------------------- 331 317 ! Local variables: 332 318 CHARACTER(LEN=256) :: modname="grid_noro0" 333 319 REAL, ALLOCATABLE :: xusn(:), yusn(:) ! dim (imdp+2*iext) (jmdp+2) 334 REAL, ALLOCATABLE :: zusn(:,:) ! dim (imdp+2*iext, jmdp+2)320 REAL, ALLOCATABLE :: zusn(:,:) ! dim (imdp+2*iext, jmdp+2) 335 321 REAL, ALLOCATABLE :: weight(:,:) ! dim (imar+1,jmar) 336 REAL, ALLOCATABLE :: mask_tmp(:,:), zmea(:,:)! dim (imar+1,jmar)337 REAL, ALLOCATABLE :: num_tot(:,:), num_lan(:,:) ! dim (imax,jmax)338 REAL, ALLOCATABLE :: a(:), b(:) ! dim (imax)339 REAL, ALLOCATABLE :: c(:), d(:) ! dim (jmax) 322 REAL, ALLOCATABLE :: num_tot(:,:), num_lan(:,:) ! dim (imar+1,jmar) 323 REAL, ALLOCATABLE :: a(:), b(:) ! dim (imar+1) 324 REAL, ALLOCATABLE :: c(:), d(:) ! dim (jmar) 325 340 326 LOGICAL :: masque_lu 341 327 INTEGER :: i, ii, imdp, imar, iext 342 328 INTEGER :: j, jj, jmdp, jmar, nn 343 REAL :: xpi, zlenx, weighx, xincr, zbordnor, zmeanor, zweinor, zbordest344 REAL :: rad, zleny, weighy, masque, zbordsud, zmeasud, zweisud, zbordoue 329 REAL :: xpi, zlenx, zleny, weighx, weighy, xincr, masque, rad 330 345 331 !------------------------------------------------------------------------------- 346 332 imdp=assert_eq(SIZE(xd),SIZE(zd,1),TRIM(modname)//" imdp") … … 392 378 393 379 !--- INITIALIZATIONS: 394 ALLOCATE(weight(imar+1,jmar)); weight(:,:)= 0.0 395 ALLOCATE(zmea (imar+1,jmar)); zmea (:,:)= 0.0 380 ALLOCATE(weight(imar+1,jmar)); weight(:,:)=0.0; zphi(:,:)=0.0 396 381 397 382 !--- SUMMATION OVER GRIDPOINT AREA … … 403 388 DO jj = 1, jmar 404 389 DO j = 2,jmdp+1 405 zlenx =zleny *COS(yusn(j)) 406 zbordnor=(xincr+c(jj)-yusn(j))*rad 407 zbordsud=(xincr-d(jj)+yusn(j))*rad 408 weighy=AMAX1(0.,AMIN1(zbordnor,zbordsud,zleny)) 409 IF(weighy/=0) THEN 410 DO i = 2, imdp+2*iext-1 411 zbordest=(xusn(i)-a(ii)+xincr)*rad*COS(yusn(j)) 412 zbordoue=(b(ii)+xincr-xusn(i))*rad*COS(yusn(j)) 413 weighx=AMAX1(0.,AMIN1(zbordest,zbordoue,zlenx)) 414 IF(weighx/=0)THEN 415 num_tot(ii,jj)=num_tot(ii,jj)+1.0 416 IF(zusn(i,j)>=1.)num_lan(ii,jj)=num_lan(ii,jj)+1.0 417 weight(ii,jj)=weight(ii,jj)+weighx*weighy 418 zmea (ii,jj)=zmea (ii,jj)+zusn(i,j)*weighx*weighy !--- MEAN 419 END IF 420 END DO 421 END IF 390 zlenx=zleny*COS(yusn(j)) 391 weighy=(xincr+AMIN1(c(jj)-yusn(j),yusn(j)-d(jj)))*rad 392 weighy=AMAX1(0.,AMIN1(weighy,zleny)) 393 IF(weighy/=0) CYCLE 394 DO i = 2, imdp+2*iext-1 395 weighx=(xincr+AMIN1(xusn(i)-a(ii),b(ii)-xusn(i)))*rad*COS(yusn(j)) 396 weighx=AMAX1(0.,AMIN1(weighx,zlenx)) 397 IF(weighx/=0) CYCLE 398 num_tot(ii,jj)=num_tot(ii,jj)+1.0 399 IF(zusn(i,j)>=1.)num_lan(ii,jj)=num_lan(ii,jj)+1.0 400 weight(ii,jj)=weight(ii,jj)+weighx*weighy 401 zphi (ii,jj)=zphi (ii,jj)+zusn(i,j)*weighx*weighy !--- MEAN 402 END DO 422 403 END DO 423 404 END DO … … 426 407 !--- COMPUTE PARAMETERS NEEDED BY LOTT & MILLER (1997) AND LOTT (1999) SSO SCHEME 427 408 IF(.NOT.masque_lu) THEN 428 WHERE(weight(:, 1:jmar-1)/=0.0) mask=num_lan(:,:)/num_tot(:,:)409 WHERE(weight(:,:)/=0.0) mask=num_lan(:,:)/num_tot(:,:) 429 410 END IF 430 nn=COUNT(weight(:, 1:jmar-1)==0.0)411 nn=COUNT(weight(:,:)==0.0) 431 412 IF(nn/=0) WRITE(lunout,*)'Problem with weight ; vanishing occurrences: ',nn 432 WHERE(weight/=0.0) z mea(:,:)=zmea(:,:)/weight(:,:)413 WHERE(weight/=0.0) zphi(:,:)=zphi(:,:)/weight(:,:) 433 414 434 415 !--- MASK BASED ON GROUND MAXIMUM, 10% THRESHOLD (<10%: SURF PARAMS MEANINGLESS) 435 ALLOCATE(mask_tmp(imar+1,jmar)); mask_tmp(:,:)=0.0 436 WHERE(mask>=0.1) mask_tmp = 1. 437 WHERE(weight(:,:)/=0.0) 438 zphi(:,:)=mask_tmp(:,:)*zmea(:,:) 439 zmea(:,:)=mask_tmp(:,:)*zmea(:,:) 440 END WHERE 416 WHERE(weight(:,:)==0.0.OR.mask<0.1) zphi(:,:)=0.0 417 WRITE(lunout,*)' MEAN ORO:' ,MAXVAL(zphi) 418 419 !--- Values at redundant longitude and at poles 420 zphi(imar+1,:)=zphi(1,:) 421 zphi(:, 1)=SUM(weight(1:imar, 1)*zphi(1:imar, 1))/SUM(weight(1:imar, 1)) 422 zphi(:,jmar)=SUM(weight(1:imar,jmar)*zphi(1:imar,jmar))/SUM(weight(1:imar,jmar)) 423 424 END SUBROUTINE grid_noro0 425 ! 426 !------------------------------------------------------------------------------- 427 428 429 !------------------------------------------------------------------------------- 430 ! 431 SUBROUTINE read_noro(x,y,fname,zphi,zmea,zstd,zsig,zgam,zthe,zpic,zval,mask) 432 ! 433 !------------------------------------------------------------------------------- 434 ! Purpose: Read parameters usually determined with grid_noro from a file. 435 !=============================================================================== 436 USE netcdf, ONLY: NF90_OPEN, NF90_INQ_DIMID, NF90_INQUIRE_DIMENSION, & 437 NF90_NOERR, NF90_CLOSE, NF90_INQ_VARID, NF90_GET_VAR, NF90_STRERROR, & 438 NF90_NOWRITE 439 IMPLICIT NONE 440 !------------------------------------------------------------------------------- 441 ! Arguments: 442 REAL, INTENT(IN) :: x(:), y(:) !--- OUTPUT COORDINATES (imar+1) (jmar) 443 CHARACTER(LEN=*), INTENT(IN) :: fname ! PARAMETERS FILE NAME 444 REAL, INTENT(OUT) :: zphi(:,:) !--- GEOPOTENTIAL (imar+1,jmar) 445 REAL, INTENT(OUT) :: zmea(:,:) !--- MEAN OROGRAPHY (imar+1,jmar) 446 REAL, INTENT(OUT) :: zstd(:,:) !--- STANDARD DEVIATION (imar+1,jmar) 447 REAL, INTENT(OUT) :: zsig(:,:) !--- SLOPE (imar+1,jmar) 448 REAL, INTENT(OUT) :: zgam(:,:) !--- ANISOTROPY (imar+1,jmar) 449 REAL, INTENT(OUT) :: zthe(:,:) !--- SMALL AXIS ORIENTATION (imar+1,jmar) 450 REAL, INTENT(OUT) :: zpic(:,:) !--- MAXIMUM ALTITUDE (imar+1,jmar) 451 REAL, INTENT(OUT) :: zval(:,:) !--- MINIMUM ALTITUDE (imar+1,jmar) 452 REAL, INTENT(OUT) :: mask(:,:) !--- MASK (imar+1,jmar) 453 !------------------------------------------------------------------------------- 454 ! Local variables: 455 CHARACTER(LEN=256) :: modname="read_noro" 456 INTEGER :: imar, jmar, fid, did, vid 457 LOGICAL :: masque_lu 458 REAL :: xpi, d2r 459 !------------------------------------------------------------------------------- 460 imar=assert_eq([SIZE(x),SIZE(zphi,1),SIZE(zmea,1),SIZE(zstd,1),SIZE(zsig,1), & 461 SIZE(zgam,1),SIZE(zthe,1),SIZE(zpic,1),SIZE(zval,1), & 462 SIZE(mask,1)],TRIM(modname)//" imar")-1 463 jmar=assert_eq([SIZE(y),SIZE(zphi,2),SIZE(zmea,2),SIZE(zstd,2),SIZE(zsig,2), & 464 SIZE(zgam,2),SIZE(zthe,2),SIZE(zpic,2),SIZE(zval,2), & 465 SIZE(mask,2)],TRIM(modname)//" jmar") 466 xpi=ACOS(-1.0); d2r=xpi/180. 467 WRITE(lunout,*)"*** Orography parameters at sub-cell scale from file ***" 468 469 !--- ARE WE USING A READ MASK ? 470 masque_lu=ANY(mask/=-99999.); IF(.NOT.masque_lu) mask=0.0 471 WRITE(lunout,*)'Masque lu: ',masque_lu 472 CALL ncerr(NF90_OPEN(fname,NF90_NOWRITE,fid)) 473 CALL check_dim('x','longitude',x(1:imar)) 474 CALL check_dim('y','latitude' ,y(1:jmar)) 475 IF(.NOT.masque_lu) CALL get_fld('mask',mask) 476 CALL get_fld('Zphi',zphi) 477 CALL get_fld('Zmea',zmea) 478 CALL get_fld('mu' ,zstd) 479 CALL get_fld('Zsig',zsig) 480 CALL get_fld('Zgam',zgam) 481 CALL get_fld('Zthe',zthe) 482 zpic=zmea+2*zstd 483 zval=MAX(0.,zmea-2.*zstd) 484 CALL ncerr(NF90_CLOSE(fid)) 441 485 WRITE(lunout,*)' MEAN ORO:' ,MAXVAL(zmea) 442 443 !--- Values at poles 444 zphi(imar+1,:)=zphi(1,:) 445 446 zweinor=SUM(weight(1:imar, 1),DIM=1) 447 zweisud=SUM(weight(1:imar,jmar),DIM=1) 448 zmeanor=SUM(weight(1:imar, 1)*zmea(1:imar, 1),DIM=1) 449 zmeasud=SUM(weight(1:imar,jmar)*zmea(1:imar,jmar),DIM=1) 450 zphi(:,1)=zmeanor/zweinor; zphi(:,jmar)=zmeasud/zweisud 451 452 END SUBROUTINE grid_noro0 486 WRITE(lunout,*)' ST. DEV.:' ,MAXVAL(zstd) 487 WRITE(lunout,*)' PENTE:' ,MAXVAL(zsig) 488 WRITE(lunout,*)' ANISOTROP:',MAXVAL(zgam) 489 WRITE(lunout,*)' ANGLE:' ,MINVAL(zthe),MAXVAL(zthe) 490 WRITE(lunout,*)' pic:' ,MAXVAL(zpic) 491 WRITE(lunout,*)' val:' ,MAXVAL(zval) 492 493 CONTAINS 494 495 496 SUBROUTINE get_fld(var,fld) 497 CHARACTER(LEN=*), INTENT(IN) :: var 498 REAL, INTENT(INOUT) :: fld(:,:) 499 CALL ncerr(NF90_INQ_VARID(fid,var,vid),var) 500 CALL ncerr(NF90_GET_VAR(fid,vid,fld(1:imar,:)),var) 501 fld(imar+1,:)=fld(1,:) 502 END SUBROUTINE get_fld 503 504 SUBROUTINE check_dim(dimd,nam,dimv) 505 CHARACTER(LEN=*), INTENT(IN) :: dimd 506 CHARACTER(LEN=*), INTENT(IN) :: nam 507 REAL, INTENT(IN) :: dimv(:) 508 REAL, ALLOCATABLE :: tmp(:) 509 INTEGER :: n 510 CALL ncerr(NF90_INQ_DIMID(fid,dimd,did)) 511 CALL ncerr(NF90_INQUIRE_DIMENSION(fid,did,len=n)); ALLOCATE(tmp(n)) 512 CALL ncerr(NF90_INQ_VARID(fid,dimd,did)) 513 CALL ncerr(NF90_GET_VAR(fid,did,tmp)) 514 IF(MAXVAL(tmp)>xpi) tmp=tmp*d2r 515 IF(n/=SIZE(dimv).OR.ANY(ABS(tmp-dimv)>1E-6)) THEN 516 WRITE(lunout,*)'Problem with file "'//TRIM(fname)//'".' 517 CALL abort_physic(modname,'Grid differs from LMDZ for '//TRIM(nam)//'.',1) 518 END IF 519 END SUBROUTINE check_dim 520 521 SUBROUTINE ncerr(ncres,var) 522 IMPLICIT NONE 523 INTEGER, INTENT(IN) :: ncres 524 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: var 525 CHARACTER(LEN=256) :: mess 526 IF(ncres/=NF90_NOERR) THEN 527 mess='Problem with file "'//TRIM(fname)//'"' 528 IF(PRESENT(var)) mess=TRIM(mess)//' and variable "'//TRIM(var)//'"' 529 WRITE(lunout,*)TRIM(mess)//'.' 530 CALL abort_physic(modname,NF90_STRERROR(ncres),1) 531 END IF 532 END SUBROUTINE ncerr 533 534 END SUBROUTINE read_noro 453 535 ! 454 536 !------------------------------------------------------------------------------- … … 494 576 END MODULE grid_noro_m 495 577 578
Note: See TracChangeset
for help on using the changeset viewer.