示例#1
0
def pel_chem_eqns(pel_chem_parameters, environmental_parameters,
                  constant_parameters, temper, conc, flPTN6r):
    """ calculates the non-living equations for DOM, POM, and nutrients """

    # State variables
    o2o = conc[0]  # Dissolved oxygen (mg O_2 m^-3)
    n3n = conc[2]  # Nitrate (mmol N m^-3)
    n4n = conc[3]  # Ammonium (mmol N m^-3)
    n6r = conc[6]  # Reduction equivalents (mmol S m^-3)
    r6s = conc[47]  # Particulate organic silicate (mmol Si m^-3)

    # Regulating factors
    eo = max(constant_parameters["p_small"], o2o) / (
        max(constant_parameters["p_small"], o2o) + pel_chem_parameters["h_o"])
    er = n6r / (n6r + pel_chem_parameters["h_r"])

    # Temperature regulating factors
    fTn = eTq_vector(temper, environmental_parameters["basetemp"],
                     environmental_parameters["q10n"])
    fTr6 = eTq_vector(temper, environmental_parameters["basetemp"],
                      environmental_parameters["q10n5"])

    # Nitrification in the water  [mmol N m^-3 s^-1]
    dn4ndt_nit_n3n = max(0.0,
                         pel_chem_parameters["lambda_N4nit"] * n4n * fTn * eo)

    # Denitrification flux [mmol N m^-3 s^-1] from PelChem.F90 line 134
    rPAo = flPTN6r / constant_parameters["omega_r"]
    dn3ndt_denit = max(
        0.0, pel_chem_parameters["lambda_N3denit"] * fTn * er * rPAo /
        pel_chem_parameters["m_o"] * n3n)

    # Reoxidation of reduction equivalents [mmol S m^-3 s^-1]
    dn6rdt_reox = pel_chem_parameters["lambda_N6reox"] * eo * n6r

    # Dissolution of biogenic silicate [mmol Si m^-3 s^-1]
    dr6sdt_rmn_n5s = pel_chem_parameters["lambda_srmn"] * fTr6 * r6s

    return (dn4ndt_nit_n3n, dn3ndt_denit, dn6rdt_reox, dr6sdt_rmn_n5s)
示例#2
0
def bacteria_eqns(conc, bacteria_parameters, constant_parameters,
                  environmental_parameters, temper):
    """ Calculates the terms needed for the bacteria biological rate equations
        Equations come from the BFM user manual
    """

    # State variables
    o2o = conc[0]  # Dissolved oxygen (mg O_2 m^-3)
    n1p = conc[1]  # Phosphate (mmol P m^-3)
    n4n = conc[3]  # Ammonium (mmol N m^-3)
    b1c = conc[7]  # Pelagic bacteria carbon (mg C m^-3)
    b1n = conc[8]  # Pelagic bacteria nitrogen (mmol N m^-3)
    b1p = conc[9]  # Pelagic bacteria phosphate (mmol P m^-3)
    r1c = conc[39]  # Labile dissolved organic carbon (mg C m^-3)
    r1n = conc[40]  # Labile dissolved organic nitrogen (mmol N m^-3)
    r1p = conc[41]  # Labile dissolved organic phosphate (mmol P m^-3)
    r2c = conc[42]  # Semi-labile dissolved organic carbon (mg C m^-3)
    r3c = conc[43]  # Semi-refractory Dissolved Organic Carbon (mg C m^-3)
    r6c = conc[44]  # Particulate organic carbon (mg C m^-3)
    r6n = conc[45]  # Particulate organic nitrogen (mmol N m^-3)
    r6p = conc[46]  # Particulate organic phosphate (mmol P m^-3)

    # concentration ratios
    bp_bc = get_concentration_ratio(b1p, b1c, constant_parameters["p_small"])
    bn_bc = get_concentration_ratio(b1n, b1c, constant_parameters["p_small"])
    r1p_r1c = get_concentration_ratio(r1p, r1c, constant_parameters["p_small"])
    r6p_r6c = get_concentration_ratio(r6p, r6c, constant_parameters["p_small"])
    r1n_r1c = get_concentration_ratio(r1n, r1c, constant_parameters["p_small"])
    r6n_r6c = get_concentration_ratio(r6n, r6c, constant_parameters["p_small"])

    # Temperature effect on pelagic bacteria
    fTB = eTq_vector(temper, environmental_parameters["basetemp"],
                     environmental_parameters["q10b"])

    # oxygen non-dimensional regulation factor[-]
    # Oxygen environment: bacteria are both aerobic and anaerobic
    f_B_O = max(constant_parameters["p_small"],
                o2o)**3 / (max(constant_parameters["p_small"], o2o)**3 +
                           bacteria_parameters["h_B_O"]**3)

    # external nutrient limitation
    f_B_n = n4n / (n4n + bacteria_parameters["h_B_n"])
    f_B_p = n1p / (n1p + bacteria_parameters["h_B_p"])

    # Bacteria mortality (lysis) process [mg C m^-3 s^-1]
    dBcdt_lys = (bacteria_parameters["d_0B"] * fTB +
                 bacteria_parameters["d_B_d"] * b1c) * b1c
    dBcdt_lys_r1c = dBcdt_lys * constant_parameters["epsilon_c"]
    dBcdt_lys_r1n = dBcdt_lys * bn_bc * constant_parameters["epsilon_n"]
    dBcdt_lys_r1p = dBcdt_lys * bp_bc * constant_parameters["epsilon_p"]
    dBcdt_lys_r6c = dBcdt_lys * (1.0 - constant_parameters["epsilon_c"])
    dBcdt_lys_r6n = dBcdt_lys * bn_bc * (1.0 -
                                         constant_parameters["epsilon_n"])
    dBcdt_lys_r6p = dBcdt_lys * bp_bc * (1.0 -
                                         constant_parameters["epsilon_p"])

    # Substrate availability
    if bacteria_parameters["bact_version"] == 1 or bacteria_parameters[
            "bact_version"] == 2:
        # nutrient limitation (intracellular)
        nut_lim_n = min(1.0, max(0.0, bn_bc /
                                 bacteria_parameters["n_B_opt"]))  # Nitrogen
        nut_lim_p = min(1.0, max(0.0, bp_bc /
                                 bacteria_parameters["p_B_opt"]))  # Phosphorus
        f_B_n_P = min(nut_lim_n, nut_lim_p)

        # Potential uptake by bacteria
        potential_upt = f_B_n_P * fTB * bacteria_parameters["r_0B"] * b1c

        # correction of substrate quality depending on nutrient content
        f_r1_n_P = min(1.0, r1p_r1c / bacteria_parameters["p_B_opt"],
                       r1n_r1c / bacteria_parameters["n_B_opt"])
        f_r6_n_P = min(1.0, r6p_r6c / bacteria_parameters["p_B_opt"],
                       r6n_r6c / bacteria_parameters["n_B_opt"])
    else:
        sys.exit(
            'This code does not support this parameterization option, only bact_version=1'
        )

    # Calculate the realized substrate uptake rate depending on the type of detritus and quality
    upt_R1c = (bacteria_parameters["v_B_r1"] * f_r1_n_P +
               bacteria_parameters["v_0B_r1"] * (1.0 - f_r1_n_P)) * r1c
    upt_R2c = bacteria_parameters["v_B_r2"] * r2c
    upt_R3c = bacteria_parameters["v_B_r3"] * r3c
    upt_R6c = bacteria_parameters["v_B_r6"] * f_r6_n_P * r6c
    realized_upt = constant_parameters[
        "p_small"] + upt_R1c + upt_R2c + upt_R3c + upt_R6c

    # Actual uptake by bacteria
    actual_upt = min(potential_upt, realized_upt)

    # Carbon fluxes into bacteria
    dBcdt_upt_r1c = actual_upt * upt_R1c / realized_upt
    dBcdt_upt_r2c = actual_upt * upt_R2c / realized_upt
    dBcdt_upt_r3c = actual_upt * upt_R3c / realized_upt
    dBcdt_upt_r6c = actual_upt * upt_R6c / realized_upt

    # Organic Nitrogen and Phosphrous uptake
    dBcdt_upt_r1n = r1n_r1c * dBcdt_upt_r1c
    dBcdt_upt_r6n = r6n_r6c * dBcdt_upt_r6c
    dBcdt_upt_r1p = r1p_r1c * dBcdt_upt_r1c
    dBcdt_upt_r6p = r6p_r6c * dBcdt_upt_r6c

    # Bacteria respiration [mc C m^-3 s^-1]
    dBcdt_rsp_o3c = (
        bacteria_parameters["gamma_B_a"] + bacteria_parameters["gamma_B_O"] *
        (1.0 - f_B_O)) * actual_upt + bacteria_parameters["b_B"] * b1c * fTB

    # Fluxes from bacteria
    if bacteria_parameters["bact_version"] == 1:

        # There is no Carbon excretion
        dBcdt_rel_r2c = 0.0
        dBcdt_rel_r3c = 0.0

        # Dissolved Nitrogen dynamics
        dBndt_upt_rel_n4n = (bn_bc - bacteria_parameters["n_B_opt"]
                             ) * b1c * bacteria_parameters["v_B_n"]

        # Dissolved Phosphorus dynamics
        dBpdt_upt_rel_n1p = (bp_bc - bacteria_parameters["p_B_opt"]
                             ) * b1c * bacteria_parameters["v_B_p"]

    # BACT2 parameterization
    if bacteria_parameters["bact_version"] == 2:
        print(
            'This code does not support this parameterization option, only bact_version=1'
        )

    # BACT3 parameterization
    if bacteria_parameters["bact_version"] == 3:
        print(
            'This code does not support this parameterization option, only bact_version=1'
        )

    # Term needed for denitrification flux (dn3ndt_denit) (from PelBac.F90 line 352)
    flPTN6r = (1.0 - f_B_O) * dBcdt_rsp_o3c * constant_parameters[
        "omega_c"] * constant_parameters["omega_r"]

    return (dBcdt_lys_r1c, dBcdt_lys_r1n, dBcdt_lys_r1p, dBcdt_lys_r6c,
            dBcdt_lys_r6n, dBcdt_lys_r6p, dBcdt_upt_r1c, dBcdt_upt_r6c,
            dBpdt_upt_rel_n1p, dBndt_upt_rel_n4n, dBcdt_upt_r2c, dBcdt_upt_r3c,
            dBcdt_rel_r2c, dBcdt_rel_r3c, dBcdt_rsp_o3c, flPTN6r, f_B_O, f_B_n,
            f_B_p)
示例#3
0
def microzoo_eqns(conc, microzoo_parameters, constant_parameters,
                  environmental_parameters, zc, zn, zp, i_c, i_n, i_p, temp):
    """ Calculates the micorzooplankton (Z5 & Z6) terms needed for the zooplankton biological rate equations
        Equations come from the BFM user manual and the fortran code MicroZoo.F90
    """

    # Dissolved oxygen concentration (mg O_2 m^-3)
    o2o = conc[0]

    # Concentration ratios
    zn_zc = get_concentration_ratio(zn, zc, constant_parameters["p_small"])
    zp_zc = get_concentration_ratio(zp, zc, constant_parameters["p_small"])

    # Temperature regulating factor
    fTZ = eTq_vector(temp, environmental_parameters["basetemp"],
                     environmental_parameters["q10z"])

    # Oxygen dependent regulation factor
    fZO = min(1.0, (o2o / (o2o + microzoo_parameters["z_o2o"])))

    #---------------------- Microzooplankton Respiration ----------------------
    # Zooplankton total repiration rate (eqn. 2.4.8, and matches fortran code)
    rrac = i_c * (1.0 - microzoo_parameters["etaZ"] -
                  microzoo_parameters["betaZ"])
    rrsc = microzoo_parameters["bZ"] * fTZ * zc
    dZcdt_rsp_o3c = rrac + rrsc

    #------------- Microzooplankton mortality and activity excretion ----------
    # From fortran code MesoZoo.F90 lines 327-331
    rdc = ((1.0 - fZO) * microzoo_parameters["d_ZO"] +
           microzoo_parameters["d_Z"]) * zc
    reac = i_c * (1.0 -
                  microzoo_parameters["etaZ"]) * microzoo_parameters["betaZ"]
    rric = reac + rdc
    dZcdt_rel_r1c = rric * constant_parameters["epsilon_c"]
    dZcdt_rel_r6c = rric * (1.0 - constant_parameters["epsilon_c"])

    #------------------- Microzooplankton nutrient dynamics -------------------
    # Organic Nitrogen dynamics (from fortran code) [mmol N m^-3 s^-1]
    rrin = i_n * microzoo_parameters["betaZ"] + rdc * zn_zc
    dZndt_rel_r1n = rrin * constant_parameters["epsilon_n"]
    dZndt_rel_r6n = rrin - dZndt_rel_r1n

    # Organic Phosphorus dynamics (from fortran code) [mmol P m^-3 s^-1]
    rrip = i_p * microzoo_parameters["betaZ"] + rdc * zp_zc
    dZpdt_rel_r1p = rrip * constant_parameters["epsilon_p"]
    dZpdt_rel_r6p = rrip - dZpdt_rel_r1p

    #--------------- Microzooplankton Dissolved nutrient dynamics -------------
    # Equations from fortran code (MicroZoo.F90 line 368-371)
    runc = max(0.0, i_c * (1.0 - microzoo_parameters["betaZ"]) - rrac)
    runn = max(0.0, i_n * (1.0 - microzoo_parameters["betaZ"]) + rrsc * zn_zc)
    runp = max(0.0, i_p * (1.0 - microzoo_parameters["betaZ"]) + rrsc * zp_zc)
    dZpdt_rel_n1p = max(
        0.0, runp / (constant_parameters["p_small"] + runc) -
        microzoo_parameters["p_Zopt"]) * runc
    dZndt_rel_n4n = max(
        0.0, runn / (constant_parameters["p_small"] + runc) -
        microzoo_parameters["n_Zopt"]) * runc

    return dZcdt_rel_r1c, dZcdt_rel_r6c, dZcdt_rsp_o3c, dZndt_rel_r1n, dZndt_rel_r6n, dZpdt_rel_r1p, dZpdt_rel_r6p, dZpdt_rel_n1p, dZndt_rel_n4n
示例#4
0
def mesozoo_eqns(conc, mesozoo_parameters, constant_parameters,
                 environmental_parameters, zc, zn, zp, i_c, i_n, i_p, temp):
    """ Calculates the mesozooplankton (Z3 & Z4) terms needed for the zooplankton biological rate equations
        Equations come from the BFM user manual and the fortran code MesoZoo.F90
    """

    # Dissolved oxygen concentration (mg O_2 m^-3)
    o2o = conc[0]  # Dissolved oxygen (mg O_2 m^-3)

    # Concentration ratios
    zn_zc = get_concentration_ratio(zn, zc, constant_parameters["p_small"])
    zp_zc = get_concentration_ratio(zp, zc, constant_parameters["p_small"])

    # Temperature regulating factor
    fTZ = eTq_vector(temp, environmental_parameters["basetemp"],
                     environmental_parameters["q10z"])

    # Oxygen dependent regulation factor
    fZO = (max(constant_parameters["p_small"], o2o)**
           3) / (max(constant_parameters["p_small"], o2o)**3 +
                 mesozoo_parameters["z_o2o"]**3)

    # energy cost of ingestion
    prI = 1.0 - mesozoo_parameters["etaZ"] - mesozoo_parameters["betaZ"]

    # Zooplankton total repiration rate (from 'MesoZoo.F90' line 343)
    dZcdt_rsp_o3c = prI * i_c + mesozoo_parameters["bZ"] * fTZ * zc

    # Specific rates of low oxygen mortality and Density dependent mortality
    # from fortran code MesoZoo.F90 lines 343-344
    rdo_c = mesozoo_parameters["d_Zdns"] * (1.0 - fZO) * fTZ * zc
    rd_c = mesozoo_parameters["d_Z"] * zc**mesozoo_parameters["gammaZ"]

    # Total egestion including pellet production (from MesoZoo.F90 line 359 - 361)
    dZcdt_rel_r6c = mesozoo_parameters["betaZ"] * i_c + rdo_c + rd_c
    dZndt_rel_r6n = mesozoo_parameters["betaZ"] * i_n + zn_zc * (rdo_c + rd_c)
    dZpdt_rel_r6p = mesozoo_parameters["betaZ"] * i_p + zp_zc * (rdo_c + rd_c)

    # Check the assimilation rate for Carbon, Nitrogen and Phosphorus
    # compute P:C and N:C ratios in the assimilation rate
    # from MesoZoo.F90 lines 371-375
    ru_c = mesozoo_parameters["etaZ"] * i_c
    ru_n = (mesozoo_parameters["etaZ"] + prI) * i_n
    ru_p = (mesozoo_parameters["etaZ"] + prI) * i_p
    pu_e_n = ru_n / (constant_parameters["p_small"] + ru_c)
    pu_e_p = ru_p / (constant_parameters["p_small"] + ru_c)

    # Eliminate the excess of the non-limiting constituent
    # Determine whether C, P or N is the limiting element and assign the value to variable limiting_nutrient
    # from MesoZoo.F90 lines
    limiting_nutrient = 'carbon'
    temp_p = pu_e_p / (zp_zc + constant_parameters["p_small"])
    temp_n = pu_e_n / (zn_zc + constant_parameters["p_small"])

    if temp_p < temp_n or abs(temp_p -
                              temp_n) < constant_parameters["p_small"]:
        if pu_e_p < zp_zc:
            limiting_nutrient = 'phosphorus'
    else:
        if pu_e_n < zn_zc:
            limiting_nutrient = 'nitrogen'

    # Compute the correction terms depending on the limiting constituent
    if limiting_nutrient == 'carbon':
        q_Zc = 0.0
        q_Zp = max(0.0, (1.0 - mesozoo_parameters["betaZ"]) * i_p -
                   mesozoo_parameters["p_Zopt"] * ru_c)
        q_Zn = max(0.0, (1.0 - mesozoo_parameters["betaZ"]) * i_n -
                   mesozoo_parameters["n_Zopt"] * ru_c)
    elif limiting_nutrient == 'phosphorus':
        q_Zp = 0.0
        q_Zc = max(
            0.0, ru_c - (1.0 - mesozoo_parameters["betaZ"]) * i_p /
            mesozoo_parameters["p_Zopt"])
        q_Zn = max(0.0, (1.0 - mesozoo_parameters["betaZ"]) * i_n -
                   mesozoo_parameters["n_Zopt"] * (ru_c - q_Zc))
    elif limiting_nutrient == 'nitrogen':
        q_Zn = 0.0
        q_Zc = max(
            0.0, ru_c - (1.0 - mesozoo_parameters["betaZ"]) * i_n /
            mesozoo_parameters["n_Zopt"])
        q_Zp = max(0.0, (1.0 - mesozoo_parameters["betaZ"]) * i_p -
                   mesozoo_parameters["p_Zopt"] * (ru_c - q_Zc))

    # Nutrient remineralization basal metabolism + excess of non-limiting nutrients
    dZpdt_rel_n1p = mesozoo_parameters["bZ"] * fZO * fTZ * zp + q_Zp
    dZndt_rel_n4n = mesozoo_parameters["bZ"] * fZO * fTZ * zn + q_Zn

    # Fluxes to particulate organic matter
    # Add the correction term for organic carbon release based on the limiting constituent
    dZcdt_rel_r6c += q_Zc

    # mesozooplankton are assumed to have no dissolved products
    dZcdt_rel_r1c = 0.0
    dZndt_rel_r1n = 0.0
    dZpdt_rel_r1p = 0.0

    return dZcdt_rel_r1c, dZcdt_rel_r6c, dZcdt_rsp_o3c, dZndt_rel_r1n, dZndt_rel_r6n, dZpdt_rel_r1p, dZpdt_rel_r6p, dZpdt_rel_n1p, dZndt_rel_n4n
示例#5
0
def get_mesozoo_predation_terms(conc, mesozoo3_parameters, mesozoo4_parameters,
                                zoo_availability_parameters,
                                environmental_parameters, constant_parameters,
                                temp):
    """ Calculates the predation terms for mesozooplankton """

    # Species concentrations
    p1c = conc[10]  # Diatoms carbon (mg C m^-3)
    p1n = conc[11]  # Diatoms nitrogen (mmol N m^-3)
    p1p = conc[12]  # Diatoms phosphate (mmol P m^-3)
    p1l = conc[13]  # Diatoms chlorophyll (mg Chl-a m^-3)
    p1s = conc[14]  # Diatoms silicate (mmol Si m^-3)
    p2c = conc[15]  # NanoFlagellates carbon (mg C m^-3)
    p2n = conc[16]  # NanoFlagellates nitrogen (mmol N m^-3)
    p2p = conc[17]  # NanoFlagellates phosphate (mmol P m^-3)
    p2l = conc[18]  # NanoFlagellates chlorophyll (mg Chl-a m^-3)
    p3c = conc[19]  # Picophytoplankton carbon (mg C m^-3)
    p3n = conc[20]  # Picophytoplankton nitrogen (mmol N m^-3)
    p3p = conc[21]  # Picophytoplankton phosphate (mmol P m^-3)
    p3l = conc[22]  # Picophytoplankton chlorophyll (mg Chl-a m^-3)
    p4c = conc[23]  # Large phytoplankton carbon (mg C m^-3)
    p4n = conc[24]  # Large phytoplankton nitrogen (mmol N m^-3)
    p4p = conc[25]  # Large phytoplankton phosphate (mmol P m^-3)
    p4l = conc[26]  # Large phytoplankton chlorophyll (mg Chl-a m^-3)
    z3c = conc[27]  # Carnivorous mesozooplankton carbon (mg C m^-3)
    z3n = conc[28]  # Carnivorous mesozooplankton nitrogen (mmol N m^-3)
    z3p = conc[29]  # Carnivorous mesozooplankton phosphate (mmol P m^-3)
    z4c = conc[30]  # Omnivorous mesozooplankton carbon (mg C m^-3)
    z4n = conc[31]  # Omnivorous mesozooplankton nitrogen (mmol N m^-3)
    z4p = conc[32]  # Omnivorous mesozooplankton phosphate (mmol P m^-3)
    z5c = conc[33]  # Microzooplankton carbon (mg C m^-3)
    z5n = conc[34]  # Microzooplankton nitrogen (mmol N m^-3)
    z5p = conc[35]  # Microzooplankton phosphate (mmol P m^-3)
    z6c = conc[36]  # Heterotrophic flagellates carbon (mg C m^-3)
    z6n = conc[37]  # Heterotrophic flagellates nitrogen (mmol N m^-3)
    z6p = conc[38]  # Heterotrophic flagellates phosphate (mmol P m^-3)

    # concentration ratios
    conc_ratio_n = {
        "p1": get_concentration_ratio(p1n, p1c,
                                      constant_parameters["p_small"]),
        "p2": get_concentration_ratio(p2n, p2c,
                                      constant_parameters["p_small"]),
        "p3": get_concentration_ratio(p3n, p3c,
                                      constant_parameters["p_small"]),
        "p4": get_concentration_ratio(p4n, p4c,
                                      constant_parameters["p_small"]),
        "z3": get_concentration_ratio(z3n, z3c,
                                      constant_parameters["p_small"]),
        "z4": get_concentration_ratio(z4n, z4c,
                                      constant_parameters["p_small"]),
        "z5": get_concentration_ratio(z5n, z5c,
                                      constant_parameters["p_small"]),
        "z6": get_concentration_ratio(z6n, z6c, constant_parameters["p_small"])
    }
    conc_ratio_p = {
        "p1": get_concentration_ratio(p1p, p1c,
                                      constant_parameters["p_small"]),
        "p2": get_concentration_ratio(p2p, p2c,
                                      constant_parameters["p_small"]),
        "p3": get_concentration_ratio(p3p, p3c,
                                      constant_parameters["p_small"]),
        "p4": get_concentration_ratio(p4p, p4c,
                                      constant_parameters["p_small"]),
        "z3": get_concentration_ratio(z3p, z3c,
                                      constant_parameters["p_small"]),
        "z4": get_concentration_ratio(z4p, z4c,
                                      constant_parameters["p_small"]),
        "z5": get_concentration_ratio(z5p, z5c,
                                      constant_parameters["p_small"]),
        "z6": get_concentration_ratio(z6p, z6c, constant_parameters["p_small"])
    }

    # Zooplankton temperature regulating factor
    fTZ = eTq_vector(temp, environmental_parameters["basetemp"],
                     environmental_parameters["q10z"])

    # Calculate total potential food given the non-dim prey availability
    # There is no parameter for capture efficiency in mesozooplankton
    # From MesoZoo.F90 lines 247-259
    # Phytoplankton LFG: Food availability of prey Phytoplankton for predator Z3 and Z4
    available_phyto_c3 = (zoo_availability_parameters["del_z3p1"] * p1c) + (
        zoo_availability_parameters["del_z3p2"] *
        p2c) + (zoo_availability_parameters["del_z3p3"] *
                p3c) + (zoo_availability_parameters["del_z3p4"] * p4c)
    available_phyto_c4 = (zoo_availability_parameters["del_z4p1"] * p1c) + (
        zoo_availability_parameters["del_z4p2"] *
        p2c) + (zoo_availability_parameters["del_z4p3"] *
                p3c) + (zoo_availability_parameters["del_z4p4"] * p4c)

    # Mesozooplankton LFG
    available_mesozoo_c3 = (zoo_availability_parameters["del_z3z3"] * z3c) + (
        zoo_availability_parameters["del_z3z4"] * z4c)
    available_mesozoo_c4 = (zoo_availability_parameters["del_z4z3"] * z3c) + (
        zoo_availability_parameters["del_z4z4"] * z4c)

    # Microzooplankton LFG
    available_microzoo_c3 = (zoo_availability_parameters["del_z3z5"] * z5c) + (
        zoo_availability_parameters["del_z3z6"] * z6c)
    available_microzoo_c4 = (zoo_availability_parameters["del_z4z5"] * z5c) + (
        zoo_availability_parameters["del_z4z6"] * z6c)
    #    sys.exit(available_microzoo_c4)

    # Total potential food (from Meso.F90 'rumc')
    f_c3 = available_phyto_c3 + available_mesozoo_c3 + available_microzoo_c3
    f_c4 = available_phyto_c4 + available_mesozoo_c4 + available_microzoo_c4

    # Calculate total food uptake rate (from Meso.F90 'rugc')
    total_uptake_rate_z3 = fTZ * mesozoo3_parameters["r_Z0"] * (
        mesozoo3_parameters["nu_z"] * f_c3 /
        ((mesozoo3_parameters["nu_z"] * f_c3) +
         mesozoo3_parameters["r_Z0"])) * z3c
    total_uptake_rate_z4 = fTZ * mesozoo4_parameters["r_Z0"] * (
        mesozoo4_parameters["nu_z"] * f_c4 /
        ((mesozoo4_parameters["nu_z"] * f_c4) +
         mesozoo4_parameters["r_Z0"])) * z4c

    # Calculate specific uptake rate considering potentially available food (from Meso.F90 'sut')
    specific_uptake_rate_z3 = total_uptake_rate_z3 / (
        constant_parameters["p_small"] + f_c3)
    specific_uptake_rate_z4 = total_uptake_rate_z4 / (
        constant_parameters["p_small"] + f_c4)

    # Total Gross Uptakes from every LFG
    dZ3cdt_prd = {
        "p1":
        specific_uptake_rate_z3 * zoo_availability_parameters["del_z3p1"] *
        p1c,
        "p2":
        specific_uptake_rate_z3 * zoo_availability_parameters["del_z3p2"] *
        p2c,
        "p3":
        specific_uptake_rate_z3 * zoo_availability_parameters["del_z3p3"] *
        p3c,
        "p4":
        specific_uptake_rate_z3 * zoo_availability_parameters["del_z3p4"] *
        p4c,
        "z3":
        specific_uptake_rate_z3 * zoo_availability_parameters["del_z3z3"] *
        z3c,
        "z4":
        specific_uptake_rate_z3 * zoo_availability_parameters["del_z3z4"] *
        z4c,
        "z5":
        specific_uptake_rate_z3 * zoo_availability_parameters["del_z3z5"] *
        z5c,
        "z6":
        specific_uptake_rate_z3 * zoo_availability_parameters["del_z3z6"] * z6c
    }

    dZ4cdt_prd = {
        "p1":
        specific_uptake_rate_z4 * zoo_availability_parameters["del_z4p1"] *
        p1c,
        "p2":
        specific_uptake_rate_z4 * zoo_availability_parameters["del_z4p2"] *
        p2c,
        "p3":
        specific_uptake_rate_z4 * zoo_availability_parameters["del_z4p3"] *
        p3c,
        "p4":
        specific_uptake_rate_z4 * zoo_availability_parameters["del_z4p4"] *
        p4c,
        "z3":
        specific_uptake_rate_z4 * zoo_availability_parameters["del_z4z3"] *
        z3c,
        "z4":
        specific_uptake_rate_z4 * zoo_availability_parameters["del_z4z4"] *
        z4c,
        "z5":
        specific_uptake_rate_z4 * zoo_availability_parameters["del_z4z5"] *
        z5c,
        "z6":
        specific_uptake_rate_z4 * zoo_availability_parameters["del_z4z6"] * z6c
    }
    # Total ingestion rate
    ic3 = 0.0
    in3 = 0.0
    ip3 = 0.0

    for key in dZ3cdt_prd:
        ic3 += dZ3cdt_prd[key]
        in3 += dZ3cdt_prd[key] * conc_ratio_n[key]
        ip3 += dZ3cdt_prd[key] * conc_ratio_p[key]

    ic4 = 0.0
    in4 = 0.0
    ip4 = 0.0

    for key in dZ4cdt_prd:
        ic4 += dZ4cdt_prd[key]
        in4 += dZ4cdt_prd[key] * conc_ratio_n[key]
        ip4 += dZ4cdt_prd[key] * conc_ratio_p[key]

    return dZ3cdt_prd, dZ4cdt_prd, ic3, in3, ip3, ic4, in4, ip4
示例#6
0
def get_microzoo_predation_terms(conc, microzoo5_parameters,
                                 microzoo6_parameters,
                                 zoo_availability_parameters,
                                 environmental_parameters, constant_parameters,
                                 temp):
    """ Calculates the predation terms for microzooplankton """

    # Species concentrations
    b1c = conc[7]  # Pelagic bacteria carbon (mg C m^-3)
    b1n = conc[8]  # Pelagic bacteria nitrogen (mmol N m^-3)
    b1p = conc[9]  # Pelagic bacteria phosphate (mmol P m^-3)
    p1c = conc[10]  # Diatoms carbon (mg C m^-3)
    p1n = conc[11]  # Diatoms nitrogen (mmol N m^-3)
    p1p = conc[12]  # Diatoms phosphate (mmol P m^-3)
    p1l = conc[13]  # Diatoms chlorophyll (mg Chl-a m^-3)
    p1s = conc[14]  # Diatoms silicate (mmol Si m^-3)
    p2c = conc[15]  # NanoFlagellates carbon (mg C m^-3)
    p2n = conc[16]  # NanoFlagellates nitrogen (mmol N m^-3)
    p2p = conc[17]  # NanoFlagellates phosphate (mmol P m^-3)
    p2l = conc[18]  # NanoFlagellates chlorophyll (mg Chl-a m^-3)
    p3c = conc[19]  # Picophytoplankton carbon (mg C m^-3)
    p3n = conc[20]  # Picophytoplankton nitrogen (mmol N m^-3)
    p3p = conc[21]  # Picophytoplankton phosphate (mmol P m^-3)
    p3l = conc[22]  # Picophytoplankton chlorophyll (mg Chl-a m^-3)
    p4c = conc[23]  # Large phytoplankton carbon (mg C m^-3)
    p4n = conc[24]  # Large phytoplankton nitrogen (mmol N m^-3)
    p4p = conc[25]  # Large phytoplankton phosphate (mmol P m^-3)
    p4l = conc[26]  # Large phytoplankton chlorophyll (mg Chl-a m^-3)
    z3c = conc[27]  # Carnivorous mesozooplankton carbon (mg C m^-3)
    z3n = conc[28]  # Carnivorous mesozooplankton nitrogen (mmol N m^-3)
    z3p = conc[29]  # Carnivorous mesozooplankton phosphate (mmol P m^-3)
    z4c = conc[30]  # Omnivorous mesozooplankton carbon (mg C m^-3)
    z4n = conc[31]  # Omnivorous mesozooplankton nitrogen (mmol N m^-3)
    z4p = conc[32]  # Omnivorous mesozooplankton phosphate (mmol P m^-3)
    z5c = conc[33]  # Microzooplankton carbon (mg C m^-3)
    z5n = conc[34]  # Microzooplankton nitrogen (mmol N m^-3)
    z5p = conc[35]  # Microzooplankton phosphate (mmol P m^-3)
    z6c = conc[36]  # Heterotrophic flagellates carbon (mg C m^-3)
    z6n = conc[37]  # Heterotrophic flagellates nitrogen (mmol N m^-3)
    z6p = conc[38]  # Heterotrophic flagellates phosphate (mmol P m^-3)

    # concentration ratios
    conc_ratio_n = {
        "b1": get_concentration_ratio(b1n, b1c,
                                      constant_parameters["p_small"]),
        "p1": get_concentration_ratio(p1n, p1c,
                                      constant_parameters["p_small"]),
        "p2": get_concentration_ratio(p2n, p2c,
                                      constant_parameters["p_small"]),
        "p3": get_concentration_ratio(p3n, p3c,
                                      constant_parameters["p_small"]),
        "p4": get_concentration_ratio(p4n, p4c,
                                      constant_parameters["p_small"]),
        "z5": get_concentration_ratio(z5n, z5c,
                                      constant_parameters["p_small"]),
        "z6": get_concentration_ratio(z6n, z6c, constant_parameters["p_small"])
    }

    conc_ratio_p = {
        "b1": get_concentration_ratio(b1p, b1c,
                                      constant_parameters["p_small"]),
        "p1": get_concentration_ratio(p1p, p1c,
                                      constant_parameters["p_small"]),
        "p2": get_concentration_ratio(p2p, p2c,
                                      constant_parameters["p_small"]),
        "p3": get_concentration_ratio(p3p, p3c,
                                      constant_parameters["p_small"]),
        "p4": get_concentration_ratio(p4p, p4c,
                                      constant_parameters["p_small"]),
        "z5": get_concentration_ratio(z5p, z5c,
                                      constant_parameters["p_small"]),
        "z6": get_concentration_ratio(z6p, z6c, constant_parameters["p_small"])
    }

    # Zooplankton temperature regulating factor
    fTZ = eTq_vector(temp, environmental_parameters["basetemp"],
                     environmental_parameters["q10z"])

    # Capture efficiencies
    capture_efficiencies_z5 = {
        "b1": b1c / (b1c + microzoo5_parameters["mu_z"]),
        "p1": p1c / (p1c + microzoo5_parameters["mu_z"]),
        "p2": p2c / (p2c + microzoo5_parameters["mu_z"]),
        "p3": p3c / (p3c + microzoo5_parameters["mu_z"]),
        "p4": p4c / (p4c + microzoo5_parameters["mu_z"]),
        "z5": z5c / (z5c + microzoo5_parameters["mu_z"]),
        "z6": z6c / (z6c + microzoo5_parameters["mu_z"])
    }

    capture_efficiencies_z6 = {
        "b1": b1c / (b1c + microzoo6_parameters["mu_z"]),
        "p1": p1c / (p1c + microzoo6_parameters["mu_z"]),
        "p2": p2c / (p2c + microzoo6_parameters["mu_z"]),
        "p3": p3c / (p3c + microzoo6_parameters["mu_z"]),
        "p4": p4c / (p4c + microzoo6_parameters["mu_z"]),
        "z5": z5c / (z5c + microzoo6_parameters["mu_z"]),
        "z6": z6c / (z6c + microzoo6_parameters["mu_z"])
    }

    # Calculate total potential food given the non-dim prey availability and capture efficiency
    # From MicroZoo.F90 lines 209-237
    # Bacteria LFG: Food availability of prey Bacteria for predator Z5 and Z6
    available_bact_c5 = zoo_availability_parameters[
        "del_z5b1"] * b1c * capture_efficiencies_z5["b1"]
    available_bact_n5 = zoo_availability_parameters[
        "del_z5b1"] * b1c * capture_efficiencies_z5["b1"] * conc_ratio_n["b1"]
    available_bact_p5 = zoo_availability_parameters[
        "del_z5b1"] * b1c * capture_efficiencies_z5["b1"] * conc_ratio_p["b1"]
    available_bact_c6 = zoo_availability_parameters[
        "del_z6b1"] * b1c * capture_efficiencies_z6["b1"]
    available_bact_n6 = zoo_availability_parameters[
        "del_z6b1"] * b1c * capture_efficiencies_z6["b1"] * conc_ratio_n["b1"]
    available_bact_p6 = zoo_availability_parameters[
        "del_z6b1"] * b1c * capture_efficiencies_z6["b1"] * conc_ratio_p["b1"]

    # Phytoplankton LFG: Food availability of prey Phytoplankton for predator Z5 and Z6
    available_phyto_c5 = ((zoo_availability_parameters["del_z5p1"] * p1c *
                           capture_efficiencies_z5["p1"]) +
                          (zoo_availability_parameters["del_z3p2"] * p2c *
                           capture_efficiencies_z5["p2"]) +
                          (zoo_availability_parameters["del_z3p3"] * p3c *
                           capture_efficiencies_z5["p3"]) +
                          (zoo_availability_parameters["del_z3p4"] * p4c *
                           capture_efficiencies_z5["p4"]))
    available_phyto_n5 = (
        (zoo_availability_parameters["del_z5p1"] * p1c *
         capture_efficiencies_z5["p1"] * conc_ratio_n["p1"]) +
        (zoo_availability_parameters["del_z3p2"] * p2c *
         capture_efficiencies_z5["p2"] * conc_ratio_n["p2"]) +
        (zoo_availability_parameters["del_z3p3"] * p3c *
         capture_efficiencies_z5["p3"] * conc_ratio_n["p3"]) +
        (zoo_availability_parameters["del_z3p4"] * p4c *
         capture_efficiencies_z5["p4"] * conc_ratio_n["p4"]))
    available_phyto_p5 = (
        (zoo_availability_parameters["del_z5p1"] * p1c *
         capture_efficiencies_z5["p1"] * conc_ratio_p["p1"]) +
        (zoo_availability_parameters["del_z3p2"] * p2c *
         capture_efficiencies_z5["p2"] * conc_ratio_p["p2"]) +
        (zoo_availability_parameters["del_z3p3"] * p3c *
         capture_efficiencies_z5["p3"] * conc_ratio_p["p3"]) +
        (zoo_availability_parameters["del_z3p4"] * p4c *
         capture_efficiencies_z5["p4"] * conc_ratio_p["p4"]))
    available_phyto_c6 = ((zoo_availability_parameters["del_z6p1"] * p1c *
                           capture_efficiencies_z6["p1"]) +
                          (zoo_availability_parameters["del_z6p2"] * p2c *
                           capture_efficiencies_z6["p2"]) +
                          (zoo_availability_parameters["del_z6p3"] * p3c *
                           capture_efficiencies_z6["p3"]) +
                          (zoo_availability_parameters["del_z6p4"] * p4c *
                           capture_efficiencies_z6["p4"]))
    available_phyto_n6 = (
        (zoo_availability_parameters["del_z6p1"] * p1c *
         capture_efficiencies_z6["p1"] * conc_ratio_n["p1"]) +
        (zoo_availability_parameters["del_z6p2"] * p2c *
         capture_efficiencies_z6["p2"] * conc_ratio_n["p2"]) +
        (zoo_availability_parameters["del_z6p3"] * p3c *
         capture_efficiencies_z6["p3"] * conc_ratio_n["p3"]) +
        (zoo_availability_parameters["del_z6p4"] * p4c *
         capture_efficiencies_z6["p4"] * conc_ratio_n["p4"]))
    available_phyto_p6 = (
        (zoo_availability_parameters["del_z6p1"] * p1c *
         capture_efficiencies_z6["p1"] * conc_ratio_p["p1"]) +
        (zoo_availability_parameters["del_z6p2"] * p2c *
         capture_efficiencies_z6["p2"] * conc_ratio_p["p2"]) +
        (zoo_availability_parameters["del_z6p3"] * p3c *
         capture_efficiencies_z6["p3"] * conc_ratio_p["p3"]) +
        (zoo_availability_parameters["del_z6p4"] * p4c *
         capture_efficiencies_z6["p4"] * conc_ratio_p["p4"]))

    # Phytoplankton LFG: Food availability of prey Microzooplankton for predator Z5 and Z6
    available_microzoo_c5 = (zoo_availability_parameters["del_z5z5"] * z5c *
                             capture_efficiencies_z5["z5"]) + (
                                 zoo_availability_parameters["del_z5z6"] *
                                 z6c * capture_efficiencies_z5["z6"])
    available_microzoo_n5 = (zoo_availability_parameters["del_z5z5"] * z5c *
                             capture_efficiencies_z5["z5"] * conc_ratio_n["z5"]
                             ) + (zoo_availability_parameters["del_z5z6"] *
                                  z6c * capture_efficiencies_z5["z6"] *
                                  conc_ratio_n["z6"])
    available_microzoo_p5 = (zoo_availability_parameters["del_z5z5"] * z5c *
                             capture_efficiencies_z5["z5"] * conc_ratio_p["z5"]
                             ) + (zoo_availability_parameters["del_z5z6"] *
                                  z6c * capture_efficiencies_z5["z6"] *
                                  conc_ratio_p["z6"])

    available_microzoo_c6 = (zoo_availability_parameters["del_z6z5"] * z5c *
                             capture_efficiencies_z6["z5"]) + (
                                 zoo_availability_parameters["del_z6z6"] *
                                 z6c * capture_efficiencies_z6["z6"])
    available_microzoo_n6 = (
        zoo_availability_parameters["del_z6z5"] * z5c *
        capture_efficiencies_z6["z5"]**conc_ratio_n["z5"]) + (
            zoo_availability_parameters["del_z6z6"] * z6c *
            capture_efficiencies_z6["z6"]**conc_ratio_n["z6"])
    available_microzoo_p6 = (
        zoo_availability_parameters["del_z6z5"] * z5c *
        capture_efficiencies_z6["z5"]**conc_ratio_p["z5"]) + (
            zoo_availability_parameters["del_z6z6"] * z6c *
            capture_efficiencies_z6["z6"]**conc_ratio_p["z6"])

    # Total potential food (from MicroZoo.F90 'rumc', 'rumn', 'rump')
    f_c5 = available_bact_c5 + available_phyto_c5 + available_microzoo_c5
    f_n5 = available_bact_n5 + available_phyto_n5 + available_microzoo_n5
    f_p5 = available_bact_p5 + available_phyto_p5 + available_microzoo_p5
    f_c6 = available_bact_c6 + available_phyto_c6 + available_microzoo_c6
    f_n6 = available_bact_n6 + available_phyto_n6 + available_microzoo_n6
    f_p6 = available_bact_p6 + available_phyto_p6 + available_microzoo_p6

    # Calculate total food uptake rate (from MicroZoo.F90 line 243 'rugc')
    total_uptake_rate_z5 = fTZ * microzoo5_parameters["r_Z0"] * (
        f_c5 / (f_c5 + microzoo5_parameters["h_Z_F"])) * z5c
    total_uptake_rate_z6 = fTZ * microzoo6_parameters["r_Z0"] * (
        f_c6 / (f_c6 + microzoo6_parameters["h_Z_F"])) * z6c

    # Calculate specific uptake rate considering potentially available food (from MicroZoo.F90 line 244 'sut')
    specific_uptake_rate_z5 = total_uptake_rate_z5 / (
        f_c5 + constant_parameters["p_small"])
    specific_uptake_rate_z6 = total_uptake_rate_z6 / (
        f_c6 + constant_parameters["p_small"])

    # Total Gross Uptakes from every LFG
    dZ5cdt_prd = {
        "b1":
        specific_uptake_rate_z5 * zoo_availability_parameters["del_z5b1"] *
        b1c * capture_efficiencies_z5["b1"],
        "p1":
        specific_uptake_rate_z5 * zoo_availability_parameters["del_z5p1"] *
        p1c * capture_efficiencies_z5["p1"],
        "p2":
        specific_uptake_rate_z5 * zoo_availability_parameters["del_z5p2"] *
        p2c * capture_efficiencies_z5["p2"],
        "p3":
        specific_uptake_rate_z5 * zoo_availability_parameters["del_z5p3"] *
        p3c * capture_efficiencies_z5["p3"],
        "p4":
        specific_uptake_rate_z5 * zoo_availability_parameters["del_z5p4"] *
        p4c * capture_efficiencies_z5["p4"],
        "z5":
        specific_uptake_rate_z5 * zoo_availability_parameters["del_z5z5"] *
        z5c * capture_efficiencies_z5["z5"],
        "z6":
        specific_uptake_rate_z5 * zoo_availability_parameters["del_z5z6"] *
        z6c * capture_efficiencies_z5["z6"]
    }

    dZ6cdt_prd = {
        "b1":
        specific_uptake_rate_z6 * zoo_availability_parameters["del_z6b1"] *
        b1c * capture_efficiencies_z6["b1"],
        "p1":
        specific_uptake_rate_z6 * zoo_availability_parameters["del_z6p1"] *
        p1c * capture_efficiencies_z6["p1"],
        "p2":
        specific_uptake_rate_z6 * zoo_availability_parameters["del_z6p2"] *
        p2c * capture_efficiencies_z6["p2"],
        "p3":
        specific_uptake_rate_z6 * zoo_availability_parameters["del_z6p3"] *
        p3c * capture_efficiencies_z6["p3"],
        "p4":
        specific_uptake_rate_z6 * zoo_availability_parameters["del_z6p4"] *
        p4c * capture_efficiencies_z6["p4"],
        "z5":
        specific_uptake_rate_z6 * zoo_availability_parameters["del_z6z5"] *
        z5c * capture_efficiencies_z6["z5"],
        "z6":
        specific_uptake_rate_z6 * zoo_availability_parameters["del_z6z6"] *
        z6c * capture_efficiencies_z6["z6"]
    }

    # Total ingestion rate
    ic5 = 0.0
    in5 = 0.0
    ip5 = 0.0

    for key in dZ5cdt_prd:
        ic5 += dZ5cdt_prd[key]
        in5 += dZ5cdt_prd[key] * conc_ratio_n[key]
        ip5 += dZ5cdt_prd[key] * conc_ratio_p[key]

    ic6 = 0.0
    in6 = 0.0
    ip6 = 0.0

    for key in dZ6cdt_prd:
        ic6 += dZ6cdt_prd[key]
        in6 += dZ6cdt_prd[key] * conc_ratio_n[key]
        ip6 += dZ6cdt_prd[key] * conc_ratio_p[key]

    return dZ5cdt_prd, dZ6cdt_prd, ic5, in5, ip5, ic6, in6, ip6
示例#7
0
def phyto_eqns(conc, phyto_parameters, env_parameters, constant_parameters, group, pc, pn, pp, pl, qs, temp, time):
    """ Calculates the terms needed for the phytoplnaktion biological rate equations
        Equations come from the BFM user manual
    """
    
    # Species concentrations
    n1p = conc[1]               # Phosphate (mmol P m^-3)
    n3n = conc[2]               # Nitrate (mmol N m^-3)
    n4n = conc[3]               # Ammonium (mmol N m^-3)
    n5s = conc[5]               # Silicate (mmol Si m^-3)
    p1l = conc[13]              # Diatoms chlorophyll (mg Chl-a m^-3)
    p1s = conc[14]              # Diatoms silicate (mmol Si m^-3) 
    p2l = conc[18]              # NanoFlagellates chlorophyll (mg Chl-a m^-3)
    p3l = conc[22]              # Picophytoplankton chlorophyll (mg Chl-a m^-3)
    p4l = conc[26]              # Large phytoplankton chlorophyll (mg Chl-a m^-3)
    r6c = conc[44]              # Particulate organic carbon (mg C m^-3)
    
    # Concentration ratios (constituents quota in phytoplankton)
    pn_pc = get_concentration_ratio(pn, pc, constant_parameters["p_small"])
    pp_pc = get_concentration_ratio(pp, pc, constant_parameters["p_small"])
    pl_pc = get_concentration_ratio(pl, pc, constant_parameters["p_small"])

    #--------------------------------------------------------------------------
    # Temperature response of Phytoplankton Include cut-off at low temperature if p_temp>0
    et = eTq_vector(temp, env_parameters["basetemp"], env_parameters["q10z"])
    fTP = max(0.0, et - phyto_parameters["p_temp"])

    #--------------------------------------------------------------------------
    # Nutrient limitations (intracellular and extracellular) fpplim is the 
    # combined non-dimensional factor limiting photosynthesis
    # from Phyto.F90 lines 268-308
    in1p = min(1.0, max(constant_parameters["p_small"], (pp_pc - phyto_parameters["phi_Pmin"])/(phyto_parameters["phi_Popt"] - phyto_parameters["phi_Pmin"])))
    in1n = min(1.0, max(constant_parameters["p_small"], (pn_pc - phyto_parameters["phi_Nmin"])/(phyto_parameters["phi_Nopt"] - phyto_parameters["phi_Nmin"])))
    
    if group == 1:
        fpplim = min(1.0, n5s/(n5s + phyto_parameters["h_Ps"] + (phyto_parameters["rho_Ps"]*p1s)))
    else:
        fpplim = 1.0

    #--------------------------------------------------------------------------
    # multiple nutrient limitation, Liebig rule (from Phyto.F90 line ~318, iN)
    multiple_nut_lim = min(in1p, in1n)
    
    #--------------------------------------------------------------------------    
    # Total extinction coef (m^-1)
    suspended_sediments = 0.0
    # from CalcVerticalExtinction.F90 line 82
    xEPS = env_parameters["p_eps0"] + env_parameters["p_epsESS"]*suspended_sediments + env_parameters["p_epsR6"]*r6c
    # from CalcVerticalExtinction.F90 line 101 (ChlAttenFlag=1, ChlDynamicsFlag=2)       
    xEPS = xEPS + p1l + p2l*2 + p3l*3 + p4l*4
    
    #-------------------------------------------------------------------------- 
    # Light limitation with Chl dynamics
    # irradiance (uE m^-2 s^-1) from Phyto.F90 lines 353-355
    irradiance = qs*env_parameters["epsilon_PAR"]/constant_parameters["e2w"]
    r = xEPS * env_parameters["del_z"]
    r = irradiance/xEPS/env_parameters["del_z"]*(1.0 - numpy.exp(-r))
    irr = max(constant_parameters["p_small"], r)
    
    # Compute exponent E_PAR/E_K = alpha0/PBmax (part of eqn. 2.2.4)
    exponent = pl_pc*phyto_parameters["alpha_chl"]/phyto_parameters["rP0"]*irr

    # light limitation factor (from Phyto.f90 line 374, eiPPY)
    light_lim = (1.0 - numpy.exp(-exponent))

    #--------------------------------------------------------------------------
    # total photosynthesis (from Phyto.F90 line ~380, sum)
    photosynthesis = phyto_parameters["rP0"]*fTP*light_lim*fpplim

    #--------------------------------------------------------------------------
    # Lysis nad excretion
    # nutr. -stress lysis (from Phyto.F90 lines ~385-387, sdo)
    nut_stress_lysis = (phyto_parameters["h_Pnp"]/(multiple_nut_lim + phyto_parameters["h_Pnp"]))*phyto_parameters["d_P0"]
    nut_stress_lysis += phyto_parameters["p_seo"]*pc/(pc + phyto_parameters["p_sheo"] + constant_parameters["p_small"])

    # activity excretion (Phyto.F90 line 389)
    activity_excretion = photosynthesis*phyto_parameters["betaP"]

    # nutrient stress excretion from Phyto.F90 line 396
    nut_stress_excretion = photosynthesis*(1.0 - phyto_parameters["betaP"])*(1.0 - multiple_nut_lim)

    #--------------------------------------------------------------------------
    # Apportioning over R1 and R6: Cell lysis generates both DOM and POM
    pe_R6 = min(phyto_parameters["phi_Pmin"]/(pp_pc + constant_parameters["p_small"]), phyto_parameters["phi_Nmin"]/(pn_pc + constant_parameters["p_small"]))
    pe_R6 = min(1.0, pe_R6)
    rr6c = pe_R6*nut_stress_lysis*pc
    rr1c = (1.0 - pe_R6)*nut_stress_lysis*pc

    #--------------------------------------------------------------------------
    # Respiration rate
    # activity (from Phyto.F90 line 416)
    activity_rsp = phyto_parameters["gammaP"]*(photosynthesis - activity_excretion - nut_stress_excretion)

    # basal (from Phyto.F90 line 417)
    basal_rsp = fTP*phyto_parameters["bP"]

    # total (from Phyto.F90 line 418)
    total_rsp = activity_rsp + basal_rsp

    # total actual respiration
    dPcdt_rsp_o3c = total_rsp*pc

    #--------------------------------------------------------------------------
    # Production, productivity and C flows
    # Phytoplankton gross primary production [mg C m^-3 s^-1]
    dPcdt_gpp_o3c = photosynthesis*pc

    # specific loss terms (from Phyto.F90 line 428)
    specific_loss_terms = activity_excretion + nut_stress_excretion + total_rsp + nut_stress_lysis

    # All activity excretions are assigned to R1
    # p_switchDOC=1 and P_netgrowth=FLASE: [mg C m^-3 s^-1]
    rr1c += activity_excretion*pc + nut_stress_excretion*pc
    dPcdt_exu_r2c = 0.0

    # Phytoplankton DOM cell lysis- carbon lost to DOM [mg C m^-3 s^-1]
    dPcdt_lys_r1c = rr1c

    # Phytoplankton POM cell lysis- carbon lost to POM (eqn. 2.2.9) [mg C m^-3 s^-1]
    dPcdt_lys_r6c = rr6c

    #--------------------------------------------------------------------------
    # Potential-Net primary production
    # from Phyto.F90 line 455
    sadap = fTP*phyto_parameters["rP0"]
    
    # Net production (from Phyto.F90 line 457, 'run')
    net_production = max(0.0, (photosynthesis - specific_loss_terms)*pc)
    
    #--------------------------------------------------------------------------
    # Nutrient Uptake: calculate maximum uptake of N, P based on affinity

    cqun3 = phyto_parameters["h_Pn"]/(constant_parameters["p_small"] + phyto_parameters["h_Pn"] + n4n)

    # max potential uptake of N3 (from Phyto.F90 'rumn3')
    max_upt_n3n = phyto_parameters["a_N"]*n3n*pc*cqun3

    # max potential uptake of N4 (from Phyto.F90 'rumn4')
    max_upt_n4n = phyto_parameters["a_N"]*n4n*pc

    # max potential uptake of DIN (from Phyto.F90 'rumn')
    max_upt_DIN = max_upt_n3n + max_upt_n4n

    # max pot. uptake of PO4 (from Phyto.F90 line 468)
    rump = phyto_parameters["a_P"]*n1p*pc

    #--------------------------------------------------------------------------
    # Nutrient dynamics: NITROGEN

    # Intracellular missing amount of N (from Phyto.F90)
    misn = sadap*(phyto_parameters["phi_Nmax"]*pc - pn)

    # N uptake based on net assimilat. C (from Phyto.F90)
    rupn = phyto_parameters["phi_Nmax"]*net_production

    # actual uptake of NI (from Phyto.F90, 'runn')
    dPndt_upt = min(max_upt_DIN, rupn + misn)

    # if nitrogen uptake rate is positive, then uptake is divided between coming from the nitrate and ammonium reservoir
    # if nitrogen uptake is negative, all nitrogen goes to the DOM pool
    upt_switch_n = insw_vector(dPndt_upt)

    # actual uptake of N3n (from Phyto.F90, 'runn3')
    dPndt_upt_n3n = upt_switch_n*dPndt_upt*max_upt_n3n/(constant_parameters["p_small"] + max_upt_DIN)

    # actual uptake of N4n (from Phyto.F90, 'runn4')
    dPndt_upt_n4n = upt_switch_n*dPndt_upt*max_upt_n4n/(constant_parameters["p_small"] + max_upt_DIN)

    extra_n = -dPndt_upt*(1.0 - upt_switch_n)

    #--------------------------------------------------------------------------
    # Nutrient dynamics: PHOSPHORUS

    # intracellular missing amount of P (from Phyto.F90 line 514)
    misp = sadap*(phyto_parameters["phi_Pmax"]*pc-pp)

    # P uptake based on C uptake (from Phyto.F90 line 517)
    rupp = phyto_parameters["phi_Pmax"]*net_production

    # Actual uptake
    runp = min(rump, rupp + misp)
    upt_switch_p = insw_vector(runp)
    dPpdt_upt_n1p = runp*upt_switch_p

    # is uptake is negative flux goes to DIP (R1P) pool
    dPpdt_upt_r1p = -runp*(1.0 - upt_switch_p)

    #--------------------------------------------------------------------------
    # Excretion of N and P to PON and POP
    dPndt_lys_r6n = pe_R6*nut_stress_lysis*pn
    dPndt_lys_r1n = nut_stress_lysis*pn - dPndt_lys_r6n

    dPpdt_lys_r6p = pe_R6*nut_stress_lysis*pp
    dPpdt_lys_r1p = nut_stress_lysis*pp - dPpdt_lys_r6p

    #--------------------------------------------------------------------------
    # Nutrient dynamics: SILICATE
    if group == 1:
        # Gross uptake of silicate excluding respiratory costs (from Phyto.F90, 'runs')
        dPsdt_upt_n5s = max(0.0, phyto_parameters["phi_Sopt"]*pc*(photosynthesis - basal_rsp))

        # losses of Si (from Phyto.F90)
        dPsdt_lys_r6s = nut_stress_lysis*p1s
    else:
        dPsdt_upt_n5s = 0.0
        dPsdt_lys_r6s = 0.0

    #--------------------------------------------------------------------------
    # Chl-a synthesis and photoacclimation
    if phyto_parameters["chl_switch"] == 1:
        # dynamical chl:c ratio from Fortran code Phyto.F90
        rho_chl = phyto_parameters["theta_chl0"]*min(1.0, phyto_parameters["rP0"]*light_lim*pc/(phyto_parameters["alpha_chl"]*(pl + constant_parameters["p_small"])*irr))
        
        # Chlorophyll synthesis from Fortran code Phyto.F90, rate_chl
        dPldt_syn = rho_chl*(photosynthesis - nut_stress_excretion - activity_excretion - activity_rsp)*pc - nut_stress_lysis*pl
    else:
        sys.exit("Warning: This code does not support other chl systhesis parameterizations")
    
    #--------------------------------------------------------------------------

    return (dPcdt_gpp_o3c, dPcdt_rsp_o3c, dPcdt_lys_r1c, dPcdt_lys_r6c, dPcdt_exu_r2c, 
            dPndt_upt_n3n, dPndt_upt_n4n, extra_n, dPndt_lys_r1n, dPndt_lys_r6n, 
            dPpdt_upt_n1p, dPpdt_upt_r1p, dPpdt_lys_r1p, dPpdt_lys_r6p, 
            dPldt_syn, dPsdt_upt_n5s, dPsdt_lys_r6s)