File indexing completed on 2025-09-17 05:08:23 UTC
view on githubraw file Latest commit e9828181 on 2025-09-16 19:00:16 UTC
c0d1c06c15 Matt*0001 #include "BLING_OPTIONS.h"
a284455135 Matt*0002 #ifdef ALLOW_AUTODIFF
0003 # include "AUTODIFF_OPTIONS.h"
0004 #endif
c0d1c06c15 Matt*0005
0006
4dea327916 aver*0007
0008
0009
a284455135 Matt*0010 SUBROUTINE BLING_LIGHT(
e0f9a7ba0b Matt*0011 I mld,
0012 U irr_inst, irr_eff,
0013 I bi, bj, imin, imax, jmin, jmax,
0014 I myTime, myIter, myThid)
0015
4dea327916 aver*0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
e0f9a7ba0b Matt*0036 IMPLICIT NONE
0037
c0d1c06c15 Matt*0038
0039 #include "SIZE.h"
e0f9a7ba0b Matt*0040 #include "DYNVARS.h"
c0d1c06c15 Matt*0041 #include "EEPARAMS.h"
0042 #include "PARAMS.h"
0043 #include "GRID.h"
0044 #include "BLING_VARS.h"
e0f9a7ba0b Matt*0045 #ifdef USE_QSW
0046 #include "FFIELDS.h"
0047 #endif
a284455135 Matt*0048 #ifdef ALLOW_AUTODIFF_TAMC
c0d1c06c15 Matt*0049 # include "tamc.h"
0050 #endif
0051
4dea327916 aver*0052
c0d1c06c15 Matt*0053
0054
0055
0056
0057
0058
0059 INTEGER bi, bj, imin, imax, jmin, jmax
0060 INTEGER myThid
0061 INTEGER myIter
0062 _RL myTime
0063 _RL mld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
4dea327916 aver*0064
0065
e37161e05a Jean*0066
0067
c0d1c06c15 Matt*0068 _RL irr_inst (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0069 _RL irr_eff (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0070
4dea327916 aver*0071
e37161e05a Jean*0072 INTEGER i,j,k
0073 LOGICAL QSW_underice
0074 #ifdef ALLOW_CAL
0075 INTEGER mydate(4)
0076 #endif
0077 _RL localTime
0078 _RL utcTime, diffutc
0079 _RL sat_atten
0080 _RL sat_atten_sum(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0081 _RL chl_sat_sum (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
c0d1c06c15 Matt*0082 _RL atten
0083 _RL irr_surf (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
e0f9a7ba0b Matt*0084 #ifdef ML_MEAN_LIGHT
c0d1c06c15 Matt*0085 _RL irr_mix (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
4dea327916 aver*0086 _RL SumMLIrr (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0087 _RL tmp_ML (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
c0d1c06c15 Matt*0088 #endif
0089 #ifndef USE_QSW
9f5240b52a Jean*0090 _RL solar, albedo
0091 _RL dayfrac, yday, delta
0092 _RL lat, sun1, dayhrs
0093 _RL cosz, frac, fluxi
c0d1c06c15 Matt*0094 _RL sfac (1-OLy:sNy+OLy)
0095 #endif
00fa2d4ddd mmaz*0096 #ifdef PHYTO_SELF_SHADING
0097 _RL k0_rd, chi_rd, e_rd
0098 _RL k0_bg, chi_bg, e_bg
a284455135 Matt*0099 _RL kChl_rd (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0100 _RL kChl_bg (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
00fa2d4ddd mmaz*0101 _RL atten_rd
0102 _RL atten_bg
a284455135 Matt*0103 _RL irr_rd (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0104 _RL irr_bg (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
4dea327916 aver*0105 #endif /* PHYTO_SELF_SHADING */
4e4ad91a39 Jean*0106 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0107
4dea327916 aver*0108
0109 INTEGER tkey, kkey
00fa2d4ddd mmaz*0110 #endif
c0d1c06c15 Matt*0111
0112
e9828181c3 Yixi*0113
0114
0115
4dea327916 aver*0116 QSW_underice = .FALSE.
0117 #ifdef USE_QSW
0118 IF ( useSEAICE ) QSW_underice = .TRUE.
0119 IF ( useThSIce ) QSW_underice = .TRUE.
0120 #endif
a284455135 Matt*0121
e37161e05a Jean*0122 DO j=1-OLy,sNy+OLy
0123 DO i=1-OLx,sNx+OLx
0124 chl_sat_sum(i,j) = 0. _d 0
0125 sat_atten_sum(i,j) = 0. _d 0
0126 #ifdef ML_MEAN_LIGHT
0127 SumMLIrr(i,j) = 0. _d 0
0128 tmp_ML(i,j) = 0. _d 0
0129 #endif
0130 ENDDO
0131 ENDDO
4dea327916 aver*0132 DO k=1,Nr
e37161e05a Jean*0133 DO j=1-OLy,sNy+OLy
0134 DO i=1-OLx,sNx+OLx
4dea327916 aver*0135 irr_eff(i,j,k) = 0. _d 0
a284455135 Matt*0136 #ifdef PHYTO_SELF_SHADING
4dea327916 aver*0137 irr_rd(i,j,k) = 0. _d 0
0138 irr_bg(i,j,k) = 0. _d 0
a284455135 Matt*0139 #endif
c0d1c06c15 Matt*0140 ENDDO
0141 ENDDO
4dea327916 aver*0142 ENDDO
e37161e05a Jean*0143
4dea327916 aver*0144 #ifdef PHYTO_SELF_SHADING
e9828181c3 Yixi*0145
0146
4dea327916 aver*0147 k0_rd = 0.225 _d 0
0148 k0_bg = 0.0232 _d 0
0149 chi_rd = 0.037 _d 0
0150 chi_bg = 0.074 _d 0
0151 e_rd = 0.629 _d 0
0152 e_bg = 0.674 _d 0
0153 #endif
c0d1c06c15 Matt*0154
e9828181c3 Yixi*0155
0156
c0d1c06c15 Matt*0157
e0f9a7ba0b Matt*0158 #ifndef USE_QSW
e9828181c3 Yixi*0159
0160
c0d1c06c15 Matt*0161
0162 solar = 1360. _d 0
0163 albedo = 0.6 _d 0
0164
0165
0166 IF ( usingCurvilinearGrid .OR. rotateGrid ) THEN
0167 STOP 'ABNORMAL END: S/R INSOL: 2-D output not implemented'
0168 ENDIF
0169
0170
4dea327916 aver*0171
0172 dayfrac=mod(myTime,360. _d 0*86400. _d 0)
0173 & /(360. _d 0*86400. _d 0)
0174
0175 yday = 2. _d 0*PI*dayfrac
0176
0177 delta = (0.006918 _d 0
0178 & -(0.399912 _d 0*cos(yday))
0179 & +(0.070257 _d 0*sin(yday))
0180 & -(0.006758 _d 0*cos(2. _d 0*yday))
0181 & +(0.000907 _d 0*sin(2. _d 0*yday))
0182 & -(0.002697 _d 0*cos(3. _d 0*yday))
0183 & +(0.001480 _d 0*sin(3. _d 0*yday)) )
0184 DO j=1-OLy,sNy+OLy
c0d1c06c15 Matt*0185
4dea327916 aver*0186 lat=YC(1,j,1,bj)*deg2rad
c0d1c06c15 Matt*0187
0188
4dea327916 aver*0189 IF ( usingCartesianGrid .OR. usingCylindricalGrid )
0190 & lat = asin( fCori(1,j,1,bj)/(2. _d 0*omega) )
0191 sun1 = -sin(delta)/cos(delta) * sin(lat)/cos(lat)
0192 IF (sun1.LE.-0.999 _d 0) sun1=-0.999 _d 0
0193 IF (sun1.GE. 0.999 _d 0) sun1= 0.999 _d 0
0194 dayhrs = abs(acos(sun1))
0195
0196 cosz = ( sin(delta)*sin(lat)
0197 & +(cos(delta)*cos(lat)*sin(dayhrs)/dayhrs) )
0198 IF (cosz.LE.5. _d -3) cosz= 5. _d -3
0199
0200 frac = dayhrs/PI
c0d1c06c15 Matt*0201
4dea327916 aver*0202 fluxi = solar*(1. _d 0-albedo)*cosz*frac*parfrac
c0d1c06c15 Matt*0203
0204
4dea327916 aver*0205 sfac(j) = MAX(1. _d -5,fluxi)
0206 ENDDO
9f5240b52a Jean*0207 #endif /* ndef USE_QSW */
c0d1c06c15 Matt*0208
82e538d851 aver*0209
0210 utcTime = MOD( myTime/3600. _d 0, 24. _d 0 )
0211 #ifdef ALLOW_CAL
e9828181c3 Yixi*0212
82e538d851 aver*0213 IF ( useCAL ) THEN
4dea327916 aver*0214 CALL CAL_GETDATE( myIter, myTime, mydate, myThid )
0215 i = mydate(2)/10000
0216 j = mydate(2)/100
0217 j = MOD(j,100)
0218 k = MOD(mydate(2),100)
0219 utcTime = i + j/60. _d 0 + k/3600. _d 0
82e538d851 aver*0220 ENDIF
0221 #endif
0222
e9828181c3 Yixi*0223
0224
c0d1c06c15 Matt*0225
e37161e05a Jean*0226 DO j=jmin,jmax
0227 DO i=imin,imax
e9828181c3 Yixi*0228
e37161e05a Jean*0229 #ifdef USE_QSW
0230 irr_surf(i,j) = MAX( epsln,
0231 & -parfrac*Qsw(i,j,bi,bj)*maskC(i,j,1,bi,bj))
0232 #else
0233 irr_surf(i,j) = sfac(j)
0234 #endif
e9828181c3 Yixi*0235
e37161e05a Jean*0236 IF ( .NOT. QSW_underice ) THEN
0237 irr_surf(i,j) = irr_surf(i,j)*(1. _d 0 - FIce(i,j,bi,bj))
0238 ENDIF
0239 ENDDO
0240 ENDDO
0241
4dea327916 aver*0242 #ifdef ALLOW_AUTODIFF_TAMC
0243 tkey = bi + (bj - 1)*nSx + (ikey_dynamics - 1)*nSx*nSy
0244 #endif /* ALLOW_AUTODIFF_TAMC */
0245
0246 DO k=1,Nr
0247
0248 #ifdef ALLOW_AUTODIFF_TAMC
0249 kkey = k + (tkey-1)*Nr
0250 # ifdef ML_MEAN_LIGHT
0251
0252 # endif /* ML_MEAN_LIGHT */
0253 #endif
0254
0255
0256 IF ( k.EQ.1) THEN
0257
0258 DO j=jmin,jmax
0259 DO i=imin,imax
0260
0261 IF ( maskC(i,j,k,bi,bj).EQ.oneRS ) THEN
e0f9a7ba0b Matt*0262
00fa2d4ddd mmaz*0263 #ifdef PHYTO_SELF_SHADING
e9828181c3 Yixi*0264
0265
0266
0267
0268
00fa2d4ddd mmaz*0269
e9828181c3 Yixi*0270
4dea327916 aver*0271 #ifdef ALLOW_AUTODIFF
0272 IF ( chl(i,j,1,bi,bj) .GT. 0. _d 0 ) THEN
0273 #endif
0274 kChl_rd(i,j,1) = k0_rd + chi_rd*(chl(i,j,1,bi,bj)**e_rd)
0275 kChl_bg(i,j,1) = k0_bg + chi_bg*(chl(i,j,1,bi,bj)**e_bg)
0276 #ifdef ALLOW_AUTODIFF
0277 ELSE
0278 kChl_rd(i,j,1) = k0_rd
0279 kChl_bg(i,j,1) = k0_bg
0280 ENDIF
0281 #endif
e9828181c3 Yixi*0282
4dea327916 aver*0283 atten_rd = kChl_rd(i,j,1)*drF(1)/2. _d 0*hFacC(i,j,1,bi,bj)
0284 atten_bg = kChl_bg(i,j,1)*drF(1)/2. _d 0*hFacC(i,j,1,bi,bj)
e9828181c3 Yixi*0285
4dea327916 aver*0286 irr_rd(i,j,1) = irr_surf(i,j) * exp(-atten_rd) * 0.5 _d 0
0287 irr_bg(i,j,1) = irr_surf(i,j) * exp(-atten_bg) * 0.5 _d 0
0288 irr_inst(i,j,1) = irr_rd(i,j,1) + irr_bg(i,j,1)
e37161e05a Jean*0289 #else /* PHYTO_SELF_SHADING */
4dea327916 aver*0290
e9828181c3 Yixi*0291
0292 atten = k0_2d(i,j,bi,bj)*halfRL*drF(1)*hFacC(i,j,1,bi,bj)
4dea327916 aver*0293 irr_inst(i,j,1) = irr_surf(i,j)*exp(-atten)
0294
e37161e05a Jean*0295 #endif /* PHYTO_SELF_SHADING */
4dea327916 aver*0296
0297 ENDIF
0298 ENDDO
0299 ENDDO
e37161e05a Jean*0300
4dea327916 aver*0301
0302 ELSE
0303
0304 #ifdef ALLOW_AUTODIFF_TAMC
0305 # ifdef PHYTO_SELF_SHADING
0306
0307
0308 # endif
0309 #endif
0310
0311 DO j=jmin,jmax
0312 DO i=imin,imax
0313
0314 IF ( maskC(i,j,k,bi,bj).EQ.oneRS ) THEN
00fa2d4ddd mmaz*0315
4dea327916 aver*0316 #ifdef PHYTO_SELF_SHADING
e9828181c3 Yixi*0317
4dea327916 aver*0318 #ifdef ALLOW_AUTODIFF
0319 IF ( chl(i,j,k,bi,bj) .GT. 0. _d 0 ) THEN
0320 #endif
0321 kChl_rd(i,j,k) = k0_rd + chi_rd*(chl(i,j,k,bi,bj)**e_rd)
0322 kChl_bg(i,j,k) = k0_bg + chi_bg*(chl(i,j,k,bi,bj)**e_bg)
0323 #ifdef ALLOW_AUTODIFF
0324 ELSE
0325 kChl_rd(i,j,k) = k0_rd
0326 kChl_bg(i,j,k) = k0_bg
0327 ENDIF
0328 #endif
e9828181c3 Yixi*0329
4dea327916 aver*0330 atten_rd = kChl_rd(i,j,k)*drF(k)/2. _d 0*hFacC(i,j,k,bi,bj)
0331 & + kChl_rd(i,j,k-1)*drF(k-1)/2. _d 0*hFacC(i,j,k-1,bi,bj)
0332 atten_bg = kChl_bg(i,j,k)*drF(k)/2. _d 0*hFacC(i,j,k,bi,bj)
0333 & + kChl_bg(i,j,k-1)*drF(k-1)/2. _d 0*hFacC(i,j,k-1,bi,bj)
e9828181c3 Yixi*0334
4dea327916 aver*0335 irr_rd(i,j,k) = irr_rd(i,j,k-1)*exp(-atten_rd)
0336 irr_bg(i,j,k) = irr_bg(i,j,k-1)*exp(-atten_bg)
0337 irr_inst(i,j,k) = irr_rd(i,j,k) + irr_bg(i,j,k)
00fa2d4ddd mmaz*0338
e37161e05a Jean*0339 #else /* PHYTO_SELF_SHADING */
e0f9a7ba0b Matt*0340
e9828181c3 Yixi*0341
0342 atten = k0_2d(i,j,bi,bj)*halfRL*( drF(k)*hFacC(i,j,k,bi,bj)
0343 & + drF(k-1)*hFacC(i,j,k-1,bi,bj) )
e37161e05a Jean*0344 irr_inst(i,j,k) = irr_inst(i,j,k-1)*exp(-atten)
4dea327916 aver*0345
e37161e05a Jean*0346 #endif /* PHYTO_SELF_SHADING */
4dea327916 aver*0347
0348 ENDIF
0349 ENDDO
0350 ENDDO
c0d1c06c15 Matt*0351
e37161e05a Jean*0352 ENDIF /* if k=1 then, else */
e0f9a7ba0b Matt*0353
82e538d851 aver*0354
4dea327916 aver*0355 DO j=jmin,jmax
0356 DO i=imin,imax
0357 IF ( maskC(i,j,k,bi,bj).EQ.oneRS ) THEN
0358
e37161e05a Jean*0359 IF ( irr_surf(i,j).GT.zeroRL ) THEN
82e538d851 aver*0360
4dea327916 aver*0361 #ifdef PHYTO_SELF_SHADING
e37161e05a Jean*0362 sat_atten = exp(-2. _d 0 * k0_bg * (-rC(k)))
82e538d851 aver*0363 #else
e9828181c3 Yixi*0364 sat_atten = exp(-2. _d 0 * k0_2d(i,j,bi,bj) * (-rC(k)))
82e538d851 aver*0365 #endif
4dea327916 aver*0366 chl_sat_sum(i,j) = chl_sat_sum(i,j)
82e538d851 aver*0367 & + chl(i,j,k,bi,bj)*sat_atten
4dea327916 aver*0368 sat_atten_sum(i,j) = sat_atten_sum(i,j) + sat_atten
0369 ENDIF
82e538d851 aver*0370
c0d1c06c15 Matt*0371 #ifdef ML_MEAN_LIGHT
e9828181c3 Yixi*0372
e37161e05a Jean*0373 IF ( (-rF(k+1).LE. mld(i,j)) .AND.
0374 & (-rF(k+1).LT.MLmix_max) ) THEN
4dea327916 aver*0375 SumMLIrr(i,j) = SumMLIrr(i,j)+drF(k)*irr_inst(i,j,k)
0376 tmp_ML(i,j) = tmp_ML(i,j) + drF(k)
0377 irr_mix(i,j) = SumMLIrr(i,j)/tmp_ML(i,j)
0378 ENDIF
c0d1c06c15 Matt*0379 #endif
0380
e37161e05a Jean*0381 ENDIF
0382 ENDDO
0383 ENDDO
0384
0385
0386 ENDDO
0387
0388
82e538d851 aver*0389
e37161e05a Jean*0390 DO j=jmin,jmax
0391 DO i=imin,imax
0392 IF ( usingSphericalPolarGrid .OR. usingCurvilinearGrid ) THEN
0393
0394 diffutc = XC(i,j,bi,bj)/15. _d 0
0395 ELSE
0396
0397 diffutc = 0. _d 0
0398 ENDIF
0399 localTime = utcTime + diffutc + 24. _d 0
0400 localTime = MOD( localTime, 24. _d 0 )
0401 IF ( localTime.GT.chlsat_locTimWindow(1) .AND.
0402 & localTime.LT.chlsat_locTimWindow(2) ) THEN
0403 chl_sat(i,j,bi,bj) = chl_sat_sum(i,j)
0404 & / (sat_atten_sum(i,j) + epsln)
0405 ENDIF
0406 ENDDO
0407 ENDDO
c0d1c06c15 Matt*0408
e37161e05a Jean*0409 DO k=1,Nr
0410 DO j=jmin,jmax
0411 DO i=imin,imax
0412 IF ( maskC(i,j,k,bi,bj).EQ.oneRS ) THEN
e0f9a7ba0b Matt*0413
e37161e05a Jean*0414 irr_eff(i,j,k) = irr_inst(i,j,k)
c0d1c06c15 Matt*0415 #ifdef ML_MEAN_LIGHT
e9828181c3 Yixi*0416
e37161e05a Jean*0417 IF ( (-rF(k+1).LE. mld(i,j)) .AND.
0418 & (-rF(k+1).LT.MLmix_max) ) THEN
c0d1c06c15 Matt*0419 irr_eff(i,j,k) = irr_mix(i,j)
0420 ENDIF
e0f9a7ba0b Matt*0421 #endif
c0d1c06c15 Matt*0422
0423 ENDIF
0424 ENDDO
0425 ENDDO
0426 ENDDO
e0f9a7ba0b Matt*0427
82e538d851 aver*0428 #ifdef ALLOW_DIAGNOSTICS
0429 IF ( useDiagnostics ) THEN
4dea327916 aver*0430 CALL DIAGNOSTICS_FILL(chl_sat,'BLGCHLSA',0,1,1,bi,bj,myThid)
82e538d851 aver*0431 ENDIF
0432 #endif /* ALLOW_DIAGNOSTICS */
0433
c0d1c06c15 Matt*0434 RETURN
0435 END