File indexing completed on 2026-05-05 05:09:00 UTC
view on githubraw file Latest commit 3f0f10fc on 2026-05-04 14:55:37 UTC
f12f84b0ce Jean*0001 #include "SEAICE_OPTIONS.h"
0002 #ifdef ALLOW_GENERIC_ADVDIFF
0003 # include "GAD_OPTIONS.h"
0004 #endif
772b2ed80e Gael*0005 #ifdef ALLOW_AUTODIFF
0006 # include "AUTODIFF_OPTIONS.h"
0007 #endif
03105a7583 Mart*0008
0009
0010
0011
0012
0013
0014 SUBROUTINE SEAICE_ADVECTION(
0015 I tracerIdentity,
0d75a51072 Mart*0016 I advectionSchArg,
f12f84b0ce Jean*0017 I uFld, vFld, uTrans, vTrans, iceFld, r_hFld,
0018 O gFld, afx, afy,
03105a7583 Mart*0019 I bi, bj, myTime, myIter, myThid)
0020
0021
f12f84b0ce Jean*0022
03105a7583 Mart*0023
0024
f12f84b0ce Jean*0025
03105a7583 Mart*0026
0027
f12f84b0ce Jean*0028
0029
0030
03105a7583 Mart*0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044 IMPLICIT NONE
0045 #include "SIZE.h"
0046 #include "EEPARAMS.h"
0047 #include "PARAMS.h"
0048 #include "GRID.h"
7303eab4f2 Patr*0049 #include "SEAICE_SIZE.h"
03105a7583 Mart*0050 #include "SEAICE_PARAMS.h"
3f0f10fc37 Mart*0051 #include "SEAICE_GRID.h"
0d75a51072 Mart*0052 #include "SEAICE.h"
f12f84b0ce Jean*0053 #ifdef ALLOW_GENERIC_ADVDIFF
0054 # include "GAD.h"
0055 #endif
0d75a51072 Mart*0056 #ifdef ALLOW_AUTODIFF
0057 # include "AUTODIFF_PARAMS.h"
0058 #endif /* ALLOW_AUTODIFF */
03105a7583 Mart*0059 #ifdef ALLOW_AUTODIFF_TAMC
0060 # include "tamc.h"
fd1ff3e50c Patr*0061 # ifdef ALLOW_PTRACERS
0062 # include "PTRACERS_SIZE.h"
0063 # endif
0d75a51072 Mart*0064 #endif /* ALLOW_AUTODIFF_TAMC */
03105a7583 Mart*0065 #ifdef ALLOW_EXCH2
f9f661930b Jean*0066 #include "W2_EXCH2_SIZE.h"
03105a7583 Mart*0067 #include "W2_EXCH2_TOPOLOGY.h"
0068 #endif /* ALLOW_EXCH2 */
4a98994c14 Jean*0069 LOGICAL extensiveFld
0070 PARAMETER ( extensiveFld = .TRUE. )
03105a7583 Mart*0071
0072
a1ab12d5e7 Dimi*0073
0d75a51072 Mart*0074
f12f84b0ce Jean*0075
0076
0077
0078
0079
e8c00a82b3 Jean*0080
f12f84b0ce Jean*0081
0082
0083
0084
e8c00a82b3 Jean*0085
03105a7583 Mart*0086 INTEGER tracerIdentity
0d75a51072 Mart*0087 INTEGER advectionSchArg
f12f84b0ce Jean*0088 _RL uFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0089 _RL vFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0090 _RL uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0091 _RL vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0092 _RL iceFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0093 _RL r_hFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
03105a7583 Mart*0094 INTEGER bi,bj
0095 _RL myTime
0096 INTEGER myIter
0097 INTEGER myThid
0098
0099
f12f84b0ce Jean*0100
0101
0102
0103 _RL gFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0104 _RL afx (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0105 _RL afy (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
03105a7583 Mart*0106
e0fa1cecbf Mart*0107 #ifdef ALLOW_GENERIC_ADVDIFF
03105a7583 Mart*0108
0109
0110
0111
0112
f12f84b0ce Jean*0113
0114
03105a7583 Mart*0115
0d75a51072 Mart*0116
03105a7583 Mart*0117
f12f84b0ce Jean*0118
03105a7583 Mart*0119
0120
0121
0122
0123
0124
f12f84b0ce Jean*0125
03105a7583 Mart*0126
0127
0128
2264082a04 Jean*0129
03105a7583 Mart*0130 _RS maskLocW(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0131 _RS maskLocS(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0132 INTEGER iMin,iMax,jMin,jMax
0133 INTEGER iMinUpd,iMaxUpd,jMinUpd,jMaxUpd
0134 INTEGER i,j,k
0d75a51072 Mart*0135 INTEGER advectionScheme
03105a7583 Mart*0136 _RL af (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0137 _RL localTij(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0138 LOGICAL calc_fluxes_X, calc_fluxes_Y, withSigns
0139 LOGICAL interiorOnly, overlapOnly
0140 INTEGER nipass,ipass
0141 INTEGER nCFace
0142 LOGICAL N_edge, S_edge, E_edge, W_edge
2264082a04 Jean*0143 CHARACTER*(MAX_LEN_MBUF) msgBuf
03105a7583 Mart*0144 #ifdef ALLOW_EXCH2
0145 INTEGER myTile
0146 #endif
0147 #ifdef ALLOW_DIAGNOSTICS
0148 CHARACTER*8 diagName
37de51ebf5 Mart*0149 CHARACTER*4 SEAICE_DIAG_SUFX, diagSufx
0150 EXTERNAL SEAICE_DIAG_SUFX
03105a7583 Mart*0151 #endif
f12f84b0ce Jean*0152 LOGICAL dBug
23142459d0 Jean*0153 INTEGER ioUnit
f12f84b0ce Jean*0154 _RL tmpFac
7c50f07931 Mart*0155 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0156
0157
0158 INTEGER tkey, dkey
7c50f07931 Mart*0159 #endif
03105a7583 Mart*0160
0161
0d75a51072 Mart*0162
0163 advectionScheme = advectionSchArg
03105a7583 Mart*0164 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0165 tkey = bi + (bj-1)*nSx + (ikey_dynamics-1)*nSx*nSy
0166 tkey = tracerIdentity + (tkey-1)*maxpass
7c50f07931 Mart*0167 IF (tracerIdentity.GT.maxpass) THEN
1574069d50 Mart*0168 WRITE(msgBuf,'(A,2I5)')
0169 & 'SEAICE_ADVECTION: tracerIdentity > maxpass ',
0170 & tracerIdentity, maxpass
7c50f07931 Mart*0171 CALL PRINT_ERROR( msgBuf, myThid )
0172 STOP 'ABNORMAL END: S/R SEAICE_ADVECTION'
0173 ENDIF
8377b8ee87 Mart*0174 #endif /* ALLOW_AUTODIFF_TAMC */
0d75a51072 Mart*0175
8377b8ee87 Mart*0176 #ifdef ALLOW_AUTODIFF
0d75a51072 Mart*0177 IF ( inAdMode .AND. useApproxAdvectionInAdMode ) THEN
0178
0179
0180
0181
0182 IF ( advectionSchArg.EQ.ENUM_DST3_FLUX_LIMIT )
0183 & advectionScheme = ENUM_DST3
0184
0185 ENDIF
8377b8ee87 Mart*0186 #endif /* ALLOW_AUTODIFF */
03105a7583 Mart*0187
37de51ebf5 Mart*0188 #ifdef ALLOW_DIAGNOSTICS
0189
0190 IF ( useDiagnostics ) THEN
0191 diagSufx = SEAICE_DIAG_SUFX( tracerIdentity, myThid )
0192 ENDIF
0193 #endif
03105a7583 Mart*0194
23142459d0 Jean*0195 ioUnit = standardMessageUnit
0196 dBug = debugLevel.GE.debLevC
f12f84b0ce Jean*0197 & .AND. myIter.EQ.nIter0
0198 & .AND. ( tracerIdentity.EQ.GAD_HEFF .OR.
0199 & tracerIdentity.EQ.GAD_QICE2 )
0200
0201
03105a7583 Mart*0202
0203
0204
0205
0206
8377b8ee87 Mart*0207 #ifdef ALLOW_AUTODIFF
03105a7583 Mart*0208 DO j=1-OLy,sNy+OLy
0209 DO i=1-OLx,sNx+OLx
0210 localTij(i,j) = 0. _d 0
0211 ENDDO
0212 ENDDO
f12f84b0ce Jean*0213 #endif
03105a7583 Mart*0214
0215
0216 IF (useCubedSphereExchange) THEN
0217 nipass=3
0218 #ifdef ALLOW_EXCH2
c424ee7cc7 Jean*0219 myTile = W2_myTileList(bi,bj)
03105a7583 Mart*0220 nCFace = exch2_myFace(myTile)
0221 N_edge = exch2_isNedge(myTile).EQ.1
0222 S_edge = exch2_isSedge(myTile).EQ.1
0223 E_edge = exch2_isEedge(myTile).EQ.1
0224 W_edge = exch2_isWedge(myTile).EQ.1
0225 #else
0226 nCFace = bi
0227 N_edge = .TRUE.
0228 S_edge = .TRUE.
0229 E_edge = .TRUE.
0230 W_edge = .TRUE.
0231 #endif
0232 ELSE
0233 nipass=2
0234 nCFace = bi
0235 N_edge = .FALSE.
0236 S_edge = .FALSE.
0237 E_edge = .FALSE.
0238 W_edge = .FALSE.
0239 ENDIF
0240
0241 iMin = 1-OLx
0242 iMax = sNx+OLx
0243 jMin = 1-OLy
0244 jMax = sNy+OLy
1574069d50 Mart*0245 #ifdef ALLOW_AUTODIFF_TAMC
0246 IF ( nipass.GT.maxcube ) THEN
0247 WRITE(msgBuf,'(A,2(I3,A))') 'S/R SEAICE_ADVECTION: nipass =',
0248 & nipass, ' >', maxcube, ' = maxcube, ==> check "tamc.h"'
0249 CALL PRINT_ERROR( msgBuf, myThid )
0250 STOP 'ABNORMAL END: S/R SEAICE_ADVECTION'
0251 ENDIF
0252 #endif /* ALLOW_AUTODIFF_TAMC */
03105a7583 Mart*0253
0254 k = 1
f12f84b0ce Jean*0255
0256 #ifdef ALLOW_AUTODIFF_TAMC
0257
edb6656069 Mart*0258
03105a7583 Mart*0259 #endif /* ALLOW_AUTODIFF_TAMC */
0260
0261
0262
0263
f12f84b0ce Jean*0264
03105a7583 Mart*0265 DO j=1-OLy,sNy+OLy
0266 DO i=1-OLx,sNx+OLx
6299430b39 Jean*0267 localTij(i,j)=iceFld(i,j)
0268 #ifdef ALLOW_OBCS
ec0d7df165 Mart*0269 maskLocW(i,j) = SIMaskU(i,j,bi,bj)*maskInW(i,j,bi,bj)
0270 maskLocS(i,j) = SIMaskV(i,j,bi,bj)*maskInS(i,j,bi,bj)
6299430b39 Jean*0271 #else /* ALLOW_OBCS */
ec0d7df165 Mart*0272 maskLocW(i,j) = SIMaskU(i,j,bi,bj)
0273 maskLocS(i,j) = SIMaskV(i,j,bi,bj)
6299430b39 Jean*0274 #endif /* ALLOW_OBCS */
03105a7583 Mart*0275 ENDDO
0276 ENDDO
f12f84b0ce Jean*0277
8377b8ee87 Mart*0278 #ifdef ALLOW_AUTODIFF
f12f84b0ce Jean*0279
0280 DO j=1-OLy,sNy+OLy
0281 DO i=1-OLx,sNx+OLx
0282 afx(i,j) = 0.
0283 afy(i,j) = 0.
0284 ENDDO
0285 ENDDO
0286 #endif
0287
24fb6044b7 Patr*0288
03105a7583 Mart*0289 IF (useCubedSphereExchange) THEN
0290 withSigns = .FALSE.
f12f84b0ce Jean*0291 CALL FILL_CS_CORNER_UV_RS(
03105a7583 Mart*0292 & withSigns, maskLocW,maskLocS, bi,bj, myThid )
0293 ENDIF
24fb6044b7 Patr*0294
03105a7583 Mart*0295
0296
0297
0298 DO ipass=1,nipass
0299 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0300 dkey = ipass + (tkey-1)*maxcube
03105a7583 Mart*0301 #endif /* ALLOW_AUTODIFF_TAMC */
0302
0303 interiorOnly = .FALSE.
0304 overlapOnly = .FALSE.
0305 IF (useCubedSphereExchange) THEN
f12f84b0ce Jean*0306
03105a7583 Mart*0307 IF (ipass.EQ.1) THEN
0308 overlapOnly = MOD(nCFace,3).EQ.0
0309 interiorOnly = MOD(nCFace,3).NE.0
0310 calc_fluxes_X = nCFace.EQ.6 .OR. nCFace.EQ.1 .OR. nCFace.EQ.2
0311 calc_fluxes_Y = nCFace.EQ.3 .OR. nCFace.EQ.4 .OR. nCFace.EQ.5
0312 ELSEIF (ipass.EQ.2) THEN
0313 overlapOnly = MOD(nCFace,3).EQ.2
0314 calc_fluxes_X = nCFace.EQ.2 .OR. nCFace.EQ.3 .OR. nCFace.EQ.4
0315 calc_fluxes_Y = nCFace.EQ.5 .OR. nCFace.EQ.6 .OR. nCFace.EQ.1
0316 ELSE
0317 calc_fluxes_X = nCFace.EQ.5 .OR. nCFace.EQ.6
0318 calc_fluxes_Y = nCFace.EQ.2 .OR. nCFace.EQ.3
0319 ENDIF
0320 ELSE
0321
0322 calc_fluxes_X = MOD(ipass,2).EQ.1
0323 calc_fluxes_Y = .NOT.calc_fluxes_X
0324 ENDIF
23142459d0 Jean*0325 IF (dBug.AND.bi.EQ.3 ) WRITE(ioUnit,*)'ICE_adv:',tracerIdentity,
f12f84b0ce Jean*0326 & ipass,calc_fluxes_X,calc_fluxes_Y,overlapOnly,interiorOnly
0327
03105a7583 Mart*0328
0329
f12f84b0ce Jean*0330
03105a7583 Mart*0331 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0332
0333
b989892ba6 Patr*0334 # ifndef DISABLE_MULTIDIM_ADVECTION
edb6656069 Mart*0335
0336
b989892ba6 Patr*0337 # endif
03105a7583 Mart*0338 #endif /* ALLOW_AUTODIFF_TAMC */
0339
0340 IF (calc_fluxes_X) THEN
f12f84b0ce Jean*0341
03105a7583 Mart*0342
f12f84b0ce Jean*0343
03105a7583 Mart*0344
0345 IF ( .NOT.overlapOnly .OR. N_edge .OR. S_edge ) THEN
0346
f12f84b0ce Jean*0347
2264082a04 Jean*0348 DO j=1-OLy,sNy+OLy
0349 DO i=1-OLx,sNx+OLx
f12f84b0ce Jean*0350 af(i,j) = 0.
0351 ENDDO
0352 ENDDO
0353
24fb6044b7 Patr*0354
03105a7583 Mart*0355
0356 IF ( useCubedSphereExchange .AND.
0357 & ( overlapOnly .OR. ipass.EQ.1 ) ) THEN
93e3461d85 Jean*0358 CALL FILL_CS_CORNER_TR_RL( 1, .FALSE.,
1891130b05 Jean*0359 & localTij, bi,bj, myThid )
03105a7583 Mart*0360 ENDIF
24fb6044b7 Patr*0361
03105a7583 Mart*0362
0363 #ifdef ALLOW_AUTODIFF_TAMC
0364 # ifndef DISABLE_MULTIDIM_ADVECTION
f12f84b0ce Jean*0365
edb6656069 Mart*0366
03105a7583 Mart*0367 # endif
0368 #endif /* ALLOW_AUTODIFF_TAMC */
0369
0370 IF ( advectionScheme.EQ.ENUM_UPWIND_1RST
0371 & .OR. advectionScheme.EQ.ENUM_DST2 ) THEN
692dd30681 Jean*0372 CALL GAD_DST2U1_ADV_X( bi,bj,k, advectionScheme, .TRUE.,
0373 I SEAICE_deltaTtherm, uTrans, uFld, localTij,
03105a7583 Mart*0374 O af, myThid )
72f0014384 Jean*0375 IF ( dBug .AND. bi.EQ.3 ) THEN
0376 i=MIN(12,sNx)
0377 j=MIN(11,sNy)
23142459d0 Jean*0378 WRITE(ioUnit,'(A,1P4E14.6)') 'ICE_adv: xFx=', af(i+1,j),
72f0014384 Jean*0379 & localTij(i,j), uTrans(i+1,j), af(i+1,j)/uTrans(i+1,j)
0380 ENDIF
0d75a51072 Mart*0381 ELSEIF ( advectionScheme.EQ.ENUM_FLUX_LIMIT ) THEN
692dd30681 Jean*0382 CALL GAD_FLUXLIMIT_ADV_X( bi,bj,k, .TRUE.,
0383 I SEAICE_deltaTtherm, uTrans, uFld, maskLocW, localTij,
03105a7583 Mart*0384 O af, myThid )
0d75a51072 Mart*0385 ELSEIF ( advectionScheme.EQ.ENUM_DST3 ) THEN
692dd30681 Jean*0386 CALL GAD_DST3_ADV_X( bi,bj,k, .TRUE.,
0387 I SEAICE_deltaTtherm, uTrans, uFld, maskLocW, localTij,
03105a7583 Mart*0388 O af, myThid )
0d75a51072 Mart*0389 ELSEIF ( advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
692dd30681 Jean*0390 CALL GAD_DST3FL_ADV_X( bi,bj,k, .TRUE.,
0391 I SEAICE_deltaTtherm, uTrans, uFld, maskLocW, localTij,
03105a7583 Mart*0392 O af, myThid )
0d75a51072 Mart*0393 ELSEIF ( advectionScheme.EQ.ENUM_OS7MP ) THEN
72f0014384 Jean*0394 CALL GAD_OS7MP_ADV_X( bi,bj,k, .TRUE.,
b227b62e2b Mart*0395 I SEAICE_deltaTtherm, uTrans, uFld, maskLocW, localTij,
0396 O af, myThid )
598aebfcee Mart*0397 #ifndef ALLOW_AUTODIFF
0d75a51072 Mart*0398 ELSEIF ( advectionScheme.EQ.ENUM_PPM_NULL_LIMIT .OR.
0399 & advectionScheme.EQ.ENUM_PPM_MONO_LIMIT .OR.
0400 & advectionScheme.EQ.ENUM_PPM_WENO_LIMIT ) THEN
83ddf5a6c6 Mart*0401 CALL GAD_PPM_ADV_X( advectionScheme, bi, bj, k , .TRUE.,
0402 I SEAICE_deltaTtherm, uFld, uTrans, localTij,
0403 O af, myThid )
0d75a51072 Mart*0404 ELSEIF ( advectionScheme.EQ.ENUM_PQM_NULL_LIMIT .OR.
0405 & advectionScheme.EQ.ENUM_PQM_MONO_LIMIT .OR.
0406 & advectionScheme.EQ.ENUM_PQM_WENO_LIMIT ) THEN
83ddf5a6c6 Mart*0407 CALL GAD_PQM_ADV_X( advectionScheme, bi, bj, k , .TRUE.,
0408 I SEAICE_deltaTtherm, uFld, uTrans, localTij,
0409 O af, myThid )
b227b62e2b Mart*0410 #endif
03105a7583 Mart*0411 ELSE
f2f222dd0d Patr*0412 WRITE(msgBuf,'(A,I3,A)')
0413 & 'SEAICE_ADVECTION: adv. scheme ', advectionScheme,
0414 & ' incompatibale with multi-dim. adv.'
0415 CALL PRINT_ERROR( msgBuf, myThid )
0416 STOP 'ABNORMAL END: S/R SEAICE_ADVECTION'
03105a7583 Mart*0417 ENDIF
f12f84b0ce Jean*0418
03105a7583 Mart*0419
0420 ENDIF
f12f84b0ce Jean*0421
24fb6044b7 Patr*0422
03105a7583 Mart*0423
0424 IF ( overlapOnly .AND. ipass.EQ.1 ) THEN
93e3461d85 Jean*0425 CALL FILL_CS_CORNER_TR_RL( 2, .FALSE.,
1891130b05 Jean*0426 & localTij, bi,bj, myThid )
03105a7583 Mart*0427 ENDIF
24fb6044b7 Patr*0428
03105a7583 Mart*0429
f12f84b0ce Jean*0430
03105a7583 Mart*0431
0432
0433 IF ( overlapOnly ) THEN
f12f84b0ce Jean*0434 iMinUpd = 1-OLx+1
0435 iMaxUpd = sNx+OLx-1
0436
03105a7583 Mart*0437
0438 IF ( W_edge ) iMinUpd = 1
0439 IF ( E_edge ) iMaxUpd = sNx
f12f84b0ce Jean*0440
0441 IF ( S_edge .AND. extensiveFld ) THEN
0442 DO j=1-OLy,0
03105a7583 Mart*0443 DO i=iMinUpd,iMaxUpd
f12f84b0ce Jean*0444 localTij(i,j)=localTij(i,j)
e8c00a82b3 Jean*0445 & -SEAICE_deltaTtherm*maskInC(i,j,bi,bj)
03105a7583 Mart*0446 & *recip_rA(i,j,bi,bj)
f12f84b0ce Jean*0447 & *( af(i+1,j)-af(i,j)
0448 & )
0449 ENDDO
0450 ENDDO
0451 ELSEIF ( S_edge ) THEN
0452 DO j=1-OLy,0
0453 DO i=iMinUpd,iMaxUpd
0454 localTij(i,j)=localTij(i,j)
e8c00a82b3 Jean*0455 & -SEAICE_deltaTtherm*maskInC(i,j,bi,bj)
f12f84b0ce Jean*0456 & *recip_rA(i,j,bi,bj)*r_hFld(i,j)
0457 & *( (af(i+1,j)-af(i,j))
0458 & -(uTrans(i+1,j)-uTrans(i,j))*iceFld(i,j)
0459 & )
03105a7583 Mart*0460 ENDDO
0461 ENDDO
0462 ENDIF
f12f84b0ce Jean*0463 IF ( N_edge .AND. extensiveFld ) THEN
0464 DO j=sNy+1,sNy+OLy
03105a7583 Mart*0465 DO i=iMinUpd,iMaxUpd
f12f84b0ce Jean*0466 localTij(i,j)=localTij(i,j)
e8c00a82b3 Jean*0467 & -SEAICE_deltaTtherm*maskInC(i,j,bi,bj)
03105a7583 Mart*0468 & *recip_rA(i,j,bi,bj)
f12f84b0ce Jean*0469 & *( af(i+1,j)-af(i,j)
0470 & )
0471 ENDDO
0472 ENDDO
0473 ELSEIF ( N_edge ) THEN
0474 DO j=sNy+1,sNy+OLy
0475 DO i=iMinUpd,iMaxUpd
0476 localTij(i,j)=localTij(i,j)
e8c00a82b3 Jean*0477 & -SEAICE_deltaTtherm*maskInC(i,j,bi,bj)
f12f84b0ce Jean*0478 & *recip_rA(i,j,bi,bj)*r_hFld(i,j)
0479 & *( (af(i+1,j)-af(i,j))
0480 & -(uTrans(i+1,j)-uTrans(i,j))*iceFld(i,j)
0481 & )
03105a7583 Mart*0482 ENDDO
0483 ENDDO
0484 ENDIF
f12f84b0ce Jean*0485
0486 IF ( S_edge ) THEN
0487 DO j=1-OLy,0
0488 DO i=1-OLx+1,sNx+OLx
0489 afx(i,j) = af(i,j)
0490 ENDDO
0491 ENDDO
0492 ENDIF
0493 IF ( N_edge ) THEN
0494 DO j=sNy+1,sNy+OLy
0495 DO i=1-OLx+1,sNx+OLx
0496 afx(i,j) = af(i,j)
0497 ENDDO
0498 ENDDO
0499 ENDIF
0500
03105a7583 Mart*0501 ELSE
0502
f12f84b0ce Jean*0503 jMinUpd = 1-OLy
0504 jMaxUpd = sNy+OLy
03105a7583 Mart*0505 IF ( interiorOnly .AND. S_edge ) jMinUpd = 1
0506 IF ( interiorOnly .AND. N_edge ) jMaxUpd = sNy
f12f84b0ce Jean*0507 IF ( extensiveFld ) THEN
0508 DO j=jMinUpd,jMaxUpd
0509 DO i=1-OLx+1,sNx+OLx-1
0510 localTij(i,j)=localTij(i,j)
e8c00a82b3 Jean*0511 & -SEAICE_deltaTtherm*maskInC(i,j,bi,bj)
f12f84b0ce Jean*0512 & *recip_rA(i,j,bi,bj)
0513 & *( af(i+1,j)-af(i,j)
0514 & )
0515 ENDDO
03105a7583 Mart*0516 ENDDO
f12f84b0ce Jean*0517 ELSE
0518 DO j=jMinUpd,jMaxUpd
0519 DO i=1-OLx+1,sNx+OLx-1
0520 localTij(i,j)=localTij(i,j)
e8c00a82b3 Jean*0521 & -SEAICE_deltaTtherm*maskInC(i,j,bi,bj)
f12f84b0ce Jean*0522 & *recip_rA(i,j,bi,bj)*r_hFld(i,j)
0523 & *( (af(i+1,j)-af(i,j))
0524 & -(uTrans(i+1,j)-uTrans(i,j))*iceFld(i,j)
0525 & )
0526 ENDDO
03105a7583 Mart*0527 ENDDO
f12f84b0ce Jean*0528 ENDIF
0529
0530 DO j=jMinUpd,jMaxUpd
0531 DO i=1-OLx+1,sNx+OLx
0532 afx(i,j) = af(i,j)
0533 ENDDO
03105a7583 Mart*0534 ENDDO
0535
0536
0537 ENDIF
f12f84b0ce Jean*0538
03105a7583 Mart*0539
0540 ENDIF
f12f84b0ce Jean*0541
03105a7583 Mart*0542
0543
f12f84b0ce Jean*0544
03105a7583 Mart*0545 #ifdef ALLOW_AUTODIFF_TAMC
b989892ba6 Patr*0546 # ifndef DISABLE_MULTIDIM_ADVECTION
f12f84b0ce Jean*0547
edb6656069 Mart*0548
f12f84b0ce Jean*0549
edb6656069 Mart*0550
b989892ba6 Patr*0551 # endif
03105a7583 Mart*0552 #endif /* ALLOW_AUTODIFF_TAMC */
f12f84b0ce Jean*0553
03105a7583 Mart*0554 IF (calc_fluxes_Y) THEN
0555
0556
0557
0558
0559 IF ( .NOT.overlapOnly .OR. E_edge .OR. W_edge ) THEN
0560
f12f84b0ce Jean*0561
0562 DO j=1-OLy,sNy+OLy
0563 DO i=1-OLx,sNx+OLx
0564 af(i,j) = 0.
0565 ENDDO
0566 ENDDO
0567
24fb6044b7 Patr*0568
03105a7583 Mart*0569
0570 IF ( useCubedSphereExchange .AND.
0571 & ( overlapOnly .OR. ipass.EQ.1 ) ) THEN
93e3461d85 Jean*0572 CALL FILL_CS_CORNER_TR_RL( 2, .FALSE.,
1891130b05 Jean*0573 & localTij, bi,bj, myThid )
03105a7583 Mart*0574 ENDIF
24fb6044b7 Patr*0575
03105a7583 Mart*0576
f12f84b0ce Jean*0577 #ifdef ALLOW_AUTODIFF_TAMC
0d75a51072 Mart*0578 # ifndef DISABLE_MULTIDIM_ADVECTION
f12f84b0ce Jean*0579
edb6656069 Mart*0580
0d75a51072 Mart*0581 # endif
03105a7583 Mart*0582 #endif /* ALLOW_AUTODIFF_TAMC */
0583
0584 IF ( advectionScheme.EQ.ENUM_UPWIND_1RST
0585 & .OR. advectionScheme.EQ.ENUM_DST2 ) THEN
692dd30681 Jean*0586 CALL GAD_DST2U1_ADV_Y( bi,bj,k, advectionScheme, .TRUE.,
0587 I SEAICE_deltaTtherm, vTrans, vFld, localTij,
03105a7583 Mart*0588 O af, myThid )
72f0014384 Jean*0589 IF ( dBug .AND. bi.EQ.3 ) THEN
0590 i=MIN(12,sNx)
0591 j=MIN(11,sNy)
23142459d0 Jean*0592 WRITE(ioUnit,'(A,1P4E14.6)') 'ICE_adv: yFx=', af(i,j+1),
72f0014384 Jean*0593 & localTij(i,j), vTrans(i,j+1), af(i,j+1)/vTrans(i,j+1)
0594 ENDIF
0d75a51072 Mart*0595 ELSEIF ( advectionScheme.EQ.ENUM_FLUX_LIMIT ) THEN
692dd30681 Jean*0596 CALL GAD_FLUXLIMIT_ADV_Y( bi,bj,k, .TRUE.,
0597 I SEAICE_deltaTtherm, vTrans, vFld, maskLocS, localTij,
03105a7583 Mart*0598 O af, myThid )
0d75a51072 Mart*0599 ELSEIF( advectionScheme.EQ.ENUM_DST3 ) THEN
692dd30681 Jean*0600 CALL GAD_DST3_ADV_Y( bi,bj,k, .TRUE.,
0601 I SEAICE_deltaTtherm, vTrans, vFld, maskLocS, localTij,
03105a7583 Mart*0602 O af, myThid )
0d75a51072 Mart*0603 ELSEIF ( advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
692dd30681 Jean*0604 CALL GAD_DST3FL_ADV_Y( bi,bj,k, .TRUE.,
0605 I SEAICE_deltaTtherm, vTrans, vFld, maskLocS, localTij,
03105a7583 Mart*0606 O af, myThid )
0d75a51072 Mart*0607 ELSEIF ( advectionScheme.EQ.ENUM_OS7MP ) THEN
b227b62e2b Mart*0608 CALL GAD_OS7MP_ADV_Y( bi,bj,k, .TRUE.,
0609 I SEAICE_deltaTtherm, vTrans, vFld, maskLocS, localTij,
0610 O af, myThid )
598aebfcee Mart*0611 #ifndef ALLOW_AUTODIFF
0d75a51072 Mart*0612 ELSEIF ( advectionScheme.EQ.ENUM_PPM_NULL_LIMIT .OR.
0613 & advectionScheme.EQ.ENUM_PPM_MONO_LIMIT .OR.
0614 & advectionScheme.EQ.ENUM_PPM_WENO_LIMIT ) THEN
83ddf5a6c6 Mart*0615 CALL GAD_PPM_ADV_Y( advectionScheme, bi, bj, k , .TRUE.,
0616 I SEAICE_deltaTtherm, vFld, vTrans, localTij,
0617 O af, myThid )
0d75a51072 Mart*0618 ELSEIF ( advectionScheme.EQ.ENUM_PQM_NULL_LIMIT .OR.
0619 & advectionScheme.EQ.ENUM_PQM_MONO_LIMIT .OR.
0620 & advectionScheme.EQ.ENUM_PQM_WENO_LIMIT ) THEN
83ddf5a6c6 Mart*0621 CALL GAD_PQM_ADV_Y( advectionScheme, bi, bj, k , .TRUE.,
0622 I SEAICE_deltaTtherm, vFld, vTrans, localTij,
0623 O af, myThid )
b227b62e2b Mart*0624 #endif
03105a7583 Mart*0625 ELSE
f2f222dd0d Patr*0626 WRITE(msgBuf,'(A,I3,A)')
0627 & 'SEAICE_ADVECTION: adv. scheme ', advectionScheme,
0628 & ' incompatibale with multi-dim. adv.'
0629 CALL PRINT_ERROR( msgBuf, myThid )
0630 STOP 'ABNORMAL END: S/R SEAICE_ADVECTION'
03105a7583 Mart*0631 ENDIF
0632
0633
0634 ENDIF
0635
24fb6044b7 Patr*0636
03105a7583 Mart*0637
0638 IF ( overlapOnly .AND. ipass.EQ.1 ) THEN
93e3461d85 Jean*0639 CALL FILL_CS_CORNER_TR_RL( 1, .FALSE.,
1891130b05 Jean*0640 & localTij, bi,bj, myThid )
03105a7583 Mart*0641 ENDIF
24fb6044b7 Patr*0642
03105a7583 Mart*0643
f12f84b0ce Jean*0644
03105a7583 Mart*0645
0646
0647 IF ( overlapOnly ) THEN
f12f84b0ce Jean*0648 jMinUpd = 1-OLy+1
0649 jMaxUpd = sNy+OLy-1
0650
03105a7583 Mart*0651
0652 IF ( S_edge ) jMinUpd = 1
0653 IF ( N_edge ) jMaxUpd = sNy
f12f84b0ce Jean*0654
0655 IF ( W_edge .AND. extensiveFld ) THEN
03105a7583 Mart*0656 DO j=jMinUpd,jMaxUpd
f12f84b0ce Jean*0657 DO i=1-OLx,0
0658 localTij(i,j)=localTij(i,j)
e8c00a82b3 Jean*0659 & -SEAICE_deltaTtherm*maskInC(i,j,bi,bj)
03105a7583 Mart*0660 & *recip_rA(i,j,bi,bj)
f12f84b0ce Jean*0661 & *( af(i,j+1)-af(i,j)
0662 & )
0663 ENDDO
0664 ENDDO
0665 ELSEIF ( W_edge ) THEN
0666 DO j=jMinUpd,jMaxUpd
0667 DO i=1-OLx,0
0668 localTij(i,j)=localTij(i,j)
e8c00a82b3 Jean*0669 & -SEAICE_deltaTtherm*maskInC(i,j,bi,bj)
f12f84b0ce Jean*0670 & *recip_rA(i,j,bi,bj)*r_hFld(i,j)
0671 & *( (af(i,j+1)-af(i,j))
0672 & -(vTrans(i,j+1)-vTrans(i,j))*iceFld(i,j)
0673 & )
03105a7583 Mart*0674 ENDDO
0675 ENDDO
0676 ENDIF
f12f84b0ce Jean*0677 IF ( E_edge .AND. extensiveFld ) THEN
03105a7583 Mart*0678 DO j=jMinUpd,jMaxUpd
f12f84b0ce Jean*0679 DO i=sNx+1,sNx+OLx
0680 localTij(i,j)=localTij(i,j)
e8c00a82b3 Jean*0681 & -SEAICE_deltaTtherm*maskInC(i,j,bi,bj)
03105a7583 Mart*0682 & *recip_rA(i,j,bi,bj)
f12f84b0ce Jean*0683 & *( af(i,j+1)-af(i,j)
0684 & )
0685 ENDDO
0686 ENDDO
0687 ELSEIF ( E_edge ) THEN
0688 DO j=jMinUpd,jMaxUpd
0689 DO i=sNx+1,sNx+OLx
0690 localTij(i,j)=localTij(i,j)
e8c00a82b3 Jean*0691 & -SEAICE_deltaTtherm*maskInC(i,j,bi,bj)
f12f84b0ce Jean*0692 & *recip_rA(i,j,bi,bj)*r_hFld(i,j)
0693 & *( (af(i,j+1)-af(i,j))
0694 & -(vTrans(i,j+1)-vTrans(i,j))*iceFld(i,j)
0695 & )
03105a7583 Mart*0696 ENDDO
0697 ENDDO
0698 ENDIF
f12f84b0ce Jean*0699
0700 IF ( W_edge ) THEN
0701 DO j=1-OLy+1,sNy+OLy
0702 DO i=1-OLx,0
0703 afy(i,j) = af(i,j)
0704 ENDDO
0705 ENDDO
0706 ENDIF
0707 IF ( E_edge ) THEN
0708 DO j=1-OLy+1,sNy+OLy
0709 DO i=sNx+1,sNx+OLx
0710 afy(i,j) = af(i,j)
0711 ENDDO
0712 ENDDO
0713 ENDIF
0714
03105a7583 Mart*0715 ELSE
0716
f12f84b0ce Jean*0717 iMinUpd = 1-OLx
0718 iMaxUpd = sNx+OLx
03105a7583 Mart*0719 IF ( interiorOnly .AND. W_edge ) iMinUpd = 1
0720 IF ( interiorOnly .AND. E_edge ) iMaxUpd = sNx
f12f84b0ce Jean*0721 IF ( extensiveFld ) THEN
0722 DO j=1-OLy+1,sNy+OLy-1
0723 DO i=iMinUpd,iMaxUpd
0724 localTij(i,j)=localTij(i,j)
e8c00a82b3 Jean*0725 & -SEAICE_deltaTtherm*maskInC(i,j,bi,bj)
f12f84b0ce Jean*0726 & *recip_rA(i,j,bi,bj)
0727 & *( af(i,j+1)-af(i,j)
0728 & )
0729 ENDDO
03105a7583 Mart*0730 ENDDO
f12f84b0ce Jean*0731 ELSE
0732 DO j=1-OLy+1,sNy+OLy-1
0733 DO i=iMinUpd,iMaxUpd
0734 localTij(i,j)=localTij(i,j)
e8c00a82b3 Jean*0735 & -SEAICE_deltaTtherm*maskInC(i,j,bi,bj)
f12f84b0ce Jean*0736 & *recip_rA(i,j,bi,bj)*r_hFld(i,j)
0737 & *( (af(i,j+1)-af(i,j))
0738 & -(vTrans(i,j+1)-vTrans(i,j))*iceFld(i,j)
0739 & )
0740 ENDDO
03105a7583 Mart*0741 ENDDO
f12f84b0ce Jean*0742 ENDIF
0743
0744 DO j=1-OLy+1,sNy+OLy
0745 DO i=iMinUpd,iMaxUpd
0746 afy(i,j) = af(i,j)
0747 ENDDO
03105a7583 Mart*0748 ENDDO
0749
0750
0751 ENDIF
0752
0753
0754 ENDIF
0755
0756
0757 ENDDO
0758
f12f84b0ce Jean*0759
0760 DO j=1-OLy,sNy+OLy
0761 DO i=1-OLx,sNx+OLx
2096f95c9b Mart*0762 gFld(i,j)=(localTij(i,j)-iceFld(i,j))/SEAICE_deltaTtherm
03105a7583 Mart*0763 ENDDO
0764 ENDDO
2096f95c9b Mart*0765 IF ( dBug .AND. bi.EQ.3 ) THEN
72f0014384 Jean*0766 i=MIN(12,sNx)
0767 j=MIN(11,sNy)
2096f95c9b Mart*0768 tmpFac= SEAICE_deltaTtherm*recip_rA(i,j,bi,bj)
23142459d0 Jean*0769 WRITE(ioUnit,'(A,1P4E14.6)') 'ICE_adv:',
2096f95c9b Mart*0770 & afx(i,j)*tmpFac,afx(i+1,j)*tmpFac,
0771 & afy(i,j)*tmpFac,afy(i,j+1)*tmpFac
0772 ENDIF
f12f84b0ce Jean*0773
37de51ebf5 Mart*0774 #ifdef ALLOW_DIAGNOSTICS
0775 IF ( useDiagnostics ) THEN
0776 diagName = 'ADVx'//diagSufx
0777 CALL DIAGNOSTICS_FILL(afx,diagName, k,1, 2,bi,bj, myThid)
0778 diagName = 'ADVy'//diagSufx
0779 CALL DIAGNOSTICS_FILL(afy,diagName, k,1, 2,bi,bj, myThid)
0780 ENDIF
0781 #endif
03105a7583 Mart*0782
0783 #ifdef ALLOW_DEBUG
be55146c1b Jean*0784 IF ( debugLevel .GE. debLevC
03105a7583 Mart*0785 & .AND. tracerIdentity.EQ.GAD_HEFF
0786 & .AND. k.LE.3 .AND. myIter.EQ.1+nIter0
0787 & .AND. nPx.EQ.1 .AND. nPy.EQ.1
0788 & .AND. useCubedSphereExchange ) THEN
0789 CALL DEBUG_CS_CORNER_UV( ' afx,afy from SEAICE_ADVECTION',
0790 & afx,afy, k, standardMessageUnit,bi,bj,myThid )
0791 ENDIF
0792 #endif /* ALLOW_DEBUG */
0793
e0fa1cecbf Mart*0794 #endif /* ALLOW_GENERIC_ADVDIFF */
03105a7583 Mart*0795 RETURN
0796 END