123 & LBi, UBi, LBj, UBj, UBk, UBt, &
124 & IminS, ImaxS, JminS, JmaxS, &
128# if defined WET_DRY && defined DIAGNOSTICS_BIO
139#ifdef DIAGNOSTICS_BIO
152 integer,
intent(in) :: ng, tile
153 integer,
intent(in) :: LBi, UBi, LBj, UBj, UBk, UBt
154 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
155 integer,
intent(in) :: nstp, nnew
159 real(r8),
intent(in) :: rmask(LBi:,LBj:)
160# if defined WET_DRY && defined DIAGNOSTICS_BIO
161 real(r8),
intent(in) :: rmask_full(LBi:,LBj:)
164 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
166 real(r8),
intent(in) :: Uwind(LBi:,LBj:)
167 real(r8),
intent(in) :: Vwind(LBi:,LBj:)
169 real(r8),
intent(in) :: sustr(LBi:,LBj:)
170 real(r8),
intent(in) :: svstr(LBi:,LBj:)
172 real(r8),
intent(in) :: respiration(LBi:,LBj:,:)
173# ifdef DIAGNOSTICS_BIO
174 real(r8),
intent(inout) :: DiaBio2d(LBi:,LBj:,:)
176 real(r8),
intent(inout) :: t(LBi:,LBj:,:,:,:)
179 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
180# if defined WET_DRY && defined DIAGNOSTICS_BIO
181 real(r8),
intent(in) :: rmask_full(LBi:UBi,LBj:UBj)
184 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,UBk)
186 real(r8),
intent(in) :: Uwind(LBi:UBi,LBj:UBj)
187 real(r8),
intent(in) :: Vwind(LBi:UBi,LBj:UBj)
189 real(r8),
intent(in) :: sustr(LBi:UBi,LBj:UBj)
190 real(r8),
intent(in) :: svstr(LBi:UBi,LBj:UBj)
192 real(r8),
intent(inout) :: repiration(LBi:UBi,LBj:UBj,UBk)
193# ifdef DIAGNOSTICS_BIO
194 real(r8),
intent(inout) :: DiaBio2d(LBi:UBi,LBj:UBj,NDbio2d)
196 real(r8),
intent(inout) :: t(LBi:UBi,LBj:UBj,UBk,3,UBt)
201 integer :: Iter, i, ibio, itrc, j, k
205 real(r8),
parameter :: OA0 = 2.00907_r8
206 real(r8),
parameter :: OA1 = 3.22014_r8
207 real(r8),
parameter :: OA2 = 4.05010_r8
208 real(r8),
parameter :: OA3 = 4.94457_r8
209 real(r8),
parameter :: OA4 =-0.256847_r8
210 real(r8),
parameter :: OA5 = 3.88767_r8
211 real(r8),
parameter :: OB0 =-0.00624523_r8
212 real(r8),
parameter :: OB1 =-0.00737614_r8
213 real(r8),
parameter :: OB2 =-0.0103410_r8
214 real(r8),
parameter :: OB3 =-0.00817083_r8
215 real(r8),
parameter :: OC0 =-0.000000488682_r8
216 real(r8),
parameter :: rOxNO3= 8.625_r8
217 real(r8),
parameter :: rOxNH4= 6.625_r8
218 real(r8) :: l2mol = 1000.0_r8/22.3916_r8
222 real(r8) :: cff, cff1, cff2, cff3, cff4
225#ifdef DIAGNOSTICS_BIO
229 real(r8) :: SchmidtN_Ox, O2satu, O2_Flux
231 real(r8),
dimension(IminS:ImaxS,N(ng),NT(ng)) :: Bio
232 real(r8),
dimension(IminS:ImaxS,N(ng),NT(ng)) :: Bio_old
234 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Hz_inv
236#include "set_bounds.h"
238#ifdef DIAGNOSTICS_BIO
245 & (mod(
iic(ng),
ndia(ng)).eq.1)).or. &
251 diabio2d(i,j,ivar)=0.0_r8
270#ifdef DIAGNOSTICS_BIO
275 fiter=1.0_r8/real(
bioiter(ng),r8)
280 j_loop :
DO j=jstr,jend
283 hz_inv(i,k)=1.0_r8/hz(i,j,k)
298 bio_old(i,k,ibio)=max(0.0_r8,t(i,j,k,nstp,ibio))
299 bio(i,k,ibio)=bio_old(i,k,ibio)
308 bio(i,k,
itemp)=min(t(i,j,k,nstp,
itemp),35.0_r8)
309 bio(i,k,
isalt)=max(t(i,j,k,nstp,
isalt), 0.0_r8)
323 iter_loop:
DO iter=1,
bioiter(ng)
336 cff1=dtdays*respiration(i,j,k)
342#ifdef SURFACE_DO_SATURATION
353 ts=log((298.15_r8-bio(i,k,
itemp))/ &
354 & (273.15_r8+bio(i,k,
itemp)))
355 aa=oa0+ts*(oa1+ts*(oa2+ts*(oa3+ts*(oa4+ts*oa5))))+ &
356 & bio(i,k,
isalt)*(ob0+ts*(ob1+ts*(ob2+ts*ob3)))+ &
359 bio(i,k,
ioxyg)=o2satu
370 cff3=dtdays*0.31_r8*24.0_r8/100.0_r8
377 u10squ=uwind(i,j)*uwind(i,j)+vwind(i,j)*vwind(i,j)
379 u10squ=cff2*sqrt((0.5_r8*(sustr(i,j)+sustr(i+1,j)))**2+ &
380 & (0.5_r8*(svstr(i,j)+svstr(i,j+1)))**2)
382# ifdef OCMIP_OXYGEN_SC
390 schmidtn_ox=1638.0_r8- &
391 & bio(i,k,
itemp)*(81.83_r8- &
394 & bio(i,k,
itemp)*0.008004_r8))
399 schmidtn_ox=1953.4_r8- &
400 & bio(i,k,
itemp)*(128.0_r8- &
403 & bio(i,k,
itemp)*0.050091_r8))
405 cff4=cff3*u10squ*sqrt(660.0_r8/schmidtn_ox)
410 ts=log((298.15_r8-bio(i,k,
itemp))/ &
411 & (273.15_r8+bio(i,k,
itemp)))
412 aa=oa0+ts*(oa1+ts*(oa2+ts*(oa3+ts*(oa4+ts*oa5))))+ &
413 & bio(i,k,
isalt)*(ob0+ts*(ob1+ts*(ob2+ts*ob3)))+ &
422 o2_flux=cff4*(o2satu-bio(i,k,
ioxyg))
424 & o2_flux*hz_inv(i,k)
425# ifdef DIAGNOSTICS_BIO
455 cff=bio(i,k,ibio)-bio_old(i,k,ibio)
456 t(i,j,k,nnew,ibio)=t(i,j,k,nnew,ibio)+cff*hz(i,j,k)
subroutine hypoxia_srm_tile(ng, tile, lbi, ubi, lbj, ubj, ubk, ubt, imins, imaxs, jmins, jmaxs, nstp, nnew, rmask, rmask_full, hz, uwind, vwind, sustr, svstr, respiration, diabio2d, t)