File indexing completed on 2025-06-13 05:08:41 UTC
view on githubraw file Latest commit b26a461d on 2025-06-12 20:15:47 UTC
6d54cf9ca1 Ed H*0001 #include "DIC_OPTIONS.h"
11c3150c71 Mart*0002 #ifdef ALLOW_AUTODIFF
0003 # include "AUTODIFF_OPTIONS.h"
0004 #endif
daab022f42 Step*0005
08536d17ba Step*0006
0007
0008
0009
e098791e51 Jean*0010 SUBROUTINE DIC_SURFFORCING( PTR_CO2 , PTR_ALK, PTR_PO4, GDC,
a1d0e455fd Hann*0011 I bi, bj, iMin, iMax, jMin, jMax,
2e3e8c330d Jona*0012 I myTime, myIter, myThid )
daab022f42 Step*0013
08536d17ba Step*0014
e098791e51 Jean*0015
0016
daab022f42 Step*0017
08536d17ba Step*0018
0019 IMPLICIT NONE
daab022f42 Step*0020 #include "SIZE.h"
0021 #include "DYNVARS.h"
0022 #include "EEPARAMS.h"
0023 #include "PARAMS.h"
0024 #include "GRID.h"
0025 #include "FFIELDS.h"
2ef8966791 Davi*0026 #include "DIC_VARS.h"
11c3150c71 Mart*0027 #ifdef ALLOW_AUTODIFF_TAMC
0028 # include "tamc.h"
0029 #endif
daab022f42 Step*0030
08536d17ba Step*0031
a1d0e455fd Hann*0032
2e3e8c330d Jona*0033
0034
0035
daab022f42 Step*0036 _RL PTR_CO2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
720e9330bd Step*0037 _RL PTR_ALK(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0038 _RL PTR_PO4(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
daab022f42 Step*0039 INTEGER iMin,iMax,jMin,jMax, bi, bj
2e3e8c330d Jona*0040 _RL myTime
0041 INTEGER myIter, myThid
daab022f42 Step*0042
08536d17ba Step*0043
a1d0e455fd Hann*0044
08536d17ba Step*0045 _RL GDC(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0046
6acab690ae Jona*0047 #ifdef ALLOW_DIC
08536d17ba Step*0048
0049
c845fbfeae Jean*0050 INTEGER i,j, kLev
6acab690ae Jona*0051 LOGICAL debugPrt
e6a52874f7 Davi*0052 _RL co3dummy
daab022f42 Step*0053
0054
0055 _RL SchmidtNoDIC(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0056 _RL pCO2sat(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0057 _RL Kwexch(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
c8d7031b60 Davi*0058 _RL pisvel(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
daab022f42 Step*0059
0060 _RL surfalk(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0061 _RL surfphos(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0062 _RL surfsi(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
8bf2c0e0ad Step*0063 _RL surftemp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0064 _RL surfsalt(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0065 _RL surfdic(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
04d6738595 Davi*0066 #ifdef ALLOW_OLD_VIRTUALFLUX
daab022f42 Step*0067 _RL VirtualFlux(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
04d6738595 Davi*0068 #endif
11c3150c71 Mart*0069 #ifdef ALLOW_AUTODIFF_TAMC
b26a461de7 Mart*0070
edb6656069 Mart*0071 INTEGER tkey
11c3150c71 Mart*0072 #endif
08536d17ba Step*0073
daab022f42 Step*0074
a1d0e455fd Hann*0075 kLev = 1
daab022f42 Step*0076
a1d0e455fd Hann*0077
0078
1ef1c61fb1 Step*0079
0080
0081
0082
0083
0084
0085
0086
daab022f42 Step*0087
0088
0089
a1d0e455fd Hann*0090 DO j=jMin,jMax
0091 DO i=iMin,iMax
daab022f42 Step*0092 #ifdef DIC_BIOTIC
0093
8bf2c0e0ad Step*0094 #ifdef DIC_BOUNDS
a1d0e455fd Hann*0095 surfalk(i,j) = MAX( 0.4 _d 0,
0096 & MIN( 10. _d 0, PTR_ALK(i,j,klev) ) )
0097 & * maskC(i,j,kLev,bi,bj)
0098 surfphos(i,j) = MAX( 1.0 _d -11,
0099 & MIN( 1. _d -1, PTR_PO4(i,j,klev) ) )
0100 & * maskC(i,j,kLev,bi,bj)
8bf2c0e0ad Step*0101 #else
a1d0e455fd Hann*0102 surfalk(i,j) = PTR_ALK(i,j,klev)*maskC(i,j,kLev,bi,bj)
0103 surfphos(i,j) = PTR_PO4(i,j,klev)*maskC(i,j,kLev,bi,bj)
8bf2c0e0ad Step*0104 #endif
6acab690ae Jona*0105 #else /* DIC_BIOTIC */
a1d0e455fd Hann*0106 surfalk(i,j) = 2.366595 _d 0 * salt(i,j,kLev,bi,bj)/gsm_s
0107 & * maskC(i,j,kLev,bi,bj)
0108 surfphos(i,j) = 5.1225 _d -4 * maskC(i,j,kLev,bi,bj)
6acab690ae Jona*0109 #endif /* DIC_BIOTIC */
a1d0e455fd Hann*0110
0111 surfsi(i,j) = silicaSurf(i,j,bi,bj)*maskC(i,j,kLev,bi,bj)
8bf2c0e0ad Step*0112 #ifdef DIC_BOUNDS
a1d0e455fd Hann*0113 surftemp(i,j) = MAX( -4. _d 0,
0114 & MIN( 50. _d 0, theta(i,j,kLev,bi,bj) ) )
0115 surfsalt(i,j) = MAX( 4. _d 0,
0116 & MIN( 50. _d 0, salt(i,j,kLev,bi,bj) ) )
0117 surfdic(i,j) = MAX( 0.4 _d 0,
0118 & MIN( 10. _d 0, PTR_CO2(i,j,kLev) ) )
8bf2c0e0ad Step*0119 #else
a1d0e455fd Hann*0120 surftemp(i,j) = theta(i,j,kLev,bi,bj)
0121 surfsalt(i,j) = salt(i,j,kLev,bi,bj)
0122 surfdic(i,j) = PTR_CO2(i,j,kLev)
8bf2c0e0ad Step*0123 #endif
a1d0e455fd Hann*0124 ENDDO
0125 ENDDO
daab022f42 Step*0126
6acab690ae Jona*0127 #ifdef CARBONCHEM_SOLVESAPHE
0128 #ifdef ALLOW_DEBUG
0129 IF (debugMode) CALL DEBUG_CALL('DIC_COEFFS_SURF',myThid)
0130 #endif
a1d0e455fd Hann*0131 CALL DIC_COEFFS_SURF(
8bf2c0e0ad Step*0132 I surftemp,surfsalt,
5625485478 Jean*0133 I bi,bj,iMin,iMax,jMin,jMax,myThid)
6acab690ae Jona*0134 #else /* CARBONCHEM_SOLVESAPHE */
0135 #ifdef ALLOW_DEBUG
0136 IF (debugMode) CALL DEBUG_CALL('CARBON_COEFFS',myThid)
0137 #endif
a1d0e455fd Hann*0138 CALL CARBON_COEFFS(
6acab690ae Jona*0139 I surftemp,surfsalt,
0140 I bi,bj,iMin,iMax,jMin,jMax,myThid)
0141 #endif /* CARBONCHEM_SOLVESAPHE */
daab022f42 Step*0142
0143
a5bfd8de3c Jean*0144 DO j=jMin,jMax
0145 DO i=iMin,iMax
c8d7031b60 Davi*0146
0147
0148 #ifdef USE_PLOAD
0149
0150
0151
0152
0153
b31669ac34 Jean*0154 AtmosP(i,j,bi,bj)= ( surf_pRef + pLoad(i,j,bi,bj) )/Pa2Atm
c8d7031b60 Davi*0155 #endif
0156
0157
0158
a1d0e455fd Hann*0159 pisvel(i,j) = 0.337 _d 0 *wind(i,j,bi,bj)**2/3.6 _d 5
0160 Kwexch_Pre(i,j,bi,bj) = pisvel(i,j)
0161 & * (1. _d 0 - fIce(i,j,bi,bj))
c8d7031b60 Davi*0162 ENDDO
0163 ENDDO
0164
11c3150c71 Mart*0165 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0166 tkey = bi + (bj-1)*nSx + (ikey_dynamics-1)*nSx*nSy
0167
11c3150c71 Mart*0168 #endif
6acab690ae Jona*0169 debugPrt = debugMode
a1d0e455fd Hann*0170
29ad036528 Step*0171
a5bfd8de3c Jean*0172 DO j=jMin,jMax
29ad036528 Step*0173
a5bfd8de3c Jean*0174 DO i=iMin,iMax
75e97f1e14 Davi*0175 IF ( maskC(i,j,kLev,bi,bj).NE.0. _d 0 ) THEN
6acab690ae Jona*0176 #ifdef CARBONCHEM_SOLVESAPHE
0177 IF ( selectPHsolver.GT.0 ) THEN
0178
0179 #ifdef ALLOW_DEBUG
0180 IF (debugPrt) CALL DEBUG_CALL(
0181 & 'CALC_PCO2_SOLVESAPHE from DIC_SURFFORCING',myThid)
0182 #endif
0183 CALL CALC_PCO2_SOLVESAPHE(
0184 I surftemp(i,j),surfsalt(i,j),
0185 I surfdic(i,j), surfphos(i,j),
0186 I surfsi(i,j),surfalk(i,j),
0187 U pH(i,j,bi,bj),pCO2(i,j,bi,bj),co3dummy,
0188 I i,j,kLev,bi,bj, debugPrt, myIter, myThid )
0189 debugPrt = .FALSE.
0190 ELSE
0191
0192 #endif /* CARBONCHEM_SOLVESAPHE */
0193 #ifdef ALLOW_DEBUG
0194 IF (debugPrt) CALL DEBUG_CALL(
0195 & 'CALC_PCO2_APPROX',myThid)
0196 debugPrt = .FALSE.
0197 #endif
0198 CALL CALC_PCO2_APPROX(
0199 I surftemp(i,j),surfsalt(i,j),
0200 I surfdic(i,j), surfphos(i,j),
0201 I surfsi(i,j),surfalk(i,j),
0202 I ak1(i,j,bi,bj),ak2(i,j,bi,bj),
0203 I ak1p(i,j,bi,bj),ak2p(i,j,bi,bj),ak3p(i,j,bi,bj),
0204 I aks(i,j,bi,bj),akb(i,j,bi,bj),akw(i,j,bi,bj),
0205 I aksi(i,j,bi,bj),akf(i,j,bi,bj),
0206 I ak0(i,j,bi,bj), fugf(i,j,bi,bj),
0207 I ff(i,j,bi,bj),
0208 I bt(i,j,bi,bj),st(i,j,bi,bj),ft(i,j,bi,bj),
0209 U pH(i,j,bi,bj),pCO2(i,j,bi,bj),co3dummy,
0210 I i,j,kLev,bi,bj,myIter, myThid )
0211 #ifdef CARBONCHEM_SOLVESAPHE
0212 ENDIF
0213 #endif /* CARBONCHEM_SOLVESAPHE */
daab022f42 Step*0214 ELSE
75e97f1e14 Davi*0215 pCO2(i,j,bi,bj)=0. _d 0
0216 ENDIF
daab022f42 Step*0217 ENDDO
0218 ENDDO
b26a461de7 Mart*0219 #ifdef ALLOW_AUTODIFF_TAMC
0220
0221 #endif
daab022f42 Step*0222
a5bfd8de3c Jean*0223 DO j=jMin,jMax
0224 DO i=iMin,iMax
daab022f42 Step*0225
75e97f1e14 Davi*0226 IF ( maskC(i,j,kLev,bi,bj).NE.0. _d 0 ) THEN
daab022f42 Step*0227
a1d0e455fd Hann*0228 SchmidtNoDIC(i,j) =
e098791e51 Jean*0229 & sca1
daab022f42 Step*0230 & + sca2 * theta(i,j,kLev,bi,bj)
e098791e51 Jean*0231 & + sca3 * theta(i,j,kLev,bi,bj)*theta(i,j,kLev,bi,bj)
0232 & + sca4 * theta(i,j,kLev,bi,bj)*theta(i,j,kLev,bi,bj)
daab022f42 Step*0233 & *theta(i,j,kLev,bi,bj)
a1d0e455fd Hann*0234
0235 SchmidtNoDIC(i,j) = MAX( 1.0 _d -2, SchmidtNoDIC(i,j) )
daab022f42 Step*0236
0237
0238
a1d0e455fd Hann*0239 pCO2sat(i,j) =
daab022f42 Step*0240 & AtmosP(i,j,bi,bj)*AtmospCO2(i,j,bi,bj)
0241
c8d7031b60 Davi*0242
a1d0e455fd Hann*0243 Kwexch(i,j) = Kwexch_Pre(i,j,bi,bj)
0244 & / SQRT(SchmidtNoDIC(i,j)/660.0 _d 0)
daab022f42 Step*0245
d0092a57ac Step*0246 #ifdef WATERVAP_BUG
daab022f42 Step*0247
0248
0249
0250
a1d0e455fd Hann*0251 FluxCO2(i,j,bi,bj) =
e098791e51 Jean*0252 & Kwexch(i,j)*(
0253 & ak0(i,j,bi,bj)*pCO2sat(i,j) -
0254 & ff(i,j,bi,bj)*pCO2(i,j,bi,bj)
0255 & )
d0092a57ac Step*0256 #else
a1d0e455fd Hann*0257
f169dabedd Jean*0258
d0092a57ac Step*0259
a1d0e455fd Hann*0260
0261 FluxCO2(i,j,bi,bj) =
d0092a57ac Step*0262 & Kwexch(i,j)*(
0263 & ff(i,j,bi,bj)*pCO2sat(i,j) -
0264 & pCO2(i,j,bi,bj)*fugf(i,j,bi,bj)
0265 & *ak0(i,j,bi,bj) )
6acab690ae Jona*0266
d0092a57ac Step*0267 #endif
75e97f1e14 Davi*0268 ELSE
a1d0e455fd Hann*0269 FluxCO2(i,j,bi,bj) = 0. _d 0
75e97f1e14 Davi*0270 ENDIF
daab022f42 Step*0271
a1d0e455fd Hann*0272 FluxCO2(i,j,bi,bj) = FluxCO2(i,j,bi,bj)/permil
daab022f42 Step*0273
04d6738595 Davi*0274 #ifdef ALLOW_OLD_VIRTUALFLUX
a1d0e455fd Hann*0275 IF (maskC(i,j,kLev,bi,bj).NE.0. _d 0) THEN
0276
0277
daab022f42 Step*0278
0279
0280
0281
0282
93d40906a6 Jean*0283 VirtualFlux(i,j)=gsm_DIC*surfaceForcingS(i,j,bi,bj)/gsm_s
a1d0e455fd Hann*0284
0285
0286
0287 ELSE
daab022f42 Step*0288 VirtualFlux(i,j)=0. _d 0
a1d0e455fd Hann*0289 ENDIF
04d6738595 Davi*0290 #endif /* ALLOW_OLD_VIRTUALFLUX */
a1d0e455fd Hann*0291 ENDDO
0292 ENDDO
daab022f42 Step*0293
e098791e51 Jean*0294
a1d0e455fd Hann*0295 DO j=jMin,jMax
0296 DO i=iMin,iMax
c8d7031b60 Davi*0297 GDC(i,j)= recip_drF(kLev)*recip_hFacC(i,j,kLev,bi,bj)
e098791e51 Jean*0298 & *(FluxCO2(i,j,bi,bj)
04d6738595 Davi*0299 #ifdef ALLOW_OLD_VIRTUALFLUX
c8d7031b60 Davi*0300 & + VirtualFlux(i,j)
04d6738595 Davi*0301 #endif
c8d7031b60 Davi*0302 & )
a1d0e455fd Hann*0303 ENDDO
0304 ENDDO
daab022f42 Step*0305
6acab690ae Jona*0306 #endif /* ALLOW_DIC */
a1d0e455fd Hann*0307 RETURN
0308 END