Commit 84ed20a5 authored by Dany Dumont's avatar Dany Dumont
Browse files

Construction d'un nouveau modele biogeochimique bio_gsj, base sur bio_ismer,...

Construction d'un nouveau modele biogeochimique bio_gsj, base sur bio_ismer, comprenant une classe hydrocarbure et une deuxieme classe de bacteries pouvant degrader les hydrocarbures. Le traceur hydrocarbon (hcb) est calque sur le traceur nitrate auquel on a ajoute la possibilite de specifier, via la namelist bio_gsj, une vitesse vertical (settling or rising). Trois fichers namelist sont affectes par ce changement (bio, obs et bio_gsj).
parent 8d24f9ca
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
! 4: Fasham et al. 1990 (7 variables) ! 4: Fasham et al. 1990 (7 variables)
! 5: IOW-ERGOM MaBenE version (9 variables) ! 5: IOW-ERGOM MaBenE version (9 variables)
! 6: ISMER model (9 variables) ! 6: ISMER model (9 variables)
! 7: GSJ model (11 variables)
! !
! bio_eulerian -> state variables are Eulerian (.true./.false.) ! bio_eulerian -> state variables are Eulerian (.true./.false.)
! !
......
#$Id$
!-------------------------------------------------------------------------------
! Fasham et al. biological model with modifications by Kuehn and Radach
!
! numc= number of compartments for geobiochemical model
!
! p1_init = initial flagellate concentration [mmol n/m3]
! p2_init = initial diatom concentration [mmol n/m3]
! z1_init = initial micro-zooplakton concentration [mmol n/m3]
! z2_init = initial meso-zooplakton concentration [mmol n/m3]
! b_init = initial bacteria concentration [mmol n/m3]
! d_init = initial detritus concentration [mmol n/m3]
! l_init = initial LDON concentration [mmol n/m3]
! p0 = minimum phytoplankton concentration [mmol n/m3]
! z0 = minimum zooplakton concentration [mmol n/m3]
! b0 = minimum bacteria concentration [mmol n/m3]
! mte = if .true. use temperature-dependent metabolic rates
! ca1 = temp-dependence coeff for p1
! ca2 = temp-dependence coeff for p2
! ch1 = temp-dependence coeff for z1
! ch2 = temp-dependence coeff for z2
! amratio = Mass ratio between p2 and p1
! hmratio = Mass ratio between z2 and z1
! vp1 = maximum flagellate uptake rate by flagellates [1/day]
! vp2 = maximum diatom uptake rate by diatoms [1/day]
! alpha1 = slope of the flagellate PI-curve [m2/(W day)]
! alpha2 = slope of the diatom PI-curve [m2/(W day)]
! inib1 = inhibition slope of the flagellate PI-curve (pos.) [m2/(W day)]
! inib2 = inhibition slope of the PI-curve (pos.) [m2/(W day)]
! kn1 = half sat. constant nitrate uptake by p1 [mmol n/m3]
! ka1 = half sat. constant ammonium uptake by p1 [mmol n/m3]
! kn2 = half sat. constant nitrate uptake by p2 [mmol n/m3]
! ka2 = half sat. constant ammonium uptake by p2 [mmol n/m3]
! mu11 = mortality rate for p1 [1/day]
! mu12 = mortality rate for p2 [1/day]
! k5 = half sat. constant phy. mortality [mmol n/m3]
! gamma = exudation fraction [-]
! w_p1 = settling velocity for p1 [m/day]
! w_p2 = settling velocity for p2 [m/day]
! theta = phytoplancton buoyancy parameter [m3 day/(mmol N)]
! g1max = maximum ingestion rate for z1 [1/day]
! g2max = maximum ingestion rate for z2 [1/day]
! k3 = half saturation constant ingestion [mmol n/m3]
! beta = grazing efficiency [-]
! k6 = half saturation zooplankton loss (z1 & z2) [mmol n/m3]
! mu21 = maximum loss rate for z1 [1/day]
! mu22 = maximum loss rate for z2 [1/day]
! delta = fractional zooplankton loss to LDON (z1 & z2) [-]
! epsi = fractional zooplankton loss to ammonium (z1 & z2) [-]
! r11 = z1 grazing preference on p1 [-]
! r12 = z1 grazing preference on p2 [-]
! r13 = z1 grazing preference on bacteria [-]
! r14 = z1 grazing preference on detritus [-]
! r21 = z2 grazing preference on p1 [-]
! r22 = z2 grazing preference on p2 [-]
! r23 = z2 grazing preference on detritus [-]
! r24 = z2 grazing preference on z1 [-]
! vb = maximum bacterial uptake rate [1/day]
! k4 = half saturation bacterial uptake [mmol n/m3]
! mu3 = bacteria excretion rate [1/day]
! eta = uptake ratio ammonium:LDON [-]
! mu4 = detritus breakdown rate [1/day]
! mu5 = nitrification rate [1/day]
! w_d = detritus settling velocity [m/day]
! kc = attenuation constant for the self shading effect [m**2/mmol N]
!-------------------------------------------------------------------------------
&bio_gsj_nml
numc = 11
p1_init = 0.012
p2_init = 0.012
z1_init = 0.012
z2_init = 0.012
b_init = 0.001
d_init = 0.01
l_init = 0.1
p0 = 0.0001
z0 = 0.0001
b0 = 0.0001
mte = .true.
ca1 = 3.61
ca2 = 14.58
ch1 = 3.265
ch2 = 24.923
amratio = 200
hmratio = 1000
vp1 = 0.02
vp2 = 0.8
alpha1 = 0.02
alpha2 = 0.04
inib1 = 0.0
inib2 = 0.006
kn1 = 1.0
ka1 = 0.8
kn2 = 1.0
ka2 = 0.8
mu11 = 0.05
mu12 = 0.05
k5 = 0.2
gamma = 0.05
w_p1 =-0.38
w_p2 =-0.00
theta = 0.0
w_p1min =-0.01
w_p1max =-0.10
w_p2min =-0.05
w_p2max =-0.38
g1max = 1.0
g2max = 1.0
k3 = 1.0
beta = 0.625
mu21 = 0.3
mu22 = 0.3
k6 = 0.2
delta = 0.1
epsi = 0.70
r11 = 0.55
r12 = 0.30
r13 = 0.05
r14 = 0.10
r21 = 0.50
r22 = 0.30
r23 = 0.05
r24 = 0.15
vb = 0.24
k4 = 0.5
k10 = 0.5
w_h = 100.0
mu3 = 0.03
eta = 0.0
mu4 = 0.02
mu5 = 0.00
w_d = -5.0
kc = 0.03
/
...@@ -63,6 +63,68 @@ ...@@ -63,6 +63,68 @@
SRelaxSurf= 0. SRelaxSurf= 0.
/ /
!-------------------------------------------------------------------------------
! observed or prescribed potential temperature profiles
!
! t_prof_method -> method to create initial or observed temperature profiles
! 0: no initial values, T-equation is not solved
! 1: use analytically prescribed initial profile
! 2: read profiles at different dates from "t_prof_file"
! and interpolate to GOTM timestep
!
! t_analyt_method -> method to create analytically precribed inital profile
! 1: set profile to constant value s_1
! 2: set "two layer" stratification (see user's guide)
! 3: set profile with constant N^2 (see user's guide)
! This option can only be used toghether with
! s_analyt_method=1 (constant salinity).
!
! z_t1 -> upper layer thickness if t_analyt_method=2
!
! t_1 -> constant temperature if t_analyt_method=1
! upper layer temperature if t_analyt_method=2
! surface temperature if t_analyt_method=3
!
! z_t2 -> depth of top of lower layer if t_analyt_method=2
!
! t_2 -> lower layer temperature if t_analyt_method=2
!
! t_obs_NN -> constant value N^2 corresponding to temperature profile
! if t_analyt_method=3
! t_prof_file -> filename of file with temperature profiles
! if t_prof_method=2
!
! The computed profiles can be relaxed towards observed or prescribed
! profiles with a certain relaxation time. If you do not want relaxation,
! set the relaxation times to 1.e15 (something large). It is possible to choose
! different relaxation times in a surface and bottom layer.
!
! TRelaxTauM -> relaxation time for bulk of the flow
! TRelaxTauB -> relaxation time for bottom layer
! TRelaxTauS -> relaxation time for surface layer
! TRelaxBott -> height of bottom relaxation layer
! (set to 0. if not used)
! TRelaxSurf -> height of surface relaxation layer
! (set to 0. if not used)
!
!-------------------------------------------------------------------------------
&tprofile
t_prof_method= 2
t_analyt_method= 2
z_t1= 25.
t_1= -1.0
z_t2= 35.
t_2= 0.0
t_obs_NN= 2.56e-4
t_prof_file= 'franklin_tprof_ctd.dat'
TRelaxTauM= 1209600.
TRelaxTauB= 1209600.
TRelaxTauS= 1209600.
TRelaxBott= 0.
TRelaxSurf= 0.
/
!------------------------------------------------------------------------------- !-------------------------------------------------------------------------------
! observed or prescribed nitrate profiles ! observed or prescribed nitrate profiles
! !
...@@ -85,7 +147,6 @@ ...@@ -85,7 +147,6 @@
! !
! n_2 -> lower layer nitrate if n_analyt_method=2 ! n_2 -> lower layer nitrate if n_analyt_method=2
! !
! n_prof_file -> filename of file with nitrate profiles ! n_prof_file -> filename of file with nitrate profiles
! if n_prof_method=2 ! if n_prof_method=2
! !
...@@ -172,65 +233,57 @@ ...@@ -172,65 +233,57 @@
/ /
!------------------------------------------------------------------------------- !-------------------------------------------------------------------------------
! observed or prescribed potential temperature profiles ! observed or prescribed hydrocarbon profiles
! !
! t_prof_method -> method to create initial or observed temperature profiles ! hc_prof_method -> method to create initial or observed hydroarbon profiles
! 0: no initial values, T-equation is not solved ! 0: no initial values, N-equation is not solved
! 1: use analytically prescribed initial profile ! 1: use analytically prescribed initial profile
! 2: read profiles at different dates from "t_prof_file" ! 2: read profiles at different dates from "hc_prof_file"
! and interpolate to GOTM timestep ! and interpolate to GOTM timestep
! !
! t_analyt_method -> method to create analytically precribed inital profile ! hc_analyt_method -> method to create analytically precribed inital profile
! 1: set profile to constant value s_1 ! 1: set profile to constant value hc_1
! 2: set "two layer" stratification (see user's guide) ! 2: set "two layer" stratification (see user's guide)
! 3: set profile with constant N^2 (see user's guide)
! This option can only be used toghether with
! s_analyt_method=1 (constant salinity).
! !
! z_t1 -> upper layer thickness if t_analyt_method=2 ! z_hc1 -> upper layer thickness if hc_analyt_method=2
! !
! t_1 -> constant temperature if t_analyt_method=1 ! hc_1 -> constant nitrate if hc_analyt_method=1
! upper layer temperature if t_analyt_method=2 ! upper layer nitrate if hc_analyt_method=2
! surface temperature if t_analyt_method=3
! !
! z_t2 -> depth of top of lower layer if t_analyt_method=2 ! z_hc2 -> depth of top of lower layer if hc_analyt_method=2
! !
! t_2 -> lower layer temperature if t_analyt_method=2 ! hc_2 -> lower layer nitrate if hc_analyt_method=2
! !
! t_obs_NN -> constant value N^2 corresponding to temperature profile ! hc_prof_file -> filename of file with hydrocarbon profiles
! if t_analyt_method=3 ! if hc_prof_method=2
! t_prof_file -> filename of file with temperature profiles
! if t_prof_method=2
! !
! The computed profiles can be relaxed towards observed or prescribed ! The computed profiles can be relaxed towards observed or prescribed
! profiles with a certain relaxation time. If you do not want relaxation, ! profiles with a certain relaxation time. If you do not want relaxation,
! set the relaxation times to 1.e15 (something large). It is possible to choose ! set the relaxation times to 1.e15 (something large). It is possible to choose
! different relaxation times in a surface and bottom layer. ! different relaxation times in a surface and bottom layer.
! !
! TRelaxTauM -> relaxation time for bulk of the flow ! HCRelaxTauM -> relaxation time for bulk of the flow
! TRelaxTauB -> relaxation time for bottom layer ! HCRelaxTauB -> relaxation time for bottom layer
! TRelaxTauS -> relaxation time for surface layer ! HCRelaxTauS -> relaxation time for surface layer
! TRelaxBott -> height of bottom relaxation layer ! HCRelaxBott -> height of bottom relaxation layer
! (set to 0. if not used) ! (set to 0. if not used)
! TRelaxSurf -> height of surface relaxation layer ! HCRelaxSurf -> height of surface relaxation layer
! (set to 0. if not used) ! (set to 0. if not used)
! !
!------------------------------------------------------------------------------- !-------------------------------------------------------------------------------
&tprofile &hcprofile
t_prof_method= 2 hc_prof_method= 1
t_analyt_method= 2 hc_analyt_method= 2
z_t1= 25. z_hc1= 35.
t_1= -1.0 hc_1= 3.0
z_t2= 35. z_hc2= 70.
t_2= 0.0 hc_2= 15.0
t_obs_NN= 2.56e-4 hc_prof_file= 'hcprof.dat'
t_prof_file= 'franklin_tprof_ctd.dat' HCRelaxTauM= 1.e15
TRelaxTauM= 1209600. HCRelaxTauB= 1.e15
TRelaxTauB= 1209600. HCRelaxTauS= 1.e15
TRelaxTauS= 1209600. HCRelaxBott= 0.
TRelaxBott= 0. HCRelaxSurf= 0.
TRelaxSurf= 0.
/ /
!------------------------------------------------------------------------------- !-------------------------------------------------------------------------------
......
#$Id: Makefile,v 1.9 2005-08-16 14:38:37 kbk Exp $ #Id: Makefile,v 1.9 2005-08-16 14:38:37 kbk Exp $
# #
# Master Makefile for making the GOTM executable. # Master Makefile for making the GOTM executable.
# #
......
...@@ -15,9 +15,11 @@ bio_iow.F90 \ ...@@ -15,9 +15,11 @@ bio_iow.F90 \
bio_sed.F90 \ bio_sed.F90 \
bio_fasham.F90 \ bio_fasham.F90 \
bio_ismer.F90 \ bio_ismer.F90 \
bio_gsj.F90 \
bio_save.F90 \ bio_save.F90 \
nitrate.F90 \ nitrate.F90 \
ammonium.F90 ammonium.F90 \
hydrocarbon.F90
OBJ = \ OBJ = \
${LIB}(bio_var.o) \ ${LIB}(bio_var.o) \
...@@ -27,11 +29,13 @@ ${LIB}(bio_npzd.o) \ ...@@ -27,11 +29,13 @@ ${LIB}(bio_npzd.o) \
${LIB}(bio_iow.o) \ ${LIB}(bio_iow.o) \
${LIB}(bio_mab.o) \ ${LIB}(bio_mab.o) \
${LIB}(bio_ismer.o) \ ${LIB}(bio_ismer.o) \
${LIB}(bio_gsj.o) \
${LIB}(bio_fasham.o) \ ${LIB}(bio_fasham.o) \
${LIB}(bio_sed.o) \ ${LIB}(bio_sed.o) \
${LIB}(bio_save.o) \ ${LIB}(bio_save.o) \
${LIB}(nitrate.o) \ ${LIB}(nitrate.o) \
${LIB}(ammonium.o) \ ${LIB}(ammonium.o) \
${LIB}(hydrocarbon.o) \
${LIB}(bio.o) ${LIB}(bio.o)
all: ${OBJ} all: ${OBJ}
......
...@@ -172,6 +172,10 @@ ...@@ -172,6 +172,10 @@
do i=1,nlev do i=1,nlev
amm(i) = cc(9,i) amm(i) = cc(9,i)
end do end do
else if (bio_model.eq.7) then
do i=1,nlev
amm(i) = cc(9,i)
end do
end if end if
#endif #endif
......
...@@ -30,16 +30,19 @@ ...@@ -30,16 +30,19 @@
use bio_fasham, only : init_bio_fasham,init_var_fasham,var_info_fasham use bio_fasham, only : init_bio_fasham,init_var_fasham,var_info_fasham
use bio_fasham, only : light_fasham,do_bio_fasham use bio_fasham, only : light_fasham,do_bio_fasham
!DD
use bio_ismer, only : init_bio_ismer,init_var_ismer,var_info_ismer use bio_ismer, only : init_bio_ismer,init_var_ismer,var_info_ismer
use bio_ismer, only : light_ismer,do_bio_ismer use bio_ismer, only : light_ismer,do_bio_ismer
use bio_sed, only : init_bio_sed,init_var_sed,var_info_sed use bio_gsj, only : init_bio_gsj,init_var_gsj,var_info_gsj
use bio_gsj, only : light_gsj,do_bio_gsj
use bio_sed, only : init_bio_sed,init_var_sed,var_info_sed
use bio_mab, only : init_bio_mab,init_var_mab,var_info_mab use bio_mab, only : init_bio_mab,init_var_mab,var_info_mab
use bio_mab, only : light_mab,surface_fluxes_mab,do_bio_mab use bio_mab, only : light_mab,surface_fluxes_mab,do_bio_mab
use output, only: out_fmt,write_results,ts use output, only: out_fmt,write_results,ts
use util use util
! !
...@@ -314,6 +317,16 @@ ...@@ -314,6 +317,16 @@
call var_info_ismer() call var_info_ismer()
case (7) ! The GSJ model, modified from ISMER
call init_bio_gsj(namlst,'bio_gsj.nml',unit)
call allocate_memory(nlev)
call init_var_gsj(nlev)
call var_info_gsj()
case default case default
stop "bio: no valid biomodel specified in bio.nml !" stop "bio: no valid biomodel specified in bio.nml !"
end select end select
...@@ -409,8 +422,8 @@ ...@@ -409,8 +422,8 @@
! modules ! modules
! !
! !INTERFACE: ! !INTERFACE:
subroutine set_env_bio(nlev,h_,t_,s_,nit_,amm_,rho_,nuh_,rad_,wind_,I_0_, & !CHG3-5 subroutine set_env_bio(nlev,h_,t_,s_,nit_,amm_,hcb_,rho_,nuh_,rad_,wind_, &
w_,w_adv_ctr_) I_0_,w_,w_adv_ctr_)
! !
! !DESCRIPTION: ! !DESCRIPTION:
! !
...@@ -423,8 +436,9 @@ ...@@ -423,8 +436,9 @@
REALTYPE, intent(in) :: nuh_(0:nlev) REALTYPE, intent(in) :: nuh_(0:nlev)
REALTYPE, intent(in) :: t_(0:nlev) REALTYPE, intent(in) :: t_(0:nlev)
REALTYPE, intent(in) :: s_(0:nlev) REALTYPE, intent(in) :: s_(0:nlev)
REALTYPE, intent(in) :: nit_(0:nlev) !CHG3 REALTYPE, intent(in) :: nit_(0:nlev)
REALTYPE, intent(in) :: amm_(0:nlev) !CHG5 REALTYPE, intent(in) :: amm_(0:nlev)
REALTYPE, intent(in) :: hcb_(0:nlev)
REALTYPE, intent(in) :: rho_(0:nlev) REALTYPE, intent(in) :: rho_(0:nlev)
REALTYPE, intent(in) :: rad_(0:nlev) REALTYPE, intent(in) :: rad_(0:nlev)
REALTYPE, intent(in) :: wind_ REALTYPE, intent(in) :: wind_
...@@ -443,9 +457,10 @@ ...@@ -443,9 +457,10 @@
h = h_ h = h_
t = t_ t = t_
s = s_ s = s_
nit = nit_ !CHG3 nit = nit_
amm = amm_ !CHG5 amm = amm_
rho = rho_ rho = rho_
hcb = hcb_
nuh = nuh_ nuh = nuh_
rad = rad_ rad = rad_
wind = wind_ wind = wind_
...@@ -565,7 +580,19 @@ ...@@ -565,7 +580,19 @@
if (bio_eulerian) then if (bio_eulerian) then
do j=1,numcc do j=1,numcc
if (j==1 .and. bio_model==6) then if (j==1 .and. bio_model==7) then
do i=1,nlev
cc(j,i) = nit(i)
end do
else if (j==9 .and. bio_model==7) then
do i=1,nlev
cc(j,i) = amm(i)
end do
else if (j==10 .and. bio_model==7) then
do i=1,nlev
cc(j,i) = hcb(i)
end do
else if (j==1 .and. bio_model==6) then
do i=1,nlev do i=1,nlev
cc(j,i) = nit(i) cc(j,i) = nit(i)
end do end do
...@@ -679,6 +706,9 @@ ...@@ -679,6 +706,9 @@
case (6) case (6)
call light_ismer(nlev,bioshade_feedback) call light_ismer(nlev,bioshade_feedback)
call ode_solver(ode_method,numc,nlev,dt_eff,cc,do_bio_ismer) call ode_solver(ode_method,numc,nlev,dt_eff,cc,do_bio_ismer)
case (7)
call light_gsj(nlev,bioshade_feedback)
call ode_solver(ode_method,numc,nlev,dt_eff,cc,do_bio_gsj)
end select end select
end do end do
...@@ -772,6 +802,7 @@ ...@@ -772,6 +802,7 @@
if (allocated(s)) deallocate(s) if (allocated(s)) deallocate(s)
if (allocated(nit)) deallocate(nit) !CHG3 if (allocated(nit)) deallocate(nit) !CHG3
if (allocated(amm)) deallocate(amm) !CHG5 if (allocated(amm)) deallocate(amm) !CHG5
if (allocated(hcb)) deallocate(hcb)
if (allocated(rho)) deallocate(rho) if (allocated(rho)) deallocate(rho)
if (allocated(rad)) deallocate(rad) if (allocated(rad)) deallocate(rad)
if (allocated(w)) deallocate(w) if (allocated(w)) deallocate(w)
...@@ -892,6 +923,12 @@ ...@@ -892,6 +923,12 @@
allocate(aprof(0:nlev),stat=rc) !CHG5 allocate(aprof(0:nlev),stat=rc) !CHG5
if (rc /= 0) stop 'init_bio(): Error allocating (aprof)' if (rc /= 0) stop 'init_bio(): Error allocating (aprof)'
allocate(hcb(0:nlev),stat=rc)
if (rc /= 0) stop 'init_bio(): Error allocating (hcb)'
allocate(hcprof(0:nlev),stat=rc)
if (rc /= 0) stop 'init_bio(): Error allocating (hcprof)'
allocate(rho(0:nlev),stat=rc) allocate(rho(0:nlev),stat=rc)
if (rc /= 0) stop 'init_bio(): Error allocating (rho)' if (rc /= 0) stop 'init_bio(): Error allocating (rho)'
......
This diff is collapsed.
...@@ -53,6 +53,8 @@ ...@@ -53,6 +53,8 @@
REALTYPE, dimension(:), allocatable :: nprof !CHG3 REALTYPE, dimension(:), allocatable :: nprof !CHG3
REALTYPE, dimension(:), allocatable :: amm !CHG5 REALTYPE, dimension(:), allocatable :: amm !CHG5
REALTYPE, dimension(:), allocatable :: aprof !CHG5 REALTYPE, dimension(:), allocatable :: aprof !CHG5
REALTYPE, dimension(:), allocatable :: hcb
REALTYPE, dimension(:), allocatable :: hcprof
REALTYPE, dimension(:), allocatable :: rho REALTYPE, dimension(:), allocatable :: rho
REALTYPE, dimension(:), allocatable :: nuh REALTYPE, dimension(:), allocatable :: nuh
REALTYPE, dimension(:), allocatable :: w REALTYPE, dimension(:), allocatable :: w
......
!$Id: nitrate.F90,v 1.11 2007-01-06 11:49:15 kbk Exp $
#include"cppdefs.h"
!-----------------------------------------------------------------------
!BOP
!
! !ROUTINE: The hydrocarbon equation \label{sec:hydrocarbon}
!
! !INTERFACE:
subroutine hydrocarbon(nlev,dt,cnpar,nus,gams,cc)
!
! !DESCRIPTION:
! This subroutine computes the balance of nitrate in the form
! \begin{equation}
! \label{SEq}
! \dot{S}
! = {\cal D}_S
! - \frac{1}{\tau^S_R}(S-S_{obs})
! \comma
! \end{equation}
! where $\dot{S}$ denotes the material derivative of the nitrate $N$, and
! ${\cal D}_N$ is the sum of the turbulent and viscous transport
! terms modelled according to
! \begin{equation}
! \label{DN}
! {\cal D}_N
! = \frstder{z}