File indexing completed on 2025-11-15 13:23:50 UTC
view on githubraw file Latest commit b7411f1a on 2025-11-06 19:05:26 UTC
d676f916b2 Jean*0001 #include "AIM_OPTIONS.h"
0002
10308cbe80 Jean*0003
0004
0005
0006
0007
0008
0009
0010
7a648a6f78 Jean*0011
0012
0013
d676f916b2 Jean*0014 SUBROUTINE AIM_TENDENCY_APPLY_U(
73b1dccda0 Jean*0015 U gU_arr,
0016 I iMin,iMax,jMin,jMax, k, bi, bj,
0017 I myTime, myIter, myThid )
7a648a6f78 Jean*0018
d676f916b2 Jean*0019
0020
0021
0022
7a648a6f78 Jean*0023
0024
0025
d676f916b2 Jean*0026 IMPLICIT NONE
0027
0028
0029 #include "SIZE.h"
0030 #include "EEPARAMS.h"
0031 #include "PARAMS.h"
0032 #include "GRID.h"
0033 #include "DYNVARS.h"
7a648a6f78 Jean*0034 #ifdef ALLOW_FRICTION_HEATING
0035 # include "FFIELDS.h"
0036 #endif
d676f916b2 Jean*0037
299f32bec2 Jean*0038 #include "AIM_PARAMS.h"
d676f916b2 Jean*0039 #include "AIM2DYN.h"
0040
7a648a6f78 Jean*0041
73b1dccda0 Jean*0042
0043
0044
0045
0046
7a648a6f78 Jean*0047
73b1dccda0 Jean*0048
7a648a6f78 Jean*0049
73b1dccda0 Jean*0050 _RL gU_arr(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0051 INTEGER iMin, iMax, jMin, jMax
0052 INTEGER k, bi, bj
0053 _RL myTime
0054 INTEGER myIter
d676f916b2 Jean*0055 INTEGER myThid
7a648a6f78 Jean*0056
d676f916b2 Jean*0057
0058 #ifdef ALLOW_AIM
b407ffd59d Jean*0059
b7411f1a84 Jean*0060 #ifdef ALLOW_DIAGNOSTICS
10308cbe80 Jean*0061
1bc0e5d60a Davi*0062 COMMON /LOCAL_AIM_TENDENCY_APPLY_U/ aim_uStress,aim_KEuStr
7a648a6f78 Jean*0063 _RL aim_uStress(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0064 _RL aim_KEuStr (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0065 #endif
10308cbe80 Jean*0066
d676f916b2 Jean*0067
7a648a6f78 Jean*0068
d676f916b2 Jean*0069 INTEGER i, j
7a648a6f78 Jean*0070 _RL uStr_tmp
0071 #if ( defined ALLOW_FRICTION_HEATING ) || ( defined ALLOW_DIAGNOSTICS )
0072 _RL aim_dKE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0073 #endif
d676f916b2 Jean*0074
b7411f1a84 Jean*0075 #ifdef ALLOW_DIAGNOSTICS
7a648a6f78 Jean*0076 IF ( myTime.EQ.startTime .AND. k.EQ.1 ) THEN
b407ffd59d Jean*0077
7a648a6f78 Jean*0078 DO j=1-OLy,sNy+OLy
0079 DO i=1-OLx,sNx+OLx
b407ffd59d Jean*0080 aim_uStress(i,j,bi,bj) = 0.
1bc0e5d60a Davi*0081 aim_KEuStr(i,j,bi,bj) = 0.
b407ffd59d Jean*0082 ENDDO
0083 ENDDO
0084 ENDIF
7a648a6f78 Jean*0085 #endif
b407ffd59d Jean*0086
10308cbe80 Jean*0087
7a648a6f78 Jean*0088 IF ( k.EQ.Nr .AND. aim_dragStrato.GT.0. ) THEN
10308cbe80 Jean*0089
299f32bec2 Jean*0090
d676f916b2 Jean*0091 DO j=jMin,jMax
0092 DO i=iMin,iMax
73b1dccda0 Jean*0093 gU_arr(i,j) = gU_arr(i,j)
7a648a6f78 Jean*0094 & -maskW(i,j,k,bi,bj)*uVel(i,j,k,bi,bj)/aim_dragStrato
0095 #if ( defined ALLOW_FRICTION_HEATING ) || ( defined ALLOW_DIAGNOSTICS )
0096 aim_dKE(i,j) =
b0521bd135 Jean*0097 & -uVel(i,j,k,bi,bj)*uVel(i,j,k,bi,bj)/aim_dragStrato
0098 & *hFacW(i,j,k,bi,bj)*drF(k)*rUnit2mass
7a648a6f78 Jean*0099 #endif
299f32bec2 Jean*0100 ENDDO
0101 ENDDO
7a648a6f78 Jean*0102 ELSEIF ( k.EQ.1 ) THEN
299f32bec2 Jean*0103 DO j=jMin,jMax
0104 DO i=iMin,iMax
7a648a6f78 Jean*0105 IF ( maskW(i,j,k,bi,bj) .NE. 0. ) THEN
10308cbe80 Jean*0106 uStr_tmp =
d676f916b2 Jean*0107 & -( aim_drag(i-1,j,bi,bj)+aim_drag(i,j,bi,bj) )
7a648a6f78 Jean*0108 & * 0.5 _d 0 * uVel(i,j,k,bi,bj)
73b1dccda0 Jean*0109 gU_arr(i,j) = gU_arr(i,j)
0110 & + uStr_tmp*gravity*recip_drF(k)
0111 & * recip_hFacW(i,j,k,bi,bj)
b7411f1a84 Jean*0112 #ifdef ALLOW_DIAGNOSTICS
b407ffd59d Jean*0113 aim_uStress(i,j,bi,bj) = uStr_tmp
7a648a6f78 Jean*0114 #endif
ed936f6096 Jean*0115 #if ( defined ALLOW_FRICTION_HEATING ) || ( defined ALLOW_DIAGNOSTICS )
0116 aim_dKE(i,j) = uStr_tmp * uVel(i,j,k,bi,bj)
7a648a6f78 Jean*0117 ELSE
0118 aim_dKE(i,j) = 0.
0119 #endif
d676f916b2 Jean*0120 ENDIF
0121 ENDDO
0122 ENDDO
0123 ELSE
0124 DO j=jMin,jMax
0125 DO i=iMin,iMax
7a648a6f78 Jean*0126 IF ( maskW(i,j,k-1,bi,bj) .EQ. 0.
0127 & .AND. maskW(i,j,k,bi,bj) .NE. 0. ) THEN
10308cbe80 Jean*0128 uStr_tmp =
7a648a6f78 Jean*0129 & -( (1.-maskC(i-1,j,k-1,bi,bj))*aim_drag(i-1,j,bi,bj)
0130 & +(1.-maskC( i ,j,k-1,bi,bj))*aim_drag( i ,j,bi,bj)
0131 & )* 0.5 _d 0 * uVel(i,j,k,bi,bj)
73b1dccda0 Jean*0132 gU_arr(i,j) = gU_arr(i,j)
0133 & + uStr_tmp*gravity*recip_drF(k)
0134 & * recip_hFacW(i,j,k,bi,bj)
b7411f1a84 Jean*0135 #ifdef ALLOW_DIAGNOSTICS
b407ffd59d Jean*0136 aim_uStress(i,j,bi,bj) = uStr_tmp
7a648a6f78 Jean*0137 #endif
ed936f6096 Jean*0138 #if ( defined ALLOW_FRICTION_HEATING ) || ( defined ALLOW_DIAGNOSTICS )
0139 aim_dKE(i,j) = uStr_tmp * uVel(i,j,k,bi,bj)
7a648a6f78 Jean*0140 ELSE
0141 aim_dKE(i,j) = 0.
0142 #endif
d676f916b2 Jean*0143 ENDIF
0144 ENDDO
0145 ENDDO
0146 ENDIF
10308cbe80 Jean*0147
d676f916b2 Jean*0148
7a648a6f78 Jean*0149 #ifdef ALLOW_FRICTION_HEATING
0150 IF ( addFrictionHeating ) THEN
0151 DO j=1,sNy
0152 DO i=1,sNx
0153 frictionHeating(i,j,k,bi,bj) = frictionHeating(i,j,k,bi,bj)
e24c9bfc82 Jean*0154 & - halfRL * ( aim_dKE( i, j)*rAw( i, j,bi,bj)
0155 & + aim_dKE(i+1,j)*rAw(i+1,j,bi,bj)
0156 & )*recip_rA(i,j,bi,bj)
7a648a6f78 Jean*0157 ENDDO
0158 ENDDO
0159 ENDIF
0160 #endif /* ALLOW_FRICTION_HEATING */
b407ffd59d Jean*0161 #ifdef ALLOW_DIAGNOSTICS
ed936f6096 Jean*0162 IF ( usediagnostics ) THEN
0163 IF ( k.EQ.1 ) THEN
0164 DO j=jMin,jMax
0165 DO i=iMin,iMax
0166 aim_KEuStr(i,j,bi,bj) = aim_dKE(i,j)
0167 ENDDO
0168 ENDDO
0169 ELSE
0170 DO j=jMin,jMax
0171 DO i=iMin,iMax
0172 aim_KEuStr(i,j,bi,bj) = aim_KEuStr(i,j,bi,bj)
0173 & + aim_dKE(i,j)
0174 ENDDO
0175 ENDDO
0176 ENDIF
0177 IF ( k.EQ.Nr ) THEN
9340658285 Jean*0178 CALL DIAGNOSTICS_FILL( aim_uStress, 'UFLUX ',
1bc0e5d60a Davi*0179 & 0,1,1,bi,bj,myThid)
0180 CALL DIAGNOSTICS_FILL( aim_KEuStr, 'dKE_Ustr',
9340658285 Jean*0181 & 0,1,1,bi,bj,myThid)
ed936f6096 Jean*0182 ENDIF
b407ffd59d Jean*0183 ENDIF
ed936f6096 Jean*0184 #endif /* ALLOW_DIAGNOSTICS */
b407ffd59d Jean*0185
d676f916b2 Jean*0186 #endif /* ALLOW_AIM */
0187
0188 RETURN
0189 END
10308cbe80 Jean*0190
0191
7a648a6f78 Jean*0192
0193
0194
d676f916b2 Jean*0195 SUBROUTINE AIM_TENDENCY_APPLY_V(
73b1dccda0 Jean*0196 U gV_arr,
0197 I iMin,iMax,jMin,jMax, k, bi, bj,
0198 I myTime, myIter, myThid )
7a648a6f78 Jean*0199
d676f916b2 Jean*0200
0201
0202
0203
7a648a6f78 Jean*0204
0205
0206
d676f916b2 Jean*0207 IMPLICIT NONE
0208
0209
0210 #include "SIZE.h"
0211 #include "EEPARAMS.h"
0212 #include "PARAMS.h"
0213 #include "GRID.h"
0214 #include "DYNVARS.h"
7a648a6f78 Jean*0215 #ifdef ALLOW_FRICTION_HEATING
0216 # include "FFIELDS.h"
0217 #endif
d676f916b2 Jean*0218
299f32bec2 Jean*0219 #include "AIM_PARAMS.h"
d676f916b2 Jean*0220 #include "AIM2DYN.h"
0221
7a648a6f78 Jean*0222
73b1dccda0 Jean*0223
0224
0225
0226
0227
7a648a6f78 Jean*0228
73b1dccda0 Jean*0229
7a648a6f78 Jean*0230
73b1dccda0 Jean*0231 _RL gV_arr(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0232 INTEGER iMin, iMax, jMin, jMax
0233 INTEGER k, bi, bj
0234 _RL myTime
0235 INTEGER myIter
d676f916b2 Jean*0236 INTEGER myThid
7a648a6f78 Jean*0237
d676f916b2 Jean*0238
0239 #ifdef ALLOW_AIM
b407ffd59d Jean*0240
b7411f1a84 Jean*0241 #ifdef ALLOW_DIAGNOSTICS
7a648a6f78 Jean*0242
1bc0e5d60a Davi*0243 COMMON /LOCAL_AIM_TENDENCY_APPLY_V/ aim_vStress,aim_KEvStr
7a648a6f78 Jean*0244 _RL aim_vStress(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0245 _RL aim_KEvStr(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0246 #endif
10308cbe80 Jean*0247
d676f916b2 Jean*0248
7a648a6f78 Jean*0249
d676f916b2 Jean*0250 INTEGER i, j
7a648a6f78 Jean*0251 _RL vStr_tmp
0252 #if ( defined ALLOW_FRICTION_HEATING ) || ( defined ALLOW_DIAGNOSTICS )
0253 _RL aim_dKE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0254 #endif
d676f916b2 Jean*0255
b7411f1a84 Jean*0256 #ifdef ALLOW_DIAGNOSTICS
7a648a6f78 Jean*0257 IF ( myTime.EQ.startTime .AND. k.EQ.1 ) THEN
b407ffd59d Jean*0258
7a648a6f78 Jean*0259 DO j=1-OLy,sNy+OLy
0260 DO i=1-OLx,sNx+OLx
b407ffd59d Jean*0261 aim_vStress(i,j,bi,bj) = 0.
1bc0e5d60a Davi*0262 aim_KEvStr(i,j,bi,bj) = 0.
b407ffd59d Jean*0263 ENDDO
0264 ENDDO
0265 ENDIF
7a648a6f78 Jean*0266 #endif
b407ffd59d Jean*0267
10308cbe80 Jean*0268
7a648a6f78 Jean*0269 IF ( k.EQ.Nr .AND. aim_dragStrato.GT.0. ) THEN
10308cbe80 Jean*0270
299f32bec2 Jean*0271
0272 DO j=jMin,jMax
0273 DO i=iMin,iMax
73b1dccda0 Jean*0274 gV_arr(i,j) = gV_arr(i,j)
7a648a6f78 Jean*0275 & -maskS(i,j,k,bi,bj)*vVel(i,j,k,bi,bj)/aim_dragStrato
0276 #if ( defined ALLOW_FRICTION_HEATING ) || ( defined ALLOW_DIAGNOSTICS )
0277 aim_dKE(i,j) =
b0521bd135 Jean*0278 & -vVel(i,j,k,bi,bj)*vVel(i,j,k,bi,bj)/aim_dragStrato
0279 & *hFacS(i,j,k,bi,bj)*drF(k)*rUnit2mass
7a648a6f78 Jean*0280 #endif
299f32bec2 Jean*0281 ENDDO
0282 ENDDO
7a648a6f78 Jean*0283 ELSEIF ( k.EQ.1 ) THEN
d676f916b2 Jean*0284 DO j=jMin,jMax
0285 DO i=iMin,iMax
7a648a6f78 Jean*0286 IF ( maskS(i,j,k,bi,bj) .NE. 0. ) THEN
10308cbe80 Jean*0287 vStr_tmp =
d676f916b2 Jean*0288 & -( aim_drag(i,j-1,bi,bj)+aim_drag(i,j,bi,bj) )
7a648a6f78 Jean*0289 & * 0.5 _d 0 * vVel(i,j,k,bi,bj)
73b1dccda0 Jean*0290 gV_arr(i,j) = gV_arr(i,j)
0291 & + vStr_tmp*gravity*recip_drF(k)
0292 & * recip_hFacS(i,j,k,bi,bj)
b7411f1a84 Jean*0293 #ifdef ALLOW_DIAGNOSTICS
b407ffd59d Jean*0294 aim_vStress(i,j,bi,bj) = vStr_tmp
7a648a6f78 Jean*0295 #endif
ed936f6096 Jean*0296 #if ( defined ALLOW_FRICTION_HEATING ) || ( defined ALLOW_DIAGNOSTICS )
0297 aim_dKE(i,j) = vStr_tmp * vVel(i,j,k,bi,bj)
7a648a6f78 Jean*0298 ELSE
0299 aim_dKE(i,j) = 0.
0300 #endif
d676f916b2 Jean*0301 ENDIF
0302 ENDDO
0303 ENDDO
0304 ELSE
0305 DO j=jMin,jMax
0306 DO i=iMin,iMax
7a648a6f78 Jean*0307 IF ( maskS(i,j,k-1,bi,bj) .EQ. 0.
0308 & .AND. maskS(i,j,k,bi,bj) .NE. 0. ) THEN
10308cbe80 Jean*0309 vStr_tmp =
7a648a6f78 Jean*0310 & -( (1.-maskC(i,j-1,k-1,bi,bj))*aim_drag(i,j-1,bi,bj)
0311 & +(1.-maskC(i, j ,k-1,bi,bj))*aim_drag(i, j ,bi,bj)
0312 & )* 0.5 _d 0 * vVel(i,j,k,bi,bj)
73b1dccda0 Jean*0313 gV_arr(i,j) = gV_arr(i,j)
0314 & + vStr_tmp*gravity*recip_drF(k)
0315 & * recip_hFacS(i,j,k,bi,bj)
b7411f1a84 Jean*0316 #ifdef ALLOW_DIAGNOSTICS
b407ffd59d Jean*0317 aim_vStress(i,j,bi,bj) = vStr_tmp
7a648a6f78 Jean*0318 #endif
ed936f6096 Jean*0319 #if ( defined ALLOW_FRICTION_HEATING ) || ( defined ALLOW_DIAGNOSTICS )
0320 aim_dKE(i,j) = vStr_tmp * vVel(i,j,k,bi,bj)
7a648a6f78 Jean*0321 ELSE
0322 aim_dKE(i,j) = 0.
0323 #endif
d676f916b2 Jean*0324 ENDIF
0325 ENDDO
0326 ENDDO
0327 ENDIF
10308cbe80 Jean*0328
d676f916b2 Jean*0329
7a648a6f78 Jean*0330 #ifdef ALLOW_FRICTION_HEATING
0331 IF ( addFrictionHeating ) THEN
0332 DO j=1,sNy
0333 DO i=1,sNx
0334 frictionHeating(i,j,k,bi,bj) = frictionHeating(i,j,k,bi,bj)
e24c9bfc82 Jean*0335 & - halfRL * ( aim_dKE(i, j )*rAs(i, j, bi,bj)
0336 & + aim_dKE(i,j+1)*rAs(i,j+1,bi,bj)
0337 & )*recip_rA(i,j,bi,bj)
7a648a6f78 Jean*0338 ENDDO
0339 ENDDO
0340 ENDIF
0341 #endif /* ALLOW_FRICTION_HEATING */
b407ffd59d Jean*0342 #ifdef ALLOW_DIAGNOSTICS
ed936f6096 Jean*0343 IF ( usediagnostics ) THEN
0344 IF ( k.EQ.1 ) THEN
0345 DO j=jMin,jMax
0346 DO i=iMin,iMax
0347 aim_KEvStr(i,j,bi,bj) = aim_dKE(i,j)
0348 ENDDO
0349 ENDDO
0350 ELSE
0351 DO j=jMin,jMax
0352 DO i=iMin,iMax
0353 aim_KEvStr(i,j,bi,bj) = aim_KEvStr(i,j,bi,bj)
0354 & + aim_dKE(i,j)
0355 ENDDO
0356 ENDDO
0357 ENDIF
0358 IF ( k.EQ.Nr ) THEN
9340658285 Jean*0359 CALL DIAGNOSTICS_FILL( aim_vStress, 'VFLUX ',
1bc0e5d60a Davi*0360 & 0,1,1,bi,bj,myThid)
0361 CALL DIAGNOSTICS_FILL( aim_KEvStr, 'dKE_Vstr',
9340658285 Jean*0362 & 0,1,1,bi,bj,myThid)
ed936f6096 Jean*0363 ENDIF
b407ffd59d Jean*0364 ENDIF
ed936f6096 Jean*0365 #endif /* ALLOW_DIAGNOSTICS */
b407ffd59d Jean*0366
d676f916b2 Jean*0367 #endif /* ALLOW_AIM */
0368
0369 RETURN
0370 END
10308cbe80 Jean*0371
0372
7a648a6f78 Jean*0373
0374
0375
d676f916b2 Jean*0376 SUBROUTINE AIM_TENDENCY_APPLY_T(
73b1dccda0 Jean*0377 U gT_arr,
0378 I iMin,iMax,jMin,jMax, k, bi, bj,
0379 I myTime, myIter, myThid )
7a648a6f78 Jean*0380
d676f916b2 Jean*0381
0382
7a648a6f78 Jean*0383
d676f916b2 Jean*0384
7a648a6f78 Jean*0385
0386
0387
d676f916b2 Jean*0388 IMPLICIT NONE
0389
0390
0391 #include "SIZE.h"
0392 #include "EEPARAMS.h"
0393 #include "PARAMS.h"
0394 #include "GRID.h"
73b1dccda0 Jean*0395
d676f916b2 Jean*0396
0397 #include "AIM2DYN.h"
0398
7a648a6f78 Jean*0399
73b1dccda0 Jean*0400
0401
0402
0403
0404
7a648a6f78 Jean*0405
73b1dccda0 Jean*0406
7a648a6f78 Jean*0407
73b1dccda0 Jean*0408 _RL gT_arr(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0409 INTEGER iMin, iMax, jMin, jMax
0410 INTEGER k, bi, bj
0411 _RL myTime
0412 INTEGER myIter
d676f916b2 Jean*0413 INTEGER myThid
7a648a6f78 Jean*0414
d676f916b2 Jean*0415
0416 #ifdef ALLOW_AIM
0417
7a648a6f78 Jean*0418
d676f916b2 Jean*0419 INTEGER I, J
0420
0421
0422 DO J=1,sNy
0423 DO I=1,sNx
73b1dccda0 Jean*0424 gT_arr(i,j) = maskC(i,j,k,bi,bj)
0425 & *( gT_arr(i,j) + aim_dTdt(i,j,k,bi,bj) )
d676f916b2 Jean*0426 ENDDO
0427 ENDDO
0428
0429 #endif /* ALLOW_AIM */
0430
0431 RETURN
0432 END
10308cbe80 Jean*0433
0434
7a648a6f78 Jean*0435
73b1dccda0 Jean*0436
7a648a6f78 Jean*0437
d676f916b2 Jean*0438 SUBROUTINE AIM_TENDENCY_APPLY_S(
73b1dccda0 Jean*0439 U gS_arr,
0440 I iMin,iMax,jMin,jMax, k, bi, bj,
0441 I myTime, myIter, myThid )
7a648a6f78 Jean*0442
d676f916b2 Jean*0443
0444
7a648a6f78 Jean*0445
d676f916b2 Jean*0446
7a648a6f78 Jean*0447
0448
0449
d676f916b2 Jean*0450 IMPLICIT NONE
0451
0452
0453 #include "SIZE.h"
0454 #include "EEPARAMS.h"
0455 #include "PARAMS.h"
0456 #include "GRID.h"
73b1dccda0 Jean*0457
d676f916b2 Jean*0458
0459 #include "AIM2DYN.h"
0460
7a648a6f78 Jean*0461
73b1dccda0 Jean*0462
0463
0464
0465
0466
7a648a6f78 Jean*0467
73b1dccda0 Jean*0468
7a648a6f78 Jean*0469
73b1dccda0 Jean*0470 _RL gS_arr(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0471 INTEGER iMin, iMax, jMin, jMax
0472 INTEGER k, bi, bj
0473 _RL myTime
0474 INTEGER myIter
d676f916b2 Jean*0475 INTEGER myThid
7a648a6f78 Jean*0476
d676f916b2 Jean*0477
0478 #ifdef ALLOW_AIM
0479
7a648a6f78 Jean*0480
d676f916b2 Jean*0481 INTEGER I, J
0482
0483
0484 DO J=1,sNy
0485 DO I=1,sNx
73b1dccda0 Jean*0486 gS_arr(i,j) = maskC(i,j,k,bi,bj)
0487 & *( gS_arr(i,j) + aim_dSdt(i,j,k,bi,bj) )
d676f916b2 Jean*0488 ENDDO
0489 ENDDO
0490
0491 #endif /* ALLOW_AIM */
0492
0493 RETURN
0494 END