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
f50f58ec54 Gael*0001 #include "SEAICE_OPTIONS.h"
80fd556159 Ou W*0002 #ifdef ALLOW_SALT_PLUME
0003 # include "SALT_PLUME_OPTIONS.h"
0004 #endif
f50f58ec54 Gael*0005
0006
0007 SUBROUTINE SEAICE_TRACER_PHYS( myTime, myIter, myThid )
dc0a9dc58e Jean*0008
0009
0010
0011
0012
f50f58ec54 Gael*0013 IMPLICIT NONE
0014
0015
0016 #include "SIZE.h"
0017 #include "EEPARAMS.h"
f1c91a595d Jean*0018 #include "PARAMS.h"
f50f58ec54 Gael*0019 #include "FFIELDS.h"
0020 #include "DYNVARS.h"
0021 #include "SEAICE_SIZE.h"
0022 #include "SEAICE.h"
3f0f10fc37 Mart*0023 #include "SEAICE_GRID.h"
f50f58ec54 Gael*0024 #include "SEAICE_PARAMS.h"
0025 #include "SEAICE_TRACER.h"
8bc8bee483 Gael*0026 #ifdef ALLOW_SALT_PLUME
0027 # include "SALT_PLUME.h"
0028 #endif
f50f58ec54 Gael*0029
0030
0031
0032
0033
0034
0035
0036 _RL myTime
0037 INTEGER myIter, myThid
0038
0039
0040
0041 #ifdef ALLOW_SITRACER
0042
80fd556159 Ou W*0043 INTEGER iTr, jTh, i, j, bi, bj, ks
f50f58ec54 Gael*0044 _RL SItrFromOcean (1:sNx,1:sNy)
bb24b8a3e6 Gael*0045 _RL SItrFromFlood (1:sNx,1:sNy)
f50f58ec54 Gael*0046 _RL HEFFprev, HEFFpost, growFact, meltPart, tmpscal1
bb24b8a3e6 Gael*0047 _RL SItrExpand (1:sNx,1:sNy)
0048 _RL AREAprev, AREApost, expandFact
3721cfe5e4 Gael*0049 CHARACTER*8 diagName
f50f58ec54 Gael*0050
3721cfe5e4 Gael*0051 #ifdef ALLOW_SITRACER_DEBUG_DIAG
f50f58ec54 Gael*0052 _RL DIAGarray (1:sNx,1:sNy,Nr)
0053 #endif
0054
0055
0056
0057
0058
0059 ks=1
0060
0061 DO bj=myByLo(myThid),myByHi(myThid)
0062 DO bi=myBxLo(myThid),myBxHi(myThid)
8bc8bee483 Gael*0063 DO iTr=1,SItrNumInUse
f50f58ec54 Gael*0064
fcdcf3fa1d Jean*0065
f50f58ec54 Gael*0066
80fd556159 Ou W*0067 DO j=1,sNy
0068 DO i=1,sNx
8bc8bee483 Gael*0069 SItrFromOcean(i,j)=SItrFromOcean0(iTr)
0070 SItrFromFlood(i,j)=SItrFromFlood0(iTr)
0071 SItrExpand(i,j)=SItrExpand0(iTr)
f50f58ec54 Gael*0072 ENDDO
0073 ENDDO
fcdcf3fa1d Jean*0074
dc0a9dc58e Jean*0075 if ( (SItrName(iTr).EQ.'salinity').AND.
8bc8bee483 Gael*0076 & (SItrFromOceanFrac(iTr).GT.ZERO) ) then
80fd556159 Ou W*0077 DO j=1,sNy
0078 DO i=1,sNx
0079 SItrFromOcean(i,j)=SItrFromOceanFrac(iTr)*salt(i,j,ks,bi,bj)
0080 SItrFromFlood(i,j)=SItrFromFloodFrac(iTr)*salt(i,j,ks,bi,bj)
f50f58ec54 Gael*0081 ENDDO
0082 ENDDO
0083 endif
0084
0085
bb24b8a3e6 Gael*0086 if (SItrMate(iTr).EQ.'HEFF') then
80fd556159 Ou W*0087 DO j=1,sNy
0088 DO i=1,sNx
f50f58ec54 Gael*0089 HEFFprev=SItrHEFF(i,j,bi,bj,1)
3721cfe5e4 Gael*0090 #ifdef ALLOW_SITRACER_DEBUG_DIAG
80fd556159 Ou W*0091 DIAGarray(i,j,5+(iTr-1)*5) =
f50f58ec54 Gael*0092 & HEFFprev*SItracer(i,j,bi,bj,iTr) + SItrBucket(i,j,bi,bj,iTr)
0093 #endif
f61838dfc1 Torg*0094
f50f58ec54 Gael*0095
0096
0097
0098
0099
0100 DO jTh=1,3
0101 HEFFprev=SItrHEFF(i,j,bi,bj,jTh)
0102 HEFFpost=SItrHEFF(i,j,bi,bj,jTh+1)
0103
0104 growFact=1. _d 0
0105 meltPart=0. _d 0
0106 if (HEFFpost.GT.HEFFprev) growFact=HEFFprev/HEFFpost
0107 if (HEFFpost.LT.HEFFprev) meltPart=HEFFprev-HEFFpost
0108
0109 SItracer(i,j,bi,bj,iTr)=SItracer(i,j,bi,bj,iTr)*growFact
0110 & +SItrFromOcean(i,j)*(1. _d 0 - growFact)
0111 SItrBucket(i,j,bi,bj,iTr)=SItrBucket(i,j,bi,bj,iTr)
0112 & -HEFFpost*SItrFromOcean(i,j)*(1. _d 0 - growFact)
0113 SItrBucket(i,j,bi,bj,iTr)=SItrBucket(i,j,bi,bj,iTr)
0114 & +meltPart*SItracer(i,j,bi,bj,iTr)
0115 ENDDO
0116
0117 growFact=1. _d 0
0118 HEFFprev=SItrHEFF(i,j,bi,bj,4)
0119 HEFFpost=SItrHEFF(i,j,bi,bj,5)
0120 if (HEFFpost.GT.HEFFprev) growFact=HEFFprev/HEFFpost
0121 SItracer(i,j,bi,bj,iTr)=SItracer(i,j,bi,bj,iTr)*growFact
bb24b8a3e6 Gael*0122 & +SItrFromFlood(i,j) *(1. _d 0 - growFact)
0123
0124
f50f58ec54 Gael*0125 SItrBucket(i,j,bi,bj,iTr)=SItrBucket(i,j,bi,bj,iTr)
bb24b8a3e6 Gael*0126 & -HEFFpost*SItrFromFlood(i,j)*(1. _d 0 - growFact)
3721cfe5e4 Gael*0127 #ifdef ALLOW_SITRACER_DEBUG_DIAG
80fd556159 Ou W*0128 DIAGarray(i,j,5+(iTr-1)*5) = HEFFpost*SItracer(i,j,bi,bj,iTr)
0129 & +SItrBucket(i,j,bi,bj,iTr)-DIAGarray(i,j,5+(iTr-1)*5)
f50f58ec54 Gael*0130 #endif
0131 ENDDO
0132 ENDDO
bb24b8a3e6 Gael*0133
0134 else
0135
0136
fcdcf3fa1d Jean*0137
0138
bb24b8a3e6 Gael*0139
fcdcf3fa1d Jean*0140
bb24b8a3e6 Gael*0141
80fd556159 Ou W*0142 DO j=1,sNy
0143 DO i=1,sNx
bb24b8a3e6 Gael*0144
0145 AREAprev=SItrAREA(i,j,bi,bj,2)
0146 AREApost=SItrAREA(i,j,bi,bj,3)
0147
0148 expandFact=1. _d 0
0149 if (AREApost.GT.AREAprev) expandFact=AREAprev/AREApost
0150
0151 SItracer(i,j,bi,bj,iTr)=SItracer(i,j,bi,bj,iTr)*expandFact
0152 & +SItrExpand(i,j)*(1. _d 0 - expandFact)
0153 ENDDO
0154 ENDDO
0155 endif
f50f58ec54 Gael*0156
0157
0158 if (SItrName(iTr).EQ.'age') then
0159
80fd556159 Ou W*0160 DO j=1,sNy
0161 DO i=1,sNx
bb24b8a3e6 Gael*0162 if (( (SItrHEFF(i,j,bi,bj,5).GT.0. _d 0).AND.(SItrMate(iTr)
0163 & .EQ.'HEFF') ).OR.( (SItrAREA(i,j,bi,bj,3).GT.0. _d 0).AND.
0164 & (SItrMate(iTr).EQ.'AREA') )) then
f50f58ec54 Gael*0165 SItracer(i,j,bi,bj,iTr)=
0166 & SItracer(i,j,bi,bj,iTr)+SEAICE_deltaTtherm
0167 else
0168 SItracer(i,j,bi,bj,iTr)=0. _d 0
0169 endif
0170 ENDDO
0171 ENDDO
0172 elseif (SItrName(iTr).EQ.'salinity') then
0173
0174 elseif (SItrName(iTr).EQ.'one') then
0175
bb24b8a3e6 Gael*0176 elseif (SItrName(iTr).EQ.'ridge') then
0177
80fd556159 Ou W*0178 DO j=1,sNy
0179 DO i=1,sNx
bb24b8a3e6 Gael*0180
0181 SItracer(i,j,bi,bj,iTr)=SItracer(i,j,bi,bj,iTr)+
0182 & MAX(0. _d 0, SItrAREA(i,j,bi,bj,1)-SItrAREA(i,j,bi,bj,2))
0183
0184 HEFFprev=SItrHEFF(i,j,bi,bj,1)
0185 HEFFpost=SItrHEFF(i,j,bi,bj,4)
0186 tmpscal1=1. _d 0
0187 if (HEFFprev.GT.HEFFpost) tmpscal1=HEFFpost/HEFFprev
0188 SItracer(i,j,bi,bj,iTr)=SItracer(i,j,bi,bj,iTr)*tmpscal1
0189 ENDDO
0190 ENDDO
f50f58ec54 Gael*0191 endif
bb24b8a3e6 Gael*0192
0193
3721cfe5e4 Gael*0194 #ifdef ALLOW_DIAGNOSTICS
f1c91a595d Jean*0195 IF ( useDiagnostics .AND. SItrMate(iTr).EQ.'HEFF') THEN
2eab512e2a Gael*0196 WRITE(diagName,'(A4,I2.2,A2)') 'SItr',iTr,'Fx'
3721cfe5e4 Gael*0197 tmpscal1=-ONE/SEAICE_deltaTtherm*SEAICE_rhoIce
dc0a9dc58e Jean*0198 CALL DIAGNOSTICS_SCALE_FILL(SItrBucket(1-OLx,1-OLy,bi,bj,iTr),
3721cfe5e4 Gael*0199 & tmpscal1, 1, diagName,0,1,2,bi,bj,myThid)
f1c91a595d Jean*0200 ENDIF
3721cfe5e4 Gael*0201 #endif
8bc8bee483 Gael*0202
0203 if ( (SItrName(iTr).EQ.'salinity').AND.
0204 & (SEAICE_salinityTracer) ) then
f50f58ec54 Gael*0205
80fd556159 Ou W*0206 DO j=1,sNy
0207 DO i=1,sNx
0208 saltFlux(i,j,bi,bj) = - SItrBucket(i,j,bi,bj,iTr)
0209 & *HEFFM(i,j,bi,bj)/SEAICE_deltaTtherm*SEAICE_rhoIce
f50f58ec54 Gael*0210
8bc8bee483 Gael*0211 #ifdef ALLOW_SALT_PLUME
0212
80fd556159 Ou W*0213 saltPlumeFlux(i,j,bi,bj) = MAX(zeroRS,saltFlux(i,j,bi,bj))
0214 & *SPsalFRAC*(salt(i,j,ks,bi,bj)-SItrFromOcean(i,j))
8bc8bee483 Gael*0215 #endif
0216 ENDDO
0217 ENDDO
f50f58ec54 Gael*0218 endif
dc0a9dc58e Jean*0219
80fd556159 Ou W*0220 DO j=1,sNy
0221 DO i=1,sNx
3721cfe5e4 Gael*0222 #ifdef ALLOW_SITRACER_DEBUG_DIAG
80fd556159 Ou W*0223 DIAGarray(i,j,4+(iTr-1)*5) = - SItrBucket(i,j,bi,bj,iTr)
0224 & *HEFFM(i,j,bi,bj)/SEAICE_deltaTtherm*SEAICE_rhoIce
f50f58ec54 Gael*0225 #endif
0226
f61838dfc1 Torg*0227
0320e25227 Mart*0228 if (SItrName(iTr).NE.'grease')
f61838dfc1 Torg*0229 & SItrBucket(i,j,bi,bj,iTr)=0. _d 0
f50f58ec54 Gael*0230 ENDDO
0231 ENDDO
dc0a9dc58e Jean*0232
bb24b8a3e6 Gael*0233
8bc8bee483 Gael*0234
f50f58ec54 Gael*0235
0236
3721cfe5e4 Gael*0237 #ifdef ALLOW_SITRACER_DEBUG_DIAG
bb24b8a3e6 Gael*0238 if (SItrMate(iTr).EQ.'HEFF') then
80fd556159 Ou W*0239 DO j=1,sNy
0240 DO i=1,sNx
f50f58ec54 Gael*0241 HEFFpost=SItrHEFF(i,j,bi,bj,5)
80fd556159 Ou W*0242 DIAGarray(i,j,1+(iTr-1)*5) = SItracer(i,j,bi,bj,iTr)
0243 DIAGarray(i,j,2+(iTr-1)*5) = SItracer(i,j,bi,bj,iTr)*HEFFpost
3721cfe5e4 Gael*0244
e54fe3e1f9 Gael*0245 if (SItrName(iTr).EQ.'salinity') then
80fd556159 Ou W*0246 DIAGarray(i,j,3+(iTr-1)*5) = HSALT(i,j,bi,bj)/SEAICE_rhoIce
f50f58ec54 Gael*0247 elseif (SItrName(iTr).EQ.'one') then
80fd556159 Ou W*0248 DIAGarray(i,j,3+(iTr-1)*5) = HEFFpost
f50f58ec54 Gael*0249 endif
3721cfe5e4 Gael*0250
0251
f50f58ec54 Gael*0252 ENDDO
0253 ENDDO
bb24b8a3e6 Gael*0254 else
80fd556159 Ou W*0255 DO j=1,sNy
0256 DO i=1,sNx
bb24b8a3e6 Gael*0257 AREApost=SItrAREA(i,j,bi,bj,3)
80fd556159 Ou W*0258 DIAGarray(i,j,1+(iTr-1)*5) = SItracer(i,j,bi,bj,iTr)
0259 DIAGarray(i,j,2+(iTr-1)*5) = SItracer(i,j,bi,bj,iTr)*AREApost
bb24b8a3e6 Gael*0260 ENDDO
0261 ENDDO
0262 endif
f50f58ec54 Gael*0263 #endif
0264 ENDDO
3721cfe5e4 Gael*0265 #ifdef ALLOW_SITRACER_DEBUG_DIAG
fcdcf3fa1d Jean*0266
f50f58ec54 Gael*0267 #endif
0268 ENDDO
0269 ENDDO
0270
0271 #endif /* ALLOW_SITRACER */
0272
0273 RETURN
0274 END