File indexing completed on 2021-04-08 05:12:21 UTC
view on githubraw file Latest commit ba0b0470 on 2021-04-08 01:06:32 UTC
e10b4e6008 Patr*0001 #include "SALT_PLUME_OPTIONS.h"
0002
0003
0004
0005
0006 SUBROUTINE SALT_PLUME_APPLY(
0007 I trIdentity, bi, bj,
0008 I recip_hFac_arg,
0009 I tracer,trApplyFlag,
0010 I myTime, myIter, myThid )
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 IMPLICIT NONE
0023
0024
0025 #include "SIZE.h"
0026 #include "GRID.h"
0027 #include "EEPARAMS.h"
0028 #include "PARAMS.h"
0029 #include "DYNVARS.h"
0030 #include "SALT_PLUME.h"
0031 #ifdef ALLOW_GENERIC_ADVDIFF
0032 # include "GAD.h"
0033 #endif
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 INTEGER trIdentity, trApplyFlag
0050 INTEGER bi, bj
0051 _RS recip_hFac_arg(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0052 _RL tracer (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0053
0054
0055 _RL myTime
0056 INTEGER myIter, myThid
0057
0058 #ifdef ALLOW_SALT_PLUME
0059 #ifdef SALT_PLUME_VOLUME
0060
0061
0062
0063
ba0b047096 Mart*0064
e10b4e6008 Patr*0065
0066 CHARACTER*(MAX_LEN_MBUF) msgBuf
0067 INTEGER i, j, k
0068 INTEGER upward
0069 LOGICAL onOffFlag
0070 _RL gTr_Surf2kLev, gTr_Below2kLev, gTr_kLev2Above,
0071 & dSPvolBelow2kLev, gTr_totSurf2Below,
0072 & SurfVal, SEAICE_Tfrz, ConvertFac, recip_ConvertFac
0073 integer kp1, Nrp1
0074 _RL plumetend(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0075 _RL work(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
0076
0077 #ifdef ALLOW_DIAGNOSTICS
0078 CHARACTER*8 diagName
0079 CHARACTER*4 diagSufx
0080 LOGICAL doDiagSPtend
0081
0082 LOGICAL DIAGNOSTICS_IS_ON
0083 EXTERNAL DIAGNOSTICS_IS_ON
0084 #ifdef ALLOW_GENERIC_ADVDIFF
0085 CHARACTER*5 GAD_DIAG_SUFX
0086 EXTERNAL GAD_DIAG_SUFX
0087 #endif /* ALLOW_GENERIC_ADVDIFF */
0088 #endif /* ALLOW_DIAGNOSTICS */
0089
0090
0091
0092
0093
0094
0095
0096
0097 IF ( trApplyFlag.LT.0 .OR. trApplyFlag.GT.1) THEN
0098 STOP 'S/R SALT_PLUME_APPLY: incorrect setting of trApplyFlag!'
0099 ELSE
0100
0101 SEAICE_Tfrz = -1.96 _d 0
0102
0103 onOffFlag = .FALSE.
0104 #ifdef ALLOW_GENERIC_ADVDIFF
0105 IF ( trIdentity.EQ.GAD_TEMPERATURE ) onOffFlag = .TRUE.
0106 IF ( trIdentity.EQ.GAD_SALINITY ) onOffFlag = .TRUE.
0107 #endif
0108 IF ( onOffFlag ) THEN
0109
0110
0111
0112 upward = 1
0113 IF (usingZCoords) upward = -1
f21016b86e Jean*0114
e10b4e6008 Patr*0115 IF ( trIdentity.EQ.GAD_TEMPERATURE ) THEN
0116 SurfVal = SEAICE_Tfrz
0117 ConvertFac = HeatCapacity_Cp*rhoConst
0118 recip_ConvertFac = mass2rUnit/HeatCapacity_Cp
0119 #ifdef ALLOW_DIAGNOSTICS
0120 IF ( useDiagnostics ) diagSufx = '_TH '
0121 #endif /* ALLOW_DIAGNOSTICS */
0122 ENDIF
0123 IF ( trIdentity.EQ.GAD_SALINITY ) THEN
0124 SurfVal = SPbrineSconst
0125 ConvertFac = rhoConst
0126 recip_ConvertFac = mass2rUnit
0127 #ifdef ALLOW_DIAGNOSTICS
0128 IF ( useDiagnostics ) diagSufx = '_SLT'
0129 #endif /* ALLOW_DIAGNOSTICS */
0130 ENDIF
f21016b86e Jean*0131
e10b4e6008 Patr*0132 #ifdef ALLOW_DIAGNOSTICS
0133 doDiagSPtend = .FALSE.
0134 diagName = 'SPtd'
0135 IF ( useDiagnostics ) THEN
0136
0137 #ifdef ALLOW_GENERIC_ADVDIFF
0138 diagSufx = GAD_DIAG_SUFX( trIdentity, myThid )
0139 #endif /* ALLOW_GENERIC_ADVDIFF */
0140 diagName = 'SPtd'//diagSufx
0141 doDiagSPtend = DIAGNOSTICS_IS_ON(diagName,myThid)
0142 ENDIF
0143 #endif /* ALLOW_DIAGNOSTICS */
0144
0145
0146 Nrp1=Nr+1
0147 DO k=1,Nr
352c2064d4 antn*0148 DO j=1-OLy,sNy+OLy
0149 DO i=1-OLx,sNx+OLx
e10b4e6008 Patr*0150 plumetend(i,j,k) = 0. _d 0
0151 work(i,j,k) = tracer(i,j,k,bi,bj)
0152 ENDDO
0153 ENDDO
0154 ENDDO
352c2064d4 antn*0155 DO j=1-OLy,sNy+OLy
0156 DO i=1-OLx,sNx+OLx
e10b4e6008 Patr*0157 work(i,j,Nrp1) = 0. _d 0
0158 ENDDO
0159 ENDDO
0160
0161
f21016b86e Jean*0162
e10b4e6008 Patr*0163
0164
0165
f21016b86e Jean*0166
e10b4e6008 Patr*0167 IF(trApplyFlag.LT.1) THEN
0168
0169 IF(trIdentity.EQ.GAD_TEMPERATURE) THEN
0170 DO k=1,Nr
0171 DO j=1-OLy,sNy+OLy
0172 DO i=1-OLx,sNx+OLx
0173 SPforcingT(i,j,k,bi,bj)=0. _d 0
0174 ENDDO
0175 ENDDO
0176 ENDDO
0177 ENDIF
0178 IF(trIdentity.EQ.GAD_SALINITY) THEN
0179 DO k=1,Nr
0180 DO j=1-OLy,sNy+OLy
0181 DO i=1-OLx,sNx+OLx
0182 SPforcingS(i,j,k,bi,bj)=0. _d 0
0183 ENDDO
0184 ENDDO
0185 ENDDO
0186 ENDIF
0187
0188 DO k=Nr,1,-1
0189 kp1=k+1
0190 DO j=1-OLy,sNy+OLy
0191 DO i=1-OLx,sNx+OLx
0192
0193 IF(trIdentity.EQ.GAD_TEMPERATURE) SurfVal=tracer(i,j,1,bi,bj)
ba0b047096 Mart*0194
e10b4e6008 Patr*0195 gTr_totSurf2Below = SPbrineVolFlux(i,j,bi,bj)*SurfVal
0196 gTr_Surf2kLev = dSPvolSurf2kLev(i,j,k,bi,bj) * SurfVal
0197 dSPvolBelow2kLev = -dSPvolkLev2Above(i,j,kp1,bi,bj)
0198 gTr_Below2kLev= dSPvolBelow2kLev * work(i,j,kp1)
0199
f21016b86e Jean*0200
e10b4e6008 Patr*0201
0202
0203 gTr_kLev2Above= dSPvolkLev2Above(i,j,k,bi,bj) * work(i,j,k)
0204
ba0b047096 Mart*0205
e10b4e6008 Patr*0206
0207 plumetend(i,j,k) = ConvertFac *
0208 & ( gTr_Surf2kLev + gTr_Below2kLev + gTr_kLev2Above )
f21016b86e Jean*0209 IF(k.eq.1) plumetend(i,j,k) = ConvertFac *
e10b4e6008 Patr*0210 & ( gTr_Surf2kLev + gTr_Below2kLev)
f21016b86e Jean*0211
e10b4e6008 Patr*0212
0213
f21016b86e Jean*0214
e10b4e6008 Patr*0215
0216
0217
0218
0219
0220
0221 IF (trIdentity.EQ.GAD_SALINITY) THEN
0222 SPforcingS(i,j,k,bi,bj)=plumetend(i,j,k)
0223 ENDIF
0224 IF (trIdentity.EQ.GAD_TEMPERATURE) THEN
0225 SPforcingT(i,j,k,bi,bj)=plumetend(i,j,k)
0226 ENDIF
0227 ENDDO
0228 ENDDO
0229 ENDDO
0230 #ifdef ALLOW_DIAGNOSTICS
0231 IF ( doDiagSPtend )
0232 & CALL DIAGNOSTICS_FILL(plumetend, diagName, 0,Nr,2,bi,bj,myThid)
0233 #endif /* ALLOW_DIAGNOSTICS */
0234
0235 ELSE
0236
ba0b047096 Mart*0237
e10b4e6008 Patr*0238
0239
0240
0241
0242 DO k=Nr,1,-1
0243 kp1=k+1
0244 DO j=1-OLy,sNy+OLy
0245 DO i=1-OLx,sNx+OLx
f21016b86e Jean*0246 IF (trIdentity.EQ.GAD_TEMPERATURE)
e10b4e6008 Patr*0247 & plumetend(i,j,k)=SPforcingT(i,j,k,bi,bj)
0248 IF (trIdentity.EQ.GAD_SALINITY) THEN
0249 plumetend(i,j,k)=SPforcingS(i,j,k,bi,bj)
0250 ENDIF
f21016b86e Jean*0251
e10b4e6008 Patr*0252
0253
0254
0255 ENDDO
0256 ENDDO
0257 ENDDO
0258
0259 ENDIF
0260
0261
0262
0263 ENDIF
0264
0265 ENDIF
0266
0267 #endif /* SALT_PLUME_VOLUME */
0268 #endif /* ALLOW_SALT_PLUME */
0269
0270 RETURN
0271 END