File indexing completed on 2025-07-08 05:10:41 UTC
view on githubraw file Latest commit 00c7090d on 2025-07-07 16:10:22 UTC
e874fa47e5 Jean*0001 #include "PACKAGES_CONFIG.h"
0002 #include "CPP_OPTIONS.h"
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 SUBROUTINE APPLY_FORCING_U(
0016 U gU_arr,
0017 I iMin,iMax,jMin,jMax, k, bi, bj,
0018 I myTime, myIter, myThid )
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 IMPLICIT NONE
0031
0032 #include "SIZE.h"
0033 #include "EEPARAMS.h"
0034 #include "PARAMS.h"
0035 #include "GRID.h"
0036 #include "DYNVARS.h"
0037 #include "FFIELDS.h"
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 _RL gU_arr(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0049 INTEGER iMin, iMax, jMin, jMax
0050 INTEGER k, bi, bj
0051 _RL myTime
0052 INTEGER myIter
0053 INTEGER myThid
0054
0055
0056
0057
0058 INTEGER i, j
0059 #ifdef USE_OLD_EXTERNAL_FORCING
0060 _RL locVar(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
202e12438b Jean*0061 _RL tmpVar(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
e874fa47e5 Jean*0062 #else
0063 INTEGER kSurface
5a705ed756 Jean*0064 #endif /* USE_OLD_EXTERNAL_FORCING */
e874fa47e5 Jean*0065
0066
0067 #ifdef USE_OLD_EXTERNAL_FORCING
0068
0069 DO j=1-OLy,sNy+OLy
0070 DO i=1-OLx,sNx+OLx
0071 locVar(i,j) = gU(i,j,k,bi,bj)
0072 ENDDO
0073 ENDDO
0074 CALL EXTERNAL_FORCING_U(
0075 I iMin, iMax, jMin, jMax, bi, bj, k,
0076 I myTime, myThid )
202e12438b Jean*0077
0078
0079
e874fa47e5 Jean*0080 DO j=1-OLy,sNy+OLy
0081 DO i=1-OLx,sNx+OLx
202e12438b Jean*0082 tmpVar(i,j) = gU(i,j,k,bi,bj) - locVar(i,j)
e874fa47e5 Jean*0083 gU(i,j,k,bi,bj) = locVar(i,j)
202e12438b Jean*0084 ENDDO
0085 ENDDO
aa25968b23 Jean*0086
0087
202e12438b Jean*0088 DO j=1-OLy,sNy+OLy
0089 DO i=1-OLx,sNx+OLx
0090 gU_arr(i,j) = gU_arr(i,j) + tmpVar(i,j)
e874fa47e5 Jean*0091 ENDDO
0092 ENDDO
0093
0094 #else /* USE_OLD_EXTERNAL_FORCING */
0095
0096 IF ( fluidIsAir ) THEN
0097 kSurface = 0
0098 ELSEIF ( usingPCoords ) THEN
0099 kSurface = Nr
0100 ELSE
0101 kSurface = 1
0102 ENDIF
0103
0104
0105 #ifdef ALLOW_AIM
0106 IF ( useAIM ) CALL AIM_TENDENCY_APPLY_U(
0107 U gU_arr,
0108 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0109 I myTime, myIter, myThid )
e874fa47e5 Jean*0110 #endif /* ALLOW_AIM */
0111
0112 #ifdef ALLOW_ATM_PHYS
0113 IF ( useAtm_Phys ) CALL ATM_PHYS_TENDENCY_APPLY_U(
0114 U gU_arr,
0115 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0116 I myTime, myIter, myThid )
e874fa47e5 Jean*0117 #endif /* ALLOW_ATM_PHYS */
0118
0119 #ifdef ALLOW_FIZHI
0120 IF ( useFIZHI ) CALL FIZHI_TENDENCY_APPLY_U(
0121 U gU_arr,
0122 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0123 I myTime, myIter, myThid )
e874fa47e5 Jean*0124 #endif /* ALLOW_FIZHI */
0125
614bfb3d2a Jean*0126
0127 IF ( momTidalForcing ) THEN
0128 DO j=0,sNy+1
0129 DO i=1,sNx+1
0130 gU_arr(i,j) = gU_arr(i,j)
0131 & - recip_dxC(i,j,bi,bj)*recip_deepFacC(k)
0132 & * ( phiTide2d(i,j,bi,bj) - phiTide2d(i-1,j,bi,bj) )
0133 & *_maskW(i,j,k,bi,bj)
0134 ENDDO
0135 ENDDO
0136 ENDIF
0137
e874fa47e5 Jean*0138
0139 IF ( k .EQ. kSurface ) THEN
0140
0141
0142 DO j=0,sNy+1
0143 DO i=1,sNx+1
0144 gU_arr(i,j) = gU_arr(i,j)
0145 & +foFacMom*surfaceForcingU(i,j,bi,bj)
0146 & *recip_drF(k)*_recip_hFacW(i,j,k,bi,bj)
0147 ENDDO
0148 ENDDO
0149 ELSEIF ( kSurface.EQ.-1 ) THEN
0150 DO j=0,sNy+1
0151 DO i=1,sNx+1
0152 IF ( kSurfW(i,j,bi,bj).EQ.k ) THEN
0153 gU_arr(i,j) = gU_arr(i,j)
0154 & +foFacMom*surfaceForcingU(i,j,bi,bj)
0155 & *recip_drF(k)*_recip_hFacW(i,j,k,bi,bj)
0156 ENDIF
0157 ENDDO
0158 ENDDO
0159 ENDIF
0160
0161 #ifdef ALLOW_EDDYPSI
0162 CALL TAUEDDY_TENDENCY_APPLY_U(
0163 U gU_arr,
0164 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0165 I myTime, myIter, myThid )
e874fa47e5 Jean*0166 #endif
0167
0168 #ifdef ALLOW_RBCS
0169 IF (useRBCS) THEN
0170 CALL RBCS_ADD_TENDENCY(
0171 U gU_arr,
0172 I k, bi, bj, -1,
2c160c3ab4 Jean*0173 I myTime, myIter, myThid )
e874fa47e5 Jean*0174
0175 ENDIF
0176 #endif /* ALLOW_RBCS */
0177
0178 #ifdef ALLOW_OBCS
0179 IF (useOBCS) THEN
0180 CALL OBCS_SPONGE_U(
0181 U gU_arr,
0182 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0183 I myTime, myIter, myThid )
e874fa47e5 Jean*0184 ENDIF
0185 #endif /* ALLOW_OBCS */
0186
0187 #ifdef ALLOW_MYPACKAGE
0188 IF ( useMYPACKAGE ) THEN
0189 CALL MYPACKAGE_TENDENCY_APPLY_U(
0190 U gU_arr,
0191 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0192 I myTime, myIter, myThid )
e874fa47e5 Jean*0193 ENDIF
0194 #endif /* ALLOW_MYPACKAGE */
0195
0196 #endif /* USE_OLD_EXTERNAL_FORCING */
0197
0198 RETURN
0199 END
0200
0201
0202
0203
0204
0205 SUBROUTINE APPLY_FORCING_V(
0206 U gV_arr,
0207 I iMin,iMax,jMin,jMax, k, bi, bj,
0208 I myTime, myIter, myThid )
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220 IMPLICIT NONE
0221
0222 #include "SIZE.h"
0223 #include "EEPARAMS.h"
0224 #include "PARAMS.h"
0225 #include "GRID.h"
0226 #include "DYNVARS.h"
0227 #include "FFIELDS.h"
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238 _RL gV_arr(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0239 INTEGER iMin, iMax, jMin, jMax
0240 INTEGER k, bi, bj
0241 _RL myTime
0242 INTEGER myIter
0243 INTEGER myThid
0244
0245
0246
0247
0248 INTEGER i, j
0249 #ifdef USE_OLD_EXTERNAL_FORCING
0250 _RL locVar(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
202e12438b Jean*0251 _RL tmpVar(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
e874fa47e5 Jean*0252 #else
0253 INTEGER kSurface
5a705ed756 Jean*0254 #endif /* USE_OLD_EXTERNAL_FORCING */
e874fa47e5 Jean*0255
0256
0257 #ifdef USE_OLD_EXTERNAL_FORCING
0258
0259 DO j=1-OLy,sNy+OLy
0260 DO i=1-OLx,sNx+OLx
0261 locVar(i,j) = gV(i,j,k,bi,bj)
0262 ENDDO
0263 ENDDO
0264 CALL EXTERNAL_FORCING_V(
0265 I iMin, iMax, jMin, jMax, bi, bj, k,
0266 I myTime, myThid )
202e12438b Jean*0267
0268
0269
e874fa47e5 Jean*0270 DO j=1-OLy,sNy+OLy
0271 DO i=1-OLx,sNx+OLx
202e12438b Jean*0272 tmpVar(i,j) = gV(i,j,k,bi,bj) - locVar(i,j)
e874fa47e5 Jean*0273 gV(i,j,k,bi,bj) = locVar(i,j)
202e12438b Jean*0274 ENDDO
0275 ENDDO
aa25968b23 Jean*0276
0277
202e12438b Jean*0278 DO j=1-OLy,sNy+OLy
0279 DO i=1-OLx,sNx+OLx
0280 gV_arr(i,j) = gV_arr(i,j) + tmpVar(i,j)
e874fa47e5 Jean*0281 ENDDO
0282 ENDDO
0283
0284 #else /* USE_OLD_EXTERNAL_FORCING */
0285
0286 IF ( fluidIsAir ) THEN
0287 kSurface = 0
0288 ELSEIF ( usingPCoords ) THEN
0289 kSurface = Nr
0290 ELSE
0291 kSurface = 1
0292 ENDIF
0293
0294
0295 #ifdef ALLOW_AIM
0296 IF ( useAIM ) CALL AIM_TENDENCY_APPLY_V(
0297 U gV_arr,
0298 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0299 I myTime, myIter, myThid )
e874fa47e5 Jean*0300 #endif /* ALLOW_AIM */
0301
0302 #ifdef ALLOW_ATM_PHYS
0303 IF ( useAtm_Phys ) CALL ATM_PHYS_TENDENCY_APPLY_V(
0304 U gV_arr,
0305 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0306 I myTime, myIter, myThid )
e874fa47e5 Jean*0307 #endif /* ALLOW_ATM_PHYS */
0308
0309 #ifdef ALLOW_FIZHI
0310 IF ( useFIZHI ) CALL FIZHI_TENDENCY_APPLY_V(
0311 U gV_arr,
0312 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0313 I myTime, myIter, myThid )
e874fa47e5 Jean*0314 #endif /* ALLOW_FIZHI */
0315
614bfb3d2a Jean*0316
0317 IF ( momTidalForcing ) THEN
0318 DO j=1,sNy+1
0319 DO i=0,sNx+1
0320 gV_arr(i,j) = gV_arr(i,j)
0321 & - recip_dyC(i,j,bi,bj)*recip_deepFacC(k)
0322 & *( phiTide2d(i,j,bi,bj) - phiTide2d(i,j-1,bi,bj) )
0323 & *_maskS(i,j,k,bi,bj)
0324 ENDDO
0325 ENDDO
0326 ENDIF
0327
e874fa47e5 Jean*0328
0329 IF ( k .EQ. kSurface ) THEN
0330 DO j=1,sNy+1
0331
0332
0333 DO i=0,sNx+1
0334 gV_arr(i,j) = gV_arr(i,j)
0335 & +foFacMom*surfaceForcingV(i,j,bi,bj)
0336 & *recip_drF(k)*_recip_hFacS(i,j,k,bi,bj)
0337 ENDDO
0338 ENDDO
0339 ELSEIF ( kSurface.EQ.-1 ) THEN
0340 DO j=1,sNy+1
0341 DO i=0,sNx+1
0342 IF ( kSurfS(i,j,bi,bj).EQ.k ) THEN
0343 gV_arr(i,j) = gV_arr(i,j)
0344 & +foFacMom*surfaceForcingV(i,j,bi,bj)
0345 & *recip_drF(k)*_recip_hFacS(i,j,k,bi,bj)
0346 ENDIF
0347 ENDDO
0348 ENDDO
0349 ENDIF
0350
0351 #ifdef ALLOW_EDDYPSI
0352 CALL TAUEDDY_TENDENCY_APPLY_V(
0353 U gV_arr,
0354 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0355 I myTime, myIter, myThid )
e874fa47e5 Jean*0356 #endif
0357
0358 #ifdef ALLOW_RBCS
0359 IF (useRBCS) THEN
0360 CALL RBCS_ADD_TENDENCY(
0361 U gV_arr,
0362 I k, bi, bj, -2,
2c160c3ab4 Jean*0363 I myTime, myIter, myThid )
e874fa47e5 Jean*0364 ENDIF
0365 #endif /* ALLOW_RBCS */
0366
0367 #ifdef ALLOW_OBCS
0368 IF (useOBCS) THEN
0369 CALL OBCS_SPONGE_V(
0370 U gV_arr,
0371 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0372 I myTime, myIter, myThid )
e874fa47e5 Jean*0373 ENDIF
0374 #endif /* ALLOW_OBCS */
0375
0376 #ifdef ALLOW_MYPACKAGE
0377 IF ( useMYPACKAGE ) THEN
0378 CALL MYPACKAGE_TENDENCY_APPLY_V(
0379 U gV_arr,
0380 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0381 I myTime, myIter, myThid )
e874fa47e5 Jean*0382 ENDIF
0383 #endif /* ALLOW_MYPACKAGE */
0384
0385 #endif /* USE_OLD_EXTERNAL_FORCING */
0386
0387 RETURN
0388 END
0389
0390
0391
0392
0393
0394 SUBROUTINE APPLY_FORCING_T(
0395 U gT_arr,
0396 I iMin,iMax,jMin,jMax, k, bi, bj,
0397 I myTime, myIter, myThid )
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409 IMPLICIT NONE
0410
0411 #include "SIZE.h"
0412 #include "EEPARAMS.h"
0413 #include "PARAMS.h"
0414 #include "GRID.h"
0415 #include "DYNVARS.h"
0416 #include "FFIELDS.h"
0417 #include "SURFACE.h"
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428 _RL gT_arr(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0429 INTEGER iMin, iMax, jMin, jMax
0430 INTEGER k, bi, bj
0431 _RL myTime
0432 INTEGER myIter
0433 INTEGER myThid
0434
0435
0436
0437
0438 INTEGER i, j
5a705ed756 Jean*0439 #ifndef USE_OLD_EXTERNAL_FORCING
e874fa47e5 Jean*0440 INTEGER kSurface
0441 INTEGER km, kc, kp
5a705ed756 Jean*0442 _RL tmpVar(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
e874fa47e5 Jean*0443 _RL tmpFac, delPI
0444 _RL recip_Cp
5a705ed756 Jean*0445 #endif /* USE_OLD_EXTERNAL_FORCING */
0446
e874fa47e5 Jean*0447
0448 #ifdef USE_OLD_EXTERNAL_FORCING
0449
0450 DO j=1-OLy,sNy+OLy
0451 DO i=1-OLx,sNx+OLx
5a705ed756 Jean*0452 gT(i,j,k,bi,bj) = 0. _d 0
e874fa47e5 Jean*0453 ENDDO
0454 ENDDO
0455 CALL EXTERNAL_FORCING_T(
0456 I iMin, iMax, jMin, jMax, bi, bj, k,
0457 I myTime, myThid )
202e12438b Jean*0458 DO j=1-OLy,sNy+OLy
0459 DO i=1-OLx,sNx+OLx
5a705ed756 Jean*0460 gT_arr(i,j) = gT_arr(i,j) + gT(i,j,k,bi,bj)
e874fa47e5 Jean*0461 ENDDO
0462 ENDDO
0463
0464 #else /* USE_OLD_EXTERNAL_FORCING */
0465
0466 IF ( fluidIsAir ) THEN
0467 kSurface = 0
0468 ELSEIF ( usingZCoords .AND. useShelfIce ) THEN
0469 kSurface = -1
0470 ELSEIF ( usingPCoords ) THEN
0471 kSurface = Nr
0472 ELSE
0473 kSurface = 1
0474 ENDIF
0475 recip_Cp = 1. _d 0 / HeatCapacity_Cp
0476
5a705ed756 Jean*0477
0478
0479
0480
0481
e874fa47e5 Jean*0482
0483 #ifdef ALLOW_AIM
0484 IF ( useAIM ) CALL AIM_TENDENCY_APPLY_T(
0485 U gT_arr,
0486 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0487 I myTime, myIter, myThid )
e874fa47e5 Jean*0488 #endif /* ALLOW_AIM */
0489
0490 #ifdef ALLOW_ATM_PHYS
0491 IF ( useAtm_Phys ) CALL ATM_PHYS_TENDENCY_APPLY_T(
0492 U gT_arr,
0493 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0494 I myTime, myIter, myThid )
e874fa47e5 Jean*0495 #endif /* ALLOW_ATM_PHYS */
0496
0497 #ifdef ALLOW_FIZHI
0498 IF ( useFIZHI ) CALL FIZHI_TENDENCY_APPLY_T(
0499 U gT_arr,
0500 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0501 I myTime, myIter, myThid )
e874fa47e5 Jean*0502 #endif /* ALLOW_FIZHI */
0503
0504 #ifdef ALLOW_ADDFLUID
0505 IF ( selectAddFluid.NE.0 .AND. temp_addMass.NE.UNSET_RL ) THEN
0506 IF ( ( selectAddFluid.GE.1 .AND. nonlinFreeSurf.GT.0 )
0507 & .OR. convertFW2Salt.EQ.-1. _d 0 ) THEN
5a705ed756 Jean*0508 DO j=0,sNy+1
0509 DO i=0,sNx+1
e874fa47e5 Jean*0510 gT_arr(i,j) = gT_arr(i,j)
0511 & + addMass(i,j,k,bi,bj)*mass2rUnit
0512 & *( temp_addMass - theta(i,j,k,bi,bj) )
0513 & *recip_rA(i,j,bi,bj)
0514 & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
0515
0516 ENDDO
0517 ENDDO
0518 ELSE
5a705ed756 Jean*0519 DO j=0,sNy+1
0520 DO i=0,sNx+1
e874fa47e5 Jean*0521 gT_arr(i,j) = gT_arr(i,j)
0522 & + addMass(i,j,k,bi,bj)*mass2rUnit
0523 & *( temp_addMass - tRef(k) )
0524 & *recip_rA(i,j,bi,bj)
0525 & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
0526
0527 ENDDO
0528 ENDDO
0529 ENDIF
0530 ENDIF
0531 #endif /* ALLOW_ADDFLUID */
0532
0533 #ifdef ALLOW_FRICTION_HEATING
0534 IF ( addFrictionHeating ) THEN
0535 IF ( fluidIsAir ) THEN
0536
0537 tmpFac = (atm_Po/rC(k))**atm_kappa
0538
0539 tmpFac = (tmpFac/atm_Cp) * mass2rUnit
0540 ELSE
0541
0542 tmpFac = recip_Cp * mass2rUnit
0543 ENDIF
5a705ed756 Jean*0544 DO j=0,sNy+1
0545 DO i=0,sNx+1
e874fa47e5 Jean*0546 gT_arr(i,j) = gT_arr(i,j)
e24c9bfc82 Jean*0547 & + frictionHeating(i,j,k,bi,bj)*tmpFac
e874fa47e5 Jean*0548 & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
0549 ENDDO
0550 ENDDO
0551 ENDIF
0552 #endif /* ALLOW_FRICTION_HEATING */
0553
0554 IF ( fluidIsAir .AND. atm_Rq.NE.zeroRL .AND. Nr.NE.1 ) THEN
0555
0556
0557
0558
0559
0560
0561
0562
0563 tmpFac = (atm_Po/rC(k))**atm_kappa
0564
0565 tmpFac = tmpFac/atm_Cp
0566 km = k-1
0567 kc = k
0568 kp = k+1
0569 IF ( k.EQ.1 ) THEN
5a705ed756 Jean*0570 DO j=0,sNy+1
0571 DO i=0,sNx+1
e874fa47e5 Jean*0572 tmpVar(i,j) = 0.
0573 ENDDO
0574 ENDDO
0575 ELSE
0576 delPI = atm_Cp*( (rC(km)/atm_Po)**atm_kappa
0577 & - (rC(kc)/atm_Po)**atm_kappa )
5a705ed756 Jean*0578 DO j=0,sNy+1
0579 DO i=0,sNx+1
e874fa47e5 Jean*0580 tmpVar(i,j) = wVel(i,j,kc,bi,bj)*delPI*atm_Rq
0581 & *( theta(i,j,km,bi,bj)*salt(i,j,km,bi,bj)
0582 & + theta(i,j,kc,bi,bj)*salt(i,j,kc,bi,bj)
0583 & )*maskC(i,j,km,bi,bj)*0.25 _d 0
0584 ENDDO
0585 ENDDO
0586 ENDIF
0587 IF ( k.LT.Nr ) THEN
0588 delPI = atm_Cp*( (rC(kc)/atm_Po)**atm_kappa
0589 & - (rC(kp)/atm_Po)**atm_kappa )
5a705ed756 Jean*0590 DO j=0,sNy+1
0591 DO i=0,sNx+1
e874fa47e5 Jean*0592 tmpVar(i,j) = tmpVar(i,j)
0593 & + wVel(i,j,kp,bi,bj)*delPI*atm_Rq
0594 & *( theta(i,j,kc,bi,bj)*salt(i,j,kc,bi,bj)
0595 & + theta(i,j,kp,bi,bj)*salt(i,j,kp,bi,bj)
0596 & )*maskC(i,j,kp,bi,bj)*0.25 _d 0
0597 ENDDO
0598 ENDDO
0599 ENDIF
5a705ed756 Jean*0600 DO j=0,sNy+1
0601 DO i=0,sNx+1
e874fa47e5 Jean*0602 gT_arr(i,j) = gT_arr(i,j)
0603 & + tmpVar(i,j)*tmpFac
0604 & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
0605 ENDDO
0606 ENDDO
0607 #ifdef ALLOW_DIAGNOSTICS
0608 IF ( useDiagnostics ) THEN
0609
0610 tmpFac = rUnit2mass
0611 CALL DIAGNOSTICS_SCALE_FILL( tmpVar, tmpFac, 1,
5a705ed756 Jean*0612 & 'MoistCor', kc, 1, 2, bi,bj,myThid )
e874fa47e5 Jean*0613 ENDIF
0614 #endif /* ALLOW_DIAGNOSTICS */
0615 ENDIF
0616
0617
0618 IF ( k .EQ. kSurface ) THEN
5a705ed756 Jean*0619 DO j=0,sNy+1
0620 DO i=0,sNx+1
e874fa47e5 Jean*0621 gT_arr(i,j) = gT_arr(i,j)
0622 & +surfaceForcingT(i,j,bi,bj)
0623 & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
0624 ENDDO
0625 ENDDO
0626 ELSEIF ( kSurface.EQ.-1 ) THEN
5a705ed756 Jean*0627 DO j=0,sNy+1
0628 DO i=0,sNx+1
e874fa47e5 Jean*0629 IF ( kSurfC(i,j,bi,bj).EQ.k ) THEN
0630 gT_arr(i,j) = gT_arr(i,j)
0631 & +surfaceForcingT(i,j,bi,bj)
0632 & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
0633 ENDIF
0634 ENDDO
0635 ENDDO
0636 ENDIF
0637
0638 IF (linFSConserveTr) THEN
5a705ed756 Jean*0639 DO j=0,sNy+1
0640 DO i=0,sNx+1
0320e25227 Mart*0641 IF (k .EQ. kSurfC(i,j,bi,bj)) THEN
0642 gT_arr(i,j) = gT_arr(i,j)
e874fa47e5 Jean*0643 & +TsurfCor*recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
0320e25227 Mart*0644 ENDIF
e874fa47e5 Jean*0645 ENDDO
0646 ENDDO
0647 ENDIF
0648
90929f8806 Patr*0649 #ifdef ALLOW_GEOTHERMAL_FLUX
0650 IF ( usingZCoords ) THEN
5a705ed756 Jean*0651 DO j=0,sNy+1
0652 DO i=0,sNx+1
90929f8806 Patr*0653 IF ( k.EQ.kLowC(i,j,bi,bj) ) THEN
0654 gT_arr(i,j)=gT_arr(i,j)
0655 & + geothermalFlux(i,j,bi,bj)
0656 & *recip_Cp*mass2rUnit
0657 & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
0658 ENDIF
0659 ENDDO
0660 ENDDO
0320e25227 Mart*0661 ELSEIF ( kSurface .EQ. Nr ) THEN
0662
0663
0664 DO j=0,sNy+1
0665 DO i=0,sNx+1
0666 IF ( k.EQ.kSurfC(i,j,bi,bj) ) THEN
0667 gT_arr(i,j)=gT_arr(i,j)
0668 & + geothermalFlux(i,j,bi,bj)
0669 & *recip_Cp*mass2rUnit
0670 & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
0671 ENDIF
0672 ENDDO
0673 ENDDO
0674 ELSE
44d3986245 Jean*0675
0676 STOP 'ABNORMAL END: S/R APPLY_FORCING_T (geothermal-flux)'
90929f8806 Patr*0677 ENDIF
0678 #endif /* ALLOW_GEOTHERMAL_FLUX */
0679
e874fa47e5 Jean*0680 #ifdef SHORTWAVE_HEATING
0681
00c7090dc0 Mart*0682 IF ( selectPenetratingSW .GT. 0 ) THEN
5a705ed756 Jean*0683 DO j=0,sNy+1
0684 DO i=0,sNx+1
e874fa47e5 Jean*0685 gT_arr(i,j) = gT_arr(i,j)
00c7090dc0 Mart*0686 & + Qsw(i,j,bi,bj)*gravitySign
0687 & *( SWFrac3D(i,j,k,bi,bj) - SWFrac3D(i,j,k+1,bi,bj) )
0320e25227 Mart*0688 & *recip_Cp*mass2rUnit
0689 & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
e874fa47e5 Jean*0690 ENDDO
0691 ENDDO
00c7090dc0 Mart*0692 ENDIF
0320e25227 Mart*0693 #endif /* SHORTWAVE_HEATING */
e874fa47e5 Jean*0694
0695 #ifdef ALLOW_FRAZIL
0696 IF ( useFRAZIL )
0697 & CALL FRAZIL_TENDENCY_APPLY_T(
0698 U gT_arr,
0699 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0700 I myTime, myIter, myThid )
e874fa47e5 Jean*0701 #endif /* ALLOW_FRAZIL */
0702
0703 #ifdef ALLOW_SHELFICE
0704 IF ( useShelfIce )
0705 & CALL SHELFICE_FORCING_T(
0706 U gT_arr,
0707 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0708 I myTime, myIter, myThid )
e874fa47e5 Jean*0709 #endif /* ALLOW_SHELFICE */
0710
0711 #ifdef ALLOW_ICEFRONT
0712 IF ( useICEFRONT )
0713 & CALL ICEFRONT_TENDENCY_APPLY_T(
0714 U gT_arr,
2c160c3ab4 Jean*0715 I k, bi, bj, myTime, myIter, myThid )
e874fa47e5 Jean*0716 #endif /* ALLOW_ICEFRONT */
0717
0718 #ifdef ALLOW_SALT_PLUME
0719 IF ( useSALT_PLUME )
0720 & CALL SALT_PLUME_TENDENCY_APPLY_T(
0721 U gT_arr,
0722 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0723 I myTime, myIter, myThid )
e874fa47e5 Jean*0724 #endif /* ALLOW_SALT_PLUME */
0725
0726 #ifdef ALLOW_RBCS
0727 IF (useRBCS) THEN
0728 CALL RBCS_ADD_TENDENCY(
0729 U gT_arr,
0730 I k, bi, bj, 1,
2c160c3ab4 Jean*0731 I myTime, myIter, myThid )
e874fa47e5 Jean*0732 ENDIF
0733 #endif /* ALLOW_RBCS */
0734
0735 #ifdef ALLOW_OBCS
0736 IF (useOBCS) THEN
0737 CALL OBCS_SPONGE_T(
0738 U gT_arr,
0739 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0740 I myTime, myIter, myThid )
e874fa47e5 Jean*0741 ENDIF
0742 #endif /* ALLOW_OBCS */
0743
0744 #ifdef ALLOW_BBL
0745 IF ( useBBL ) CALL BBL_TENDENCY_APPLY_T(
0746 U gT_arr,
0747 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0748 I myTime, myIter, myThid )
e874fa47e5 Jean*0749 #endif /* ALLOW_BBL */
0750
0751 #ifdef ALLOW_MYPACKAGE
0752 IF ( useMYPACKAGE ) THEN
0753 CALL MYPACKAGE_TENDENCY_APPLY_T(
0754 U gT_arr,
0755 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0756 I myTime, myIter, myThid )
e874fa47e5 Jean*0757 ENDIF
0758 #endif /* ALLOW_MYPACKAGE */
0759
0760 #endif /* USE_OLD_EXTERNAL_FORCING */
0761
0762 RETURN
0763 END
0764
0765
0766
0767
0768
0769 SUBROUTINE APPLY_FORCING_S(
0770 U gS_arr,
0771 I iMin,iMax,jMin,jMax, k, bi, bj,
0772 I myTime, myIter, myThid )
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784 IMPLICIT NONE
0785
0786 #include "SIZE.h"
0787 #include "EEPARAMS.h"
0788 #include "PARAMS.h"
0789 #include "GRID.h"
0790 #include "DYNVARS.h"
0791 #include "FFIELDS.h"
0792 #include "SURFACE.h"
0793
0794
0795
0796
0797
0798
0799
0800
0801
0802
0803 _RL gS_arr(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0804 INTEGER iMin, iMax, jMin, jMax
0805 INTEGER k, bi, bj
0806 _RL myTime
0807 INTEGER myIter
0808 INTEGER myThid
0809
0810
0811
0812
0813 INTEGER i, j
5a705ed756 Jean*0814 #ifndef USE_OLD_EXTERNAL_FORCING
e874fa47e5 Jean*0815 INTEGER kSurface
5a705ed756 Jean*0816 #endif /* USE_OLD_EXTERNAL_FORCING */
e874fa47e5 Jean*0817
0818
0819 #ifdef USE_OLD_EXTERNAL_FORCING
0820
0821 DO j=1-OLy,sNy+OLy
0822 DO i=1-OLx,sNx+OLx
5a705ed756 Jean*0823 gS(i,j,k,bi,bj) = 0. _d 0
e874fa47e5 Jean*0824 ENDDO
0825 ENDDO
0826 CALL EXTERNAL_FORCING_S(
0827 I iMin, iMax, jMin, jMax, bi, bj, k,
0828 I myTime, myThid )
0829 DO j=1-OLy,sNy+OLy
0830 DO i=1-OLx,sNx+OLx
5a705ed756 Jean*0831 gS_arr(i,j) = gS_arr(i,j) + gS(i,j,k,bi,bj)
e874fa47e5 Jean*0832 ENDDO
0833 ENDDO
0834
0835 #else /* USE_OLD_EXTERNAL_FORCING */
0836
0837 IF ( fluidIsAir ) THEN
0838 kSurface = 0
0839 ELSEIF ( usingZCoords .AND. useShelfIce ) THEN
0840 kSurface = -1
0841 ELSEIF ( usingPCoords ) THEN
0842 kSurface = Nr
0843 ELSE
0844 kSurface = 1
0845 ENDIF
0846
5a705ed756 Jean*0847
0848
0849
0850
0851
e874fa47e5 Jean*0852
0853 #ifdef ALLOW_AIM
0854 IF ( useAIM ) CALL AIM_TENDENCY_APPLY_S(
0855 U gS_arr,
0856 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0857 I myTime, myIter, myThid )
e874fa47e5 Jean*0858 #endif /* ALLOW_AIM */
0859
0860 #ifdef ALLOW_ATM_PHYS
0861 IF ( useAtm_Phys ) CALL ATM_PHYS_TENDENCY_APPLY_S(
0862 U gS_arr,
0863 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0864 I myTime, myIter, myThid )
e874fa47e5 Jean*0865 #endif /* ALLOW_ATM_PHYS */
0866
0867 #ifdef ALLOW_FIZHI
0868 IF ( useFIZHI ) CALL FIZHI_TENDENCY_APPLY_S(
0869 U gS_arr,
0870 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0871 I myTime, myIter, myThid )
e874fa47e5 Jean*0872 #endif /* ALLOW_FIZHI */
0873
0874 #ifdef ALLOW_ADDFLUID
0875 IF ( selectAddFluid.NE.0 .AND. salt_addMass.NE.UNSET_RL ) THEN
0876 IF ( ( selectAddFluid.GE.1 .AND. nonlinFreeSurf.GT.0 )
0877 & .OR. convertFW2Salt.EQ.-1. _d 0 ) THEN
5a705ed756 Jean*0878 DO j=0,sNy+1
0879 DO i=0,sNx+1
e874fa47e5 Jean*0880 gS_arr(i,j) = gS_arr(i,j)
0881 & + addMass(i,j,k,bi,bj)*mass2rUnit
0882 & *( salt_addMass - salt(i,j,k,bi,bj) )
0883 & *recip_rA(i,j,bi,bj)
0884 & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
0885
0886 ENDDO
0887 ENDDO
0888 ELSE
5a705ed756 Jean*0889 DO j=0,sNy+1
0890 DO i=0,sNx+1
e874fa47e5 Jean*0891 gS_arr(i,j) = gS_arr(i,j)
0892 & + addMass(i,j,k,bi,bj)*mass2rUnit
0893 & *( salt_addMass - sRef(k) )
0894 & *recip_rA(i,j,bi,bj)
0895 & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
0896
0897 ENDDO
0898 ENDDO
0899 ENDIF
0900 ENDIF
0901 #endif /* ALLOW_ADDFLUID */
0902
0903
0904 IF ( k .EQ. kSurface ) THEN
5a705ed756 Jean*0905 DO j=0,sNy+1
0906 DO i=0,sNx+1
e874fa47e5 Jean*0907 gS_arr(i,j) = gS_arr(i,j)
0908 & +surfaceForcingS(i,j,bi,bj)
0909 & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
0910 ENDDO
0911 ENDDO
0912 ELSEIF ( kSurface.EQ.-1 ) THEN
5a705ed756 Jean*0913 DO j=0,sNy+1
0914 DO i=0,sNx+1
e874fa47e5 Jean*0915 IF ( kSurfC(i,j,bi,bj).EQ.k ) THEN
0916 gS_arr(i,j) = gS_arr(i,j)
0917 & +surfaceForcingS(i,j,bi,bj)
0918 & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
0919 ENDIF
0920 ENDDO
0921 ENDDO
0922 ENDIF
0923
0924 IF (linFSConserveTr) THEN
5a705ed756 Jean*0925 DO j=0,sNy+1
0926 DO i=0,sNx+1
0320e25227 Mart*0927 IF (k .EQ. kSurfC(i,j,bi,bj)) THEN
0928 gS_arr(i,j) = gS_arr(i,j)
e874fa47e5 Jean*0929 & +SsurfCor*recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
0320e25227 Mart*0930 ENDIF
e874fa47e5 Jean*0931 ENDDO
0932 ENDDO
0933 ENDIF
0934
0935 #ifdef ALLOW_SHELFICE
0936 IF ( useShelfIce )
0937 & CALL SHELFICE_FORCING_S(
0938 U gS_arr,
0939 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0940 I myTime, myIter, myThid )
e874fa47e5 Jean*0941 #endif /* ALLOW_SHELFICE */
0942
0943 #ifdef ALLOW_ICEFRONT
0944 IF ( useICEFRONT )
0945 & CALL ICEFRONT_TENDENCY_APPLY_S(
0946 U gS_arr,
2c160c3ab4 Jean*0947 I k, bi, bj, myTime, myIter, myThid )
e874fa47e5 Jean*0948 #endif /* ALLOW_ICEFRONT */
0949
0950 #ifdef ALLOW_SALT_PLUME
0951 IF ( useSALT_PLUME )
0952 & CALL SALT_PLUME_TENDENCY_APPLY_S(
0953 U gS_arr,
0954 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0955 I myTime, myIter, myThid )
e874fa47e5 Jean*0956 #endif /* ALLOW_SALT_PLUME */
0957
0958 #ifdef ALLOW_RBCS
0959 IF (useRBCS) THEN
0960 CALL RBCS_ADD_TENDENCY(
0961 U gS_arr,
0962 I k, bi, bj, 2,
2c160c3ab4 Jean*0963 I myTime, myIter, myThid )
e874fa47e5 Jean*0964 ENDIF
0965 #endif /* ALLOW_RBCS */
0966
0967 #ifdef ALLOW_OBCS
0968 IF (useOBCS) THEN
0969 CALL OBCS_SPONGE_S(
0970 U gS_arr,
0971 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0972 I myTime, myIter, myThid )
e874fa47e5 Jean*0973 ENDIF
0974 #endif /* ALLOW_OBCS */
0975
0976 #ifdef ALLOW_BBL
0977 IF ( useBBL ) CALL BBL_TENDENCY_APPLY_S(
0978 U gS_arr,
0979 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0980 I myTime, myIter, myThid )
e874fa47e5 Jean*0981 #endif /* ALLOW_BBL */
0982
0983 #ifdef ALLOW_MYPACKAGE
0984 IF ( useMYPACKAGE ) THEN
0985 CALL MYPACKAGE_TENDENCY_APPLY_S(
0986 U gS_arr,
0987 I iMin,iMax,jMin,jMax, k, bi,bj,
2c160c3ab4 Jean*0988 I myTime, myIter, myThid )
e874fa47e5 Jean*0989 ENDIF
0990 #endif /* ALLOW_MYPACKAGE */
0991
0992 #endif /* USE_OLD_EXTERNAL_FORCING */
0993
0994 RETURN
0995 END