File indexing completed on 2026-05-05 05:09:05 UTC
view on githubraw file Latest commit 3f0f10fc on 2026-05-04 14:55:37 UTC
1cf549c217 Mart*0001 #include "SEAICE_OPTIONS.h"
0002 #ifdef ALLOW_EXF
0003 # include "EXF_OPTIONS.h"
0004 #endif
772b2ed80e Gael*0005 #ifdef ALLOW_AUTODIFF
0006 # include "AUTODIFF_OPTIONS.h"
0007 #endif
1cf549c217 Mart*0008
0009
0010
0011
0012 SUBROUTINE SEAICE_REG_RIDGE( myTime, myIter, myThid )
0013
0014
0015
0016
0017
925297a0db Jean*0018
0019
0020
1cf549c217 Mart*0021
0022
925297a0db Jean*0023
1cf549c217 Mart*0024
0025
0026
0027
0028
0029
0030 IMPLICIT NONE
0031
0032 #include "SIZE.h"
0033 #include "EEPARAMS.h"
0034 #include "PARAMS.h"
0035 #include "SEAICE_SIZE.h"
0036 #include "SEAICE_PARAMS.h"
3f0f10fc37 Mart*0037 #ifdef SEAICE_VARIABLE_SALINITY
0038 # include "SEAICE_GRID.h"
0039 #endif
1cf549c217 Mart*0040 #include "SEAICE.h"
0041 #include "SEAICE_TRACER.h"
0042 #ifdef ALLOW_EXF
0043 # include "EXF_FIELDS.h"
0044 #endif
0045 #ifdef ALLOW_AUTODIFF_TAMC
0046 # include "tamc.h"
0047 #endif /* ALLOW_AUTODIFF_TAMC */
0048
0049
0050
0051
0052
0053
0054 _RL myTime
0055 INTEGER myIter, myThid
0056
0057 #ifdef ALLOW_SEAICE
0058
0059
0060
0061 INTEGER i, j, bi, bj
0062
0063
925297a0db Jean*0064 INTEGER IT
1cf549c217 Mart*0065
0066 _RL recip_deltaTtherm
0067
0068 _RL tmpscal1, tmpscal2
0069 #ifdef SEAICE_ITD
0070 _RL tmpscal1itd(1:sNx,1:sNy), tmpscal2itd(1:sNx,1:sNy)
0071 _RL tmpscal3itd(1:sNx,1:sNy)
0072
0073 _RL recip_nitd
0074 #endif /* SEAICE_ITD */
0075 #ifdef ALLOW_DIAGNOSTICS
0076
0077 _RL DIAGarrayA (1:sNx,1:sNy)
0078 #endif /* ALLOW_DIAGNOSTICS */
7c50f07931 Mart*0079 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0080
0081 INTEGER tkey
7c50f07931 Mart*0082 #endif
1cf549c217 Mart*0083
0084
0085
0086
0087
0088 recip_deltaTtherm = ONE / SEAICE_deltaTtherm
0089
0090 DO bj=myByLo(myThid),myByHi(myThid)
0091 DO bi=myBxLo(myThid),myBxHi(myThid)
0092
0093 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0094 tkey = bi + (bj-1)*nSx + (ikey_dynamics-1)*nSx*nSy
1cf549c217 Mart*0095 #endif /* ALLOW_AUTODIFF_TAMC */
0096
8377b8ee87 Mart*0097 DO j=1-OLy,sNy+OLy
0098 DO i=1-OLx,sNx+OLx
0099 d_HEFFbyNEG(i,j,bi,bj) = 0.0 _d 0
0100 d_HSNWbyNEG(i,j,bi,bj) = 0.0 _d 0
1cf549c217 Mart*0101 #ifdef EXF_SEAICE_FRACTION
8377b8ee87 Mart*0102 d_AREAbyRLX(i,j,bi,bj) = 0.0 _d 0
0103 d_HEFFbyRLX(i,j,bi,bj) = 0.0 _d 0
1cf549c217 Mart*0104 #endif /* EXF_SEAICE_FRACTION */
0105 #ifdef SEAICE_VARIABLE_SALINITY
8377b8ee87 Mart*0106 saltFluxAdjust(i,j,bi,bj) = 0.0 _d 0
1cf549c217 Mart*0107 #endif /* SEAICE_VARIABLE_SALINITY */
0108 ENDDO
0109 ENDDO
0110
0111
0112
0113
0114
8377b8ee87 Mart*0115 #if (defined ALLOW_AUTODIFF && defined SEAICE_MODIFY_GROWTH_ADJ)
1cf549c217 Mart*0116
0117 IF ( SEAICEadjMODE.EQ.0 ) THEN
0118 #endif
0119
0120 #ifdef EXF_SEAICE_FRACTION
edb6656069 Mart*0121
0122
1cf549c217 Mart*0123
0124 IF ( SEAICE_tauAreaObsRelax .GT. zeroRL ) THEN
8377b8ee87 Mart*0125 DO j=1,sNy
0126 DO i=1,sNx
0127 IF ( exf_iceFraction(i,j,bi,bj).GT.AREA(i,j,bi,bj) ) THEN
1cf549c217 Mart*0128 d_AREAbyRLX(i,j,bi,bj) =
0129 & SEAICE_deltaTtherm/SEAICE_tauAreaObsRelax
8377b8ee87 Mart*0130 & * (exf_iceFraction(i,j,bi,bj) - AREA(i,j,bi,bj))
1cf549c217 Mart*0131 ENDIF
8377b8ee87 Mart*0132 IF ( exf_iceFraction(i,j,bi,bj).GT.zeroRS .AND.
0133 & AREA(i,j,bi,bj).EQ.0. _d 0) THEN
1cf549c217 Mart*0134
0135 d_HEFFbyRLX(i,j,bi,bj) = 1. _d 1 * siEps
0136 ENDIF
0137 #ifdef SEAICE_ITD
8377b8ee87 Mart*0138 AREAITD(i,j,1,bi,bj) = AREAITD(i,j,1,bi,bj)
1cf549c217 Mart*0139 & + d_AREAbyRLX(i,j,bi,bj)
8377b8ee87 Mart*0140 HEFFITD(i,j,1,bi,bj) = HEFFITD(i,j,1,bi,bj)
1cf549c217 Mart*0141 & + d_HEFFbyRLX(i,j,bi,bj)
0142 #endif /* SEAICE_ITD */
8377b8ee87 Mart*0143 AREA(i,j,bi,bj) = AREA(i,j,bi,bj) + d_AREAbyRLX(i,j,bi,bj)
0144 HEFF(i,j,bi,bj) = HEFF(i,j,bi,bj) + d_HEFFbyRLX(i,j,bi,bj)
1cf549c217 Mart*0145 ENDDO
0146 ENDDO
0147 ENDIF
0148 #endif /* EXF_SEAICE_FRACTION */
0149
0150
0151
0152 #ifdef SEAICE_ITD
cb071e52ee Mart*0153 DO IT=1,SEAICE_multDim
8377b8ee87 Mart*0154 DO j=1,sNy
0155 DO i=1,sNx
1cf549c217 Mart*0156 tmpscal1=0. _d 0
0157 tmpscal2=0. _d 0
8377b8ee87 Mart*0158 tmpscal1=MAX(-HEFFITD(i,j,IT,bi,bj),0. _d 0)
0159 HEFFITD(i,j,IT,bi,bj)=HEFFITD(i,j,IT,bi,bj)+tmpscal1
0160 d_HEFFbyNEG(i,j,bi,bj)=d_HEFFbyNEG(i,j,bi,bj)+tmpscal1
0161 tmpscal2=MAX(-HSNOWITD(i,j,IT,bi,bj),0. _d 0)
0162 HSNOWITD(i,j,IT,bi,bj)=HSNOWITD(i,j,IT,bi,bj)+tmpscal2
0163 d_HSNWbyNEG(i,j,bi,bj)=d_HSNWbyNEG(i,j,bi,bj)+tmpscal2
0164 AREAITD(i,j,IT,bi,bj)=MAX(AREAITD(i,j,IT,bi,bj),0. _d 0)
1cf549c217 Mart*0165
0166
0167 ENDDO
0168 ENDDO
0169 ENDDO
925297a0db Jean*0170
cb071e52ee Mart*0171
0172 CALL SEAICE_ITD_SUM ( bi, bj, myTime, myIter, myThid )
1cf549c217 Mart*0173 #else /* ndef SEAICE_ITD */
0174 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0175
0176
0177
1cf549c217 Mart*0178 #endif /* ALLOW_AUTODIFF_TAMC */
8377b8ee87 Mart*0179 DO j=1,sNy
0180 DO i=1,sNx
0181 d_HEFFbyNEG(i,j,bi,bj)=MAX(-HEFF(i,j,bi,bj),0. _d 0)
0182 HEFF(i,j,bi,bj)=HEFF(i,j,bi,bj)+d_HEFFbyNEG(i,j,bi,bj)
0183 d_HSNWbyNEG(i,j,bi,bj)=MAX(-HSNOW(i,j,bi,bj),0. _d 0)
0184 HSNOW(i,j,bi,bj)=HSNOW(i,j,bi,bj)+d_HSNWbyNEG(i,j,bi,bj)
0185 AREA(i,j,bi,bj)=MAX(AREA(i,j,bi,bj),0. _d 0)
1cf549c217 Mart*0186 ENDDO
0187 ENDDO
0188 #endif /* SEAICE_ITD */
0189
0190
0191
0192 #ifdef SEAICE_ITD
cb071e52ee Mart*0193
0194
925297a0db Jean*0195
cb071e52ee Mart*0196
0197
0198 DO IT=1,SEAICE_multDim
8377b8ee87 Mart*0199 DO j=1,sNy
0200 DO i=1,sNx
0201 IF (HEFF(i,j,bi,bj).LE.siEps) THEN
0202 HEFFITD(i,j,IT,bi,bj) = 0. _d 0
0203 HSNOWITD(i,j,IT,bi,bj) = 0. _d 0
1cf549c217 Mart*0204 ENDIF
0205 ENDDO
0206 ENDDO
0207 ENDDO
cb071e52ee Mart*0208 #endif /* SEAICE_ITD */
1cf549c217 Mart*0209 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0210
3c775cbf98 Mart*0211
0212
0213
0214
0215
0216
1cf549c217 Mart*0217 #endif /* ALLOW_AUTODIFF_TAMC */
8377b8ee87 Mart*0218 DO j=1,sNy
0219 DO i=1,sNx
1cf549c217 Mart*0220 tmpscal1=0. _d 0
0221 tmpscal2=0. _d 0
8377b8ee87 Mart*0222 IF (HEFF(i,j,bi,bj).LE.siEps) THEN
0223 tmpscal1=-HEFF(i,j,bi,bj)
0224 tmpscal2=-HSNOW(i,j,bi,bj)
1cf549c217 Mart*0225 DO IT=1,SEAICE_multDim
8377b8ee87 Mart*0226 TICES(i,j,IT,bi,bj)=celsius2K
1cf549c217 Mart*0227 ENDDO
0228 ENDIF
8377b8ee87 Mart*0229 HEFF(i,j,bi,bj)=HEFF(i,j,bi,bj)+tmpscal1
0230 HSNOW(i,j,bi,bj)=HSNOW(i,j,bi,bj)+tmpscal2
0231 d_HEFFbyNEG(i,j,bi,bj)=d_HEFFbyNEG(i,j,bi,bj)+tmpscal1
0232 d_HSNWbyNEG(i,j,bi,bj)=d_HSNWbyNEG(i,j,bi,bj)+tmpscal2
1cf549c217 Mart*0233 ENDDO
0234 ENDDO
0235
0236
0237
0238 #ifdef SEAICE_ITD
cb071e52ee Mart*0239 DO IT=1,SEAICE_multDim
8377b8ee87 Mart*0240 DO j=1,sNy
0241 DO i=1,sNx
0242 IF ( (HEFFITD(i,j,IT,bi,bj) .EQ.0. _d 0).AND.
0243 & (HSNOWITD(i,j,IT,bi,bj).EQ.0. _d 0))
0244 & AREAITD(i,j,IT,bi,bj)=0. _d 0
1cf549c217 Mart*0245 ENDDO
0246 ENDDO
0247 ENDDO
0248 #else /* ndef SEAICE_ITD */
0249 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0250
0251
1cf549c217 Mart*0252 #endif /* ALLOW_AUTODIFF_TAMC */
8377b8ee87 Mart*0253 DO j=1,sNy
0254 DO i=1,sNx
1cf549c217 Mart*0255 IF ((HEFF(i,j,bi,bj).EQ.0. _d 0).AND.
8377b8ee87 Mart*0256 & (HSNOW(i,j,bi,bj).EQ.0. _d 0)) AREA(i,j,bi,bj)=0. _d 0
1cf549c217 Mart*0257 ENDDO
0258 ENDDO
0259 #endif /* SEAICE_ITD */
0260
0261
0262
0263 #ifndef DISABLE_AREA_FLOOR
0264 #ifdef SEAICE_ITD
cb071e52ee Mart*0265 recip_nitd = 1. _d 0 / float(SEAICE_multDim)
0266 DO IT=1,SEAICE_multDim
8377b8ee87 Mart*0267 DO j=1,sNy
0268 DO i=1,sNx
0269 IF ((HEFFITD(i,j,IT,bi,bj).GT.0).OR.
0270 & (HSNOWITD(i,j,IT,bi,bj).GT.0)) THEN
cb071e52ee Mart*0271
0272
1cf549c217 Mart*0273
8377b8ee87 Mart*0274 AREAITD(i,j,IT,bi,bj)=
0275 & MAX(AREAITD(i,j,IT,bi,bj),SEAICE_area_floor*recip_nitd)
1cf549c217 Mart*0276 ENDIF
0277 ENDDO
0278 ENDDO
0279 ENDDO
0280 #else /* ndef SEAICE_ITD */
0281 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0282
1cf549c217 Mart*0283 #endif /* ALLOW_AUTODIFF_TAMC */
8377b8ee87 Mart*0284 DO j=1,sNy
0285 DO i=1,sNx
1cf549c217 Mart*0286 IF ((HEFF(i,j,bi,bj).GT.0).OR.(HSNOW(i,j,bi,bj).GT.0)) THEN
8377b8ee87 Mart*0287 AREA(i,j,bi,bj)=MAX(AREA(i,j,bi,bj),SEAICE_area_floor)
1cf549c217 Mart*0288 ENDIF
0289 ENDDO
0290 ENDDO
0291 #endif /* SEAICE_ITD */
0292 #endif /* DISABLE_AREA_FLOOR */
0293
0294
0295 #ifdef SEAICE_VARIABLE_SALINITY
0296 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0297
0298
1cf549c217 Mart*0299 #endif /* ALLOW_AUTODIFF_TAMC */
8377b8ee87 Mart*0300 DO j=1,sNy
0301 DO i=1,sNx
0302 IF ( (HSALT(i,j,bi,bj) .LT. 0.0).OR.
0303 & (HEFF(i,j,bi,bj) .EQ. 0.0) ) THEN
0304 saltFluxAdjust(i,j,bi,bj) = - HEFFM(i,j,bi,bj) *
0305 & HSALT(i,j,bi,bj) * recip_deltaTtherm
0306 HSALT(i,j,bi,bj) = 0.0 _d 0
1cf549c217 Mart*0307 ENDIF
0308 ENDDO
0309 ENDDO
0310 #endif /* SEAICE_VARIABLE_SALINITY */
0311
0312
0313
0314
0315
0316
0317
0318 #ifdef SEAICE_ITD
0319
0320
8377b8ee87 Mart*0321 DO j=1,sNy
0322 DO i=1,sNx
1cf549c217 Mart*0323 tmpscal1itd(i,j) = 0. _d 0
0324 tmpscal2itd(i,j) = 0. _d 0
0325 tmpscal3itd(i,j) = 0. _d 0
0326 ENDDO
0327 ENDDO
cb071e52ee Mart*0328 DO IT=1,SEAICE_multDim
8377b8ee87 Mart*0329 DO j=1,sNy
0330 DO i=1,sNx
1cf549c217 Mart*0331
0332
0333 tmpscal1itd(i,j)=tmpscal1itd(i,j)
8377b8ee87 Mart*0334 & + TICES(i,j,IT,bi,bj) * HEFFITD(i,j,IT,bi,bj)
0335 tmpscal2itd(i,j)=tmpscal2itd(i,j) + HEFFITD(i,j,IT,bi,bj)
1cf549c217 Mart*0336
8377b8ee87 Mart*0337 tmpscal3itd(i,j)=tmpscal3itd(i,j) + AREAITD(i,j,IT,bi,bj)
1cf549c217 Mart*0338 ENDDO
0339 ENDDO
0340 ENDDO
8377b8ee87 Mart*0341 DO j=1,sNy
0342 DO i=1,sNx
1cf549c217 Mart*0343
0344
0345
0346
0347 #ifdef ALLOW_DIAGNOSTICS
8377b8ee87 Mart*0348 DIAGarrayA(i,j) = tmpscal3itd(i,j)
1cf549c217 Mart*0349 #endif
0350 #ifdef ALLOW_SITRACER
8377b8ee87 Mart*0351 SItrAREA(i,j,bi,bj,1)=tmpscal3itd(i,j)
1cf549c217 Mart*0352 #endif
0353 ENDDO
0354 ENDDO
0355
0356
0357 CALL SEAICE_DO_RIDGING( bi, bj, myTime, myIter, myThid )
0358
0359
0360 CALL SEAICE_ITD_REDIST( bi, bj, myTime, myIter, myThid )
925297a0db Jean*0361
1cf549c217 Mart*0362
0363 CALL SEAICE_ITD_SUM ( bi, bj, myTime, myIter, myThid )
0364
0365 #else /* ifndef SEAICE_ITD */
0366
0367 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0368
1cf549c217 Mart*0369 #endif /* ALLOW_AUTODIFF_TAMC */
8377b8ee87 Mart*0370 DO j=1,sNy
0371 DO i=1,sNx
1cf549c217 Mart*0372
0373 #ifdef ALLOW_DIAGNOSTICS
8377b8ee87 Mart*0374 DIAGarrayA(i,j) = AREA(i,j,bi,bj)
1cf549c217 Mart*0375 #endif /* ALLOW_DIAGNOSTICS */
0376 #ifdef ALLOW_SITRACER
8377b8ee87 Mart*0377 SItrAREA(i,j,bi,bj,1)=AREA(i,j,bi,bj)
1cf549c217 Mart*0378 #endif /* ALLOW_SITRACER */
925297a0db Jean*0379
1cf549c217 Mart*0380
8377b8ee87 Mart*0381 AREA(i,j,bi,bj)=MIN(AREA(i,j,bi,bj),SEAICE_area_max)
1cf549c217 Mart*0382 ENDDO
0383 ENDDO
0384
0385 #endif /* SEAICE_ITD */
0386
8377b8ee87 Mart*0387 #if (defined ALLOW_AUTODIFF && defined SEAICE_MODIFY_GROWTH_ADJ)
1cf549c217 Mart*0388
0389 ENDIF
0390 #endif
0391
0392 #ifdef ALLOW_DIAGNOSTICS
0393 IF ( useDiagnostics ) THEN
0394 CALL DIAGNOSTICS_FILL(DIAGarrayA,'SIareaPR',0,1,3,bi,bj,myThid)
0395 ENDIF
0396 #endif /* ALLOW_DIAGNOSTICS */
0397
0398
0399 ENDDO
0400 ENDDO
0401
0402 #endif /* ALLOW_SEAICE */
0403 RETURN
0404 END