C $Header: /u/gcmpack/MITgcm/pkg/bling/bling_readparms.F,v 1.11 2017/08/09 15:23:39 mlosch Exp $ C $Name: $ #include "BLING_OPTIONS.h" #ifdef ALLOW_EXF # include "EXF_OPTIONS.h" #endif CBOP SUBROUTINE BLING_READPARMS( myThid ) C *========================================================* C | subroutine bling_readparms C | o Initialise and read parameters for BLING model C *========================================================* implicit none C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #ifdef USE_EXFCO2 # ifdef USE_EXF_INTERPOLATION # ifdef ALLOW_EXCH2 # include "W2_EXCH2_SIZE.h" # include "W2_EXCH2_TOPOLOGY.h" # endif /* ALLOW_EXCH2 */ # include "SET_GRID.h" # endif /* USE_EXF_INTERPOLATION */ # include "EXF_PARAM.h" # include "EXF_CONSTANTS.h" #endif /* USE_EXFCO2 */ #include "BLING_VARS.h" C === Routine arguments === C myThid :: My Thread Id. number INTEGER myThid CEOP #ifdef ALLOW_BLING C === Local variables === C msgBuf :: Informational/error message buffer C errCount :: error counter C iUnit :: Work variable for IO unit number CHARACTER*(MAX_LEN_MBUF) msgBuf INTEGER errCount INTEGER iUnit C ========================================================== C Abiotic parameters C ========================================================== NAMELIST //ABIOTIC_PARMS & permil, Pa2Atm C ========================================================== C BLING parameters C ========================================================== NAMELIST //BIOTIC_PARMS & pivotal, & Pc_0, & Pc_0_diaz, & lambda_0, & chl_min, & CtoN, & NO3toN, & HtoC, & O2toN, & CatoN, & masstoN, & alpha_photo, & theta_Fe_max_hi, & theta_Fe_max_lo, & gamma_irr_mem, & gamma_DON, & gamma_DOP, & gamma_POM, & k_Fe, & k_Fe_diaz, & k_O2, & k_NO3, & k_PO4, & k_PtoN, & k_FetoN, & kFe_eq_lig_max, & kFe_eq_lig_min, & kFe_eq_lig_Femin, & kFe_eq_lig_irr, & kFe_org, & kFe_inorg, & PtoN_min, & PtoN_max, & FetoN_min, & FetoN_max, & FetoC_sed, & remin_min, & oxic_min, & ligand, & kappa_eppley, & kappa_eppley_diaz, & kappa_remin, & ca_remin_depth, & phi_DOM, & phi_sm, & phi_lg, & phi_dvm, & sigma_dvm, & wsink0z, & wsink0, & wsinkacc, & parfrac, & alpfe, & k0, & epsln C ========================================================== C BLING forcing C ========================================================== NAMELIST //BLING_FORCING & bling_windFile, bling_atmospFile, bling_iceFile, & bling_ironFile, bling_silicaFile, & bling_psmFile, bling_plgFile, bling_PdiazFile, & bling_forcingPeriod, bling_forcingCycle, & bling_pCO2, river_conc_trac, & bling_Pc_2dFile, bling_Pc_2d_diazFile, & bling_alpha_photo2dFile,bling_phi_DOM2dFile, & bling_k_Fe2dFile, bling_k_Fe_diaz2dFile, & bling_gamma_POM2dFile, bling_wsink0_2dFile, & bling_phi_sm2dFile,bling_phi_lg2dFile #ifdef USE_EXFCO2 & , apco2file, apco2startdate1, apco2startdate2, & apco2RepCycle, apco2period, apco2StartTime, & exf_inscal_apco2, exf_outscal_apco2, apco2const, & apco2_exfremo_intercept, apco2_exfremo_slope #ifdef USE_EXF_INTERPOLATION & , apco2_lon0, apco2_lon_inc, apco2_lat0, apco2_lat_inc, & apco2_nlon, apco2_nlat, apco2_interpMethod #endif /* USE_EXF_INTERPOLATION */ #endif C ========================================================== C secperday :: seconds in a day = 24*60*60 C permil :: set carbon mol/m3 <---> mol/kg conversion factor C default permil = 1024.5 kg/m3 C Pa2Atm :: Conversion factor for atmospheric pressure pLoad C (when coupled to atmospheric model) into Atm. C Default assumes pLoad in Pascal C 1 Atm = 1.01325e5 Pa = 1013.25 mb C pivotal :: Pivotal phytoplankton biomass C Pc_0 :: Maximum phytoplankton carbon-specific growth rate at 0C C Pc_0_diaz :: Maximum diazotroph carbon-specific growth rate at 0C C lambda_0 :: Carbon-specific phytoplankton mortality rate C chl_min :: minimum chlorophyll concentration [ug kg-1] C CtoN :: Carbon to nitrogen ratio in organic matter C NO3toN :: C HtoC :: C O2toN :: Oxygen to nitrogen for biological activity C CatoN :: Calcium to nitrogen uptake by small phyto C masstoN :: C alpha_photo :: [g C g Chl-1 m2 W-1 s-1] C theta_Fe_max_hi :: Maximum Chl:c ratio, abundant iron C theta_Fe_max_lo :: Maximum Chl:c ratio, extreme iron limitation C gamma_irr_mem :: Photoadaptation time scale C gamma_DON :: Decay timescale of DON C gamma_DOP :: Decay timescale of DOP C gamma_POM :: C k_Fe :: Dissolved Fe uptake half-saturation constant C k_Fe_diaz :: Dissolved Fe uptake half-saturation constant for diazotrophs C k_O2 :: Half-saturation constant for aerobic respiration C k_NO3 :: Nitrate uptake half-saturation constant C k_PO4 :: Phosphate uptake half-saturation constant C k_PtoN :: Half-saturation cellular P:N C k_FetoN :: Half-saturation cellular Fe:N C kFe_eq_lig_max :: Maximum Fe-ligand stability constant C kFe_eq_lig_min :: Minimum Fe-ligand stability constant C kFe_eq_lig_Femin :: Constant having to do with photodissociation C kFe_eq_lig_irr :: Iron ligand stability constant C kFe_org :: Organic-matter dependent scavenging rate C kFe_inorg :: Inorganic scavenging rate C PtoN_min :: Minimum P:N uptake ratio C PtoN_max :: Maximum P:N uptake ratio C FetoN_min :: Minimum Fe:N uptake ratio C FetoN_max :: Maximum Fe:N uptake ratio C FetoC_sed :: Fe:P in sediments C remin_min :: Minimum anaerobic respiration rate C oxic_min :: Minimum O2 concentration for aerobic respiration C ligand :: Ligand concentration C kappa_eppley :: Temperature dependence of growth C kappa_eppley_diaz:: Temperature dependence of growth for diazotrophs C kappa_remin :: Temperature dependence of remineralization C ca_remin_depth :: CaCO3 remineralization lengthscale C phi_DOM :: Fraction of non-sinking production to DOM C phi_sm :: Fraction of small phytoplankton biomass converted to detritus C phi_lg :: Fraction of large phytoplankton biomass converted to detritus C phi_dvm :: C sigma_dvm :: C wsink0z :: Depth at which sinking rate starts increasing C wsink0 :: Initial sinking rate C wsinkacc :: Acceleration rate of sinking with depth C parfrac :: fraction of Qsw avail for photosynthesis C alpfe :: solubility of aeolian iron C k0 :: Light attentuation coefficient C epsln :: a very small number _RL secperday integer k #ifdef USE_EXF_INTERPOLATION INTEGER gridNx, gridNy INTEGER j _RL inp_lon0, inp_lat0, inp_dLon, inp_dLat #endif _BEGIN_MASTER(myThid) errCount = 0 C ========================================================== C Default values secperday = 86400. _d 0 permil = 1. _d 0 / 1024.5 _d 0 Pa2Atm = 1.01325 _d 5 CtoN = 6.75 _d 0 HtoC = 48. _d 0 / 106. _d 0 O2toN = CtoN * (1. _d 0 + 0.25 _d 0 * HtoC) & + 2. _d 0 NO3toN = CtoN * (1. _d 0 + 0.25 _d 0 * HtoC) & * 0.8 _d 0 + 0.6 _d 0 CatoN = CtoN * 0.015 _d 0 masstoN = CtoN * 12.001 _d 0 pivotal = 1.9 _d -3 / 1028. _d 0 / CtoN / permil Pc_0 = 1.7 _d -5 Pc_0_diaz = 0.01 _d -5 lambda_0 = 0.19 _d 0 / secperday chl_min = 1. _d -5 alpha_photo = 0.7 _d -5 * 2.77 _d 18 / 6.022 _d 17 theta_Fe_max_hi = 0.04 _d 0 theta_Fe_max_lo = 0.01 _d 0 gamma_irr_mem = 1. _d 0 / secperday gamma_DON = 0.25 _d 0 / (365.25 _d 0 * secperday) gamma_DOP = 0.5 _d 0 / (365.25 _d 0 * secperday) gamma_POM = 0.12 _d 0 / secperday k_Fe = 1.6 _d -10 / permil k_Fe_diaz = 7. _d -10 / permil k_O2 = 20. _d -6 / permil k_NO3 = 2. _d -6 / permil k_PO4 = 1. _d -8 / permil k_PtoN = 1.5 _d -6 / permil k_FetoN = 8. _d -10 / permil PtoN_min = 1. / 28. PtoN_max = 1. / 9. FetoN_min = 2. _d -6 * 6.75 FetoN_max = 25. _d -6 * 6.75 FetoC_sed = 1. _d -4 kFe_eq_lig_max = 8.0 _d 10 * permil kFe_eq_lig_min = 8.0 _d 9 * permil kFe_eq_lig_Femin = 0.05 _d -9 / permil kFe_eq_lig_irr = 0.1 _d 0 kFe_org = 0.5 _d 0 / secperday * permil**(0.58) kFe_inorg = 1. _d 3 / secperday * permil**(0.5) remin_min = 0.15 _d 0 oxic_min = 1. _d -6 / permil Ligand = 1. _d -9 / permil kappa_eppley = 0.063 _d 0 kappa_eppley_diaz = 0.18 _d 0 kappa_remin = -0.032 _d 0 ca_remin_depth = 1343. _d 0 phi_DOM = 0.1 _d 0 phi_sm = 0.18 _d 0 phi_lg = 1. _d 0 phi_dvm = 0.2 _d 0 sigma_dvm = 40.0 _d 0 wsink0z = 80. _d 0 wsink0 = 16. _d 0 / secperday wsinkacc = 0.05 _d 0 / secperday parfrac = 0.4 _d 0 alpfe = 0.01 _d 0 k0 = 0.04 _d 0 epsln = 1. _d -30 bling_windFile = ' ' bling_atmospFile= ' ' bling_iceFile = ' ' bling_ironFile = ' ' bling_silicaFile= ' ' bling_psmFile = ' ' bling_plgFile = ' ' bling_pdiazFile = ' ' bling_pCO2 = 278. _d -6 DO k=1,8 river_conc_trac(k) = 0. _d 0 ENDDO bling_Pc_2dFile = ' ' bling_Pc_2d_diazFile = ' ' bling_alpha_photo2dFile= ' ' bling_k_Fe2dFile = ' ' bling_k_Fe_diaz2dFile = ' ' bling_gamma_POM2dFile = ' ' bling_wsink0_2dFile = ' ' bling_phi_DOM2dFile = ' ' bling_phi_sm2dFile = ' ' bling_phi_lg2dFile = ' ' #ifdef USE_EXFCO2 apco2startdate1 = 0 apco2startdate2 = 0 apco2StartTime = UNSET_RL apco2period = 0.0 _d 0 apco2RepCycle = repeatPeriod apco2const = 0.0 _d 0 apco2_exfremo_intercept = 0.0 _d 0 apco2_exfremo_slope = 0.0 _d 0 apco2file = ' ' exf_inscal_apco2 = 1. _d 0 exf_outscal_apco2 = 1. _d 0 #ifdef USE_EXF_INTERPOLATION C-- set default input location to match (in case of simple Lat-Long grid) C model grid cell-center position (leading to trivial interpolation) inp_lon0 = xgOrigin + delX(1)*exf_half inp_lat0 = ygOrigin + delY(1)*exf_half inp_dLon = delX(1) inp_dLat = delY(1) apco2_lon0 = inp_lon0 apco2_lat0 = inp_lat0 apco2_nlon = gridNx apco2_nlat = gridNy apco2_lon_inc = inp_dLon DO j=1,MAX_LAT_INC IF (j.LT.gridNy) THEN inp_dLat = (delY(j) + delY(j+1))*exf_half ELSE inp_dLat = 0. ENDIF apco2_lat_inc(j) = inp_dLat ENDDO #endif /* USE_EXF_INTERPOLATION */ #endif C default periodic forcing to same as for physics bling_forcingPeriod = externForcingPeriod bling_forcingCycle = externForcingCycle WRITE(msgBuf,'(A)') ' BLING_READPARMS: opening data.bling' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, I SQUEEZE_RIGHT, myThid ) CALL OPEN_COPY_DATA_FILE( 'data.bling', 'BLING_READPARMS', O iUnit, myThid ) C-- Read parameters from open data file: C- Abiotic parameters READ(UNIT=iUnit,NML=ABIOTIC_PARMS) C- BLING parameters READ(UNIT=iUnit,NML=BIOTIC_PARMS) C- forcing filenames and parameters READ(UNIT=iUnit,NML=BLING_FORCING) WRITE(msgBuf,'(A)') & ' BLING_READPARMS: finished reading data.BLING' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, I SQUEEZE_RIGHT, myThid ) C-- Close the open data file #ifdef SINGLE_DISK_IO CLOSE(iUnit) #else CLOSE(iUnit,STATUS='DELETE') #endif /* SINGLE_DISK_IO */ C- derive other parameters: QSW_underice = .FALSE. #ifdef USE_QSW_UNDERICE QSW_underice = .TRUE. #elif (defined (USE_QSW)) C if using Qsw and seaice, then ice fraction is already C taken into account IF ( useSEAICE ) QSW_underice = .TRUE. IF ( useThSIce ) QSW_underice = .TRUE. #endif IF ( errCount.GE.1 ) THEN WRITE(msgBuf,'(A,I3,A)') & 'BLING_READPARMS: detected', errCount,' fatal error(s)' CALL PRINT_ERROR( msgBuf, myThid ) CALL ALL_PROC_DIE( 0 ) STOP 'ABNORMAL END: S/R BLING_READPARMS' ENDIF _END_MASTER(myThid) C-- Everyone else must wait for the parameters to be loaded _BARRIER #endif /* ALLOW_BLING */ RETURN END