File indexing completed on 2018-03-02 18:36:52 UTC
view on githubraw file Latest commit add29e06 on 2018-01-31 20:35:05 UTC
6c9bcec054 Jean*0001 #include "CPP_OPTIONS.h"
463053c692 Jean*0002 #undef CHECK_ANALYLIC_THETA
6c9bcec054 Jean*0003
9366854e02 Chri*0004
0005
0006
f15994caab Jean*0007 SUBROUTINE INI_P_GROUND(selectMode,
0008 & Hfld, Pfld,
6c9bcec054 Jean*0009 I myThid )
9366854e02 Chri*0010
0011
f15994caab Jean*0012
0013
0014
0015
0016
9366854e02 Chri*0017
0018
0019
0020
6c9bcec054 Jean*0021 IMPLICIT NONE
0022
0023 #include "SIZE.h"
0024 #include "GRID.h"
0025 #include "EEPARAMS.h"
0026 #include "PARAMS.h"
463053c692 Jean*0027 #include "SURFACE.h"
6c9bcec054 Jean*0028
9366854e02 Chri*0029
6c9bcec054 Jean*0030
46ac67bdf3 Jean*0031
0032
0033
f15994caab Jean*0034
0035
463053c692 Jean*0036 INTEGER selectMode
6c9bcec054 Jean*0037 _RS Hfld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0038 _RS Pfld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0039 INTEGER myThid
0040
9366854e02 Chri*0041
6c9bcec054 Jean*0042
f15994caab Jean*0043
463053c692 Jean*0044
f15994caab Jean*0045
463053c692 Jean*0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058 CHARACTER*(MAX_LEN_MBUF) msgBuf
893c662779 Jean*0059 INTEGER bi,bj,i,j,k, ks
797ab70dc1 Jean*0060 _RL Po_surf
769c28d1ef Jean*0061 _RL hRef(2*Nr+1), rHalf(2*Nr+1)
46ac67bdf3 Jean*0062 LOGICAL findPoSurf
463053c692 Jean*0063
0064 INTEGER nLevHvR
0065 PARAMETER ( nLevHvR = 60 )
0066 _RL plowHvR, dpHvR, pLevHvR(nLevHvR+1), pMidHvR(nLevHvR)
0067 _RL thetaHvR(nLevHvR), PiHvR(nLevHvR+1), dPiHvR(nLevHvR)
0068 _RL recip_kappa, PiLoc, zLoc, dzLoc, yLatLoc, phiLoc
f15994caab Jean*0069 _RL psNorm, rMidKp1
46ac67bdf3 Jean*0070 _RL ratioRm(Nr), ratioRp(Nr)
463053c692 Jean*0071 INTEGER kLev
0072 #ifdef CHECK_ANALYLIC_THETA
46ac67bdf3 Jean*0073 _RL tmpVar(nLevHvR,61)
463053c692 Jean*0074 #endif
9366854e02 Chri*0075
6c9bcec054 Jean*0076
463053c692 Jean*0077 IF ( selectFindRoSurf.LT.0 .OR. selectFindRoSurf.GT.1 ) THEN
0078 WRITE(msgBuf,'(A,I2,A)')
0079 & 'INI_P_GROUND: selectFindRoSurf =', selectFindRoSurf,
0080 & ' <== bad value !'
893c662779 Jean*0081 CALL PRINT_ERROR( msgBuf, myThid )
f15994caab Jean*0082 STOP 'INI_P_GROUND'
463053c692 Jean*0083 ENDIF
0084
893c662779 Jean*0085 DO k=1,Nr
0086 rHalf(2*k-1) = rF(k)
0087 rHalf(2*k) = rC(k)
6c9bcec054 Jean*0088 ENDDO
0089 rHalf(2*Nr+1) = rF(Nr+1)
0090
769c28d1ef Jean*0091
893c662779 Jean*0092
6c9bcec054 Jean*0093
893c662779 Jean*0094 DO k=1,2*Nr+1
0095 hRef(k) = phiRef(k)*recip_gravity
6c9bcec054 Jean*0096 ENDDO
463053c692 Jean*0097
46ac67bdf3 Jean*0098 IF (selectFindRoSurf.EQ.0 .AND. selectMode .GT. 0 ) THEN
6c9bcec054 Jean*0099
0100 DO bj = myByLo(myThid), myByHi(myThid)
0101 DO bi = myBxLo(myThid), myBxHi(myThid)
0102 DO j=1,sNy
0103 DO i=1,sNx
893c662779 Jean*0104 ks = 1
0105 DO k=1,2*Nr
0106 IF (Hfld(i,j,bi,bj).GE.hRef(k)) ks = k
6c9bcec054 Jean*0107 ENDDO
893c662779 Jean*0108 Po_surf = rHalf(ks) + (rHalf(ks+1)-rHalf(ks))*
0109 & (Hfld(i,j,bi,bj)-hRef(ks))/(hRef(ks+1)-hRef(ks))
6c9bcec054 Jean*0110
769c28d1ef Jean*0111
0112
6c9bcec054 Jean*0113 Pfld(i,j,bi,bj) = Po_surf
0114 ENDDO
0115 ENDDO
0116 ENDDO
0117 ENDDO
0118
0119
46ac67bdf3 Jean*0120
463053c692 Jean*0121 ENDIF
0122
46ac67bdf3 Jean*0123 IF ( selectFindRoSurf.EQ.1 ) THEN
463053c692 Jean*0124
0125
0126 recip_kappa = 1. _d 0 / atm_kappa
0127 plowHvR = 0.4 _d 0
0128 dpHvR = nLevHvR
0129 dpHvR = (1. - plowHvR) / dpHvR
2ad79bdf32 Jean*0130 pLevHvR(1)= rF(1)/atm_Po
463053c692 Jean*0131 PiHvR(1) = atm_Cp*(pLevHvR(1)**atm_kappa)
0132 DO k=1,nLevHvR
893c662779 Jean*0133 pLevHvR(k+1)= pLevHvR(1) - k*dpHvR
463053c692 Jean*0134 PiHvR(k+1) = atm_Cp*(pLevHvR(k+1)**atm_kappa)
f15994caab Jean*0135 pMidHvR(k)= (pLevHvR(k)+pLevHvR(k+1))*0.5 _d 0
463053c692 Jean*0136 dPiHvR(k) = PiHvR(k) - PiHvR(k+1)
0137 ENDDO
0138
46ac67bdf3 Jean*0139
0140
0141 DO k=1,Nr
0142 ratioRm(k) = 1. _d 0
0143 ratioRp(k) = 1. _d 0
0144 IF (k.GT.1 ) ratioRm(k) = 0.5 _d 0*drC(k)/(rF(k)-rC(k))
f15994caab Jean*0145 IF (k.LT.Nr) ratioRp(k) = 0.5 _d 0*drC(k+1)/(rC(k)-rF(k+1))
46ac67bdf3 Jean*0146 ENDDO
0147
463053c692 Jean*0148 #ifdef CHECK_ANALYLIC_THETA
893c662779 Jean*0149 _BEGIN_MASTER( myThid )
463053c692 Jean*0150 DO j=1,61
0151 yLatLoc =-90.+(j-1)*3.
893c662779 Jean*0152 CALL ANALYLIC_THETA( yLatLoc, pMidHvR,
0153 & tmpVar(1,j), nLevHvR, myThid )
f15994caab Jean*0154 ENDDO
463053c692 Jean*0155 OPEN(88,FILE='analytic_theta',
0156 & STATUS='unknown',FORM='unformatted')
0157 WRITE(88) tmpVar
0158 CLOSE(88)
893c662779 Jean*0159 _END_MASTER( myThid )
463053c692 Jean*0160 STOP 'CHECK_ANALYLIC_THETA'
0161 #endif /* CHECK_ANALYLIC_THETA */
0162
46ac67bdf3 Jean*0163
463053c692 Jean*0164 ENDIF
0165
46ac67bdf3 Jean*0166 IF ( selectFindRoSurf*selectMode .GT. 0) THEN
463053c692 Jean*0167
0168
0169
0170 DO bj = myByLo(myThid), myByHi(myThid)
0171 DO bi = myBxLo(myThid), myBxHi(myThid)
0172
46ac67bdf3 Jean*0173
463053c692 Jean*0174 DO j=1,sNy
0175 DO i=1,sNx
893c662779 Jean*0176 phiLoc = Hfld(i,j,bi,bj) - hRef(1)
0177 IF ( phiLoc .LE. 0. _d 0 ) THEN
2ad79bdf32 Jean*0178 Pfld(i,j,bi,bj) = rF(1)
463053c692 Jean*0179 ELSE
0180 yLatLoc = yC(i,j,bi,bj)
893c662779 Jean*0181 CALL ANALYLIC_THETA( yLatLoc, pMidHvR,
0182 & thetaHvR, nLevHvR, myThid )
463053c692 Jean*0183 zLoc = 0.
f15994caab Jean*0184 DO k=1,nLevHvR
463053c692 Jean*0185 IF (zLoc.GE.0.) THEN
0186
f15994caab Jean*0187 dzLoc = dPiHvR(k)*thetaHvR(k)*recip_gravity
893c662779 Jean*0188 IF ( phiLoc .LE. zLoc+dzLoc ) THEN
46ac67bdf3 Jean*0189
f15994caab Jean*0190 PiLoc = PiHvR(k)
893c662779 Jean*0191 & - gravity*( phiLoc - zLoc )/thetaHvR(k)
f15994caab Jean*0192 psNorm = (PiLoc/atm_Cp)**recip_kappa
463053c692 Jean*0193
f15994caab Jean*0194
893c662779 Jean*0195
463053c692 Jean*0196 zLoc = -1.
0197 ELSE
f15994caab Jean*0198 zLoc = zLoc + dzLoc
463053c692 Jean*0199 ENDIF
0200 ENDIF
0201 ENDDO
0202 IF (zLoc.GE.0.) THEN
0203 WRITE(msgBuf,'(2A)')
0204 & 'INI_P_GROUND: FAIL in trying to find Pfld:',
0205 & ' selectMode,i,j,bi,bj=',selectMode,i,j,bi,bj
893c662779 Jean*0206 CALL PRINT_ERROR( msgBuf, myThid )
463053c692 Jean*0207 WRITE(msgBuf,'(A,F7.1,2A,F6.4,A,F8.0)')
0208 & 'INI_P_GROUND: Hfld=', Hfld(i,j,bi,bj), ' exceeds',
0209 & ' Zloc(lowest P=', pLevHvR(1+nLevHvR),' )=',zLoc
893c662779 Jean*0210 CALL PRINT_ERROR( msgBuf, myThid )
f15994caab Jean*0211 STOP 'ABNORMAL END: S/R INI_P_GROUND'
463053c692 Jean*0212 ELSE
46ac67bdf3 Jean*0213 Pfld(i,j,bi,bj) = psNorm*atm_Po
463053c692 Jean*0214 ENDIF
0215 ENDIF
0216 ENDDO
0217 ENDDO
46ac67bdf3 Jean*0218
0219 IF (selectMode.EQ.2 .AND. integr_GeoPot.NE.1) THEN
0220
f15994caab Jean*0221
46ac67bdf3 Jean*0222
0223
0224 DO j=1,sNy
0225 DO i=1,sNx
0226 Po_surf = Pfld(i,j,bi,bj)
0227 IF ( Po_surf.LT.rC(1) .AND. Po_surf.GT.rC(Nr) ) THEN
0228 findPoSurf = .TRUE.
0229 DO k=1,Nr
0230 IF ( findPoSurf .AND. Po_surf.GE.rC(k) ) THEN
0231 Po_surf = rC(k) + (Po_surf-rC(k))/ratioRm(k)
0232 findPoSurf = .FALSE.
0233 ENDIF
0234 rMidKp1 = rF(k+1)
f15994caab Jean*0235 IF (k.LT.Nr) rMidKp1 = (rC(k)+rC(k+1))*0.5 _d 0
46ac67bdf3 Jean*0236 IF ( findPoSurf .AND. Po_surf.GE.rMidKp1 ) THEN
0237 Po_surf = rC(k) + (Po_surf-rC(k))/ratioRp(k)
0238 findPoSurf = .FALSE.
0239 ENDIF
0240 ENDDO
f15994caab Jean*0241 IF ( findPoSurf )
46ac67bdf3 Jean*0242 & STOP 'S/R INI_P_GROUND: Pb with selectMode=2'
f15994caab Jean*0243 ENDIF
46ac67bdf3 Jean*0244 Pfld(i,j,bi,bj) = Po_surf
0245 ENDDO
0246 ENDDO
0247
0248 ENDIF
0249
463053c692 Jean*0250
0251 ENDDO
0252 ENDDO
0253
0254
46ac67bdf3 Jean*0255
463053c692 Jean*0256 ENDIF
0257
46ac67bdf3 Jean*0258 IF (selectMode .LT. 0) THEN
463053c692 Jean*0259
46ac67bdf3 Jean*0260
463053c692 Jean*0261
0262 DO bj = myByLo(myThid), myByHi(myThid)
0263 DO bi = myBxLo(myThid), myBxHi(myThid)
0264
0265
769c28d1ef Jean*0266
463053c692 Jean*0267 DO j=1,sNy
0268 DO i=1,sNx
769c28d1ef Jean*0269
f15994caab Jean*0270 ks = kSurfC(i,j,bi,bj)
463053c692 Jean*0271 IF (ks.LE.Nr) THEN
f15994caab Jean*0272
0273 IF ( selectSigmaCoord.NE.0 ) THEN
0274 DO k=2,Nr
0275 IF ( Pfld(i,j,bi,bj).LT.rF(k) ) ks = k
0276 ENDDO
0277 ENDIF
463053c692 Jean*0278 IF ( Pfld(i,j,bi,bj).GE.rC(ks) ) THEN
769c28d1ef Jean*0279 phiLoc = hRef(2*ks)
0280 & + (hRef(2*ks-1)-hRef(2*ks))
463053c692 Jean*0281 & *(Pfld(i,j,bi,bj)-rC(ks))/(rHalf(2*ks-1)-rHalf(2*ks))
0282 ELSE
769c28d1ef Jean*0283 phiLoc = hRef(2*ks)
0284 & + (hRef(2*ks+1)-hRef(2*ks))
463053c692 Jean*0285 & *(Pfld(i,j,bi,bj)-rC(ks))/(rHalf(2*ks+1)-rHalf(2*ks))
0286 ENDIF
46ac67bdf3 Jean*0287 Hfld(i,j,bi,bj) = phiLoc
463053c692 Jean*0288 ELSE
0289 Hfld(i,j,bi,bj) = 0.
0290 ENDIF
0291 ENDDO
0292 ENDDO
46ac67bdf3 Jean*0293
0294 IF (selectFindRoSurf.EQ.1) THEN
0295
ff02675122 Jean*0296
46ac67bdf3 Jean*0297
0298
0299
0300
0301
0302 DO j=1,sNy
0303 DO i=1,sNx
893c662779 Jean*0304 zLoc = hRef(1)
2ad79bdf32 Jean*0305 IF ( Pfld(i,j,bi,bj) .LT. rF(1) ) THEN
46ac67bdf3 Jean*0306 Po_surf = Pfld(i,j,bi,bj)
0307
f15994caab Jean*0308
46ac67bdf3 Jean*0309
0310 IF (selectMode.EQ.-2 .AND. integr_GeoPot.NE.1) THEN
0311 IF ( Po_surf.LT.rC(1) .AND. Po_surf.GT.rC(Nr) ) THEN
0312 findPoSurf = .TRUE.
0313 DO k=1,Nr
0314 IF ( findPoSurf .AND. Po_surf.GE.rC(k) ) THEN
0315 Po_surf = rC(k) + (Po_surf-rC(k))*ratioRm(k)
0316 findPoSurf = .FALSE.
0317 ENDIF
0318 IF ( findPoSurf .AND. Po_surf.GE.rF(k+1) ) THEN
0319 Po_surf = rC(k) + (Po_surf-rC(k))*ratioRp(k)
0320 findPoSurf = .FALSE.
0321 ENDIF
0322 ENDDO
f15994caab Jean*0323 ENDIF
0324 ENDIF
46ac67bdf3 Jean*0325
0326 psNorm = Po_surf/atm_Po
0327 kLev = 1 + INT( (pLevHvR(1)-psNorm)/dpHvR )
0328 yLatLoc = yC(i,j,bi,bj)
893c662779 Jean*0329 CALL ANALYLIC_THETA( yLatLoc, pMidHvR,
0330 & thetaHvR, kLev, myThid )
46ac67bdf3 Jean*0331
0332 DO k=1,kLev-1
f15994caab Jean*0333 dzLoc = dPiHvR(k)*thetaHvR(k)*recip_gravity
46ac67bdf3 Jean*0334 zLoc = zLoc + dzLoc
0335 ENDDO
0336 dzLoc = ( PiHvR(kLev)-atm_Cp*(psNorm**atm_kappa) )
f15994caab Jean*0337 & * thetaHvR(kLev)*recip_gravity
46ac67bdf3 Jean*0338 zLoc = zLoc + dzLoc
0339 ENDIF
0340
0341 phi0surf(i,j,bi,bj) = gravity*(zLoc - Hfld(i,j,bi,bj))
0342
0343 Hfld(i,j,bi,bj) = zLoc
0344 ENDDO
0345 ENDDO
0346
0347 ENDIF
0348
463053c692 Jean*0349
0350 ENDDO
0351 ENDDO
0352
0353
46ac67bdf3 Jean*0354
463053c692 Jean*0355 ENDIF
0356
0357 RETURN
0358 END
0359
0360
0361
0362
0363 SUBROUTINE ANALYLIC_THETA( yLat, pNlev,
0364 O thetaLev,
893c662779 Jean*0365 I kSize, myThid )
463053c692 Jean*0366
0367
0368
f15994caab Jean*0369
0370
0371
0372
463053c692 Jean*0373
0374
0375
0376
0377
0378
0379 IMPLICIT NONE
0380
0381
0382 #include "SIZE.h"
0383 #include "EEPARAMS.h"
0384 #include "PARAMS.h"
0385
0386
0387
0388
0389
0390
0391
0392 INTEGER kSize
0393 _RL yLat
0394 _RL pNlev (kSize)
0395 _RL thetaLev(kSize)
0396 INTEGER myThid
0397
0398
0399
0400 INTEGER k
0401 _RL yyA, yyB, yyC, yyAd, yyBd, yyCd
0402 _RL cAtmp, cBtmp, ttdC
f15994caab Jean*0403 _RL ppN0, ppN1, ppN2, ppN3a, ppN3b, ppN4
463053c692 Jean*0404 _RL ttp1, ttp2, ttp3, ttp4, ttp5
0405 _RL yAtmp, yBtmp, yCtmp, yDtmp
f15994caab Jean*0406 _RL ttp2y, ttp4y, a1tmp
463053c692 Jean*0407 _RL ppl, ppm, pph, ppr
0408
0409
0410 DATA yyA , yyB , yyC , yyAd , yyBd , yyCd
0411 & / 45. _d 0, 65. _d 0, 65. _d 0, .9 _d 0, .9 _d 0, 10. _d 0 /
0412 DATA cAtmp , cBtmp , ttdC
0413 & / 2.6 _d 0, 1.5 _d 0, 3.3 _d 0 /
f15994caab Jean*0414 DATA ppN0 , ppN1 , ppN2 , ppN3a , ppN3b , ppN4
463053c692 Jean*0415 & / .1 _d 0, .19 _d 0, .3 _d 0, .9 _d 0, .7 _d 0, .925 _d 0 /
0416 DATA ttp1 , ttp2 , ttp3 , ttp4 , ttp5
0417 & / 350. _d 0, 342. _d 0, 307. _d 0, 301. _d 0, 257. _d 0 /
0418
0419
0420
0421 yAtmp = ABS(yLat) - yyA
0422 yAtmp = yyA + MIN(0. _d 0,yAtmp/yyAd) + MAX(yAtmp, 0. _d 0)
0423 yAtmp = COS( deg2rad*MAX(yAtmp, 0. _d 0) )
0424 yBtmp = ABS(yLat) - yyB
0425 yBtmp = yyB + yBtmp/yyBd
0426 yBtmp = COS( deg2rad*MAX( 0. _d 0, MIN(yBtmp,90. _d 0) ) )
0427 yCtmp = ABS(yLat) - yyC
0428 yCtmp = MAX( 0. _d 0, 1. _d 0 - (yCtmp/yyCd)**2 )
0429 yDtmp = ppN3a +(ppN3b - ppN3a)*yCtmp
0430 ttp2y = ttp3 + (ttp2-ttp3)*yAtmp**cAtmp
0431 ttp4y = ttp5 + (ttp4-ttp5)*yBtmp**cBtmp
0432 a1tmp = (ttp1-ttp2y)*ppN1*ppN2/(ppN2-ppN1)
0433 DO k=1,kSize
0434 ppl = MIN(pNlev(k),ppN1)
0435 ppm = MIN(MAX(pNlev(k),ppN1),ppN2)
0436 pph = MAX(pNlev(k),ppN2)
0437 ppr =( ppN0 + ABS(ppl-ppN0) - ppN1 )/(ppN2-ppN1)
f15994caab Jean*0438 thetaLev(k) =
463053c692 Jean*0439 & ( (1. _d 0 -ppr)*ttp1*ppN1**atm_kappa
0440 & + ppr*ttp2y*ppN2**atm_kappa
0441 & )*ppl**(-atm_kappa)
0442 & + a1tmp*(1. _d 0 /ppm - 1. _d 0/ppN1)
f15994caab Jean*0443 & + (ttp4y-ttp2y)*(pph-ppN2)/(ppN4-ppN2)
463053c692 Jean*0444 & + (ttdC+yCtmp)*MAX(0. _d 0,pNlev(k)-yDtmp)/(1-yDtmp)
0445 ENDDO
6c9bcec054 Jean*0446
f15994caab Jean*0447
463053c692 Jean*0448
0449
0450
0451
f15994caab Jean*0452
463053c692 Jean*0453
0454
0455
0456
0457
0458
0459
f15994caab Jean*0460
463053c692 Jean*0461
0462
0463
0464
0465
f15994caab Jean*0466
6c9bcec054 Jean*0467
0468 RETURN
0469 END