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