File indexing completed on 2025-03-03 06:11:14 UTC
view on githubraw file Latest commit b7b61e61 on 2025-03-02 15:55:22 UTC
6d54cf9ca1 Ed H*0001 #include "EXF_OPTIONS.h"
3a255f48df Gael*0002 #ifdef ALLOW_AUTODIFF
0003 # include "AUTODIFF_OPTIONS.h"
0004 #endif
bdec91d862 Patr*0005
d216b1690c Mart*0006
0007
0008
701e10a905 Mart*0009 SUBROUTINE EXF_BULKFORMULAE( exf_Tsf, myTime, myIter, myThid )
d216b1690c Mart*0010
0011
0012
0013
0014
0015
e1fb02e8f0 Jean*0016
d216b1690c Mart*0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141 IMPLICIT NONE
0142
bdec91d862 Patr*0143 #include "EEPARAMS.h"
0144 #include "SIZE.h"
0145 #include "PARAMS.h"
0146 #include "DYNVARS.h"
d216b1690c Mart*0147 #include "GRID.h"
bdec91d862 Patr*0148
082e18c36c Jean*0149 #include "EXF_PARAM.h"
0150 #include "EXF_FIELDS.h"
0151 #include "EXF_CONSTANTS.h"
bdec91d862 Patr*0152
0153 #ifdef ALLOW_AUTODIFF_TAMC
0154 #include "tamc.h"
0155 #endif
0156
d216b1690c Mart*0157
0158
0159
0160
0161
701e10a905 Mart*0162
0163
d216b1690c Mart*0164 _RL myTime
0165 INTEGER myIter
0166 INTEGER myThid
701e10a905 Mart*0167 _RL exf_Tsf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
d216b1690c Mart*0168
0169
bdec91d862 Patr*0170
7109a141b2 Patr*0171 #ifdef ALLOW_BULKFORMULAE
423768d890 Jean*0172 #ifdef ALLOW_ATM_TEMP
d216b1690c Mart*0173
7109a141b2 Patr*0174
d216b1690c Mart*0175
0176
0177
0178
0179 INTEGER i,j,bi,bj
bdec91d862 Patr*0180
20cf30c902 Patr*0181 _RL czol
d216b1690c Mart*0182 _RL Tsf
0183 _RL wsm
0184 _RL t0
0185
0186 _RL tstar (1:sNx,1:sNy)
0187 _RL qstar (1:sNx,1:sNy)
0188 _RL ustar (1:sNx,1:sNy)
0189 _RL tau (1:sNx,1:sNy)
0190 _RL rdn (1:sNx,1:sNy)
0191 _RL rd (1:sNx,1:sNy)
0192 _RL delq (1:sNx,1:sNy)
0b902863ee Mart*0193 _RL deltap(1:sNx,1:sNy)
8053a926ae Jean*0194 #ifdef EXF_CALC_ATMRHO
0195 _RL atmrho_loc(1:sNx,1:sNy)
0196 #endif
0197
e1fb02e8f0 Jean*0198 #ifdef ALLOW_BULK_LARGEYEAGER04
d216b1690c Mart*0199 _RL dzTmp
e1fb02e8f0 Jean*0200 #endif
d216b1690c Mart*0201 _RL ssq
0202 _RL re
0203 _RL rh
0204 _RL ren, rhn
0205 _RL usn, usm
0206 _RL stable
0207 _RL huol
0208 _RL htol
0209 _RL hqol
0210 _RL x
0211 _RL xsq
0212 _RL psimh
0213 _RL psixh
0214 _RL zwln
0215 _RL ztln
0216 _RL tmpbulk
0217 _RL recip_rhoConstFresh
0320e25227 Mart*0218 INTEGER ks, kl
d216b1690c Mart*0219 INTEGER iter
0220
0221 LOGICAL solve4Stress
e1fb02e8f0 Jean*0222 _RL windStress
d216b1690c Mart*0223
bdec91d862 Patr*0224 #ifdef ALLOW_AUTODIFF_TAMC
20dee61641 Mart*0225 INTEGER ikey, ikey_1, ikey_2
bdec91d862 Patr*0226 #endif
0227
e1fb02e8f0 Jean*0228
0229
423768d890 Jean*0230 IF ( useAtmWind ) THEN
358649780a Gael*0231 solve4Stress = .TRUE.
423768d890 Jean*0232 ELSE
d216b1690c Mart*0233 #ifdef ALLOW_BULK_LARGEYEAGER04
358649780a Gael*0234 solve4Stress = wspeedfile .NE. ' '
d216b1690c Mart*0235 #else
358649780a Gael*0236 solve4Stress = .FALSE.
d216b1690c Mart*0237 #endif
423768d890 Jean*0238 ENDIF
bdec91d862 Patr*0239
0320e25227 Mart*0240 IF ( usingPCoords ) THEN
0241 ks = Nr
0242 kl = Nr-1
0243 ELSE
0244 ks = 1
0245 kl = 2
0246 ENDIF
0247
0248
666d41f610 Mart*0249 zwln = LOG(hu/zref)
0250 ztln = LOG(ht/zref)
20cf30c902 Patr*0251 czol = hu*karman*gravity_mks
d216b1690c Mart*0252
666d41f610 Mart*0253 recip_rhoConstFresh = 1. _d 0/rhoConstFresh
e1fb02e8f0 Jean*0254
8053a926ae Jean*0255
bdec91d862 Patr*0256 #ifdef ALLOW_AUTODIFF_TAMC
b7b61e618a Mart*0257
bdec91d862 Patr*0258
0259 #endif
d216b1690c Mart*0260 DO bj = myByLo(myThid),myByHi(myThid)
bdec91d862 Patr*0261 #ifdef ALLOW_AUTODIFF_TAMC
b7b61e618a Mart*0262
bdec91d862 Patr*0263
0264 #endif
d216b1690c Mart*0265 DO bi = myBxLo(myThid),myBxHi(myThid)
0320e25227 Mart*0266
20dee61641 Mart*0267 #ifdef ALLOW_AUTODIFF_TAMC
0268 ikey = bi + (bj-1)*nSx + (ikey_dynamics-1)*nSx*nSy
0269 #endif
d216b1690c Mart*0270 DO j = 1,sNy
0271 DO i = 1,sNx
bdec91d862 Patr*0272
0273 #ifdef ALLOW_AUTODIFF_TAMC
20dee61641 Mart*0274 ikey_1 = i + (j-1)*sNx + (ikey-1)*sNx*sNy
bdec91d862 Patr*0275 #endif
0276
423768d890 Jean*0277 #ifdef ALLOW_AUTODIFF
f1644eaf0d Patr*0278 deltap(i,j) = 0. _d 0
0279 delq(i,j) = 0. _d 0
0280 #endif
d216b1690c Mart*0281
0282
0283 IF ( atemp(i,j,bi,bj) .NE. 0. _d 0 ) THEN
0284
701e10a905 Mart*0285 Tsf = exf_Tsf(i,j,bi,bj)
d216b1690c Mart*0286 tmpbulk = cvapor_fac*exp(-cvapor_exp/Tsf)
8053a926ae Jean*0287 #ifdef EXF_CALC_ATMRHO
0288 atmrho_loc(i,j) = apressure(i,j,bi,bj) /
0289 & (287.04 _d 0*atemp(i,j,bi,bj)
0290 & *(1. _d 0 + humid_fac*aqh(i,j,bi,bj)))
0291 ssq = saltsat*tmpbulk/atmrho_loc(i,j)
0292 #else
d216b1690c Mart*0293 ssq = saltsat*tmpbulk/atmrho
8053a926ae Jean*0294 #endif
d216b1690c Mart*0295 deltap(i,j) = atemp(i,j,bi,bj) + gamma_blk*ht - Tsf
0b902863ee Mart*0296 delq(i,j) = aqh(i,j,bi,bj) - ssq
d216b1690c Mart*0297
0298 IF ( noNegativeEvap ) delq(i,j) = MIN( 0. _d 0, delq(i,j) )
0299
0300
0301
0302 stable = exf_half + SIGN(exf_half, deltap(i,j))
0303
0304 IF ( solve4Stress ) THEN
bdec91d862 Patr*0305 #ifdef ALLOW_AUTODIFF_TAMC
3752238fd8 Patr*0306
d216b1690c Mart*0307 #endif /* ALLOW_AUTODIFF_TAMC */
0308
0309 wsm = sh(i,j,bi,bj)
cc60455fbb Mart*0310 #ifdef ALLOW_DRAG_LARGEYEAGER09
0311
0312 tmpbulk = cdrag_1/wsm + cdrag_2 + cdrag_3*wsm
0313 & + cdrag_8 * wsm**6
0314 tmpbulk = exf_scal_BulkCdn * (
0315 & ( halfRL - SIGN(halfRL, wsm-umax) )*tmpbulk
0316 & + ( halfRL + SIGN(halfRL, wsm-umax) )*cdragMax
0317 & )
0318 #else
d216b1690c Mart*0319 tmpbulk = exf_scal_BulkCdn *
0320 & ( cdrag_1/wsm + cdrag_2 + cdrag_3*wsm )
cc60455fbb Mart*0321 #endif
d216b1690c Mart*0322 rdn(i,j) = SQRT(tmpbulk)
0323 ustar(i,j) = rdn(i,j)*wsm
0324 ELSE
ddea17ebdb Gael*0325 rdn(i,j) = 0. _d 0
d216b1690c Mart*0326 windStress = wStress(i,j,bi,bj)
8053a926ae Jean*0327 #ifdef EXF_CALC_ATMRHO
423768d890 Jean*0328 ustar(i,j) = SQRT(windStress/atmrho_loc(i,j))
0329 tau(i,j) = SQRT(windStress*atmrho_loc(i,j))
8053a926ae Jean*0330 #else
423768d890 Jean*0331 ustar(i,j) = SQRT(windStress/atmrho)
d216b1690c Mart*0332
423768d890 Jean*0333 tau(i,j) = SQRT(windStress*atmrho)
8053a926ae Jean*0334 #endif
d216b1690c Mart*0335 ENDIF
7311a000e1 Mart*0336
0337
666d41f610 Mart*0338 rhn = (exf_one-stable)*cstanton_1 + stable*cstanton_2
d216b1690c Mart*0339 ren = cDalton
7311a000e1 Mart*0340
d216b1690c Mart*0341 tstar(i,j)=rhn*deltap(i,j)
0342 qstar(i,j)=ren*delq(i,j)
0b902863ee Mart*0343
d216b1690c Mart*0344 ELSE
e1fb02e8f0 Jean*0345
0b902863ee Mart*0346 tstar (i,j) = 0. _d 0
0347 qstar (i,j) = 0. _d 0
0348 ustar (i,j) = 0. _d 0
0349 tau (i,j) = 0. _d 0
0350 rdn (i,j) = 0. _d 0
d216b1690c Mart*0351 ENDIF
0352 ENDDO
0353 ENDDO
0354 DO iter=1,niter_bulk
0355 DO j = 1,sNy
0356 DO i = 1,sNx
0357 IF ( atemp(i,j,bi,bj) .NE. 0. _d 0 ) THEN
0358
0359
bdec91d862 Patr*0360 #ifdef ALLOW_AUTODIFF_TAMC
20dee61641 Mart*0361 ikey_2 = i + (j-1)*sNx + (iter-1)*sNx*sNy
0362 & + (ikey-1)*sNx*sNy*niter_bulk
d216b1690c Mart*0363
0364
0365
0366
0367
0368
bdec91d862 Patr*0369 #endif
0370
d216b1690c Mart*0371 t0 = atemp(i,j,bi,bj)*
0b902863ee Mart*0372 & (exf_one + humid_fac*aqh(i,j,bi,bj))
d216b1690c Mart*0373 huol = ( tstar(i,j)/t0 +
0374 & qstar(i,j)/(exf_one/humid_fac+aqh(i,j,bi,bj))
0375 & )*czol/(ustar(i,j)*ustar(i,j))
0376 #ifdef ALLOW_BULK_LARGEYEAGER04
0377 tmpbulk = MIN(abs(huol),10. _d 0)
0378 huol = SIGN(tmpbulk , huol)
0379 #else
0380
0b902863ee Mart*0381 huol = max(huol,zolmin)
d216b1690c Mart*0382 #endif /* ALLOW_BULK_LARGEYEAGER04 */
0b902863ee Mart*0383 htol = huol*ht/hu
0384 hqol = huol*hq/hu
666d41f610 Mart*0385 stable = exf_half + sign(exf_half, huol)
d216b1690c Mart*0386
8053a926ae Jean*0387
d216b1690c Mart*0388 IF ( solve4Stress ) THEN
0389 #ifdef ALLOW_BULK_LARGEYEAGER04
0390
0391 xsq = SQRT( ABS(exf_one - huol*16. _d 0) )
0392 #else
0393
423768d890 Jean*0394 xsq = MAX(SQRT(ABS(exf_one - 16.*huol)),exf_one)
d216b1690c Mart*0395 #endif /* ALLOW_BULK_LARGEYEAGER04 */
0396 x = SQRT(xsq)
0397 psimh = -psim_fac*huol*stable
0398 & +(exf_one-stable)*
0399 & ( LOG( (exf_one + exf_two*x + xsq)*
0400 & (exf_one+xsq)*.125 _d 0 )
0401 & -exf_two*ATAN(x) + exf_half*pi )
ddea17ebdb Gael*0402 ELSE
0403 psimh = 0. _d 0
d216b1690c Mart*0404 ENDIF
0405 #ifdef ALLOW_BULK_LARGEYEAGER04
0406
0407 xsq = SQRT( ABS(exf_one - htol*16. _d 0) )
0408 #else
0409
423768d890 Jean*0410 xsq = MAX(SQRT(ABS(exf_one - 16.*htol)),exf_one)
d216b1690c Mart*0411 #endif /* ALLOW_BULK_LARGEYEAGER04 */
666d41f610 Mart*0412 psixh = -psim_fac*htol*stable + (exf_one-stable)*
0413 & ( exf_two*LOG(exf_half*(exf_one+xsq)) )
d216b1690c Mart*0414
0415 IF ( solve4Stress ) THEN
7448700841 Mart*0416 #ifdef ALLOW_AUTODIFF_TAMC
8ed910e28e Patr*0417
7448700841 Mart*0418 #endif
d216b1690c Mart*0419
0420 #ifdef ALLOW_BULK_LARGEYEAGER04
0421
0422 dzTmp = (zwln-psimh)/karman
0423 usn = wspeed(i,j,bi,bj)/(exf_one + rdn(i,j)*dzTmp )
0424 #else
0425
666d41f610 Mart*0426
d216b1690c Mart*0427
8053a926ae Jean*0428
0429
d216b1690c Mart*0430 usn = sh(i,j,bi,bj)/(exf_one - rdn(i,j)/karman*psimh)
0431 #endif /* ALLOW_BULK_LARGEYEAGER04 */
0432 usm = MAX(usn, umin)
0433
0434
cc60455fbb Mart*0435 #ifdef ALLOW_DRAG_LARGEYEAGER09
0436
0437 tmpbulk = cdrag_1/usm + cdrag_2 + cdrag_3*usm
0438 & + cdrag_8 * usm**6
0439 tmpbulk = exf_scal_BulkCdn * (
0440 & ( halfRL - SIGN(halfRL, usm-umax) )*tmpbulk
0441 & + ( halfRL + SIGN(halfRL, usm-umax) )*cdragMax
0442 & )
0443 #else
d216b1690c Mart*0444 tmpbulk = exf_scal_BulkCdn *
0445 & ( cdrag_1/usm + cdrag_2 + cdrag_3*usm )
cc60455fbb Mart*0446 #endif
d216b1690c Mart*0447 rdn(i,j) = SQRT(tmpbulk)
0448 #ifdef ALLOW_BULK_LARGEYEAGER04
0449 rd(i,j) = rdn(i,j)/(exf_one + rdn(i,j)*dzTmp)
0450 #else
0451 rd(i,j) = rdn(i,j)/(exf_one - rdn(i,j)/karman*psimh)
0452 #endif /* ALLOW_BULK_LARGEYEAGER04 */
0453 ustar(i,j) = rd(i,j)*sh(i,j,bi,bj)
0454
8053a926ae Jean*0455 #ifdef EXF_CALC_ATMRHO
0456 tau(i,j) = atmrho_loc(i,j)*rd(i,j)*wspeed(i,j,bi,bj)
0457 #else
d216b1690c Mart*0458 tau(i,j) = atmrho*rd(i,j)*wspeed(i,j,bi,bj)
8053a926ae Jean*0459 #endif
d216b1690c Mart*0460 ENDIF
0461
0462
666d41f610 Mart*0463 rhn = (exf_one-stable)*cstanton_1 + stable*cstanton_2
d216b1690c Mart*0464 ren = cDalton
0465
0466
0467 rh = rhn/(exf_one + rhn*(ztln-psixh)/karman)
0468 re = ren/(exf_one + ren*(ztln-psixh)/karman)
bdec91d862 Patr*0469
d216b1690c Mart*0470
0b902863ee Mart*0471 qstar(i,j) = re*delq(i,j)
0472 tstar(i,j) = rh*deltap(i,j)
f1644eaf0d Patr*0473
d216b1690c Mart*0474 ENDIF
0475 ENDDO
0476 ENDDO
8053a926ae Jean*0477
d216b1690c Mart*0478 ENDDO
0479 DO j = 1,sNy
0480 DO i = 1,sNx
0481 IF ( atemp(i,j,bi,bj) .NE. 0. _d 0 ) THEN
bdec91d862 Patr*0482
0483 #ifdef ALLOW_AUTODIFF_TAMC
20dee61641 Mart*0484 ikey_1 = i + (j-1)*sNx + (ikey-1)*sNx*sNy
7311a000e1 Mart*0485
0486
d216b1690c Mart*0487
0488
0489 #endif /* ALLOW_AUTODIFF_TAMC */
0490
0491
666d41f610 Mart*0492 hs(i,j,bi,bj) = atmcp*tau(i,j)*tstar(i,j)
0493 hl(i,j,bi,bj) = flamb*tau(i,j)*qstar(i,j)
bdec91d862 Patr*0494 #ifndef EXF_READ_EVAP
d216b1690c Mart*0495
0496
666d41f610 Mart*0497 evap(i,j,bi,bj) = -recip_rhoConstFresh*tau(i,j)*qstar(i,j)
d216b1690c Mart*0498
0499
bdec91d862 Patr*0500 #endif
56d13a40ed Mart*0501 IF ( useAtmWind .AND. useRelativeWind ) THEN
0502 tmpbulk = tau(i,j)*rd(i,j)
0503 ustress(i,j,bi,bj) = tmpbulk* ( uwind(i,j,bi,bj) -
0504 & 0.5 _d 0 * (uVel(i,j,ks,bi,bj)+uVel(i+1,j,ks,bi,bj)) )
0505 vstress(i,j,bi,bj) = tmpbulk* ( vwind(i,j,bi,bj) -
0506 & 0.5 _d 0 * (vVel(i,j,ks,bi,bj)+vVel(i,j+1,ks,bi,bj)) )
0507 ELSEIF ( useAtmWind ) THEN
423768d890 Jean*0508
0509
d216b1690c Mart*0510
0511
0512
423768d890 Jean*0513 tmpbulk = tau(i,j)*rd(i,j)
0514 ustress(i,j,bi,bj) = tmpbulk*uwind(i,j,bi,bj)
0515 vstress(i,j,bi,bj) = tmpbulk*vwind(i,j,bi,bj)
0516 ENDIF
7311a000e1 Mart*0517
0518
423768d890 Jean*0519 ELSE
0520 IF ( useAtmWind ) ustress(i,j,bi,bj) = 0. _d 0
0521 IF ( useAtmWind ) vstress(i,j,bi,bj) = 0. _d 0
0b902863ee Mart*0522 hflux (i,j,bi,bj) = 0. _d 0
d216b1690c Mart*0523 evap (i,j,bi,bj) = 0. _d 0
0524 hs (i,j,bi,bj) = 0. _d 0
0525 hl (i,j,bi,bj) = 0. _d 0
7311a000e1 Mart*0526
0527
423768d890 Jean*0528 ENDIF
0529
d216b1690c Mart*0530 ENDDO
0531 ENDDO
0532 ENDDO
0533 ENDDO
bdec91d862 Patr*0534
423768d890 Jean*0535 #endif /* ALLOW_ATM_TEMP */
7109a141b2 Patr*0536 #endif /* ALLOW_BULKFORMULAE */
0537
d216b1690c Mart*0538 RETURN
0539 END