215 & LBi, UBi, LBj, UBj, UBk, UBt, &
216 & IminS, ImaxS, JminS, JmaxS, &
222# ifdef DIAGNOSTICS_BIO
227 & Hz, z_r, z_w, srflx, &
228#if defined CARBON || defined OXYGEN
238#ifdef DIAGNOSTICS_BIO
239 & DiaBio2d, DiaBio3d, &
253 integer,
intent(in) :: ng, tile
254 integer,
intent(in) :: LBi, UBi, LBj, UBj, UBk, UBt
255 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
256 integer,
intent(in) :: nstp, nnew
260 real(r8),
intent(in) :: rmask(LBi:,LBj:)
262 real(r8),
intent(in) :: rmask_wet(LBi:,LBj:)
263# ifdef DIAGNOSTICS_BIO
264 real(r8),
intent(in) :: rmask_full(LBi:,LBj:)
268 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
269 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
270 real(r8),
intent(in) :: z_w(LBi:,LBj:,0:)
271 real(r8),
intent(in) :: srflx(LBi:,LBj:)
272# if defined CARBON || defined OXYGEN
274 real(r8),
intent(in) :: Uwind(LBi:,LBj:)
275 real(r8),
intent(in) :: Vwind(LBi:,LBj:)
277 real(r8),
intent(in) :: sustr(LBi:,LBj:)
278 real(r8),
intent(in) :: svstr(LBi:,LBj:)
282 real(r8),
intent(inout) :: pH(LBi:,LBj:)
284# ifdef DIAGNOSTICS_BIO
285 real(r8),
intent(inout) :: DiaBio2d(LBi:,LBj:,:)
286 real(r8),
intent(inout) :: DiaBio3d(LBi:,LBj:,:,:)
288 real(r8),
intent(inout) :: t(LBi:,LBj:,:,:,:)
291 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
293 real(r8),
intent(in) :: rmask_wet(LBi:UBi,LBj:UBj)
294# ifdef DIAGNOSTICS_BIO
295 real(r8),
intent(in) :: rmask_full(LBi:UBi,LBj:UBj)
299 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,UBk)
300 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,UBk)
301 real(r8),
intent(in) :: z_w(LBi:UBi,LBj:UBj,0:UBk)
302 real(r8),
intent(in) :: srflx(LBi:UBi,LBj:UBj)
303# if defined CARBON || defined OXYGEN
305 real(r8),
intent(in) :: Uwind(LBi:UBi,LBj:UBj)
306 real(r8),
intent(in) :: Vwind(LBi:UBi,LBj:UBj)
308 real(r8),
intent(in) :: sustr(LBi:UBi,LBj:UBj)
309 real(r8),
intent(in) :: svstr(LBi:UBi,LBj:UBj)
313 real(r8),
intent(inout) :: pH(LBi:UBi,LBj:UBj)
315# ifdef DIAGNOSTICS_BIO
316 real(r8),
intent(inout) :: DiaBio2d(LBi:UBi,LBj:UBj,NDbio2d)
317 real(r8),
intent(inout) :: DiaBio3d(LBi:UBi,LBj:UBj,UBk,NDbio3d)
319 real(r8),
intent(inout) :: t(LBi:UBi,LBj:UBj,UBk,3,UBt)
325 integer,
parameter :: Nsink = 6
327 integer,
parameter :: Nsink = 4
330 integer :: Iter, i, ibio, isink, itrc, ivar, j, k, ks
332 integer,
dimension(Nsink) :: idsink
334 real(r8),
parameter :: eps = 1.0e-20_r8
336#if defined CARBON || defined OXYGEN
340# if defined OCMIP_OXYGEN_SC
346 real(r8),
parameter :: A_O2 = 1638.0_r8
347 real(r8),
parameter :: B_O2 = 81.83_r8
348 real(r8),
parameter :: C_O2 = 1.483_r8
349 real(r8),
parameter :: D_O2 = 0.008004_r8
350 real(r8),
parameter :: E_O2 = 0.0_r8
352# elif defined RW14_OXYGEN_SC
357 real(r8),
parameter :: A_O2 = 1920.4_r8
358 real(r8),
parameter :: B_O2 = 135.6_r8
359 real(r8),
parameter :: C_O2 = 5.2122_r8
360 real(r8),
parameter :: D_O2 = 0.10939_r8
361 real(r8),
parameter :: E_O2 = 0.00093777_r8
368 real(r8),
parameter :: A_O2 = 1953.4_r8
369 real(r8),
parameter :: B_O2 = 128.0_r8
370 real(r8),
parameter :: C_O2 = 3.9918_r8
371 real(r8),
parameter :: D_O2 = 0.050091_r8
372 real(r8),
parameter :: E_O2 = 0.0_r8
374 real(r8),
parameter :: OA0 = 2.00907_r8
375 real(r8),
parameter :: OA1 = 3.22014_r8
376 real(r8),
parameter :: OA2 = 4.05010_r8
377 real(r8),
parameter :: OA3 = 4.94457_r8
378 real(r8),
parameter :: OA4 =-0.256847_r8
379 real(r8),
parameter :: OA5 = 3.88767_r8
380 real(r8),
parameter :: OB0 =-0.00624523_r8
381 real(r8),
parameter :: OB1 =-0.00737614_r8
382 real(r8),
parameter :: OB2 =-0.0103410_r8
383 real(r8),
parameter :: OB3 =-0.00817083_r8
384 real(r8),
parameter :: OC0 =-0.000000488682_r8
385 real(r8),
parameter :: rOxNO3= 8.625_r8
386 real(r8),
parameter :: rOxNH4= 6.625_r8
387 real(r8) :: l2mol = 1000.0_r8/22.3916_r8
391 integer,
parameter :: DoNewton = 0
393# if defined RW14_CO2_SC
394 real(r8),
parameter :: A_CO2 = 2116.8_r8
395 real(r8),
parameter :: B_CO2 = 136.25_r8
396 real(r8),
parameter :: C_CO2 = 4.7353_r8
397 real(r8),
parameter :: D_CO2 = 0.092307_r8
398 real(r8),
parameter :: E_CO2 = 0.0007555_r8
400 real(r8),
parameter :: A_CO2 = 2073.1_r8
401 real(r8),
parameter :: B_CO2 = 125.62_r8
402 real(r8),
parameter :: C_CO2 = 3.6276_r8
403 real(r8),
parameter :: D_CO2 = 0.043219_r8
404 real(r8),
parameter :: E_CO2 = 0.0_r8
407 real(r8),
parameter :: A1 = -60.2409_r8
408 real(r8),
parameter :: A2 = 93.4517_r8
409 real(r8),
parameter :: A3 = 23.3585_r8
410 real(r8),
parameter :: B1 = 0.023517_r8
411 real(r8),
parameter :: B2 = -0.023656_r8
412 real(r8),
parameter :: B3 = 0.0047036_r8
415 real(r8) :: pCO2air_secular
418 real(r8),
parameter :: pi2 = 6.2831853071796_r8
420 real(r8),
parameter :: D0 = 282.6_r8
421 real(r8),
parameter :: D1 = 0.125_r8
422 real(r8),
parameter :: D2 =-7.18_r8
423 real(r8),
parameter :: D3 = 0.86_r8
424 real(r8),
parameter :: D4 =-0.99_r8
425 real(r8),
parameter :: D5 = 0.28_r8
426 real(r8),
parameter :: D6 =-0.80_r8
427 real(r8),
parameter :: D7 = 0.06_r8
430 real(r8) :: Att, AttFac, ExpAtt, Itop, PAR
431 real(r8) :: Epp, L_NH4, L_NO3, LTOT, Vp
433 real(r8),
parameter :: MinVal = 1.0e-6_r8
435 real(r8) :: L_PO4, LMIN, mu, cff6
437 real(r8) :: Chl2C, dtdays, t_PPmax, inhNH4
439 real(r8) :: cff, cff1, cff2, cff3, cff4, cff5
441 real(r8) :: cff7, cff8
443 real(r8) :: fac1, fac2, fac3
444 real(r8) :: cffL, cffR, cu, dltL, dltR
448#ifdef DIAGNOSTICS_BIO
453 real(r8) :: SchmidtN_Ox, O2satu, O2_Flux
458 real(r8) :: C_Flux_RemineL, C_Flux_RemineS, C_Flux_RemineR
459 real(r8) :: CO2_Flux, CO2_sol, SchmidtN, TempK
462 real(r8) :: N_Flux_Assim
463 real(r8) :: N_Flux_CoagD, N_Flux_CoagP
464 real(r8) :: N_Flux_Egest
465 real(r8) :: N_Flux_NewProd, N_Flux_RegProd
466 real(r8) :: N_Flux_Nitrifi
467 real(r8) :: N_Flux_Pmortal, N_Flux_Zmortal
468 real(r8) :: N_Flux_RemineL, N_Flux_RemineS, N_Flux_RemineR
469 real(r8) :: N_Flux_Zexcret, N_Flux_Zmetabo
471 real(r8),
dimension(Nsink) :: Wbio
473 integer,
dimension(IminS:ImaxS,N(ng)) :: ksource
475 real(r8),
dimension(IminS:ImaxS) :: PARsur
477 real(r8),
dimension(IminS:ImaxS) :: pCO2
480 real(r8),
dimension(IminS:ImaxS,N(ng),NT(ng)) :: Bio
481 real(r8),
dimension(IminS:ImaxS,N(ng),NT(ng)) :: Bio_old
483 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FC
485 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Hz_inv
486 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Hz_inv2
487 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Hz_inv3
488 real(r8),
dimension(IminS:ImaxS,N(ng)) :: WL
489 real(r8),
dimension(IminS:ImaxS,N(ng)) :: WR
490 real(r8),
dimension(IminS:ImaxS,N(ng)) :: bL
491 real(r8),
dimension(IminS:ImaxS,N(ng)) :: bR
492 real(r8),
dimension(IminS:ImaxS,N(ng)) :: qc
494#include "set_bounds.h"
495#ifdef DIAGNOSTICS_BIO
502 & (mod(
iic(ng),
ndia(ng)).eq.1)).or. &
508 diabio2d(i,j,ivar)=0.0_r8
516 diabio3d(i,j,k,ivar)=0.0_r8
535#ifdef DIAGNOSTICS_BIO
540 fiter=1.0_r8/real(
bioiter(ng),r8)
568 j_loop :
DO j=jstr,jend
571 hz_inv(i,k)=1.0_r8/hz(i,j,k)
576 hz_inv2(i,k)=1.0_r8/(hz(i,j,k)+hz(i,j,k+1))
581 hz_inv3(i,k)=1.0_r8/(hz(i,j,k-1)+hz(i,j,k)+hz(i,j,k+1))
596 bio_old(i,k,ibio)=max(0.0_r8,t(i,j,k,nstp,ibio))
597 bio(i,k,ibio)=bio_old(i,k,ibio)
604 bio_old(i,k,
itic_)=min(bio_old(i,k,
itic_),3000.0_r8)
605 bio_old(i,k,
itic_)=max(bio_old(i,k,
itic_),400.0_r8)
615 bio(i,k,
itemp)=min(t(i,j,k,nstp,
itemp),35.0_r8)
616 bio(i,k,
isalt)=max(t(i,j,k,nstp,
isalt), 0.0_r8)
683 iter_loop:
DO iter=1,
bioiter(ng)
703 IF (parsur(i).gt.0.0_r8)
THEN
713 & (z_w(i,j,k)-z_w(i,j,k-1))
716 par=itop*(1.0_r8-expatt)/att
720 cff=
phycn(ng)*12.0_r8
721 chl2c=min(bio(i,k,
ichlo)/(bio(i,k,
iphyt)*cff+eps), &
728 vp=
vp0(ng)*0.59_r8*(1.066_r8**bio(i,k,
itemp))
730 epp=vp/sqrt(vp*vp+fac1*fac1)
737 inhnh4=1.0_r8/(1.0_r8+cff1)
738 l_nh4=cff1/(1.0_r8+cff1)
739 l_no3=cff2*inhnh4/(1.0_r8+cff2)
743 l_po4=cff3/(1.0_r8+cff3)
750 mu=dtdays*t_ppmax*lmin
751 cff4=mu*bio(i,k,
iphyt)*l_no3/ &
752 & max(minval,ltot)/max(minval,bio(i,k,
ino3_))
753 cff5=mu*bio(i,k,
iphyt)*l_nh4/ &
754 & max(minval,ltot)/max(minval,bio(i,k,
inh4_))
756 & max(minval,bio(i,k,
ipo4_))
759 cff4=fac1*
k_no3(ng)*inhnh4/(1.0_r8+cff2)*bio(i,k,
iphyt)
760 cff5=fac1*
k_nh4(ng)/(1.0_r8+cff1)*bio(i,k,
iphyt)
767 n_flux_newprod=bio(i,k,
ino3_)*cff4
768 n_flux_regprod=bio(i,k,
inh4_)*cff5
770 & n_flux_newprod+n_flux_regprod
774 & (dtdays*t_ppmax*t_ppmax*lmin*lmin* &
776 & (dtdays*t_ppmax*t_ppmax*ltot*ltot* &
779 & (
phyis(ng)*max(chl2c,eps)*par+eps)
780#ifdef DIAGNOSTICS_BIO
781 diabio3d(i,j,k,
ippro)=diabio3d(i,j,k,
ippro)+ &
785 & (n_flux_newprod+n_flux_regprod)* &
787 diabio3d(i,j,k,
ino3u)=diabio3d(i,j,k,
ino3u)+ &
791 & n_flux_newprod*fiter
795 & n_flux_newprod*roxno3+ &
796 & n_flux_regprod*roxnh4
802 cff1=
phycn(ng)*(n_flux_newprod+n_flux_regprod)
804# ifdef TALK_NONCONSERV
808 bio(i,k,
italk)=bio(i,k,
italk)+n_flux_newprod- &
826 fac2=max(bio(i,k,
ioxyg),0.0_r8)
827 fac3=max(fac2/(3.0_r8+fac2),0.0_r8)
828 fac1=dtdays*
nitrir(ng)*fac3
834 cff2=1.0_r8-max(0.0_r8,cff1)
837 n_flux_nitrifi=bio(i,k,
inh4_)*cff3
839#ifdef DIAGNOSTICS_BIO
840 diabio3d(i,j,k,
inifx)=diabio3d(i,j,k,
inifx)+ &
844 & n_flux_nitrifi*fiter
847 bio(i,k,
ioxyg)=bio(i,k,
ioxyg)-2.0_r8*n_flux_nitrifi
849#if defined CARBON && defined TALK_NONCONSERV
850 bio(i,k,
italk)=bio(i,k,
italk)-2.0_r8*n_flux_nitrifi
865 n_flux_nitrifi=bio(i,k,
inh4_)*cff3
867#ifdef DIAGNOSTICS_BIO
868 diabio3d(i,j,k,
inifx)=diabio3d(i,j,k,
inifx)+ &
872 & n_flux_nitrifi*fiter
875 bio(i,k,
ioxyg)=bio(i,k,
ioxyg)-2.0_r8*n_flux_nitrifi
877#if defined CARBON && defined TALK_NONCONSERV
878 bio(i,k,
italk)=bio(i,k,
italk)-2.0_r8*n_flux_nitrifi
891 fac1=dtdays*
zoogr(ng)
892 cff2=dtdays*
phymr(ng)
900 cff3=1.0_r8/(1.0_r8+cff1)
916 n_flux_pmortal=cff2*max(bio(i,k,
iphyt)-
phymin(ng),0.0_r8)
924 &
phycn(ng)*(n_flux_egest+n_flux_pmortal)+ &
936 cff1=dtdays*
zoobm(ng)
937 fac2=dtdays*
zoomr(ng)
938 fac3=dtdays*
zooer(ng)
943 cff2=fac2*bio(i,k,
izoop)
950 n_flux_zmortal=cff2*bio(i,k,
izoop)
951 n_flux_zexcret=cff3*bio(i,k,
izoop)
960 n_flux_zmetabo=cff1*max(bio(i,k,
izoop)-
zoomin(ng),0.0_r8)
968 & roxnh4*(n_flux_zmetabo+n_flux_zexcret)
972 &
zoocn(ng)*n_flux_zmortal
974 &
zoocn(ng)*(n_flux_zmetabo+n_flux_zexcret)
975#ifdef TALK_NONCONSERV
976 bio(i,k,
italk)=bio(i,k,
italk)+n_flux_zmetabo+ &
987 fac1=dtdays*
coagr(ng)
991 cff2=1.0_r8/(1.0_r8+cff1)
995 n_flux_coagp=bio(i,k,
iphyt)*cff1
996 n_flux_coagd=bio(i,k,
isden)*cff1
998 & n_flux_coagp+n_flux_coagd
1002 &
phycn(ng)*(n_flux_coagp+n_flux_coagd)
1014 fac1=max(bio(i,k,
ioxyg)-6.0_r8,0.0_r8)
1015 fac2=max(fac1/(3.0_r8+fac1),0.0_r8)
1016 cff1=dtdays*
sderrn(ng)*fac2
1017 cff2=1.0_r8/(1.0_r8+cff1)
1018 cff3=dtdays*
lderrn(ng)*fac2
1019 cff4=1.0_r8/(1.0_r8+cff3)
1022 n_flux_remines=bio(i,k,
isden)*cff1
1023 n_flux_reminel=bio(i,k,
ilden)*cff3
1025 & n_flux_remines+n_flux_reminel
1028 & *(n_flux_remines+n_flux_reminel)
1031 & (n_flux_remines+n_flux_reminel)*roxnh4
1032# if defined CARBON && defined TALK_NONCONSERV
1033 bio(i,k,
italk)=bio(i,k,
italk)+n_flux_remines+ &
1037 cff7=dtdays*
rderrn(ng)*fac2
1038 cff8=1.0_r8/(1.0_r8+cff7)
1040 n_flux_reminer=bio(i,k,
irden)*cff7
1047 bio(i,k,
ioxyg)=bio(i,k,
ioxyg)-n_flux_reminer*roxnh4
1048# if defined CARBON && defined TALK_NONCONSERV
1056 cff2=1.0_r8/(1.0_r8+cff1)
1058 cff4=1.0_r8/(1.0_r8+cff3)
1061 cff8=1.0_r8/(1.0_r8+cff7)
1067 n_flux_remines=bio(i,k,
isden)*cff1
1068 n_flux_reminel=bio(i,k,
ilden)*cff3
1070 & n_flux_remines+n_flux_reminel
1073 & *(n_flux_remines+n_flux_reminel)
1075# if defined CARBON && defined TALK_NONCONSERV
1076 bio(i,k,
italk)=bio(i,k,
italk)+n_flux_remines+ &
1081 n_flux_reminer=bio(i,k,
irden)*cff7
1087# if defined CARBON && defined TALK_NONCONSERV
1103# if defined RW14_OXYGEN_SC
1104 cff2=dtdays*0.251_r8*24.0_r8/100.0_r8
1106 cff2=dtdays*0.31_r8*24.0_r8/100.0_r8
1114 u10squ=uwind(i,j)*uwind(i,j)+vwind(i,j)*vwind(i,j)
1116 u10squ=cff1*sqrt((0.5_r8*(sustr(i,j)+sustr(i+1,j)))**2+ &
1117 & (0.5_r8*(svstr(i,j)+svstr(i,j+1)))**2)
1119 schmidtn_ox=a_o2-bio(i,k,
itemp)*(b_o2-bio(i,k,
itemp)*(c_o2- &
1120 & bio(i,k,
itemp)*(d_o2- &
1121 & bio(i,k,
itemp)*e_o2)))
1122 cff3=cff2*u10squ*sqrt(660.0_r8/schmidtn_ox)
1127 ts=log((298.15_r8-bio(i,k,
itemp))/ &
1128 & (273.15_r8+bio(i,k,
itemp)))
1129 aa=oa0+ts*(oa1+ts*(oa2+ts*(oa3+ts*(oa4+ts*oa5))))+ &
1130 & bio(i,k,
isalt)*(ob0+ts*(ob1+ts*(ob2+ts*ob3)))+ &
1135 o2satu=l2mol*exp(aa)
1139 o2_flux=cff3*(o2satu-bio(i,k,
ioxyg))
1141 & o2_flux*hz_inv(i,k)
1142# ifdef DIAGNOSTICS_BIO
1145 & rmask_full(i,j)* &
1160 cff2=1.0_r8/(1.0_r8+cff1)
1162 cff4=1.0_r8/(1.0_r8+cff3)
1165 cff8=1.0_r8/(1.0_r8+cff7)
1171 c_flux_remines=bio(i,k,
isdec)*cff1
1172 c_flux_reminel=bio(i,k,
ildec)*cff3
1174 & c_flux_remines+c_flux_reminel
1177 c_flux_reminer=bio(i,k,
irdec)*cff7
1182# ifndef TALK_NONCONSERV
1189 bio(i,k,
italk)=587.05_r8+50.56_r8*bio(i,k,
isalt)
1204 & imins, imaxs, j, donewton, &
1208 & bio(imins:,k,
itemp), bio(imins:,k,
isalt), &
1209 & bio(imins:,k,
itic_), bio(imins:,k,
italk), &
1212 CALL pco2_water (istr, iend, lbi, ubi, lbj, ubj, &
1213 & imins, imaxs, j, donewton, &
1217 & bio(imins:,k,
itemp), bio(imins:,k,
isalt), &
1218 & bio(imins:,k,
itic_), bio(imins:,k,
italk), &
1219 & 0.0_r8, 0.0_r8, ph, pco2)
1225# if defined RW14_CO2_SC
1226 cff2=dtdays*0.251_r8*24.0_r8/100.0_r8
1228 cff2=dtdays*0.31_r8*24.0_r8/100.0_r8
1235 u10squ=uwind(i,j)**2+vwind(i,j)**2
1237 u10squ=cff1*sqrt((0.5_r8*(sustr(i,j)+sustr(i+1,j)))**2+ &
1238 & (0.5_r8*(svstr(i,j)+svstr(i,j+1)))**2)
1240 schmidtn=a_co2-bio(i,k,
itemp)*(b_co2-bio(i,k,
itemp)*(c_co2- &
1241 & bio(i,k,
itemp)*(d_co2- &
1242 & bio(i,k,
itemp)*e_co2)))
1243 cff3=cff2*u10squ*sqrt(660.0_r8/schmidtn)
1247 tempk=0.01_r8*(bio(i,k,
itemp)+273.15_r8)
1251 & bio(i,k,
isalt)*(b1+tempk*(b2+b3*tempk)))
1256 pmonth=year-1951.0_r8+yday/365.0_r8
1257# if defined PCO2AIR_DATA
1258 pco2air_secular=380.464_r8+9.321_r8*sin(pi2*yday/365.25_r8+ &
1260 co2_flux=cff3*co2_sol*(pco2air_secular-pco2(i))
1261# elif defined PCO2AIR_SECULAR
1262 pco2air_secular=d0+d1*pmonth*12.0_r8+ &
1263 & d2*sin(pi2*pmonth+d3)+ &
1264 & d4*sin(pi2*pmonth+d5)+ &
1265 & d6*sin(pi2*pmonth+d7)
1266 co2_flux=cff3*co2_sol*(pco2air_secular-pco2(i))
1268 co2_flux=cff3*co2_sol*(
pco2air(ng)-pco2(i))
1271 & co2_flux*hz_inv(i,k)
1272# ifdef DIAGNOSTICS_BIO
1275 & rmask_full(i,j)* &
1278 diabio2d(i,j,
ipco2)=pco2(i)
1280 diabio2d(i,j,
ipco2)=diabio2d(i,j,
ipco2)*rmask_full(i,j)
1294 sink_loop:
DO isink=1,nsink
1304 qc(i,k)=bio(i,k,ibio)
1310 fc(i,k)=(qc(i,k+1)-qc(i,k))*hz_inv2(i,k)
1315 dltr=hz(i,j,k)*fc(i,k)
1316 dltl=hz(i,j,k)*fc(i,k-1)
1317 cff=hz(i,j,k-1)+2.0_r8*hz(i,j,k)+hz(i,j,k+1)
1324 IF ((dltr*dltl).le.0.0_r8)
THEN
1327 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
1329 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
1342 cff=(dltr-dltl)*hz_inv3(i,k)
1343 dltr=dltr-cff*hz(i,j,k+1)
1344 dltl=dltl+cff*hz(i,j,k-1)
1345 br(i,k)=qc(i,k)+dltr
1346 bl(i,k)=qc(i,k)-dltl
1347 wr(i,k)=(2.0_r8*dltr-dltl)**2
1348 wl(i,k)=(dltr-2.0_r8*dltl)**2
1354 dltl=max(cff,wl(i,k ))
1355 dltr=max(cff,wr(i,k+1))
1356 br(i,k)=(dltr*br(i,k)+dltl*bl(i,k+1))/(dltr+dltl)
1362#if defined LINEAR_CONTINUATION
1363 bl(i,
n(ng))=br(i,
n(ng)-1)
1364 br(i,
n(ng))=2.0_r8*qc(i,
n(ng))-bl(i,
n(ng))
1365#elif defined NEUMANN
1366 bl(i,
n(ng))=br(i,
n(ng)-1)
1367 br(i,
n(ng))=1.5_r8*qc(i,
n(ng))-0.5_r8*bl(i,
n(ng))
1369 br(i,
n(ng))=qc(i,
n(ng))
1370 bl(i,
n(ng))=qc(i,
n(ng))
1371 br(i,
n(ng)-1)=qc(i,
n(ng))
1373#if defined LINEAR_CONTINUATION
1375 bl(i,1)=2.0_r8*qc(i,1)-br(i,1)
1376#elif defined NEUMANN
1378 bl(i,1)=1.5_r8*qc(i,1)-0.5_r8*br(i,1)
1392 dltr=br(i,k)-qc(i,k)
1393 dltl=qc(i,k)-bl(i,k)
1396 IF ((dltr*dltl).lt.0.0_r8)
THEN
1399 ELSE IF (abs(dltr).gt.abs(cffl))
THEN
1401 ELSE IF (abs(dltl).gt.abs(cffr))
THEN
1404 br(i,k)=qc(i,k)+dltr
1405 bl(i,k)=qc(i,k)-dltl
1423 cff=dtdays*abs(wbio(isink))
1427 wl(i,k)=z_w(i,j,k-1)+cff
1428 wr(i,k)=hz(i,j,k)*qc(i,k)
1435 IF (wl(i,k).gt.z_w(i,j,ks))
THEN
1437 fc(i,k-1)=fc(i,k-1)+wr(i,ks)
1448 cu=min(1.0_r8,(wl(i,k)-z_w(i,j,ks-1))*hz_inv(i,ks))
1449 fc(i,k-1)=fc(i,k-1)+ &
1452 & cu*(0.5_r8*(br(i,ks)-bl(i,ks))- &
1454 & (br(i,ks)+bl(i,ks)- &
1455 & 2.0_r8*qc(i,ks))))
1460 bio(i,k,ibio)=qc(i,k)+(fc(i,k)-fc(i,k-1))*hz_inv(i,k)
1475 cff3=115.0_r8/16.0_r8
1476 cff4=106.0_r8/16.0_r8
1478 IF ((ibio.eq.
iphyt).or. &
1479 & (ibio.eq.
isden).or. &
1480 & (ibio.eq.
ilden))
THEN
1482 cff1=fc(i,0)*hz_inv(i,1)
1483# ifdef DENITRIFICATION
1485# ifdef DIAGNOSTICS_BIO
1488 & rmask_full(i,j)* &
1490 & (1.0_r8-cff2)*cff1*hz(i,j,1)*fiter
1506# if defined CARBON && defined TALK_NONCONSERV
1513# ifdef DENITRIFICATION
1517 IF ((ibio.eq.
isdec).or. &
1518 & (ibio.eq.
ildec))
THEN
1520 cff1=fc(i,0)*hz_inv(i,1)
1524 IF (ibio.eq.
iphyt)
THEN
1526 cff1=fc(i,0)*hz_inv(i,1)
1563 cff=bio(i,k,ibio)-bio_old(i,k,ibio)
1567 cff=cff*rmask_wet(i,j)
1570 t(i,j,k,nnew,ibio)=t(i,j,k,nnew,ibio)+cff*hz(i,j,k)
1582 & LBi, UBi, LBj, UBj, IminS, ImaxS, &
1587 & T, S, TIC, TAlk, pH, pCO2)
1642 integer,
intent(in) :: LBi, UBi, LBj, UBj, IminS, ImaxS
1643 integer,
intent(in) :: Istr, Iend, j, DoNewton
1645# ifdef ASSUMED_SHAPE
1647 real(r8),
intent(in) :: rmask(LBi:,LBj:)
1649 real(r8),
intent(in) :: T(IminS:)
1650 real(r8),
intent(in) :: S(IminS:)
1651 real(r8),
intent(in) :: TIC(IminS:)
1652 real(r8),
intent(in) :: TAlk(IminS:)
1653 real(r8),
intent(inout) :: pH(LBi:,LBj:)
1656 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
1658 real(r8),
intent(in) :: T(IminS:ImaxS)
1659 real(r8),
intent(in) :: S(IminS:ImaxS)
1660 real(r8),
intent(in) :: TIC(IminS:ImaxS)
1661 real(r8),
intent(in) :: TAlk(IminS:ImaxS)
1662 real(r8),
intent(inout) :: pH(LBi:UBi,LBj:UBj)
1665 real(r8),
intent(out) :: pCO2(IminS:ImaxS)
1669 integer,
parameter :: InewtonMax = 10
1670 integer,
parameter :: IbrackMax = 30
1672 integer :: Hstep, Ibrack, Inewton, i
1674 real(r8) :: Tk, centiTk, invTk, logTk
1675 real(r8) :: scl, sqrtS
1676 real(r8) :: borate, alk, dic
1677 real(r8) :: ff, K1, K2, K12, Kb, Kw
1678 real(r8) :: p5, p4, p3, p2, p1, p0
1679 real(r8) :: df, fn, fni(3), ftest
1680 real(r8) :: deltaX, invX, invX2, X, X2, X3
1681 real(r8) :: pH_guess, pH_hi, pH_lo
1682 real(r8) :: X_guess, X_hi, X_lo, X_mid
1683 real(r8) :: CO2star, Htotal, Htotal2
1690 i_loop:
DO i=istr,iend
1692 IF (rmask(i,j).gt.0.0_r8)
THEN
1701 alk= talk(i)*0.000001_r8
1702 dic = tic(i)*0.000001_r8
1709 ff=exp(-162.8301_r8+ &
1710 & 218.2968_r8/centitk+ &
1711 & log(centitk)*90.9241_r8- &
1712 & centitk*centitk*1.47696_r8+ &
1713 & s(i)*(0.025695_r8- &
1714 & centitk*(0.025225_r8- &
1715 & centitk*0.0049867_r8)))
1728 k1=10.0_r8**(62.008_r8- &
1729 & invtk*3670.7_r8- &
1730 & logtk*9.7944_r8+ &
1731 & s(i)*(0.0118_r8- &
1732 & s(i)*0.000116_r8))
1733 k2=10.0_r8**(-4.777_r8- &
1734 & invtk*1394.7_r8+ &
1735 & s(i)*(0.0184_r8- &
1736 & s(i)*0.000118_r8))
1743 kb=exp(-invtk*(8966.90_r8+ &
1744 & sqrts*(2890.53_r8+ &
1745 & sqrts*(77.942_r8- &
1746 & sqrts*(1.728_r8- &
1747 & sqrts*0.0996_r8))))- &
1748 & logtk*(24.4344_r8+ &
1749 & sqrts*(25.085_r8+ &
1750 & sqrts*0.2474_r8))+ &
1751 & tk*(sqrts*0.053105_r8)+ &
1753 & sqrts*(137.1942_r8+ &
1754 & sqrts*1.62142_r8))
1761 kw=exp(148.9652_r8- &
1762 & invtk*13847.26_r8- &
1763 & logtk*23.6521_r8- &
1764 & sqrts*(5.977_r8- &
1765 & invtk*118.67_r8- &
1766 & logtk*1.0495_r8)- &
1773 borate=0.000232_r8*scl/10.811_r8
1790 p3 = dic*k1-alk*(kb+k1)+kb*borate+kw-kb*k1-k12
1791 p2 = dic*(kb*k1+2*k12)-alk*(kb*k1+k12)+kb*borate*k1 &
1792 & +(kw*kb+kw*k1-kb*k12)
1793 p1 = 2.0_r8*dic*kb*k12-alk*kb*k12+kb*borate*k12 &
1805 x_guess=10.0_r8**(-ph_guess)
1806 x_lo=10.0_r8**(-ph_hi)
1807 x_hi=10.0_r8**(-ph_lo)
1808 x_mid=0.5_r8*(x_lo+x_hi)
1814 IF (donewton.eq.1)
THEN
1817 DO inewton=1,inewtonmax
1821 fn=((((p5*x+p4)*x+p3)*x+p2)*x+p1)*x+p0
1827 df=(((5*p5*x+4*p4)*x+3*p3)*x+2*p2)*x+p1
1847 brack_it:
DO ibrack=1,ibrackmax
1849 IF (hstep.eq.1) x=x_hi
1850 IF (hstep.eq.2) x=x_lo
1851 IF (hstep.eq.3) x=x_mid
1855 fni(hstep)=((((p5*x+p4)*x+p3)*x+p2)*x+p1)*x+p0
1860 IF (fni(3).eq.0)
THEN
1864 IF (ftest.gt.0)
THEN
1869 x_mid=0.5_r8*(x_lo+x_hi)
1885 htotal2=htotal*htotal
1891 co2star=dic*htotal2/(htotal2+k1*htotal+k1*k2)
1895 ph(i,j)=-log10(htotal)
1899 pco2(i)=co2star*1000000.0_r8/ff
1914 & LBi, UBi, LBj, UBj, &
1915 & IminS, ImaxS, j, DoNewton, &
1919 & T, S, TIC, TAlk, PO4b, SiO3, pH, pCO2)
1970 integer,
intent(in) :: LBi, UBi, LBj, UBj, IminS, ImaxS
1971 integer,
intent(in) :: Istr, Iend, j, DoNewton
1973# ifdef ASSUMED_SHAPE
1975 real(r8),
intent(in) :: rmask(LBi:,LBj:)
1977 real(r8),
intent(in) :: T(IminS:)
1978 real(r8),
intent(in) :: S(IminS:)
1979 real(r8),
intent(in) :: TIC(IminS:)
1980 real(r8),
intent(in) :: TAlk(IminS:)
1981 real(r8),
intent(inout) :: pH(LBi:,LBj:)
1984 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
1986 real(r8),
intent(in) :: T(IminS:ImaxS)
1987 real(r8),
intent(in) :: S(IminS:ImaxS)
1988 real(r8),
intent(in) :: TIC(IminS:ImaxS)
1989 real(r8),
intent(in) :: TAlk(IminS:ImaxS)
1990 real(r8),
intent(inout) :: pH(LBi:UBi,LBj:UBj)
1992 real(r8),
intent(in) :: PO4b
1993 real(r8),
intent(in) :: SiO3
1995 real(r8),
intent(out) :: pCO2(IminS:ImaxS)
1999 integer,
parameter :: InewtonMax = 10
2000 integer,
parameter :: IbrackMax = 30
2002 integer :: Hstep, Ibrack, Inewton, i
2004 real(r8) :: Tk, centiTk, invTk, logTk
2005 real(r8) :: SO4, scl, sqrtS, sqrtSO4
2006 real(r8) :: alk, dic, phos, sili
2007 real(r8) :: borate, sulfate, fluoride
2008 real(r8) :: ff, K1, K2, K1p, K2p, K3p, Kb, Kf, Ks, Ksi, Kw
2009 real(r8) :: K12, K12p, K123p, invKb, invKs, invKsi
2010 real(r8) :: A, A2, B, B2, C, dA, dB
2011 real(r8) :: df, fn, fni(3), ftest
2012 real(r8) :: deltaX, invX, invX2, X, X2, X3
2013 real(r8) :: pH_guess, pH_hi, pH_lo
2014 real(r8) :: X_guess, X_hi, X_lo, X_mid
2015 real(r8) :: CO2star, Htotal, Htotal2
2022 i_loop:
DO i=istr,iend
2024 IF (rmask(i,j).gt.0.0_r8)
THEN
2031 so4=19.924_r8*s(i)/(1000.0_r8-1.005_r8*s(i))
2035 alk=talk(i)*0.000001_r8
2036 dic=tic(i)*0.000001_r8
2037 phos=po4b*0.000001_r8
2038 sili=sio3*0.000001_r8
2045 ff=exp(-162.8301_r8+ &
2046 & 218.2968_r8/centitk+ &
2047 & log(centitk)*90.9241_r8- &
2048 & centitk*centitk*1.47696_r8+ &
2049 & s(i)*(0.025695_r8- &
2050 & centitk*(0.025225_r8- &
2051 & centitk*0.0049867_r8)))
2064 k1=10.0_r8**(62.008_r8- &
2065 & invtk*3670.7_r8- &
2066 & logtk*9.7944_r8+ &
2067 & s(i)*(0.0118_r8- &
2068 & s(i)*0.000116_r8))
2069 k2=10.0_r8**(-4.777_r8- &
2070 & invtk*1394.7_r8+ &
2071 & s(i)*(0.0184_r8- &
2072 & s(i)*0.000118_r8))
2079 kb=exp(-invtk*(8966.90_r8+ &
2080 & sqrts*(2890.53_r8+ &
2081 & sqrts*(77.942_r8- &
2082 & sqrts*(1.728_r8- &
2083 & sqrts*0.0996_r8))))- &
2084 & logtk*(24.4344_r8+ &
2085 & sqrts*(25.085_r8+ &
2086 & sqrts*0.2474_r8))+ &
2087 & tk*(sqrts*0.053105_r8)+ &
2089 & sqrts*(137.1942_r8+ &
2090 & sqrts*1.62142_r8))
2104 k1p=exp(115.525_r8- &
2105 & invtk*4576.752_r8- &
2106 & logtk*18.453_r8+ &
2107 & sqrts*(0.69171_r8-invtk*106.736_r8)- &
2108 & s(i)*(0.01844_r8+invtk*0.65643_r8))
2109 k2p=exp(172.0883_r8- &
2110 & invtk*8814.715_r8- &
2111 & logtk*27.927_r8+ &
2112 & sqrts*(1.3566_r8-invtk*160.340_r8)- &
2113 & s(i)*(0.05778_r8-invtk*0.37335_r8))
2114 k3p=exp(-18.141_r8- &
2115 & invtk*3070.75_r8+ &
2116 & sqrts*(2.81197_r8+invtk*17.27039_r8)- &
2117 & s(i)*(0.09984_r8+invtk*44.99486_r8))
2124 ksi=exp(117.385_r8- &
2125 & invtk*8904.2_r8- &
2126 & logtk*19.334_r8+ &
2127 & sqrtso4*(3.5913_r8-invtk*458.79_r8)- &
2128 & so4*(1.5998_r8-invtk*188.74_r8- &
2129 & so4*(0.07871_r8-invtk*12.1652_r8))+ &
2130 & log(1.0_r8-0.001005_r8*s(i)))
2137 kw=exp(148.9652_r8- &
2138 & invtk*13847.26_r8- &
2139 & logtk*23.6521_r8- &
2140 & sqrts*(5.977_r8- &
2141 & invtk*118.67_r8- &
2142 & logtk*1.0495_r8)- &
2150 ks=exp(141.328_r8- &
2151 & invtk*4276.1_r8- &
2152 & logtk*23.093_r8+ &
2153 & sqrtso4*(324.57_r8-invtk*13856.0_r8-logtk*47.986_r8- &
2154 & so4*invtk*2698.0_r8)- &
2155 & so4*(771.54_r8-invtk*35474.0_r8-logtk*114.723_r8- &
2156 & so4*invtk*1776.0_r8)+ &
2157 & log(1.0_r8-0.001005_r8*s(i)))
2164 kf=exp(-12.641_r8+ &
2165 & invtk*1590.2_r8+ &
2166 & sqrtso4*1.525_r8+ &
2167 & log(1.0_r8-0.001005_r8*s(i))+ &
2168 & log(1.0_r8+0.1400_r8*scl/(96.062_r8*ks)))
2175 borate=0.000232_r8*scl/10.811_r8
2176 sulfate=0.14_r8*scl/96.062_r8
2177 fluoride=0.000067_r8*scl/18.9984_r8
2195 x_guess=10.0_r8**(-ph_guess)
2196 x_lo=10.0_r8**(-ph_hi)
2197 x_hi=10.0_r8**(-ph_lo)
2198 x_mid=0.5_r8*(x_lo+x_hi)
2204 IF (donewton.eq.1)
THEN
2213 DO inewton=1,inewtonmax
2223 a=x*(k12p+x*(k1p+x))
2225 c=1.0_r8/(1.0_r8+sulfate*invks)
2229 da=x*(2.0_r8*k1p+3.0_r8*x)+k12p
2236 fn=dic*k1*(x+2.0_r8*k2)/b+ &
2237 & borate/(1.0_r8+x*invkb)+ &
2239 & phos*(k12p*x+2.0_r8*k123p-x3)/a+ &
2240 & sili/(1.0_r8+x*invksi)- &
2242 & sulfate/(1.0_r8+ks*invx*c)- &
2243 & fluoride/(1.0_r8+kf*invx)- &
2250 df=dic*k1*(b-db*(x+2.0_r8*k2))/b2- &
2251 & borate/(invkb*(1.0+x*invkb)**2)- &
2253 & phos*(a*(k12p-3.0_r8*x2)-da*(k12p*x+2.0_r8*k123p-x3))/a2-&
2254 & sili/(invksi*(1.0_r8+x*invksi)**2)+ &
2256 & sulfate*ks*c*invx2/((1.0_r8+ks*invx*c)**2)+ &
2257 & fluoride*kf*invx2/((1.0_r8+kf*invx)**2)
2284 brack_it:
DO ibrack=1,ibrackmax
2286 IF (hstep.eq.1) x=x_hi
2287 IF (hstep.eq.2) x=x_lo
2288 IF (hstep.eq.3) x=x_mid
2297 a=x*(k12p+x*(k1p+x))+k123p
2299 c=1.0_r8/(1.0_r8+sulfate*invks)
2303 da=x*(k1p*2.0_r8+3.0_r8*x2)+k12p
2308 fni(hstep)=dic*(k1*x+2.0_r8*k12)/b+ &
2309 & borate/(1.0_r8+x*invkb)+ &
2311 & phos*(k12p*x+2.0_r8*k123p-x3)/a+ &
2312 & sili/(1.0_r8+x*invksi)- &
2314 & sulfate/(1.0_r8+ks*invx*c)- &
2315 & fluoride/(1.0_r8+kf*invx)- &
2321 IF (fni(3).eq.0.0_r8)
THEN
2325 IF (ftest.gt.0.0)
THEN
2330 x_mid=0.5_r8*(x_lo+x_hi)
2346 htotal2=htotal*htotal
2352 co2star=dic*htotal2/(htotal2+k1*htotal+k1*k2)
2356 ph(i,j)=-log10(htotal)
2360 pco2(i)=co2star*1000000.0_r8/ff