MODULE ecosys_parms 1,5
!-----------------------------------------------------------------------------
! This module manages the parameter variables for the module ecosys_mod.
! Most of the variables are not parameters in the Fortran sense. In the
! the Fortran sense, they are vanilla module variables.
!
! This modules handles initializing the variables to default values and
! reading them from the namelist ecosys_parms. The values used are echoed
! to stdout for record keeping purposes.
!
! CVS:$Id: ecosys_parms.F90 941 2006-05-12 21:36:48Z klindsay $
! CVS:$Name$
!-----------------------------------------------------------------------------
! Modified to include parameters for diazotrophs, JKM 4/2002
!-----------------------------------------------------------------------------
! variables/subroutines/function used from other modules
! The following are used extensively in this ecosys, so are used at
! the module level. The use statements for variables that are only needed
! locally are located at the module subprogram level.
!-----------------------------------------------------------------------------
USE exit_mod
, ONLY : sigAbort, exit_POP
USE communicate
, ONLY : my_task, master_task
USE constants
, ONLY : c1
USE kinds_mod
USE io_tools
, ONLY : document
IMPLICIT NONE
!-----------------------------------------------------------------------------
! public/private declarations
! all module variables are public and should have their values preserved
!-----------------------------------------------------------------------------
PUBLIC
SAVE
!-----------------------------------------------------------------------------
! floating point constants used across ecosystem module
!-----------------------------------------------------------------------------
REAL(KIND=r8), PARAMETER :: &
spd = 86400.0_r8, & ! number of seconds in a day
dps = c1 / spd, & ! number of days in a second
yps = c1 / (365.0_r8*spd)! number of years in a second
!-----------------------------------------------------------------------------
! Redfield Ratios, dissolved & particulate
!-----------------------------------------------------------------------------
REAL(KIND=r8), PARAMETER :: &
parm_Red_D_C_P = 117.0_r8, & ! carbon:phosphorus
parm_Red_D_N_P = 16.0_r8, & ! nitrogen:phosphorus
parm_Red_D_O2_P = 170.0_r8, & ! oxygen:phosphorus
parm_Remin_D_O2_P = 138.0_r8, & ! oxygen:phosphorus
parm_Red_P_C_P = parm_Red_D_C_P, & ! carbon:phosphorus
parm_Red_D_C_N = parm_Red_D_C_P/parm_Red_D_N_P, & ! carbon:nitrogen
parm_Red_P_C_N = parm_Red_D_C_N, & ! carbon:nitrogen
parm_Red_D_C_O2 = parm_Red_D_C_P/parm_Red_D_O2_P, & ! carbon:oxygen
parm_Remin_D_C_O2 = parm_Red_D_C_P/parm_Remin_D_O2_P, & ! carbon:oxygen
parm_Red_P_C_O2 = parm_Red_D_C_O2, & ! carbon:oxygen
parm_Red_Fe_C = 3.0e-6_r8, & ! iron:carbon
parm_Red_D_C_O2_diaz = parm_Red_D_C_P/150.0_r8! carbon:oxygen
! for diazotrophs
!----------------------------------------------------------------------------
! ecosystem parameters accessible via input file
!----------------------------------------------------------------------------
REAL(KIND=r8) :: &
parm_Fe_bioavail, & ! fraction of Fe flux that is bioavailable
parm_o2_min, & ! min O2 needed for prod & consump. (nmol/cm^3)
parm_o2_min_delta, & ! width of min O2 range (nmol/cm^3)
parm_no3_min, & ! min NO3 needed for denitrification (mmol/m^3)
parm_kappa_nitrif, & ! nitrification inverse time constant (1/sec)
parm_nitrif_par_lim, & ! PAR limit for nitrif. (W/m^2)
parm_z_umax_0, & ! max. zoo growth rate on sphyto at tref (1/sec)
parm_diat_umax_0, & ! max. zoo growth rate on diat at tref (1/sec)
parm_z_mort_0, & ! zoo linear mort rate (1/sec)
parm_z_mort2_0, & ! zoo quad mort rate (1/sec/((mmol C/m3))
parm_sd_remin_0, & ! small detrital remineralization rate (1/sec)
parm_sp_kNO3, & ! sphyto nitrate half sat. coef. (mmol N/m3)
parm_diat_kNO3, & ! diatom nitrate half sat. coef. (mmol N/m3)
parm_sp_kNH4, & ! sphyto ammonium half sat. coef. (mmol N/m3)
parm_diat_kNH4, & ! diatom ammonium half sat. coef. (mmol N/m3)
parm_sp_kFe, & ! sphyto iron half sat. coef. (nmol Fe/m3)
parm_diat_kFe, & ! diatom iron half sat. coef. (nmol Fe/m3)
parm_diat_kSiO3, & ! diatom si half sat. coef. (mmol SiO3/m3)
parm_sp_kPO4, & ! sphyto PO4 uptake (mmol P/m^3)
parm_diat_kPO4, & ! diatom PO4 uptate (mmol P/m^3)
parm_z_grz, & ! grazing coef. for small phyto (mmol C/m^3)
parm_alphaChl, & ! init slope of P_I curve (GD98) (mmol C m^2/(mg Chl W sec))
parm_alphaChlsp, & ! init slope of P_I curve (GD98) (mmol C m^2/(mg Chl W sec))
parm_labile_ratio, & ! fraction of loss to DOC that routed directly to DIC (non-dimensional)
parm_alphaDiaz, & ! chl. spec. init. slope of diaz. P_I curve
parm_diaz_umax_0 ! max. zoo growth rate on diazotrophs at tref (1/sec)
real(kind=r8), parameter :: &
PCref = 4.8_r8 * dps, & !max phyto C-spec. grth rate at tref (1/sec)
sp_mort = 0.15_r8 * dps, & !sphyto mort rate (1/sec)
sp_mort2 = 0.0035_r8 * dps, & !sphyto quad. mort rate (1/sec/((mmol C/m3))
diat_mort = 0.15_r8 * dps, & !diatom mort rate (1/sec)
diat_mort2 = 0.0035_r8 * dps, & !diatom quad mort rate (1/sec/((mmol C/m3))
PCrefDiaz = 0.70_r8 * dps, & !max Diaz C-specific growth rate at tref (1/sec)
diaz_mort = 0.17_r8 * dps, & !diaz mort rate (1/sec)
diaz_kPO4 = 0.02_r8, & !diaz half-sat. const. for P (diatom value)
diaz_kFe = 0.06e-3_r8 !diaz half-sat. const. for Fe
!---------------------------------------------------------------------
! Misc. Rate constants
!---------------------------------------------------------------------
real(kind=r8), parameter :: &
sp_agg_rate_max = 0.75_r8, & !max agg. rate for small phyto (1/d)
diat_agg_rate_max = 0.75_r8, & !max agg. rate for diatoms (1/d)
diat_agg_rate_min = 0.01_r8,& !min agg. rate for diatoms (1/d)
fe_scavenge_rate0 = 1.5_r8, & !base scavenging rate
fe_scavenge_thres1 = 0.6e-3_r8, & !upper thres. for Fe scavenging
dust_fescav_scale = 1.0e9, & !dust scavenging scale factor
fe_max_scale2 = 1000.0_r8,& !unitless scaling coeff.
f_fescav_P_iron = 0.9_r8 !fraction of Fe scavenging
! to particulate Fe
!---------------------------------------------------------------------
! Compute iron remineralization and flux out.
! dust remin gDust = 0.035 gFe mol Fe 1e9 nmolFe
! --------- * ---------- * ----------
! gDust 55.847 gFe molFe
!
! dust_to_Fe conversion - dust to iron (nmol Fe/g Dust)
!---------------------------------------------------------------------
real(kind=r8), parameter :: &
dust_to_Fe=0.035_r8/55.847_r8*1.0e9_r8
!----------------------------------------------------------------------------
! Partitioning of phytoplankton growth, grazing and losses
!
! All f_* variables are fractions and are non-dimensional
!----------------------------------------------------------------------------
real(kind=r8), parameter :: &
z_ingest = 0.3_r8, & !zoo ingestion coefficient (non-dim)
caco3_poc_min = 0.4_r8, & !minimum proportionality between
! QCaCO3 and grazing losses to POC
! (mmol C/mmol CaCO3)
spc_poc_fac = 0.2_r8, & !small phyto grazing factor (1/mmolC)
f_graze_sp_poc_lim = 0.25_r8, &
f_prod_sp_CaCO3 = 0.042_r8, & !fraction of sp prod. as CaCO3 prod.
f_photosp_CaCO3 = 0.4_r8, & !proportionality between small phyto
! production and CaCO3 production
f_graze_sp_doc = 0.4_r8, & !fraction sm. phyto. grazing to DOC
f_graze_sp_dic = c1 - z_ingest - f_graze_sp_doc, & !fraction to DIC
f_graze_diat_poc = 0.25_r8, & !fraction diatom grazing to POC
f_graze_diat_doc = 0.35_r8, & !fraction diatom grazing to DOC
f_graze_diat_dic = c1 - z_ingest - f_graze_diat_poc &
- f_graze_diat_doc, & !fraction diatom grazing to DIC
f_diat_loss_poc = 0.01_r8, & !fraction diatom loss to POC
f_diat_loss_dc = c1-f_diat_loss_poc, & !fraction diatom loss to DOC
f_graze_diaz_zoo = 0.21_r8, & !fraction diaz. grazing to zoo
f_graze_diaz_poc = 0.0_r8, & !fraction diaz grazing to POC
f_graze_diaz_doc = 0.35_r8, & !fraction diaz grazing to DOC
f_graze_diaz_dic = c1-f_graze_diaz_zoo-f_graze_diaz_poc &
- f_graze_diaz_doc, & !fraction diaz grazing to DIC
f_diaz_loss_poc = 0.0_r8,& !fraction diaz loss to sinking pool
f_sp_zoo_detr = 0.1_r8,& !fraction of zoo losses to detrital
! pool when eating sphyto
f_diat_zoo_detr = 0.25_r8,& !fraction of zoo losses to detrital
! pool when eating diatoms
f_diaz_zoo_detr = 0.1_r8,& !fraction of zoo losses to detrital
! pool when eating diaz
f_graze_CaCO3_remin = 0.33_r8, & !fraction of spCaCO3 grazing
! which is remin
f_graze_si_remin = 0.33_r8 !fraction of diatom Si grazing
! which is remin
!----------------------------------------------------------------------------
! fixed ratios
!----------------------------------------------------------------------------
real(kind=r8), parameter :: &
r_Nfix_photo=1.3335_r8 ! N fix relative to C fix (non-dim)
!-----------------------------------------------------------------------
! SET FIXED RATIOS for N/C, P/C, SiO3/C, Fe/C
! assumes C/N/P of 117/16/1 based on Anderson and Sarmiento, 1994
! for diazotrophs a N/P of 45 is assumed based on Letelier & Karl, 1998
!-----------------------------------------------------------------------
real(kind=r8), parameter :: &
Q = 0.137_r8, & !N/C ratio (mmol/mmol) of phyto & zoo
Qp = 0.00855_r8,& !P/C ratio (mmol/mmol) sphyto,diat,zoo
Qp_diaz = 0.002735_r8,& !diazotroph P/C ratio
Qfe_zoo = 3.0e-6_r8, & !zooplankton fe/C ratio
gQsi_0 = 0.137_r8, & !initial diatom Si/C ratio
gQfe_diat_0 = 6.0e-6_r8, & !initial diatom fe/C ratio
gQfe_sp_0 = 6.0e-6_r8, & !initial sphyto fe/C ratio
gQfe_diaz_0 = 42.0e-6_r8,& !initial diaz. fe/C ratio
gQfe_diat_min = 3.0e-6_r8, & !min diatom fe/C ratio
gQsi_max = 0.685_r8, & !max diatom Si/C ratio
gQsi_min = 0.0685_r8, & !min diatom Si/C ratio
gQfe_sp_min = 3.0e-6_r8, & !min sphyto fe/C ratio
gQfe_diaz_min = 14.0e-6_r8,& !min diaz fe/C ratio
QCaCO3_max = 0.4_r8, & !max QCaCO3
thetaN_max_sp = 2.5_r8, & !sp max thetaN (Chl/N) (mg Chl/mmol N)
thetaN_max_diat = 4.0_r8, & !diat max thetaN (Chl/N) (mg Chl/mmol N)
thetaN_max_diaz = 2.5_r8, & !diaz max thetaN (Chl/N) (mg Chl/mmol N)
! carbon:nitrogen ratio for denitrification
! net removal of 120 mols NO3 for 117 mols C (136 = 120 + 16)
denitrif_C_N = parm_Red_D_C_P/136.0_r8
!----------------------------------------------------------------------------
! loss term threshold parameters, chl:c ratios
!----------------------------------------------------------------------------
real(kind=r8), parameter :: &
thres_z1 = 100.0e2_r8, & !threshold = C_loss_thres for z shallower than this (cm)
thres_z2 = 200.0e2_r8, & !threshold = 0 for z deeper than this (cm)
loss_thres_sp = 0.001_r8, & !small phyto conc. where losses go to zero
loss_thres_diat = 0.02_r8, & !diat conc. where losses go to zero
loss_thres_zoo = 0.2_r8, & !zoo conc. where losses go to zero
loss_thres_diaz = 0.01_r8, & !diaz conc. where losses go to zero
loss_thres_diaz2 = 0.001_r8, & !diaz conc. thres at low temp
diaz_temp_thres = 17.0_r8, & !Temp. where diaz conc thres drops
CaCO3_temp_thres1 = 2.0_r8, & !upper temp threshold for CaCO3 prod
CaCO3_temp_thres2 = -2.0_r8, & !lower temp threshold
CaCO3_sp_thres = 3.0_r8, & ! bloom condition thres (mmolC/m3)
diaz_kNO3 = 1.0_r8, & ! diazotroph Ks for nitrate (mmolN/m3)
diaz_kNH4 = 0.1_r8 ! diazotroph Ks for ammonimum (mmolN/m3)
!---------------------------------------------------------------------
! attenuation coefficients for PAR and related parameters
!---------------------------------------------------------------------
real(kind=r8), parameter :: &
k_chl = 0.03e-2_r8, & ! Chl atten. coeff. (1/cm/(mg Chl/m^3))
k_h2o = 0.04e-2_r8, & ! water atten. coeff (1/cm)
f_qsw_par = 0.45_r8 ! PAR fraction
!---------------------------------------------------------------------
! Temperature parameters
!---------------------------------------------------------------------
real(kind=r8), parameter :: &
Tref = 30.0_r8, & ! reference temperature (C)
Q_10 = 2.0_r8 ! factor for temperature dependence (non-dim)
!*****************************************************************************
CONTAINS
!*****************************************************************************
SUBROUTINE ecosys_parms_init 1,31
USE io_types
, ONLY: stdout, nml_in, nml_filename
USE broadcast
, ONLY : broadcast_scalar
!---------------------------------------------------------------------------
! local variables
!---------------------------------------------------------------------------
CHARACTER(LEN=*), PARAMETER :: subname = 'ecosys_parms:ecosys_parms_init'
LOGICAL(KIND=log_kind) :: &
lnml_found ! Was ecosys_parms_nml found ?
NAMELIST /ecosys_parms_nml/ &
parm_Fe_bioavail, &
parm_o2_min, &
parm_o2_min_delta, &
parm_no3_min, &
parm_kappa_nitrif, &
parm_nitrif_par_lim, &
parm_z_umax_0, &
parm_diat_umax_0, &
parm_z_mort_0, &
parm_z_mort2_0, &
parm_sd_remin_0, &
parm_sp_kNO3, &
parm_diat_kNO3, &
parm_sp_kNH4, &
parm_diat_kNH4, &
parm_sp_kFe, &
parm_diat_kFe, &
parm_diat_kSiO3, &
parm_sp_kPO4, &
parm_diat_kPO4, &
parm_z_grz, &
parm_alphaChl, &
parm_alphaChlsp, &
parm_labile_ratio, &
parm_alphaDiaz, &
parm_diaz_umax_0
!---------------------------------------------------------------------------
! default namelist settings
!---------------------------------------------------------------------------
parm_Fe_bioavail = 0.02_r8
parm_o2_min = 4.0_r8
parm_o2_min_delta = 2.0_r8
parm_no3_min = 110.0_r8
parm_kappa_nitrif = 0.06_r8 * dps ! (= 1/( days))
parm_nitrif_par_lim = 5.0_r8
parm_z_umax_0 = 2.5_r8 * dps
parm_diat_umax_0 = 1.95_r8 * dps
parm_z_mort_0 = 0.08_r8 * dps
parm_z_mort2_0 = 0.42_r8 * dps
parm_sd_remin_0 = 0.006667_r8 * dps ! (= 1/(100 days))
parm_sp_kNO3 = 0.5_r8
parm_diat_kNO3 = 2.5_r8
parm_sp_kNH4 = 0.01_r8
parm_diat_kNH4 = 0.1_r8
parm_sp_kFe = 0.03e-3_r8
parm_diat_kFe = 0.08e-3_r8
parm_diat_kSiO3 = 1.0_r8
parm_sp_kPO4 = 0.01_r8
parm_diat_kPO4 = 0.1_r8
parm_z_grz = 1.0_r8
parm_alphaChl = 0.3_r8 * dps
parm_alphaChlsp = 0.34_r8 * dps
parm_labile_ratio = 0.65_r8
parm_alphaDiaz = 0.17_r8 * dps
parm_diaz_umax_0 = 0.9_r8 * dps
!---------------------------------------------------------------------------
! read in namelist
!---------------------------------------------------------------------------
IF (my_task == master_task) THEN
lnml_found = .FALSE.
OPEN(UNIT=nml_in, FILE=nml_filename, STATUS='OLD')
10 CONTINUE
READ(UNIT=nml_in, NML=ecosys_parms_nml, ERR=10, END=20)
CLOSE(UNIT=nml_in)
lnml_found = .TRUE.
20 CONTINUE
END IF
CALL broadcast_scalar
(lnml_found, master_task)
IF (.NOT. lnml_found) THEN
CALL document
(subname, 'ecosys_parms_nml not found')
CALL exit_POP
(sigAbort, 'ERROR : stopping in ' // subname)
END IF
!---------------------------------------------------------------------------
! broadcast all namelist variables
!---------------------------------------------------------------------------
CALL broadcast_scalar
(parm_Fe_bioavail, master_task)
CALL broadcast_scalar
(parm_o2_min, master_task)
CALL broadcast_scalar
(parm_o2_min_delta, master_task)
CALL broadcast_scalar
(parm_no3_min, master_task)
CALL broadcast_scalar
(parm_kappa_nitrif, master_task)
CALL broadcast_scalar
(parm_nitrif_par_lim, master_task)
CALL broadcast_scalar
(parm_z_umax_0, master_task)
CALL broadcast_scalar
(parm_diat_umax_0, master_task)
CALL broadcast_scalar
(parm_z_mort_0, master_task)
CALL broadcast_scalar
(parm_z_mort2_0, master_task)
CALL broadcast_scalar
(parm_sd_remin_0, master_task)
CALL broadcast_scalar
(parm_sp_kNO3, master_task)
CALL broadcast_scalar
(parm_diat_kNO3, master_task)
CALL broadcast_scalar
(parm_sp_kNH4, master_task)
CALL broadcast_scalar
(parm_diat_kNH4, master_task)
CALL broadcast_scalar
(parm_sp_kFe, master_task)
CALL broadcast_scalar
(parm_diat_kFe, master_task)
CALL broadcast_scalar
(parm_diat_kSiO3, master_task)
CALL broadcast_scalar
(parm_sp_kPO4, master_task)
CALL broadcast_scalar
(parm_diat_kPO4, master_task)
CALL broadcast_scalar
(parm_z_grz, master_task)
CALL broadcast_scalar
(parm_alphaChl, master_task)
CALL broadcast_scalar
(parm_alphaChlsp, master_task)
CALL broadcast_scalar
(parm_labile_ratio, master_task)
CALL broadcast_scalar
(parm_alphaDiaz, master_task)
CALL broadcast_scalar
(parm_diaz_umax_0, master_task)
!---------------------------------------------------------------------------
! echo all namelist variables to stdout
!---------------------------------------------------------------------------
IF (my_task == master_task) THEN
WRITE (stdout,*) '----------------------------------------'
WRITE (stdout,*) '----- ecosys_parms namelist values -----'
WRITE (stdout,*) 'parm_Fe_bioavail = ', parm_Fe_bioavail
WRITE (stdout,*) 'parm_o2_min = ', parm_o2_min
WRITE (stdout,*) 'parm_o2_min_delta = ', parm_o2_min_delta
WRITE (stdout,*) 'parm_no3_min = ', parm_no3_min
WRITE (stdout,*) 'parm_kappa_nitrif = ', parm_kappa_nitrif
WRITE (stdout,*) 'parm_nitrif_par_lim = ', parm_nitrif_par_lim
WRITE (stdout,*) 'parm_z_umax_0 = ', parm_z_umax_0
WRITE (stdout,*) 'parm_diat_umax_0 = ', parm_diat_umax_0
WRITE (stdout,*) 'parm_z_mort_0 = ', parm_z_mort_0
WRITE (stdout,*) 'parm_z_mort2_0 = ', parm_z_mort2_0
WRITE (stdout,*) 'parm_sd_remin_0 = ', parm_sd_remin_0
WRITE (stdout,*) 'parm_sp_kNO3 = ', parm_sp_kNO3
WRITE (stdout,*) 'parm_diat_kNO3 = ', parm_diat_kNO3
WRITE (stdout,*) 'parm_sp_kNH4 = ', parm_sp_kNH4
WRITE (stdout,*) 'parm_diat_kNH4 = ', parm_diat_kNH4
WRITE (stdout,*) 'parm_sp_kFe = ', parm_sp_kFe
WRITE (stdout,*) 'parm_diat_kFe = ', parm_diat_kFe
WRITE (stdout,*) 'parm_diat_kSiO3 = ', parm_diat_kSiO3
WRITE (stdout,*) 'parm_sp_kPO4 = ', parm_sp_kPO4
WRITE (stdout,*) 'parm_diat_kPO4 = ', parm_diat_kPO4
WRITE (stdout,*) 'parm_z_grz = ', parm_z_grz
WRITE (stdout,*) 'parm_alphaChl = ', parm_alphaChl
WRITE (stdout,*) 'parm_alphaChlsp = ', parm_alphaChlsp
WRITE (stdout,*) 'parm_labile_ratio = ', parm_labile_ratio
WRITE (stdout,*) 'parm_alphaDiaz = ', parm_alphaDiaz
WRITE (stdout,*) 'parm_diaz_umax_0 = ', parm_diaz_umax_0
WRITE (stdout,*) '----------------------------------------'
END IF
END SUBROUTINE ecosys_parms_init
!*****************************************************************************
END MODULE ecosys_parms