97 & LBi, UBi, LBj, UBj, UBk, UBt, &
98 & IminS, ImaxS, JminS, JmaxS, &
103#if defined IRON_LIMIT && defined IRON_RELAX
106 & Hz, ad_Hz, z_r, ad_z_r, &
119 integer,
intent(in) :: ng, tile
120 integer,
intent(in) :: LBi, UBi, LBj, UBj, UBk, UBt
121 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
122 integer,
intent(in) :: nstp, nnew
126 real(r8),
intent(in) :: rmask(LBi:,LBj:)
128#if defined IRON_LIMIT && defined IRON_RELAX
129 real(r8),
intent(in) :: h(LBi:,LBj:)
131 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
132 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
133 real(r8),
intent(in) :: z_w(LBi:,LBj:,0:)
134 real(r8),
intent(in) :: srflx(LBi:,LBj:)
135 real(r8),
intent(inout) :: t(LBi:,LBj:,:,:,:)
137 real(r8),
intent(inout) :: ad_Hz(LBi:,LBj:,:)
138 real(r8),
intent(in) :: ad_z_r(LBi:,LBj:,:)
139 real(r8),
intent(inout) :: ad_z_w(LBi:,LBj:,0:)
140 real(r8),
intent(inout) :: ad_srflx(LBi:,LBj:)
141 real(r8),
intent(inout) :: ad_t(LBi:,LBj:,:,:,:)
144 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
146#if defined IRON_LIMIT && defined IRON_RELAX
147 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
149 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,UBk)
150 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,UBk)
151 real(r8),
intent(in) :: z_w(LBi:UBi,LBj:UBj,0:UBk)
152 real(r8),
intent(in) :: srflx(LBi:UBi,LBj:UBj)
153 real(r8),
intent(inout) :: t(LBi:UBi,LBj:UBj,UBk,3,UBt)
155 real(r8),
intent(inout) :: ad_Hz(LBi:UBi,LBj:UBj,UBk)
156 real(r8),
intent(in) :: ad_z_r(LBi:UBi,LBj:UBj,UBk)
157 real(r8),
intent(inout) :: ad_z_w(LBi:UBi,LBj:UBj,0:UBk)
158 real(r8),
intent(inout) :: ad_srflx(LBi:UBi,LBj:UBj)
159 real(r8),
intent(inout) :: ad_t(LBi:UBi,LBj:UBj,UBk,3,UBt)
164 integer,
parameter :: Nsink = 2
166 integer :: Iter, i, ibio, isink, itime, itrc, iTrcMax, j, k, ks
167 integer :: Iteradj, kk
169 integer,
dimension(Nsink) :: idsink
171 real(r8),
parameter :: MinVal = 1.0e-6_r8
173 real(r8) :: Att, ExpAtt, Itop, PAR, PAR1
174 real(r8) :: ad_Att, ad_ExpAtt, ad_Itop, ad_PAR
175 real(r8) :: cff, cff1, cff2, cff3, cff4, cff5, cff6, dtdays
176 real(r8) :: ad_cff, ad_cff1, ad_cff4, ad_cff5, ad_cff6
177 real(r8) :: cffL, cffR, cu, dltL, dltR
178 real(r8) :: ad_cffL, ad_cffR, ad_cu, ad_dltL, ad_dltR
179 real(r8) :: fac, fac1, fac2
180 real(r8) :: ad_fac, ad_fac1, ad_fac2
181 real(r8) :: adfac, adfac1, adfac2, adfac3
183 real(r8) :: Nlimit, FNlim
184 real(r8) :: ad_Nlimit, ad_FNlim
185 real(r8) :: FNratio, FCratio, FCratioE, Flimit
186 real(r8) :: ad_FNratio, ad_FCratio, ad_FCratioE, ad_Flimit
187 real(r8) :: FeC2FeN, FeN2FeC
189 real(r8) :: FeNudgCoef
192 real(r8),
dimension(Nsink) :: Wbio
193 real(r8),
dimension(Nsink) :: ad_Wbio
195 integer,
dimension(IminS:ImaxS,N(ng)) :: ksource
197 real(r8),
dimension(IminS:ImaxS) :: PARsur
198 real(r8),
dimension(IminS:ImaxS) :: ad_PARsur
200 real(r8),
dimension(NT(ng),2) :: BioTrc
201 real(r8),
dimension(NT(ng),2) :: BioTrc1
202 real(r8),
dimension(NT(ng),2) :: ad_BioTrc
203 real(r8),
dimension(IminS:ImaxS,N(ng),NT(ng)) :: Bio
204 real(r8),
dimension(IminS:ImaxS,N(ng),NT(ng)) :: Bio1
205 real(r8),
dimension(IminS:ImaxS,N(ng),NT(ng)) :: Bio2
206 real(r8),
dimension(IminS:ImaxS,N(ng),NT(ng)) :: Bio_old
208 real(r8),
dimension(IminS:ImaxS,N(ng),NT(ng)) :: ad_Bio
209 real(r8),
dimension(IminS:ImaxS,N(ng),NT(ng)) :: ad_Bio_old
211 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FC
212 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: ad_FC
214 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Hz_inv
215 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Hz_inv2
216 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Hz_inv3
217 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Light
218 real(r8),
dimension(IminS:ImaxS,N(ng)) :: WL
219 real(r8),
dimension(IminS:ImaxS,N(ng)) :: WR
220 real(r8),
dimension(IminS:ImaxS,N(ng)) :: bL
221 real(r8),
dimension(IminS:ImaxS,N(ng)) :: bL1
222 real(r8),
dimension(IminS:ImaxS,N(ng)) :: bR
223 real(r8),
dimension(IminS:ImaxS,N(ng)) :: bR1
224 real(r8),
dimension(IminS:ImaxS,N(ng)) :: qc
226 real(r8),
dimension(IminS:ImaxS,N(ng)) :: ad_Hz_inv
227 real(r8),
dimension(IminS:ImaxS,N(ng)) :: ad_Hz_inv2
228 real(r8),
dimension(IminS:ImaxS,N(ng)) :: ad_Hz_inv3
229 real(r8),
dimension(IminS:ImaxS,N(ng)) :: ad_Light
230 real(r8),
dimension(IminS:ImaxS,N(ng)) :: ad_WL
231 real(r8),
dimension(IminS:ImaxS,N(ng)) :: ad_WR
232 real(r8),
dimension(IminS:ImaxS,N(ng)) :: ad_bL
233 real(r8),
dimension(IminS:ImaxS,N(ng)) :: ad_bR
234 real(r8),
dimension(IminS:ImaxS,N(ng)) :: ad_qc
236#include "set_bounds.h"
250#if defined IRON_LIMIT && defined IRON_RELAX
260 fen2fec=(16.0_r8/106.0_r8)*1.0e3_r8
261 fec2fen=(106.0_r8/16.0_r8)*1.0e-3_r8
278 j_loop :
DO j=jstr,jend
316 ad_hz_inv(i,k)=0.0_r8
317 ad_hz_inv2(i,k)=0.0_r8
318 ad_hz_inv3(i,k)=0.0_r8
329 ad_biotrc(ibio,1)=0.0_r8
330 ad_biotrc(ibio,2)=0.0_r8
348 bio1(i,k,ibio)=0.0_r8
349 bio2(i,k,ibio)=0.0_r8
350 ad_bio(i,k,ibio)=0.0_r8
351 ad_bio_old(i,k,ibio)=0.0_r8
360 hz_inv(i,k)=1.0_r8/hz(i,j,k)
365 hz_inv2(i,k)=1.0_r8/(hz(i,j,k)+hz(i,j,k+1))
370 hz_inv3(i,k)=1.0_r8/(hz(i,j,k-1)+hz(i,j,k)+hz(i,j,k+1))
399 biotrc(ibio,nstp)=t(i,j,k,nstp,ibio)
402 biotrc(ibio,nnew)=t(i,j,k,nnew,ibio)
417 cff1=cff1+max(0.0_r8,minval-biotrc(ibio,itime))
418 IF (biotrc(ibio,itime).gt.biotrc(itrcmax,itime))
THEN
421 biotrc(ibio,itime)=max(minval,biotrc(ibio,itime))
423 IF (biotrc(itrcmax,itime).gt.cff1)
THEN
424 biotrc(itrcmax,itime)=biotrc(itrcmax,itime)-cff1
429 biotrc(ibio,itime)=max(minval,biotrc(ibio,itime))
438 bio_old(i,k,ibio)=biotrc(ibio,nstp)
439 bio(i,k,ibio)=biotrc(ibio,nstp)
442#if defined IRON_LIMIT && defined IRON_RELAX
448 IF (h(i,j).le.
fehmin(ng))
THEN
525 iter_loop:
DO iter=1,
bioiter(ng)
531 IF (parsur(i).gt.0.0_r8)
THEN
539 & (z_w(i,j,k)-z_w(i,j,k-1))
542 par=itop*(1.0_r8-expatt)/att
581 fnratio=bio(i,k,
ifphy)/max(minval,bio(i,k,
iphyt))
582 fcratio=fnratio*fen2fec
584 flimit=fcratio*fcratio/ &
588 fnlim=min(1.0_r8,flimit/(bio(i,k,
ino3_)*nlimit))
590 cff4=1.0_r8/sqrt(cff2+cff3*light(i,k)*light(i,k))
591 cff=bio(i,k,
iphyt)* &
593 & cff1*cff4*light(i,k)*fnlim*nlimit
596 & cff1*cff4*light(i,k)/ &
607 fac=cff*bio(i,k,
ino3_)*fnratio/ &
608 & max(minval,bio(i,k,
ifdis))
615 cff5=dtdays*(fcratioe-fcratio)/
t_fe(ng)
616 cff6=bio(i,k,
iphyt)*cff5*fec2fen
617 IF (cff6.ge.0.0_r8)
THEN
618 cff=cff6/max(minval,bio(i,k,
ifdis))
623 cff=-cff6/max(minval,bio(i,k,
ifphy))
641 cff1=dtdays*
zoogr(ng)
645 cff=bio(i,k,
izoop)* &
646 & cff1*(1.0_r8-exp(-
ivlev(ng)*bio(i,k,
iphyt)))/ &
650 & bio(i,k,
iphyt)*cff2*cff
668 cff1=1.0_r8/(1.0_r8+cff2+cff3)
673 & bio(i,k,
iphyt)*cff2
675 & bio(i,k,
iphyt)*cff3
689 cff1=1.0_r8/(1.0_r8+cff2+cff3)
694 & bio(i,k,
izoop)*cff2
696 & bio(i,k,
izoop)*cff3
702 cff2=dtdays*
detrr(ng)
703 cff1=1.0_r8/(1.0_r8+cff2)
708 & bio(i,k,
isdet)*cff2
720 sink_loop:
DO isink=1,nsink
730 qc(i,k)=bio(i,k,ibio)
736 fc(i,k)=(qc(i,k+1)-qc(i,k))*hz_inv2(i,k)
741 dltr=hz(i,j,k)*fc(i,k)
742 dltl=hz(i,j,k)*fc(i,k-1)
743 cff=hz(i,j,k-1)+2.0_r8*hz(i,j,k)+hz(i,j,k+1)
750 IF ((dltr*dltl).le.0.0_r8)
THEN
753 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
755 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
768 cff=(dltr-dltl)*hz_inv3(i,k)
769 dltr=dltr-cff*hz(i,j,k+1)
770 dltl=dltl+cff*hz(i,j,k-1)
773 wr(i,k)=(2.0_r8*dltr-dltl)**2
774 wl(i,k)=(dltr-2.0_r8*dltl)**2
780 dltl=max(cff,wl(i,k ))
781 dltr=max(cff,wr(i,k+1))
782 br(i,k)=(dltr*br(i,k)+dltl*bl(i,k+1))/(dltr+dltl)
788#if defined LINEAR_CONTINUATION
789 bl(i,
n(ng))=br(i,
n(ng)-1)
790 br(i,
n(ng))=2.0_r8*qc(i,
n(ng))-bl(i,
n(ng))
792 bl(i,
n(ng))=br(i,
n(ng)-1)
793 br(i,
n(ng))=1.5*qc(i,
n(ng))-0.5_r8*bl(i,
n(ng))
795 br(i,
n(ng))=qc(i,
n(ng))
796 bl(i,
n(ng))=qc(i,
n(ng))
797 br(i,
n(ng)-1)=qc(i,
n(ng))
799#if defined LINEAR_CONTINUATION
801 bl(i,1)=2.0_r8*qc(i,1)-br(i,1)
804 bl(i,1)=1.5_r8*qc(i,1)-0.5_r8*br(i,1)
822 IF ((dltr*dltl).lt.0.0_r8)
THEN
825 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
827 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
849 cff=dtdays*abs(wbio(isink))
853 wl(i,k)=z_w(i,j,k-1)+cff
854 wr(i,k)=hz(i,j,k)*qc(i,k)
861 IF (wl(i,k).gt.z_w(i,j,ks))
THEN
863 fc(i,k-1)=fc(i,k-1)+wr(i,ks)
874 cu=min(1.0_r8,(wl(i,k)-z_w(i,j,ks-1))*hz_inv(i,ks))
875 fc(i,k-1)=fc(i,k-1)+ &
878 & cu*(0.5_r8*(br(i,ks)-bl(i,ks))- &
880 & (br(i,ks)+bl(i,ks)- &
886 bio(i,k,ibio)=qc(i,k)+(fc(i,k)-fc(i,k-1))*hz_inv(i,k)
912 cff=bio(i,k,ibio)-bio_old(i,k,ibio)
916 ad_hz(i,j,k)=ad_hz(i,j,k)+cff*ad_t(i,j,k,nnew,ibio)
917 ad_cff=ad_cff+hz(i,j,k)*ad_t(i,j,k,nnew,ibio)
920 ad_bio_old(i,k,ibio)=ad_bio_old(i,k,ibio)-ad_cff
921 ad_bio(i,k,ibio)=ad_bio(i,k,ibio)+ad_cff
932 iter_loop1:
DO iter=
bioiter(ng),1,-1
962 biotrc(ibio,nstp)=t(i,j,k,nstp,ibio)
965 biotrc(ibio,nnew)=t(i,j,k,nnew,ibio)
980 cff1=cff1+max(0.0_r8,minval-biotrc(ibio,itime))
981 IF (biotrc(ibio,itime).gt.biotrc(itrcmax,itime))
THEN
984 biotrc(ibio,itime)=max(minval,biotrc(ibio,itime))
986 IF (biotrc(itrcmax,itime).gt.cff1)
THEN
987 biotrc(itrcmax,itime)=biotrc(itrcmax,itime)-cff1
992 biotrc(ibio,itime)=max(minval,biotrc(ibio,itime))
1001 bio_old(i,k,ibio)=biotrc(ibio,nstp)
1002 bio(i,k,ibio)=biotrc(ibio,nstp)
1005#if defined IRON_LIMIT && defined IRON_RELAX
1011 IF (h(i,j).le.
fehmin(ng))
THEN
1028 parsur(i)=158.075_r8
1045 IF (parsur(i).gt.0.0_r8)
THEN
1053 & (z_w(i,j,k)-z_w(i,j,k-1))
1056 par=itop*(1.0_r8-expatt)/att
1098 fnratio=bio(i,k,
ifphy)/max(minval,bio(i,k,
iphyt))
1099 fcratio=fnratio*fen2fec
1101 flimit=fcratio*fcratio/ &
1105 fnlim=min(1.0_r8,flimit/(bio(i,k,
ino3_)*nlimit))
1107 cff4=1.0_r8/sqrt(cff2+cff3*light(i,k)*light(i,k))
1108 cff=bio(i,k,
iphyt)* &
1110 & cff1*cff4*light(i,k)*fnlim*nlimit
1112 & cff1*cff4*light(i,k)/ &
1117 & bio(i,k,
ino3_)*cff
1122 fac=cff*bio(i,k,
ino3_)*fnratio/ &
1123 & max(minval,bio(i,k,
ifdis))
1126 & bio(i,k,
ifdis)*fac
1130 cff=cff*bio(i,k,
ino3_)* &
1131 & fnratio/max(minval,bio(i,k,
ifdis))
1134 & bio(i,k,
ifdis)*cff
1138 cff5=dtdays*(fcratioe-fcratio)/
t_fe(ng)
1139 cff6=bio(i,k,
iphyt)*cff5*fec2fen
1140 IF (cff6.ge.0.0_r8)
THEN
1141 cff=cff6/max(minval,bio(i,k,
ifdis))
1144 & bio(i,k,
ifdis)*cff
1146 cff=-cff6/max(minval,bio(i,k,
ifphy))
1149 & bio(i,k,
ifphy)*cff
1164 cff1=dtdays*
zoogr(ng)
1168 cff=bio(i,k,
izoop)* &
1169 & cff1*(1.0_r8-exp(-
ivlev(ng)*bio(i,k,
iphyt)))/ &
1173 & bio(i,k,
iphyt)*cff2*cff
1191 cff1=1.0_r8/(1.0_r8+cff2+cff3)
1196 & bio(i,k,
iphyt)*cff2
1198 & bio(i,k,
iphyt)*cff3
1212 cff1=1.0_r8/(1.0_r8+cff2+cff3)
1217 & bio(i,k,
izoop)*cff2
1219 & bio(i,k,
izoop)*cff3
1225 cff2=dtdays*
detrr(ng)
1226 cff1=1.0_r8/(1.0_r8+cff2)
1231 & bio(i,k,
isdet)*cff2
1235 IF (iteradj.ne.iter)
THEN
1255 qc(i,k)=bio(i,k,ibio)
1261 fc(i,k)=(qc(i,k+1)-qc(i,k))*hz_inv2(i,k)
1266 dltr=hz(i,j,k)*fc(i,k)
1267 dltl=hz(i,j,k)*fc(i,k-1)
1268 cff=hz(i,j,k-1)+2.0_r8*hz(i,j,k)+hz(i,j,k+1)
1275 IF ((dltr*dltl).le.0.0_r8)
THEN
1278 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
1280 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
1293 cff=(dltr-dltl)*hz_inv3(i,k)
1294 dltr=dltr-cff*hz(i,j,k+1)
1295 dltl=dltl+cff*hz(i,j,k-1)
1296 br(i,k)=qc(i,k)+dltr
1297 bl(i,k)=qc(i,k)-dltl
1298 wr(i,k)=(2.0_r8*dltr-dltl)**2
1299 wl(i,k)=(dltr-2.0_r8*dltl)**2
1305 dltl=max(cff,wl(i,k ))
1306 dltr=max(cff,wr(i,k+1))
1307 br(i,k)=(dltr*br(i,k)+dltl*bl(i,k+1))/(dltr+dltl)
1313#if defined LINEAR_CONTINUATION
1314 bl(i,
n(ng))=br(i,
n(ng)-1)
1315 br(i,
n(ng))=2.0_r8*qc(i,
n(ng))-bl(i,
n(ng))
1316#elif defined NEUMANN
1317 bl(i,
n(ng))=br(i,
n(ng)-1)
1318 br(i,
n(ng))=1.5*qc(i,
n(ng))-0.5_r8*bl(i,
n(ng))
1320 br(i,
n(ng))=qc(i,
n(ng))
1321 bl(i,
n(ng))=qc(i,
n(ng))
1322 br(i,
n(ng)-1)=qc(i,
n(ng))
1324#if defined LINEAR_CONTINUATION
1326 bl(i,1)=2.0_r8*qc(i,1)-br(i,1)
1327#elif defined NEUMANN
1329 bl(i,1)=1.5_r8*qc(i,1)-0.5_r8*br(i,1)
1343 dltr=br(i,k)-qc(i,k)
1344 dltl=qc(i,k)-bl(i,k)
1347 IF ((dltr*dltl).lt.0.0_r8)
THEN
1350 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
1352 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
1355 br(i,k)=qc(i,k)+dltr
1356 bl(i,k)=qc(i,k)-dltl
1374 cff=dtdays*abs(wbio(isink))
1378 wl(i,k)=z_w(i,j,k-1)+cff
1379 wr(i,k)=hz(i,j,k)*qc(i,k)
1386 IF (wl(i,k).gt.z_w(i,j,ks))
THEN
1388 fc(i,k-1)=fc(i,k-1)+wr(i,ks)
1399 cu=min(1.0_r8,(wl(i,k)-z_w(i,j,ks-1))*hz_inv(i,ks))
1400 fc(i,k-1)=fc(i,k-1)+ &
1403 & cu*(0.5_r8*(br(i,ks)-bl(i,ks))- &
1405 & (br(i,ks)+bl(i,ks)- &
1406 & 2.0_r8*qc(i,ks))))
1411 bio(i,k,ibio)=qc(i,k)+ &
1412 & (fc(i,k)-fc(i,k-1))*hz_inv(i,k)
1421 sink_loop1:
DO isink=1,nsink
1434 qc(i,k)=bio(i,k,ibio)
1440 fc(i,k)=(qc(i,k+1)-qc(i,k))*hz_inv2(i,k)
1445 dltr=hz(i,j,k)*fc(i,k)
1446 dltl=hz(i,j,k)*fc(i,k-1)
1447 cff=hz(i,j,k-1)+2.0_r8*hz(i,j,k)+hz(i,j,k+1)
1454 IF ((dltr*dltl).le.0.0_r8)
THEN
1457 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
1459 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
1472 cff=(dltr-dltl)*hz_inv3(i,k)
1473 dltr=dltr-cff*hz(i,j,k+1)
1474 dltl=dltl+cff*hz(i,j,k-1)
1475 br(i,k)=qc(i,k)+dltr
1476 bl(i,k)=qc(i,k)-dltl
1477 wr(i,k)=(2.0_r8*dltr-dltl)**2
1478 wl(i,k)=(dltr-2.0_r8*dltl)**2
1484 dltl=max(cff,wl(i,k ))
1485 dltr=max(cff,wr(i,k+1))
1486 br(i,k)=(dltr*br(i,k)+dltl*bl(i,k+1))/(dltr+dltl)
1492#if defined LINEAR_CONTINUATION
1493 bl(i,
n(ng))=br(i,
n(ng)-1)
1494 br(i,
n(ng))=2.0_r8*qc(i,
n(ng))-bl(i,
n(ng))
1495#elif defined NEUMANN
1496 bl(i,
n(ng))=br(i,
n(ng)-1)
1497 br(i,
n(ng))=1.5*qc(i,
n(ng))-0.5_r8*bl(i,
n(ng))
1499 br(i,
n(ng))=qc(i,
n(ng))
1500 bl(i,
n(ng))=qc(i,
n(ng))
1501 br(i,
n(ng)-1)=qc(i,
n(ng))
1503#if defined LINEAR_CONTINUATION
1505 bl(i,1)=2.0_r8*qc(i,1)-br(i,1)
1506#elif defined NEUMANN
1508 bl(i,1)=1.5_r8*qc(i,1)-0.5_r8*br(i,1)
1522 dltr=br(i,k)-qc(i,k)
1523 dltl=qc(i,k)-bl(i,k)
1526 IF ((dltr*dltl).lt.0.0_r8)
THEN
1529 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
1531 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
1534 br(i,k)=qc(i,k)+dltr
1535 bl(i,k)=qc(i,k)-dltl
1553 cff=dtdays*abs(wbio(isink))
1557 wl(i,k)=z_w(i,j,k-1)+cff
1558 wr(i,k)=hz(i,j,k)*qc(i,k)
1565 IF (wl(i,k).gt.z_w(i,j,ks))
THEN
1567 fc(i,k-1)=fc(i,k-1)+wr(i,ks)
1578 cu=min(1.0_r8,(wl(i,k)-z_w(i,j,ks-1))*hz_inv(i,ks))
1579 fc(i,k-1)=fc(i,k-1)+ &
1582 & cu*(0.5_r8*(br(i,ks)-bl(i,ks))- &
1584 & (br(i,ks)+bl(i,ks)- &
1585 & 2.0_r8*qc(i,ks))))
1594 ad_qc(i,k)=ad_qc(i,k)+ad_bio(i,k,ibio)
1595 ad_fc(i,k)=ad_fc(i,k)+hz_inv(i,k)*ad_bio(i,k,ibio)
1596 ad_fc(i,k-1)=ad_fc(i,k-1)-hz_inv(i,k)*ad_bio(i,k,ibio)
1597 ad_hz_inv(i,k)=ad_hz_inv(i,k)+ &
1598 & (fc(i,k)-fc(i,k-1))*ad_bio(i,k,ibio)
1599 ad_bio(i,k,ibio)=0.0_r8
1608 cu=min(1.0_r8,(wl(i,k)-z_w(i,j,ks-1))*hz_inv(i,ks))
1630 & cu*(0.5_r8*(br(i,ks)-bl(i,ks))- &
1632 & (br(i,ks)+bl(i,ks)- &
1633 & 2.0_r8*qc(i,ks))))*ad_fc(i,k-1)
1634 adfac1=hz(i,j,ks)*cu*ad_fc(i,k-1)
1636 adfac3=adfac2*(1.5_r8-cu)
1637 ad_hz(i,j,ks)=ad_hz(i,j,ks)+cu*adfac
1638 ad_cu=ad_cu+hz(i,j,ks)*adfac
1639 ad_bl(i,ks)=ad_bl(i,ks)+adfac1
1641 & adfac1*(0.5_r8*(br(i,ks)-bl(i,ks))- &
1643 & (br(i,ks)+bl(i,ks)- &
1644 & 2.0_r8*qc(i,ks)))+ &
1645 & adfac2*(br(i,ks)+bl(i,ks)-2.0_r8*qc(i,ks))
1646 ad_br(i,ks)=ad_br(i,ks)+0.5_r8*adfac2-adfac3
1647 ad_bl(i,ks)=ad_bl(i,ks)-0.5_r8*adfac2-adfac3
1648 ad_qc(i,ks)=ad_qc(i,ks)+2.0_r8*adfac3
1655 adfac=(0.5_r8+sign(0.5_r8, &
1656 & (1.0_r8-(wl(i,k)-z_w(i,j,ks-1))* &
1657 & hz_inv(i,ks))))*ad_cu
1658 adfac1=adfac*hz_inv(i,ks)
1659 ad_wl(i,k)=ad_wl(i,k)+adfac1
1660 ad_z_w(i,j,ks-1)=ad_z_w(i,j,ks-1)-adfac1
1661 ad_hz_inv(i,ks)=ad_hz_inv(i,ks)+ &
1662 & (wl(i,k)-z_w(i,j,ks-1))*adfac
1681 cff=dtdays*abs(wbio(isink))
1685 IF (wl(i,k).gt.z_w(i,j,ks))
THEN
1688 ad_wr(i,ks)=ad_wr(i,ks)+ad_fc(i,k-1)
1697 ad_hz(i,j,k)=ad_hz(i,j,k)+qc(i,k)*ad_wr(i,k)
1698 ad_qc(i,k)=ad_qc(i,k)+hz(i,j,k)*ad_wr(i,k)
1702 ad_z_w(i,j,k-1)=ad_z_w(i,j,k-1)+ad_wl(i,k)
1703 ad_cff=ad_cff+ad_wl(i,k)
1712 ad_wbio(isink)=ad_wbio(isink)+ &
1713 & dtdays*sign(1.0_r8,wbio(isink))*ad_cff
1725 qc(i,k)=bio(i,k,ibio)
1731 fc(i,k)=(qc(i,k+1)-qc(i,k))*hz_inv2(i,k)
1736 dltr=hz(i,j,k)*fc(i,k)
1737 dltl=hz(i,j,k)*fc(i,k-1)
1738 cff=hz(i,j,k-1)+2.0_r8*hz(i,j,k)+hz(i,j,k+1)
1745 IF ((dltr*dltl).le.0.0_r8)
THEN
1748 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
1750 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
1763 cff=(dltr-dltl)*hz_inv3(i,k)
1764 dltr=dltr-cff*hz(i,j,k+1)
1765 dltl=dltl+cff*hz(i,j,k-1)
1766 br(i,k)=qc(i,k)+dltr
1767 bl(i,k)=qc(i,k)-dltl
1768 wr(i,k)=(2.0_r8*dltr-dltl)**2
1769 wl(i,k)=(dltr-2.0_r8*dltl)**2
1775 dltl=max(cff,wl(i,k ))
1776 dltr=max(cff,wr(i,k+1))
1777 br(i,k)=(dltr*br(i,k)+dltl*bl(i,k+1))/(dltr+dltl)
1783#if defined LINEAR_CONTINUATION
1784 bl(i,
n(ng))=br(i,
n(ng)-1)
1785 br(i,
n(ng))=2.0_r8*qc(i,
n(ng))-bl(i,
n(ng))
1786#elif defined NEUMANN
1787 bl(i,
n(ng))=br(i,
n(ng)-1)
1788 br(i,
n(ng))=1.5*qc(i,
n(ng))-0.5_r8*bl(i,
n(ng))
1790 br(i,
n(ng))=qc(i,
n(ng))
1791 bl(i,
n(ng))=qc(i,
n(ng))
1792 br(i,
n(ng)-1)=qc(i,
n(ng))
1794#if defined LINEAR_CONTINUATION
1796 bl(i,1)=2.0_r8*qc(i,1)-br(i,1)
1797#elif defined NEUMANN
1799 bl(i,1)=1.5_r8*qc(i,1)-0.5_r8*br(i,1)
1813 dltr=br(i,k)-qc(i,k)
1814 dltl=qc(i,k)-bl(i,k)
1819 ad_qc(i,k)=ad_qc(i,k)+ad_bl(i,k)
1820 ad_dltl=ad_dltl-ad_bl(i,k)
1824 ad_qc(i,k)=ad_qc(i,k)+ad_br(i,k)
1825 ad_dltr=ad_dltr+ad_br(i,k)
1827 IF ((dltr*dltl).lt.0.0_r8)
THEN
1834 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
1837 ad_cffl=ad_cffl+ad_dltr
1839 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
1842 ad_cffr=ad_cffr+ad_dltl
1847 ad_dltl=ad_dltl+2.0_r8*ad_cffl
1851 ad_dltr=ad_dltr+2.0_r8*ad_cffr
1855 ad_qc(i,k)=ad_qc(i,k)+ad_dltl
1856 ad_bl(i,k)=ad_bl(i,k)-ad_dltl
1860 ad_br(i,k)=ad_br(i,k)+ad_dltr
1861 ad_qc(i,k)=ad_qc(i,k)-ad_dltr
1866#if defined LINEAR_CONTINUATION
1869 ad_bl(i,2)=ad_bl(i,2)+ad_br(i,1)
1873 ad_qc(i,1)=ad_qc(i,1)+2.0_r8*ad_bl(i,1)
1874 ad_br(i,1)=ad_br(i,1)-ad_bl(i,1)
1876#elif defined NEUMANN
1879 ad_bl(i,2)=ad_bl(i,2)+ad_br(i,1)
1883 ad_qc(i,1)=ad_qc(i,1)+1.5_r8*ad_bl(i,1)
1884 ad_br(i,1)=ad_br(i,1)-0.5_r8*ad_bl(i,1)
1891 ad_qc(i,1)=ad_qc(i,1)+ad_bl(i,1)+ &
1898#if defined LINEAR_CONTINUATION
1901 ad_br(i,
n(ng)-1)=ad_br(i,
n(ng)-1)+ad_bl(i,
n(ng))
1902 ad_bl(i,
n(ng))=0.0_r8
1905 ad_qc(i,
n(ng))=ad_qc(i,
n(ng))+2.0_r8*ad_br(i,
n(ng))
1906 ad_bl(i,
n(ng))=ad_bl(i,
n(ng))-ad_br(i,
n(ng))
1907 ad_br(i,
n(ng))=0.0_r8
1908#elif defined NEUMANN
1911 ad_br(i,
n(ng)-1)=ad_br(i,
n(ng)-1)+ad_bl(i,
n(ng))
1912 ad_bl(i,
n(ng))=0.0_r8
1915 ad_qc(i,
n(ng))=ad_qc(i,
n(ng))+1.5_r8*ad_br(i,
n(ng))
1916 ad_bl(i,
n(ng))=ad_bl(i,
n(ng))-0.5_r8*ad_br(i,
n(ng))
1917 ad_br(i,
n(ng))=0.0_r8
1923 ad_qc(i,
n(ng))=ad_qc(i,
n(ng))+ad_br(i,
n(ng)-1)+ &
1926 ad_br(i,
n(ng)-1)=0.0_r8
1927 ad_bl(i,
n(ng))=0.0_r8
1928 ad_br(i,
n(ng))=0.0_r8
1941 qc(i,k)=bio(i,k,ibio)
1947 fc(i,k)=(qc(i,k+1)-qc(i,k))*hz_inv2(i,k)
1952 dltr=hz(i,j,k)*fc(i,k)
1953 dltl=hz(i,j,k)*fc(i,k-1)
1954 cff=hz(i,j,k-1)+2.0_r8*hz(i,j,k)+hz(i,j,k+1)
1961 IF ((dltr*dltl).le.0.0_r8)
THEN
1964 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
1966 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
1979 cff=(dltr-dltl)*hz_inv3(i,k)
1980 dltr=dltr-cff*hz(i,j,k+1)
1981 dltl=dltl+cff*hz(i,j,k-1)
1982 br(i,k)=qc(i,k)+dltr
1983 bl(i,k)=qc(i,k)-dltl
1984 wr(i,k)=(2.0_r8*dltr-dltl)**2
1985 wl(i,k)=(dltr-2.0_r8*dltl)**2
1992 dltl=max(cff,wl(i,k ))
1993 dltr=max(cff,wr(i,k+1))
1995 br(i,k)=(dltr*br(i,k)+dltl*bl(i,k+1))/(dltr+dltl)
1996 bl1(i,k+1)=bl(i,k+1)
2000 ad_br(i,k)=ad_br(i,k)+ad_bl(i,k+1)
2007 adfac=ad_br(i,k)/(dltr+dltl)
2008 adfac1=ad_br(i,k)*br(i,k)/(dltr+dltl)
2009 ad_dltr=ad_dltr+adfac*br1(i,k)
2010 ad_dltl=ad_dltl+adfac*bl1(i,k+1)
2011 ad_bl(i,k+1)=ad_bl(i,k+1)+dltl*adfac
2012 ad_dltr=ad_dltr-adfac1
2013 ad_dltl=ad_dltl-adfac1
2014 ad_br(i,k)=dltr*adfac
2018 ad_wr(i,k+1)=ad_wr(i,k+1)+ &
2019 & (0.5_r8-sign(0.5_r8,cff-wr(i,k+1)))* &
2025 ad_wl(i,k )=ad_wl(i,k )+ &
2026 & (0.5_r8-sign(0.5_r8,cff-wl(i,k )))* &
2037 dltr=hz(i,j,k)*fc(i,k)
2038 dltl=hz(i,j,k)*fc(i,k-1)
2039 cff=hz(i,j,k-1)+2.0_r8*hz(i,j,k)+hz(i,j,k+1)
2046 IF ((dltr*dltl).le.0.0_r8)
THEN
2049 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
2051 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
2064 cff=(dltr-dltl)*hz_inv3(i,k)
2065 dltr=dltr-cff*hz(i,j,k+1)
2066 dltl=dltl+cff*hz(i,j,k-1)
2070 adfac=ad_wl(i,k)*2.0_r8*(dltr-2.0_r8*dltl)
2071 ad_dltr=ad_dltr+adfac
2072 ad_dltl=ad_dltl-2.0_r8*adfac
2078 adfac=ad_wr(i,k)*2.0_r8*(2.0_r8*dltr-dltl)
2079 ad_dltr=ad_dltr+2.0_r8*adfac
2080 ad_dltl=ad_dltl-adfac
2084 ad_qc(i,k)=ad_qc(i,k)+ad_bl(i,k)
2085 ad_dltl=ad_dltl-ad_bl(i,k)
2089 ad_qc(i,k)=ad_qc(i,k)+ad_br(i,k)
2090 ad_dltr=ad_dltr+ad_br(i,k)
2096 dltr=hz(i,j,k)*fc(i,k)
2097 dltl=hz(i,j,k)*fc(i,k-1)
2098 cff=hz(i,j,k-1)+2.0_r8*hz(i,j,k)+hz(i,j,k+1)
2105 IF ((dltr*dltl).le.0.0_r8)
THEN
2108 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
2110 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
2114 cff=(dltr-dltl)*hz_inv3(i,k)
2117 ad_cff=ad_cff+ad_dltl*hz(i,j,k-1)
2118 ad_hz(i,j,k-1)=ad_hz(i,j,k-1)+cff*ad_dltl
2121 ad_cff=ad_cff-ad_dltr*hz(i,j,k+1)
2122 ad_hz(i,j,k+1)=ad_hz(i,j,k+1)-cff*ad_dltr
2126 adfac=ad_cff*hz_inv3(i,k)
2127 ad_dltr=ad_dltr+adfac
2128 ad_dltl=ad_dltl-adfac
2129 ad_hz_inv3(i,k)=ad_hz_inv3(i,k)+(dltr-dltl)*ad_cff
2134 dltr=hz(i,j,k)*fc(i,k)
2135 dltl=hz(i,j,k)*fc(i,k-1)
2136 cff=hz(i,j,k-1)+2.0_r8*hz(i,j,k)+hz(i,j,k+1)
2140 IF ((dltr*dltl).le.0.0_r8)
THEN
2147 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
2150 ad_cffl=ad_cffl+ad_dltr
2152 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
2155 ad_cffr=ad_cffr+ad_dltl
2160 ad_cff=ad_cff+ad_cffl*fc(i,k-1)
2161 ad_fc(i,k-1)=ad_fc(i,k-1)+cff*ad_cffl
2165 ad_cff=ad_cff+ad_cffr*fc(i,k)
2166 ad_fc(i,k)=ad_fc(i,k)+cff*ad_cffr
2170 ad_hz(i,j,k-1)=ad_hz(i,j,k-1)+ad_cff
2171 ad_hz(i,j,k)=ad_hz(i,j,k)+2.0_r8*ad_cff
2172 ad_hz(i,j,k+1)=ad_hz(i,j,k+1)+ad_cff
2176 ad_hz(i,j,k)=ad_hz(i,j,k)+ad_dltl*fc(i,k-1)
2177 ad_fc(i,k-1)=ad_fc(i,k-1)+ad_dltl*hz(i,j,k)
2181 ad_hz(i,j,k)=ad_hz(i,j,k)+ad_dltr*fc(i,k)
2182 ad_fc(i,k)=ad_fc(i,k)+ad_dltr*hz(i,j,k)
2191 adfac=ad_fc(i,k)*hz_inv2(i,k)
2192 ad_qc(i,k+1)=ad_qc(i,k+1)+adfac
2193 ad_qc(i,k)=ad_qc(i,k)-adfac
2194 ad_hz_inv2(i,k)=ad_hz_inv2(i,k)+(qc(i,k+1)-qc(i,k))* &
2203 ad_bio(i,k,ibio)=ad_bio(i,k,ibio)+ad_qc(i,k)
2230 biotrc(ibio,nstp)=t(i,j,k,nstp,ibio)
2233 biotrc(ibio,nnew)=t(i,j,k,nnew,ibio)
2248 cff1=cff1+max(0.0_r8,minval-biotrc(ibio,itime))
2249 IF (biotrc(ibio,itime).gt.biotrc(itrcmax,itime))
THEN
2252 biotrc(ibio,itime)=max(minval,biotrc(ibio,itime))
2254 IF (biotrc(itrcmax,itime).gt.cff1)
THEN
2255 biotrc(itrcmax,itime)=biotrc(itrcmax,itime)-cff1
2260 biotrc(ibio,itime)=max(minval,biotrc(ibio,itime))
2269 bio_old(i,k,ibio)=biotrc(ibio,nstp)
2270 bio(i,k,ibio)=biotrc(ibio,nstp)
2273#if defined IRON_LIMIT && defined IRON_RELAX
2279 IF (h(i,j).le.
fehmin(ng))
THEN
2296 parsur(i)=158.075_r8
2313 IF (parsur(i).gt.0.0_r8)
THEN
2321 & (z_w(i,j,k)-z_w(i,j,k-1))
2324 par=itop*(1.0_r8-expatt)/att
2363 fnratio=bio(i,k,
ifphy)/max(minval,bio(i,k,
iphyt))
2364 fcratio=fnratio*fen2fec
2366 flimit=fcratio*fcratio/ &
2370 fnlim=min(1.0_r8,flimit/(bio(i,k,
ino3_)*nlimit))
2373 cff4=1.0_r8/sqrt(cff2+cff3*light(i,k)*light(i,k))
2374 cff=bio(i,k,
iphyt)* &
2376 & cff1*cff4*light(i,k)*fnlim*nlimit
2378 & cff1*cff4*light(i,k)/ &
2383 & bio(i,k,
ino3_)*cff
2389 fac=cff*bio(i,k,
ino3_)*fnratio/ &
2390 & max(minval,bio(i,k,
ifdis))
2393 & bio(i,k,
ifdis)*fac
2397 cff5=dtdays*(fcratioe-fcratio)/
t_fe(ng)
2398 cff6=bio(i,k,
iphyt)*cff5*fec2fen
2399 IF (cff6.ge.0.0_r8)
THEN
2400 cff=cff6/max(minval,bio(i,k,
ifdis))
2403 & bio(i,k,
ifdis)*cff
2405 cff=-cff6/max(minval,bio(i,k,
ifphy))
2408 & bio(i,k,
ifphy)*cff
2423 cff1=dtdays*
zoogr(ng)
2427 cff=bio(i,k,
izoop)* &
2428 & cff1*(1.0_r8-exp(-
ivlev(ng)*bio(i,k,
iphyt)))/ &
2434 & bio(i,k,
iphyt)*cff2*cff
2454 cff1=1.0_r8/(1.0_r8+cff2+cff3)
2459 & bio(i,k,
iphyt)*cff2
2461 & bio(i,k,
iphyt)*cff3
2470 IF (iteradj.ne.iter)
THEN
2477 cff1=1.0_r8/(1.0_r8+cff2+cff3)
2482 & bio(i,k,
izoop)*cff2
2484 & bio(i,k,
izoop)*cff3
2490 cff2=dtdays*
detrr(ng)
2491 cff1=1.0_r8/(1.0_r8+cff2)
2496 & bio(i,k,
isdet)*cff2
2518 qc(i,k)=bio(i,k,ibio)
2524 fc(i,k)=(qc(i,k+1)-qc(i,k))*hz_inv2(i,k)
2529 dltr=hz(i,j,k)*fc(i,k)
2530 dltl=hz(i,j,k)*fc(i,k-1)
2531 cff=hz(i,j,k-1)+2.0_r8*hz(i,j,k)+hz(i,j,k+1)
2538 IF ((dltr*dltl).le.0.0_r8)
THEN
2541 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
2543 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
2556 cff=(dltr-dltl)*hz_inv3(i,k)
2557 dltr=dltr-cff*hz(i,j,k+1)
2558 dltl=dltl+cff*hz(i,j,k-1)
2559 br(i,k)=qc(i,k)+dltr
2560 bl(i,k)=qc(i,k)-dltl
2561 wr(i,k)=(2.0_r8*dltr-dltl)**2
2562 wl(i,k)=(dltr-2.0_r8*dltl)**2
2568 dltl=max(cff,wl(i,k ))
2569 dltr=max(cff,wr(i,k+1))
2570 br(i,k)=(dltr*br(i,k)+dltl*bl(i,k+1))/(dltr+dltl)
2576#if defined LINEAR_CONTINUATION
2577 bl(i,
n(ng))=br(i,
n(ng)-1)
2578 br(i,
n(ng))=2.0_r8*qc(i,
n(ng))-bl(i,
n(ng))
2579#elif defined NEUMANN
2580 bl(i,
n(ng))=br(i,
n(ng)-1)
2581 br(i,
n(ng))=1.5*qc(i,
n(ng))-0.5_r8*bl(i,
n(ng))
2583 br(i,
n(ng))=qc(i,
n(ng))
2584 bl(i,
n(ng))=qc(i,
n(ng))
2585 br(i,
n(ng)-1)=qc(i,
n(ng))
2587#if defined LINEAR_CONTINUATION
2589 bl(i,1)=2.0_r8*qc(i,1)-br(i,1)
2590#elif defined NEUMANN
2592 bl(i,1)=1.5_r8*qc(i,1)-0.5_r8*br(i,1)
2606 dltr=br(i,k)-qc(i,k)
2607 dltl=qc(i,k)-bl(i,k)
2610 IF ((dltr*dltl).lt.0.0_r8)
THEN
2613 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
2615 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
2618 br(i,k)=qc(i,k)+dltr
2619 bl(i,k)=qc(i,k)-dltl
2637 cff=dtdays*abs(wbio(isink))
2641 wl(i,k)=z_w(i,j,k-1)+cff
2642 wr(i,k)=hz(i,j,k)*qc(i,k)
2649 IF (wl(i,k).gt.z_w(i,j,ks))
THEN
2651 fc(i,k-1)=fc(i,k-1)+wr(i,ks)
2662 cu=min(1.0_r8,(wl(i,k)-z_w(i,j,ks-1))*hz_inv(i,ks))
2663 fc(i,k-1)=fc(i,k-1)+ &
2666 & cu*(0.5_r8*(br(i,ks)-bl(i,ks))- &
2668 & (br(i,ks)+bl(i,ks)- &
2669 & 2.0_r8*qc(i,ks))))
2674 bio(i,k,ibio)=qc(i,k)+ &
2675 & (fc(i,k)-fc(i,k-1))*hz_inv(i,k)
2687 cff2=dtdays*
detrr(ng)
2688 cff1=1.0_r8/(1.0_r8+cff2)
2695 & cff2*ad_bio(i,k,
ino3_)
2707 cff1=1.0_r8/(1.0_r8+cff2+cff3)
2714 & cff3*ad_bio(i,k,
isdet)
2719 & cff2*ad_bio(i,k,
ino3_)
2732 cff1=1.0_r8/(1.0_r8+cff2+cff3)
2740 & (cff2+cff3)*
ferr(ng)*ad_bio(i,k,
ifdis)
2749 & cff3*ad_bio(i,k,
isdet)
2754 & cff2*ad_bio(i,k,
ino3_)
2770 cff1=dtdays*
zoogr(ng)
2774 cff=bio1(i,k,
izoop)* &
2775 & cff1*(1.0_r8-exp(-
ivlev(ng)*bio1(i,k,
iphyt)))/ &
2789 adfac=ad_bio(i,k,
ifphy)/(1.0_r8+cff)
2790 ad_cff=ad_cff-bio2(i,k,
ifphy)*adfac
2791 ad_bio(i,k,
ifphy)=adfac
2815 & cff2*cff*ad_bio(i,k,
izoop)
2820 adfac=ad_bio(i,k,
iphyt)/(1.0_r8+cff)
2821 ad_cff=ad_cff-bio(i,k,
iphyt)*adfac
2822 ad_bio(i,k,
iphyt)=adfac
2831 adfac=ad_cff/bio1(i,k,
iphyt)
2832 ad_bio(i,k,
iphyt)=ad_bio(i,k,
iphyt)-adfac*cff
2837 & adfac*cff1*(1.0_r8-fac)
2862 biotrc(ibio,nstp)=t(i,j,k,nstp,ibio)
2865 biotrc(ibio,nnew)=t(i,j,k,nnew,ibio)
2880 cff1=cff1+max(0.0_r8,minval-biotrc(ibio,itime))
2881 IF (biotrc(ibio,itime).gt.biotrc(itrcmax,itime))
THEN
2884 biotrc(ibio,itime)=max(minval,biotrc(ibio,itime))
2886 IF (biotrc(itrcmax,itime).gt.cff1)
THEN
2887 biotrc(itrcmax,itime)=biotrc(itrcmax,itime)-cff1
2892 biotrc(ibio,itime)=max(minval,biotrc(ibio,itime))
2901 bio_old(i,k,ibio)=biotrc(ibio,nstp)
2902 bio(i,k,ibio)=biotrc(ibio,nstp)
2905#if defined IRON_LIMIT && defined IRON_RELAX
2911 IF (h(i,j).le.
fehmin(ng))
THEN
2928 parsur(i)=158.075_r8
2945 IF (parsur(i).gt.0.0_r8)
THEN
2953 & (z_w(i,j,k)-z_w(i,j,k-1))
2956 par=itop*(1.0_r8-expatt)/att
2998 fnratio=bio(i,k,
ifphy)/max(minval,bio(i,k,
iphyt))
2999 fcratio=fnratio*fen2fec
3001 flimit=fcratio*fcratio/ &
3005 fnlim=min(1.0_r8,flimit/(bio(i,k,
ino3_)*nlimit))
3007 cff4=1.0_r8/sqrt(cff2+cff3*light(i,k)*light(i,k))
3008 cff=bio(i,k,
iphyt)* &
3010 & cff1*cff4*light(i,k)*fnlim*nlimit
3012 & cff1*cff4*light(i,k)/ &
3019 & bio(i,k,
ino3_)*cff
3025 fac=cff*bio(i,k,
ino3_)*fnratio/ &
3026 & max(minval,bio(i,k,
ifdis))
3032 & bio(i,k,
ifdis)*fac
3037 cff5=dtdays*(fcratioe-fcratio)/
t_fe(ng)
3038 cff6=bio(i,k,
iphyt)*cff5*fec2fen
3039 IF (cff6.ge.0.0_r8)
then
3040 cff=cff6/max(minval,bio(i,k,
ifdis))
3043 & bio(i,k,
ifdis)*cff
3045 cff=-cff6/max(minval,bio(i,k,
ifphy))
3048 & bio(i,k,
ifphy)*cff
3054 IF (iteradj.ne.iter)
THEN
3065 cff1=dtdays*
zoogr(ng)
3069 cff=bio(i,k,
izoop)* &
3070 & cff1*(1.0_r8-exp(-
ivlev(ng)*bio(i,k,
iphyt)))/ &
3074 & bio(i,k,
iphyt)*cff2*cff
3092 cff1=1.0_r8/(1.0_r8+cff2+cff3)
3097 & bio(i,k,
iphyt)*cff2
3099 & bio(i,k,
iphyt)*cff3
3113 cff1=1.0_r8/(1.0_r8+cff2+cff3)
3118 & bio(i,k,
izoop)*cff2
3120 & bio(i,k,
izoop)*cff3
3126 cff2=dtdays*
detrr(ng)
3127 cff1=1.0_r8/(1.0_r8+cff2)
3132 & bio(i,k,
isdet)*cff2
3154 qc(i,k)=bio(i,k,ibio)
3160 fc(i,k)=(qc(i,k+1)-qc(i,k))*hz_inv2(i,k)
3165 dltr=hz(i,j,k)*fc(i,k)
3166 dltl=hz(i,j,k)*fc(i,k-1)
3167 cff=hz(i,j,k-1)+2.0_r8*hz(i,j,k)+hz(i,j,k+1)
3174 IF ((dltr*dltl).le.0.0_r8)
THEN
3177 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
3179 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
3192 cff=(dltr-dltl)*hz_inv3(i,k)
3193 dltr=dltr-cff*hz(i,j,k+1)
3194 dltl=dltl+cff*hz(i,j,k-1)
3195 br(i,k)=qc(i,k)+dltr
3196 bl(i,k)=qc(i,k)-dltl
3197 wr(i,k)=(2.0_r8*dltr-dltl)**2
3198 wl(i,k)=(dltr-2.0_r8*dltl)**2
3204 dltl=max(cff,wl(i,k ))
3205 dltr=max(cff,wr(i,k+1))
3206 br(i,k)=(dltr*br(i,k)+dltl*bl(i,k+1))/(dltr+dltl)
3212#if defined LINEAR_CONTINUATION
3213 bl(i,
n(ng))=br(i,
n(ng)-1)
3214 br(i,
n(ng))=2.0_r8*qc(i,
n(ng))-bl(i,
n(ng))
3215#elif defined NEUMANN
3216 bl(i,
n(ng))=br(i,
n(ng)-1)
3217 br(i,
n(ng))=1.5*qc(i,
n(ng))-0.5_r8*bl(i,
n(ng))
3219 br(i,
n(ng))=qc(i,
n(ng))
3220 bl(i,
n(ng))=qc(i,
n(ng))
3221 br(i,
n(ng)-1)=qc(i,
n(ng))
3223#if defined LINEAR_CONTINUATION
3225 bl(i,1)=2.0_r8*qc(i,1)-br(i,1)
3226#elif defined NEUMANN
3228 bl(i,1)=1.5_r8*qc(i,1)-0.5_r8*br(i,1)
3242 dltr=br(i,k)-qc(i,k)
3243 dltl=qc(i,k)-bl(i,k)
3246 IF ((dltr*dltl).lt.0.0_r8)
THEN
3249 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
3251 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
3254 br(i,k)=qc(i,k)+dltr
3255 bl(i,k)=qc(i,k)-dltl
3273 cff=dtdays*abs(wbio(isink))
3277 wl(i,k)=z_w(i,j,k-1)+cff
3278 wr(i,k)=hz(i,j,k)*qc(i,k)
3285 IF (wl(i,k).gt.z_w(i,j,ks))
THEN
3287 fc(i,k-1)=fc(i,k-1)+wr(i,ks)
3298 cu=min(1.0_r8,(wl(i,k)-z_w(i,j,ks-1))*hz_inv(i,ks))
3299 fc(i,k-1)=fc(i,k-1)+ &
3302 & cu*(0.5_r8*(br(i,ks)-bl(i,ks))- &
3304 & (br(i,ks)+bl(i,ks)- &
3305 & 2.0_r8*qc(i,ks))))
3310 bio(i,k,ibio)=qc(i,k)+ &
3311 & (fc(i,k)-fc(i,k-1))*hz_inv(i,k)
3347 fnratio=bio1(i,k,
ifphy)/max(minval,bio1(i,k,
iphyt))
3348 fcratio=fnratio*fen2fec
3350 flimit=fcratio*fcratio/ &
3354 fnlim=min(1.0_r8,flimit/(bio1(i,k,
ino3_)*nlimit))
3356 cff5=dtdays*(fcratioe-fcratio)/
t_fe(ng)
3357 cff6=bio(i,k,
iphyt)*cff5*fec2fen
3358 IF (cff6.ge.0.0_r8)
THEN
3359 fac1=max(minval,bio2(i,k,
ifdis))
3366 & cff*ad_bio(i,k,
ifphy)
3367 ad_cff=ad_cff+bio(i,k,
ifdis)*ad_bio(i,k,
ifphy)
3372 adfac=ad_bio(i,k,
ifdis)/(1.0_r8+cff)
3373 ad_cff=ad_cff-bio(i,k,
ifdis)*adfac
3374 ad_bio(i,k,
ifdis)=adfac
3378 ad_cff6=ad_cff6+adfac
3379 ad_fac1=ad_fac1-cff*adfac
3387 & minval-bio2(i,k,
ifdis)))*ad_fac1
3390 fac1=-max(minval,bio2(i,k,
ifphy))
3397 & cff*ad_bio(i,k,
ifdis)
3398 ad_cff=ad_cff+bio(i,k,
ifphy)*ad_bio(i,k,
ifdis)
3403 adfac=ad_bio(i,k,
ifphy)/(1.0_r8+cff)
3404 ad_cff=ad_cff-bio(i,k,
ifphy)*adfac
3405 ad_bio(i,k,
ifphy)=adfac
3409 ad_cff6=ad_cff6+adfac
3410 ad_fac1=ad_fac1-cff*adfac
3418 & minval-bio2(i,k,
ifphy)))*ad_fac1
3424 adfac=ad_cff6*fec2fen
3425 ad_bio(i,k,
iphyt)=ad_bio(i,k,
iphyt)+cff5*adfac
3426 ad_cff5=ad_cff5+bio(i,k,
iphyt)*adfac
3430 adfac=dtdays*ad_cff5/
t_fe(ng)
3431 ad_fcratioe=ad_fcratioe+adfac
3432 ad_fcratio=ad_fcratio-adfac
3435 cff4=1.0_r8/sqrt(cff2+cff3*light(i,k)*light(i,k))
3436 cff=bio1(i,k,
iphyt)* &
3438 & cff1*cff4*light(i,k)*fnlim*nlimit
3440 & cff1*cff4*light(i,k)/ &
3447 fac1=max(minval,bio1(i,k,
ifdis))
3449 fac=cff*bio(i,k,
ino3_)*fnratio*fac2
3454 ad_fac=ad_fac+bio2(i,k,
ifdis)*ad_bio(i,k,
ifphy)
3456 & fac*ad_bio(i,k,
ifphy)
3461 adfac=ad_bio(i,k,
ifdis)/(1.0_r8+fac)
3462 ad_fac=ad_fac-bio2(i,k,
ifdis)*adfac
3463 ad_bio(i,k,
ifdis)=adfac
3469 adfac1=fnratio*fac2*ad_fac
3470 adfac2=cff*bio(i,k,
ino3_)*ad_fac
3471 ad_cff=ad_cff+bio(i,k,
ino3_)*adfac1
3472 ad_bio(i,k,
ino3_)=ad_bio(i,k,
ino3_)+cff*adfac1
3473 ad_fnratio=ad_fnratio+fac2*adfac2
3474 ad_fac2=ad_fac2+fnratio*adfac2
3478 ad_fac1=ad_fac1-fac2*fac2*ad_fac2
3485 & sign(0.5_r8,minval-bio1(i,k,
ifdis)))* &
3496 ad_cff=ad_cff+bio(i,k,
ino3_)*ad_bio(i,k,
iphyt)
3498 & cff*ad_bio(i,k,
iphyt)
3503 adfac=ad_bio(i,k,
ino3_)/(1.0_r8+cff)
3504 ad_cff=ad_cff-bio(i,k,
ino3_)*adfac
3505 ad_bio(i,k,
ino3_)=adfac
3517 adfac1=cff1*cff4*ad_cff
3518 adfac2=adfac1*bio1(i,k,
iphyt)
3520 & light(i,k)*fnlim*nlimit*adfac1
3521 ad_light(i,k)=ad_light(i,k)+ &
3522 & fnlim*nlimit*adfac2
3523 ad_fnlim=ad_fnlim+ &
3524 & light(i,k)*nlimit*adfac2
3525 ad_nlimit=ad_nlimit+ &
3526 & light(i,k)*fnlim*adfac2
3528 & bio1(i,k,
iphyt)*cff1*light(i,k)*fnlim*nlimit* &
3539 adfac1=adfac*bio1(i,k,
iphyt)*cff1
3541 & cff1*cff4*light(i,k)*adfac
3542 ad_cff4=adfac1*light(i,k)
3543 ad_light(i,k)=ad_light(i,k)+ &
3551 ad_light(i,k)=ad_light(i,k)- &
3552 & cff3*light(i,k)* &
3553 & cff4*cff4*cff4*ad_cff4
3561 fac1=flimit/(bio1(i,k,
ino3_)*nlimit)
3564 ad_fac1=(0.5_r8+sign(0.5_r8,1.0_r8-fac1))*ad_fnlim
3571 adfac1=ad_fac1/(bio1(i,k,
ino3_)*nlimit)
3573 ad_flimit=ad_flimit+adfac1
3574 ad_bio(i,k,
ino3_)=ad_bio(i,k,
ino3_)-nlimit*adfac2
3575 ad_nlimit=ad_nlimit-bio1(i,k,
ino3_)*adfac2
3580 & ad_nlimit*nlimit*nlimit
3586 adfac=2.0_r8*ad_flimit/ &
3588 ad_fcratio=ad_fcratio+ &
3590 & fcratio*flimit*adfac
3603 ad_fnratio=ad_fnratio+fen2fec*ad_fcratio
3606 fac1=max(minval,bio1(i,k,
iphyt))
3609 adfac=ad_fnratio/fac1
3611 ad_fac1=ad_fac1-ad_fnratio*fnratio/fac1
3618 & sign(0.5_r8,minval-bio1(i,k,
iphyt)))* &
3629 IF (parsur(i).gt.0.0_r8)
THEN
3642 & (z_w(i,j,kk)-z_w(i,j,kk-1))
3645 par=itop*(1.0_r8-expatt)/att
3659 ad_expatt=ad_expatt+itop*ad_par
3660 ad_itop=ad_itop+expatt*ad_par
3669 ad_par=ad_par+ad_light(i,k)
3670 ad_light(i,k)=0.0_r8
3675 ad_att=ad_att-par1*adfac
3676 ad_expatt=ad_expatt-itop*adfac
3677 ad_itop=ad_itop+(1.0_r8-expatt)*adfac
3681 ad_par=ad_par+ad_itop
3685 ad_att=ad_att-expatt*ad_expatt
3694 &
attphy(ng)*(z_w(i,j,k)-z_w(i,j,k-1))* &
3696 ad_z_w(i,j,k-1)=ad_z_w(i,j,k-1)-adfac
3697 ad_z_w(i,j,k )=ad_z_w(i,j,k )+adfac
3704 ad_light(i,k)=0.0_r8
3709 ad_parsur(i)=ad_parsur(i)+ad_par
3732 adfac=
rho0*
cp*ad_parsur(i)
3733 ad_srflx(i,j)=ad_srflx(i,j)+
parfrac(ng)*adfac
3747#if defined IRON_LIMIT && defined IRON_RELAX
3753 IF (h(i,j).le.
fehmin(ng))
THEN
3758 & fenudgcoef*ad_bio(i,k,
ifdis)
3768 ad_biotrc(ibio,nstp)=ad_biotrc(ibio,nstp)+ &
3770 ad_bio(i,k,ibio)=0.0_r8
3773 ad_biotrc(ibio,nstp)=ad_biotrc(ibio,nstp)+ &
3774 & ad_bio_old(i,k,ibio)
3775 ad_bio_old(i,k,ibio)=0.0_r8
3788 biotrc(ibio,itime)=t(i,j,k,itime,ibio)
3789 biotrc1(ibio,itime)=biotrc(ibio,itime)
3803 cff1=cff1+max(0.0_r8,minval-biotrc(ibio,itime))
3804 IF (biotrc(ibio,itime).gt.biotrc(itrcmax,itime))
THEN
3807 biotrc(ibio,itime)=max(minval,biotrc(ibio,itime))
3809 IF (biotrc(itrcmax,itime).gt.cff1)
THEN
3810 biotrc(itrcmax,itime)=biotrc(itrcmax,itime)-cff1
3816 biotrc(ibio,itime)=max(minval,biotrc1(ibio,itime))
3823 ad_biotrc(ibio,itime)=(0.5_r8- &
3826 & biotrc1(ibio,itime)))* &
3827 & ad_biotrc(ibio,itime)
3846 biotrc(ibio,itime)=t(i,j,k,itime,ibio)
3847 cff1=cff1+max(0.0_r8,minval-biotrc(ibio,itime))
3848 IF (biotrc(ibio,itime).gt.biotrc(itrcmax,itime))
THEN
3851 biotrc1(ibio,itime)=biotrc(ibio,itime)
3852 biotrc(ibio,itime)=max(minval,biotrc(ibio,itime))
3854 IF (biotrc(itrcmax,itime).gt.cff1)
THEN
3858 ad_cff1=-ad_biotrc(itrcmax,itime)
3873 biotrc(ibio,itime)=t(i,j,k,itime,ibio)
3874 cff1=cff1+max(0.0_r8,minval-biotrc(ibio,itime))
3881 ad_biotrc(ibio,itime)=(0.5_r8- &
3884 & biotrc1(ibio,itime)))* &
3885 & ad_biotrc(ibio,itime)
3891 ad_biotrc(ibio,itime)=ad_biotrc(ibio,itime)- &
3892 & (0.5_r8-sign(0.5_r8, &
3893 & biotrc(ibio,itime)- &
3917 ad_hz_inv(i,k)=ad_hz_inv(i,k)+ &
3918 & t(i,j,k,nnew,ibio)*hz(i,j,k)* &
3919 & ad_biotrc(ibio,nnew)
3920 ad_t(i,j,k,nnew,ibio)=ad_t(i,j,k,nnew,ibio)+ &
3921 & hz_inv(i,k)*ad_biotrc(ibio,nnew)
3922 ad_biotrc(ibio,nnew)=0.0_r8
3925 ad_t(i,j,k,nstp,ibio)=ad_t(i,j,k,nstp,ibio)+ &
3926 & ad_biotrc(ibio,nstp)
3927 ad_biotrc(ibio,nstp)=0.0_r8
3940 adfac=hz_inv3(i,k)*hz_inv3(i,k)*ad_hz_inv3(i,k)
3941 ad_hz(i,j,k-1)=ad_hz(i,j,k-1)-adfac
3942 ad_hz(i,j,k )=ad_hz(i,j,k )-adfac
3943 ad_hz(i,j,k+1)=ad_hz(i,j,k+1)-adfac
3944 ad_hz_inv3(i,k)=0.0_r8
3952 adfac=hz_inv2(i,k)*hz_inv2(i,k)*ad_hz_inv2(i,k)
3953 ad_hz(i,j,k )=ad_hz(i,j,k )-adfac
3954 ad_hz(i,j,k+1)=ad_hz(i,j,k+1)-adfac
3955 ad_hz_inv2(i,k)=0.0_r8
3962 ad_hz(i,j,k)=ad_hz(i,j,k)- &
3963 & hz_inv(i,k)*hz_inv(i,k)*ad_hz_inv(i,k)
3964 ad_hz_inv(i,k)=0.0_r8