LandscapeDNDC 1.37.0
Loading...
Searching...
No Matches
ldndc::PhysiologyGrowthPSIM Class Reference

Vegetation model GrowthPSIM. More...

#include <models/physiology/psim/psim.h>

Public Attributes

cbm::string_t branchfraction_opt
 ...
 
cbm::string_t crownlength_opt
 ...
 
bool competition_opt
 ...
 
cbm::string_t timemode_opt
 ...
 
int stand_structure_opt
 ...
 

Static Public Attributes

static const unsigned int IMAX_W = 24
 
static const double C1 = 0.0367
 
static const double CCOMNOX = 1.0
 
static const double CSATNH3 = 50.0
 
static const double CSATNOX = 5.0
 
static const double EPOTNOX = 1.0
 
static const double FRFRT = 0.5
 
static const double FMIN = 0.05
 
static const double KMMM = 0.0
 
static const double PAMM = 0.17
 
static const double PGDD = 0.0075
 
static const double PMIN = 0.06
 
static const double PNIT = 0.34
 
static const double PPHLOE = 0.06
 
static const double PREDFRT = 1.72
 
static const double PREDSAP = 0.855
 
static const double PTW = 0.29
 
static const double TAU = 330.0
 
static const double TGLIM = 6.0
 
static const double TRMAX = 45.0
 
static const double TRMIN = -7.0
 
static const double TROPT = 20.0
 
static const double UPOTNH3 = 10000.0
 

Protected Member Functions

lerr_t PSIM_ResizeVegetationVectors ()
 
lerr_t PSIM_StepInit ()
 
lerr_t PSIM_PlantingEvent ()
 
lerr_t PSIM_HydraulicConductance ()
 
lerr_t PSIM_Photosynthesis ()
 
lerr_t PSIM_Potentialtranspiration ()
 
lerr_t PSIM_AgriculturalManagement ()
 
lerr_t PSIM_BiomassUpdate ()
 Biomass growth according to allocation gains and respiration losses in different plant compartments.
 
lerr_t PSIM_PhotosynthesisRates ()
 

Private Attributes

std::map< int, RootSystemDNDC > root_system
 Root system.
 

Detailed Description

Vegetation model GrowthPSIM.

Author
Ruediger Grote

Member Function Documentation

◆ PSIM_AgriculturalManagement()

lerr_t ldndc::PhysiologyGrowthPSIM::PSIM_AgriculturalManagement ( )
protected

PSIM considers:

  • grazing (for grasses)
  • cutting (for grasses) (for other management options on trees, see ref@ ld_treeDyn:treedyn_events)
1478{
1479 m_eventgraze.update_available_freshfood_c( m_veg, species_groups_select_t< species::grass >());
1480
1481 for ( PlantIterator vt = m_veg->begin(); vt != m_veg->end(); ++vt)
1482 {
1483 MoBiLE_Plant *p = (*vt);
1484 if ( p->group() == "grass")
1485 {
1486 lerr_t rc_graze = m_eventgraze.event_graze_physiology( *vt);
1487 if ( (rc_graze != LDNDC_ERR_EVENT_MATCH) &&
1488 (rc_graze != LDNDC_ERR_EVENT_EMPTY_QUEUE))
1489 {
1490 LOGERROR("Grazing not successful");
1491 return rc_graze;
1492 }
1493 }
1494 }
1495
1496 // cutting event by external module
1497 lerr_t rc_cut = m_eventcut.event_cut_physiology( m_veg, species_groups_select_t< species::grass >());
1498 if ( (rc_cut != LDNDC_ERR_EVENT_MATCH) &&
1499 (rc_cut != LDNDC_ERR_EVENT_EMPTY_QUEUE))
1500 {
1501 LOGERROR("Cutting not successful");
1502 return rc_cut;
1503 }
1504 else if (rc_cut == LDNDC_ERR_EVENT_MATCH)
1505 {
1506 for (PlantIterator vt = m_veg->begin(); vt != m_veg->end(); ++vt)
1507 {
1508 MoBiLE_Plant* p = (*vt);
1509 m_treedyn.OnStructureChange(p);
1510 }
1511 }
1512
1513 return LDNDC_ERR_OK;
1514}

References PSIM_AgriculturalManagement().

Referenced by PSIM_AgriculturalManagement().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ PSIM_BiomassUpdate()

lerr_t ldndc::PhysiologyGrowthPSIM::PSIM_BiomassUpdate ( )
protected

Biomass growth according to allocation gains and respiration losses in different plant compartments.

3251{
3252 for ( PlantIterator vt = this->m_veg->begin(); vt != this->m_veg->end(); ++vt)
3253 {
3254 MoBiLE_Plant *p = (*vt);
3255
3256 // remembering starting values
3257 double const fFacOld = p->f_fac;
3258
3259 double const mFolOld = p->mFol;
3260 double const mBudOld = p->mBud;
3261 double const mFrtOld = p->mFrt;
3262 double const mSapOld = p->mSap;
3263 double const mLivOld = mFolOld + mBudOld + mFrtOld + mSapOld;
3264
3265 // increase of dry matter
3266 double const groFol = p->dcFol / cbm::CCDM;
3267 double const groBud = p->dcBud / cbm::CCDM;
3268 double const groFrt = p->dcFrt / cbm::CCDM;
3269 double const groSap = p->dcSap / cbm::CCDM;
3270 double const groSum = groBud + groFrt + groSap;
3271
3272 /* biomass adjustment according to the shift in free available carbon
3273 * following the basic assumption that free available carbon is proportionally
3274 * distributed between or taken from the compartments but leaving reserves unchanged.*/
3275 if ( cbm::flt_greater_zero( mLivOld))
3276 {
3277 double const redistribC( p->dcFac / cbm::CCDM);
3278 p->mFol += (redistribC * mFolOld / mLivOld);
3279 p->mBud += (redistribC * mBudOld / mLivOld);
3280 p->mFrt += (redistribC * mFrtOld / mLivOld);
3281 p->mSap += (redistribC * mSapOld / mLivOld);
3282 }
3283
3284 // considering growth and loss effects on compartment biomasses
3285 p->mFol += (groFol - p->sFol + mBudLoss_vt[p->slot]);
3286 p->mBud += (groBud - p->sBud - mBudLoss_vt[p->slot]);
3287 p->mFrt += (groFrt - cbm::sum( p->sFrt_sl, sl_.soil_layer_cnt()));
3288 p->mSap += (groSap - mSapLoss_vt[p->slot]);
3289 p->mCor += (mSapLoss_vt[p->slot] * (1.0 - p->f_branch));
3290
3291 if ( !cbm::flt_greater_zero( p->mFol)) p->mFol = 0.0;
3292 if ( !cbm::flt_greater_zero( p->mBud)) p->mBud = 0.0;
3293 if ( !cbm::flt_greater_zero( p->mFrt)) p->mFrt = 0.0;
3294 if ( !cbm::flt_greater_zero( p->mSap)) p->mSap = 0.0;
3295
3296 // biomass and foliage area in layers
3297 m_pf.update_foliage_layer_biomass_and_lai((*vt), fl_cnt_, 0.0);
3298
3299 // change foliage biomass in age classes due to growth and senescence
3300 if ( p->nb_ageclasses() == 1)
3301 {
3302 p->mFol_na[0] = p->mFol;
3303 }
3304 else
3305 {
3306 // allowing foliage mass increase in plants with non-annual growth behaviour
3307 p->mFol_na[0] += cbm::bound_min( 0.0, groFol + mBudLoss_vt[p->slot] - p->sFol_na[0]);
3308 for ( size_t na = 1; na < p->nb_ageclasses(); ++na)
3309 {
3310 p->mFol_na[na] = cbm::bound_min( 0.0, p->mFol_na[na] - p->sFol_na[na]);
3311 }
3312 }
3313
3314 // total living biomass after growth (kgDM)
3315 double const mLivNew( p->mFol + p->mBud + p->mFrt + p->mSap);
3316
3320 if ( cbm::flt_greater( mLivNew, 0.001))
3321 {
3322 // ratio of free available carbohydrates
3323 double const senSum = cbm::sum( p->sFrt_sl, sl_.soil_layer_cnt()) + mSapLoss_vt[p->slot] + p->sFol;
3324 p->f_fac = (fFacOld * (mLivOld - senSum) * cbm::CCDM + vt->FFACMAX() * groSum * cbm::CCDM + p->dcFac ) / (mLivNew * cbm::CCDM);
3325
3326 if ( !cbm::flt_greater_zero( p->f_fac)) p->f_fac = 0.0;
3327 }
3328 else
3329 {
3330 p->f_fac = 0.0;
3331 }
3332
3333 // peak foliage amount
3334 if ( cbm::flt_greater( p->mFol, p->mFolMax))
3335 {
3336 p->mFolMax = p->mFol;
3337 }
3338 }
3339
3340 return LDNDC_ERR_OK;
3341}

References PSIM_BiomassUpdate().

Referenced by PSIM_BiomassUpdate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ PSIM_HydraulicConductance()

lerr_t ldndc::PhysiologyGrowthPSIM::PSIM_HydraulicConductance ( )
protected
Returns
error code
1560{
1561 // realized (soil water limited) transpiration (per ground area) in m per time step (should vary per hour) and vegetation type
1562 accumulated_wateruptake_old = wc_.accumulated_wateruptake_sl.sum();
1563
1564 // transpiration demand given from potential demand derived from different stomata methods
1565 double transpiration_demand(wc_.accumulated_potentialtranspiration - accumulated_potentialtranspiration_old);
1566 accumulated_potentialtranspiration_old = wc_.accumulated_potentialtranspiration;
1567
1568 // relative recovery of plant water deficit from the last time step
1569 double rehydrationindex(0.0);
1570 if (cbm::flt_greater_zero(plant_waterdeficit_old))
1571 {
1572 rehydrationindex = cbm::bound(0.0,
1573 (plant_waterdeficit_old - wc_.plant_waterdeficit) / plant_waterdeficit_old,
1574 1.0);
1575 }
1576 plant_waterdeficit_old = wc_.plant_waterdeficit;
1577
1578 // number of hours per day
1579 double const daylength_hours(meteo::daylength(m_setup->latitude(), this->lclock()->yearday()));
1580
1581 // setting soil to root hydraulic conductance equal to soil conductance
1582 double const lai_sum(m_veg->lai());
1583 for (PlantIterator vt = this->m_veg->begin(); vt != this->m_veg->end(); ++vt)
1584 {
1585 MoBiLE_Plant* p = *vt;
1586
1587 // length of timestep [s]
1588 double const tslength = double(cbm::SEC_IN_HR) * double(cbm::HR_IN_DAY) / double(this->lclock_ref().time_resolution());
1589
1590 // transform transpiration units from m timestep-1 to mol m-2leaf s-1 and relate it to daylength
1591 // TODO: find a better way to differentiate transpiration into vegetation classes
1592 double transp_mol(0.0);
1593 double const dayl(meteo::daylength(m_setup->latitude(), this->lclock()->yearday()));
1594 if ( cbm::flt_greater_zero( lai_sum))
1595 {
1596 double transp_vt = transpiration_demand * p->lai() / lai_sum;
1597 if (cbm::flt_greater_zero( dayl))
1598 {
1599 transp_mol = transp_vt * cbm::MM_IN_M * cbm::G_IN_KG / (tslength * cbm::MH2O * p->lai())
1600 / (dayl / cbm::HR_IN_DAY);
1601 }
1602 }
1603
1604 // soil layer water potential at which roots get detached (in MPa, positive units)
1605 double psi_detach(m_sipar->CP_WP() * cbm::MPA_IN_MH2O); // 150 mWS (1.5 MPa) is the predefined value for the water content at wilting point
1606
1607 // plant (root) hydraulic conductance calculated from soil water potential, weighted by fine root abundance
1608 double const SCALE_WP(1.2);
1609 p->psi_sr = 0.0;
1610 for (size_t sl = 0; sl < sl_.soil_layer_cnt(); ++sl)
1611 {
1612 double const wc( cbm::bound( 1.001 * wc_.wc_res_sl[sl],
1613 wc_.wc_sl[sl],
1614 0.999 * wc_.wc_sat_sl[sl]));
1615
1616 // soil layer water potential (in MPa, positive units)
1617 double const psi_sl( ldndc::capillary_pressure( wc, wc_.vga_sl[sl], wc_.vgn_sl[sl], wc_.vgm_sl[sl],
1618 wc_.wc_sat_sl[sl], wc_.wc_res_sl[sl] ) * cbm::MPA_IN_MH2O );
1619
1620 // soil to root water potential (MPa) weighted by fine root abundance
1621 p->psi_sr += ( std::min(SCALE_WP * m_sipar->CP_WP() * cbm::MPA_IN_MH2O, psi_sl) * p->fFrt_sl[sl] );
1622 }
1623
1624 p->psi_sr *= -1.0;
1625 psi_detach *= -1.0;
1626
1627 // plant water potential calculated considering previous declines (without gravitational impact)
1628 double psi_vt(std::max(p->psi_sr, psi_detach) + psidecline_cum_vt[p->slot]);
1629
1630 // canopy water potential
1631 // (calculated in a lumped fashion, alternatively define psi for each canopy layer separately)
1632 // - average canopy height
1633 double h_weighted(0.0); // [m]
1634 double height_cum(0.0); // [m]
1635 for (size_t fl = 0; fl < p->nb_foliagelayers(); ++fl)
1636 {
1637 height_cum += 0.5 * ph_.h_fl[fl];
1638 h_weighted += height_cum * p->fFol_fl[fl];
1639 height_cum += 0.5 * ph_.h_fl[fl];
1640 }
1641
1642 // - increase of water potential due to vertical transport (gravitational impact)
1643 double const dpsi = h_weighted * cbm::MPA_IN_KPA * cbm::KPA_IN_PA * cbm::DWAT * cbm::DM3_IN_M3 * cbm::G;
1644
1645 // decrease and recovery of plant water potential
1646 int night(1); // 1=false, 0=true
1647 // - state determination after daytime
1648 if (cbm::flt_equal_zero(mc_.shortwaveradiation_in)) // nighttime without radiation (NOTE: problems occur if there is radiation input during night)
1649 {
1650 // in the night, the multiplier for psi that accounts for increasing tension is set to zero
1651 night = 0;
1652
1653 if (daytime == true)
1654 {
1655 // weighting by leaf/wood ratio as proxy for capacitance change
1656 // NOTE1: assuming that the degree of capacitance deficit (if it occurs) is the same in all compartments
1657 // NOTE2: doesn't consider a possible capacitance change with relative water content
1658 double const qcapacitance = (p->mFol + p->f_branch * p->mSap) / (p->mFol + p->mSap + p->mFrt); // assuming that transpiration affects primarily the crown tissue relation to all living tissue
1659// double const qcapacitance = p->mFol / (p->mFol + p->mSap + p->mFrt); // assuming that transpiration only affects foliage tissue in relation to all living tissue
1660// double const qcapacitance = p->mFol / (p->mFol + p->mSap + p->mCor + p->mFrt); // assuming that transpiration only affects foliage tissue in relation to all tissues including core wood
1661// double const qcapacitance = 1.0; // assuming that only transpiration affects tree water potential
1662// double const qcapacitanc = p->mFol / (p->mFol + p->mSap * (*vt)->wc_rel + p->mFrt); // assuming that transpiration only affects foliage tissue in relation to all living tissues reduced by water content
1663
1664 // recovery of cumulative plant water potential due to rehydration during the previous day
1665 psidecline_cum_vt[p->slot] *= std::min(1.0, (1.0 - rehydrationindex_cum_vt[p->slot])); // assumes that relative rehydration and plant water potential recovers in parallel
1666// psidecline_cum_vt[p->slot] *= std::min(1.0, (1.0 - qcapacitance)); // assumes that the recovery is slowed down according to the relation between affected and total tissue
1667
1668 // in case of root detachment (soil water potential below wilting point) plant water potential decline is accumulated
1669 if (cbm::flt_greater_equal(psi_detach, p->psi_sr))
1670 {
1671 psidecline_cum_vt[p->slot] += std::min(0.0, (psidecline_daycum_vt[p->slot] / daylength_hours) * qcapacitance);
1672 }
1673
1674 // reset of the cumulative rehydration index
1675 rehydrationindex_cum_vt[p->slot] = 0.0;
1676
1677 // reset the cumulative water potential deficit
1678 psidecline_daycum_vt[p->slot] = 0.0;
1679 }
1680
1681 daytime = false;
1682 }
1683 // - state determination during daytime
1684 else
1685 {
1686 // calculations directly after nighttime
1687 if (daytime == false)
1688 {
1689 // predawn canopy water potential
1690 p->psi_pd = psi_vt - dpsi;
1691
1692 // predawn (minimum) tree water deficit = maximum diurnal radius
1693 (*vt)->twd_pd_vt = (*vt)->stem_shrinkage;
1694 (*vt)->twd_max_vt = 0.0;
1695 }
1696
1697 daytime = true;
1698
1699 // minimum shrinkage (maximum tree water deficit) during the day
1700 if ((*vt)->stem_shrinkage > (*vt)->twd_max_vt)
1701 {
1702 (*vt)->twd_max_vt = (*vt)->stem_shrinkage;
1703 }
1704
1705 }
1706
1707 // relative xylem conductivity based on current plant water potential
1708 double krc_rel_vt = 1.0 - (1.0 - std::exp(-std::pow(psi_vt / vt->PSI_REF(), vt->PSI_EXP())));
1709 krc_rel_vt = std::max(0.001, krc_rel_vt);
1710
1711 // canopy hydraulic potential in MPa (negative) due to water loss (only at daytime) considering height induced gradient
1712 p->psi_cr = psi_vt;
1713 if (cbm::flt_greater_zero(krc_rel_vt))
1714 {
1715 p->psi_cr = psi_vt - (transp_mol * double(night) / (vt->CWP_REF() * krc_rel_vt)) - dpsi; // CWP_REF is the conductance of the whole pathlength
1716 }
1717
1718 // mean canopy water potential (not important, but smoothing between timesteps)
1719 p->psi_mean = (p->psi_pd + p->psi_cr) * 0.5;
1720
1721 // drop in plant water potential (!) due to evaporative demand cumulated over the day
1722 psidecline_daycum_vt[p->slot] += std::min(0.0, (p->psi_cr + dpsi - psi_vt));
1723
1724 // daily cumulative reduction of drop in water potential after refilling (rehydration_index is in fraction per hour, needed in fraction per day)
1725 rehydrationindex_cum_vt[p->slot] += rehydrationindex;
1726 rehydrationindex_cum_vt[p->slot] = cbm::bound(0.0, rehydrationindex_cum_vt[p->slot], 1.0);
1727
1728 // overall root-to-canopy (plant hydraulic) conductance considering current day demands (in mol MPa-1 s-1 m-2)
1729 double k_rc_rel_mean = 1.0 - (1.0 - std::exp(-std::pow(p->psi_mean / vt->PSI_REF(), vt->PSI_EXP())));
1730 k_rc_rel_mean = std::max(0.001, k_rc_rel_mean);
1731
1732 // whole plant resistances (in MPa s m2 mol-1)
1733 // NOTE: resistance is reversible and is not affected by xylem senescence (e.g. embolism)
1734 // Possible solutions to increase k_rc_rel_mean accordingly are suggested
1735 p->xylem_resistance = vt->RPMIN(); // 1/RPMIN is the conductance in the crown area
1736 if (cbm::flt_greater_zero(k_rc_rel_mean))
1737 {
1738 p->xylem_resistance /= k_rc_rel_mean;
1739
1740 // option to increase resistance proportionally to sapwood area loss considering increases in conductive efficiency
1741// p->xylem_resistance /= (k_rc_rel_mean / std::max(0.1, std::min(1.0, qsaparea_vt[p->slot] * (1.0 + vt->FOLRELGROMAX()))) );
1742
1743 // (PIA) option to increase resistance dispropotionally
1744// p->xylem_resistance /= (k_rc_rel_mean * sqrt(std::max(0.1, qsaparea_vt[p->slot])));
1745 }
1746
1747 } // vegetation type loop end
1748
1749 return LDNDC_ERR_OK;
1750}

References PSIM_HydraulicConductance().

Referenced by PSIM_HydraulicConductance().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ PSIM_Photosynthesis()

lerr_t ldndc::PhysiologyGrowthPSIM::PSIM_Photosynthesis ( )
protected
Returns
error code
854{
855 for ( PlantIterator vt = this->m_veg->begin(); vt != this->m_veg->end(); ++vt)
856 {
857 MoBiLE_Plant *p = *vt;
858
859 for (size_t fl = 0; fl < p->nb_foliagelayers(); ++fl)
860 {
861 m_photo.vpd_fl[fl] = mc_.vpd_fl[fl];
862 m_photo.rh_fl[fl] = cl_.rel_humidity_subday( lclock_ref());
863 m_photo.temp_fl[fl] = mc_.temp_fl[fl];
864 m_photo.parsun_fl[fl] = mc_.parsun_fl[fl];
865 m_photo.parshd_fl[fl] = mc_.parshd_fl[fl];
866 m_photo.tFol_fl[fl] = mc_.tFol_fl[fl];
867 m_photo.co2_concentration_fl[fl] = ac_.ts_co2_concentration_fl[fl];
868 m_photo.sunlitfoliagefraction_fl[fl] = mc_.ts_sunlitfoliagefraction_fl[fl];
869 }
870 m_photo.nd_airpressure = mc_.nd_airpressure;
871
872 m_photo.set_vegetation_base_state( p);
873
874 m_photo.set_vegetation_non_stomatal_water_limitation_state( p->xylem_resistance, p->psi_mean, p->psi_sr, p->psi_pd);
875
876 m_photo.solve();
877
878 m_photo.get_vegetation_state( p);
879 }
880
881 return LDNDC_ERR_OK;
882}

References PSIM_Photosynthesis().

Referenced by PSIM_Photosynthesis().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ PSIM_PhotosynthesisRates()

lerr_t ldndc::PhysiologyGrowthPSIM::PSIM_PhotosynthesisRates ( )
protected

Nitrogen concentration is related to specific leaf area but declines generally not linear. Therefore, an exponential relationship with a parameter of 0.3 is used, fitted to various canopy gradient studies (e.g. Meir et al. 2002, Al Afas et al. 2007, Ellsworth and Reich 1993) (parameter should be consistent with the one used in m_pf.optimum_nitrogen_content_foliage())

3400{
3401 for ( PlantIterator vt = this->m_veg->begin(); vt != this->m_veg->end(); ++vt)
3402 {
3403 MoBiLE_Plant *p = (*vt);
3404
3405 // phenological state
3406 bool const evergreen( (p->nb_ageclasses() > 1) && cbm::flt_greater_zero( p->mFol));
3407 double const pstatus( evergreen ?
3408 (p->dvsFlush * p->mFol_na[0] + (1.0 - p->dvsMort) * (cbm::sum( p->mFol_na, p->nb_ageclasses()) - p->mFol_na[0])) / p->mFol :
3409 std::min( p->dvsFlush, 1.0 - p->dvsMort));
3410
3411 // drought stress impact
3412 // NOTE: consideration of water potential effects is only warranted if the whole hydraulic model is used
3413 double fwat(1.0);
3414 if (m_photo.stomatalconductance_method == eller_2020 && p->dvsFlush > 0.99)
3415 {
3416 fwat = ldndc::non_stomatal_water_limitation( p->psi_pd, (*p)->A_REF(), (*p)->A_EXP() );
3417 }
3418
3419 // - in case drought stress decreases, its decrease is limited by recovery rate (legacy effect)
3420 const double RECOVER(0.01); // fraction recovery per hour
3421 if (fwat > p->fwatOld)
3422 {
3423 double const tslength = double(cbm::HR_IN_DAY) / double(this->lclock_ref().time_resolution());
3424 fwat = std::min(fwat, p->fwatOld + RECOVER * tslength);
3425 }
3426 p->fwatOld = fwat;
3427
3428 // enzyme activity
3429 // (activity of isoprene and monoterpene enzymes are unchanged during the dormant season)
3430 double nFolOpt(m_pf.optimum_nitrogen_content_foliage(p));
3431 double const ncFol_top = (p->mFol * p->ncFol / nFolOpt) * vt->NCFOLOPT();
3432
3433 if ( cbm::flt_greater_zero( pstatus))
3434 {
3435 for ( size_t fl = 0; fl < fl_cnt_; ++fl)
3436 {
3437 if ( cbm::flt_greater_zero( p->m_fol_fl(fl)) &&
3438 cbm::flt_greater_zero( p->sla_fl[fl]))
3439 {
3440 // nitrogen supply in dependence on specific leaf area
3447 double const ncFol_fl( ncFol_top * pow( vt->SLAMIN() / p->sla_fl[fl], 0.3));
3448
3449 // dependency of photosynthesis linearly related to nitrogen (Reynolds et al. 1992)
3450 double const fnit( cbm::bound( 0.0, (ncFol_fl - vt->NC_FOLIAGE_MIN()) / (vt->NCFOLOPT() - vt->NC_FOLIAGE_MIN()), 1.0));
3451
3452 // seasonality factor
3453 double fdorm(0.0);
3454 // - deciduous
3455 if (p->nb_ageclasses() == 1)
3456 {
3457 if ( p->dvsFlush < 1.0)
3458 {
3459 fdorm = cbm::sqr( p->dvsFlush);
3460 }
3461 else
3462 {
3463 fdorm = 1.0 - cbm::sqr( p->dvsMort);
3464 }
3465 }
3466 // - evergreen
3467 else
3468 {
3469 // - equal to the relative pool size of free available carbon reserves (fsub_vt)*/
3470 fdorm = fsub_vt[p->slot];
3471
3472 // - temperature dependent according to Maekelae et al. 2004 (S model)
3473/* if ((mc_.tFol24_fl[fl] + cbm::HR_IN_DAY / TAU * (mc_.nd_temp_fl[fl] - mc_.tFol24_fl[fl])) >= vt->PSNTFROST())
3474 {
3475// fdorm = C1 * (mc_.tFol24_fl[fl] + cbm::HR_IN_DAY / TAU * ( mc_.nd_temp_fl[fl] - mc_.tFol24_fl[fl]) - vt->PSNTFROST());
3476// fdorm = 1.0;
3477 }
3478 else
3479 {
3480 fdorm = 0.0;
3481 }
3482*/
3483 }
3484
3485 fdorm = cbm::bound( 0.0, fdorm, 1.0);
3486
3487 // activity of rubisco under standard conditions
3488 p->vcAct25_fl[fl] = vt->VCMAX25() * fnit * fdorm * fwat;
3489 // activity of maximum electron transport rate under standard conditions
3490 p->jAct25_fl[fl] = p->vcAct25_fl[fl] * vt->QJVC();
3491 // activity of dark respiration under standard conditions
3492 p->rdAct25_fl[fl] = p->vcAct25_fl[fl] * vt->QRD25();
3493 }
3494 else
3495 {
3496 p->vcAct25_fl[fl] = 0.0;
3497 p->jAct25_fl[fl] = 0.0;
3498 p->rdAct25_fl[fl] = 0.0;
3499 }
3500 }
3501 }
3502 else
3503 {
3504 for ( size_t fl = 0; fl < fl_cnt_; ++fl)
3505 {
3506 p->vcAct25_fl[fl] = 0.0;
3507 p->jAct25_fl[fl] = 0.0;
3508 p->rdAct25_fl[fl] = 0.0;
3509 }
3510 }
3511 }
3512
3513 return LDNDC_ERR_OK;
3514}
double non_stomatal_water_limitation(double const &_var, double const &_var_ref, double const &_var_scale)
Non stomatal water limitation.
Definition ld_droughtstress.cpp:136

References ldndc::non_stomatal_water_limitation(), and PSIM_PhotosynthesisRates().

Referenced by PSIM_PhotosynthesisRates().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ PSIM_PlantingEvent()

lerr_t ldndc::PhysiologyGrowthPSIM::PSIM_PlantingEvent ( )
protected
Returns
error code
528{
529 EventAttributes const * ev_plant = NULL;
530 while ( (ev_plant = this->m_PlantEvents.pop()) != NULL)
531 {
532 MoBiLE_Plant *vt = this->m_veg->get_plant( ev_plant->get( "/name", "?"));
533 if ( !vt)
534 {
535 KLOGERROR( "Handling plant event failed [species=", ev_plant->get( "/name", "?"),"]");
536 return LDNDC_ERR_RUNTIME_ERROR;
537 }
538 CBM_LogDebug( "Seed plant '",vt->name(),"'");
539
540 species_t const * sp = NULL;
541 if ( m_species)
542 {
543 sp = m_species->get_species( vt->cname());
544 }
545
546 root_system.insert( { vt->slot, RootSystemDNDC( m_state, io_kcomm) } );
547
548 char const * group = ev_plant->get( "/group", "?");
549 if ( cbm::is_equal( group, "wood"))
550 {
551 lerr_t rc_plant = m_pf.initialize_tree( vt, sp->wood(), branchfraction_opt, crownlength_opt, competition_opt);
552 if ( rc_plant)
553 {
554 KLOGERROR( "Plant initialization failed [species=", vt->name(),"]");
555 return LDNDC_ERR_FAIL;
556 }
557 }
558 else if ( cbm::is_equal( group, "grass")) // TODO could be done at "push-time"
559 {
560 lerr_t rc_plant = m_pf.initialize_grass( vt, sp->grass());
561 if ( rc_plant)
562 {
563 KLOGERROR( "Plant initialization failed [species=", vt->name(),"]");
564 return LDNDC_ERR_FAIL;
565 }
566 }
567 else if ( cbm::is_equal( group, "crop")) // TODO could be done at "push-time"
568 {
569 lerr_t rc_plant = m_pf.initialize_crop( vt, sp->crop());
570 if ( rc_plant)
571 {
572 KLOGERROR( "Plant initialization failed [species=", vt->name(),"]");
573 return LDNDC_ERR_FAIL;
574 }
575 }
576
577 // initialize local state variables after planting
578 if ( vt->dEmerg > 0)
579 {
580 if ( (int)lclock()->yearday() > vt->dEmerg)
581 {
582 days_since_emergence[vt->slot] = (int)(lclock()->yearday()) - vt->dEmerg;
583 }
584 else
585 {
586 // use 366 on purpose to ensure always: days_since_emergence > 0
587 days_since_emergence[vt->slot] = (int)(lclock()->yearday()) + (366 - vt->dEmerg);
588 }
589 }
590 else
591 {
592 days_since_emergence[vt->slot] = 0;
593 }
594
595 if ( lclock()->yearday() >= PSIM_YEAR_START)
596 {
597 phenological_year[vt->slot] = lclock()->year();
598 }
599 else
600 {
601 phenological_year[vt->slot] = lclock()->year() - 1;
602 }
603
604 foliage_age_of_start_senescence[vt->slot] = m_pf.get_foliage_age_of_senescence( vt, 0.0);
605
606 for ( size_t na = 0; na < vt->nb_ageclasses(); ++na)
607 {
608 foliage_age_na[vt->slot][na] = m_pf.get_foliage_age( PSIM_YEAR_START, lclock()->yearday(), na);
609 }
610 }
611
612 return LDNDC_ERR_OK;
613}
cbm::string_t branchfraction_opt
...
Definition psim.h:113
cbm::string_t crownlength_opt
...
Definition psim.h:119
std::map< int, RootSystemDNDC > root_system
Root system.
Definition psim.h:385
bool competition_opt
...
Definition psim.h:125

References branchfraction_opt, competition_opt, crownlength_opt, PSIM_PlantingEvent(), and root_system.

Referenced by PSIM_PlantingEvent().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ PSIM_Potentialtranspiration()

lerr_t ldndc::PhysiologyGrowthPSIM::PSIM_Potentialtranspiration ( )
protected
Returns
error code
3519{
3520 double potential_transpiration_vt(0.0);
3521 double potential_transpiration_sum (0.0);
3522
3523 for ( PlantIterator vt = this->m_veg->begin(); vt != this->m_veg->end(); ++vt)
3524 {
3525 MoBiLE_Plant *p = (*vt);
3526 if (vt->IS_WOOD())
3527 {
3528 if ( wc_.transpiration_method == substate_watercycle_t::WATERUSEEFFICIENCY)
3529 {
3530 potential_transpiration_vt += potential_wood_transpiration(
3531 sl_,
3532 mc_.nd_watervaporsaturationdeficit,
3533 ph_.carbonuptake(m_veg, fl_cnt_),
3534 p->f_area,
3535 vt->WUECMAX(),
3536 vt->WUECMIN(),
3537 sc_.h_sl,
3538 wc_.wc_sl,
3539 wc_.wc_wp_sl,
3540 wc_.wc_fc_sl);
3541 }
3542 else // transpiration_method == "treewaterdeficit", "potentialtranspiration"
3543 {
3544 potential_transpiration_vt += potential_transpiration(
3545 p->nb_foliagelayers(),
3546 vt->GSMIN(),
3547 vt->GSMAX(),
3548 p->lai_fl,
3549 mc_.vpd_fl,
3550 p->relativeconductance_fl) * cbm::HR_IN_DAY * lclock()->day_fraction();
3551 }
3552 }
3553 else
3554 {
3555 potential_transpiration_vt += potential_crop_transpiration(
3556 ac_.nd_co2_concentration,
3557 ph_.carbonuptake( m_veg, fl_cnt_),
3558 vt->WUECMAX());
3559 }
3560
3561 potential_transpiration_sum += potential_transpiration_vt;
3562 wc_.accumulated_potentialtranspiration += potential_transpiration_vt;
3563 }
3564
3565 for (PlantIterator vt = this->m_veg->begin(); vt != this->m_veg->end(); ++vt)
3566 {
3567 MoBiLE_Plant* p = (*vt);
3568 if (cbm::flt_greater_zero(potential_transpiration_sum))
3569 {
3570 p->f_ptransp = potential_transpiration_vt / potential_transpiration_sum;
3571 }
3572 else
3573 {
3574 p->f_ptransp = 0.0;
3575 }
3576 }
3577
3578 return LDNDC_ERR_OK;
3579}
double potential_transpiration(size_t, double gsmin, double gsmax, double *_lai_fl, lvector_t< double > _vpd_fl, double *_relative_conductance_fl)
Returns potential transpiration in [m] for any species type.
Definition ld_transpiration.cpp:225
double potential_wood_transpiration(soillayers::input_class_soillayers_t const &, double _vpd, double _carbon_uptake, double _f_area, double _wuecmax, double _wuecmin, lvector_t< double > _h_sl, lvector_t< double > _wc, lvector_t< double > _wc_min, lvector_t< double > _wc_max)
Returns potential transpiration in [m] for trees.
Definition ld_transpiration.cpp:144
double potential_crop_transpiration(double _co2, double _carbon_uptake, double _wuecmax)
Returns potential transpiration in [m] for crops and grass.
Definition ld_transpiration.cpp:45

References ldndc::potential_crop_transpiration(), ldndc::potential_transpiration(), ldndc::potential_wood_transpiration(), and PSIM_Potentialtranspiration().

Referenced by PSIM_Potentialtranspiration().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ PSIM_ResizeVegetationVectors()

lerr_t ldndc::PhysiologyGrowthPSIM::PSIM_ResizeVegetationVectors ( )
protected
Returns
error code
411{
412 // compare number of vegetation types
413 size_t const slot_cnt( m_veg->slot_cnt());
414 size_t const slot_cnt_old( additional_season.size());
415
416 if ( slot_cnt <= slot_cnt_old)
417 {
418 return LDNDC_ERR_OK;
419 }
420
421 matrix_2d_dbl_t::extent_type const vtsl[] =
422 { static_cast< matrix_2d_dbl_t::extent_type >( slot_cnt),
423 static_cast< matrix_2d_dbl_t::extent_type >( sl_.soil_layer_cnt())};
424
425 additional_season.resize_and_preserve( slot_cnt, false);
426 phenological_year.resize_and_preserve( slot_cnt, 0);
427 foliage_age_of_start_senescence.resize_and_preserve( slot_cnt, 0);
428 days_since_emergence.resize_and_preserve( slot_cnt, 0);
429
430 // average (effective) temperatures of all leaves of a vegetation type
431 ts_leaftemp_vt.resize_and_preserve( slot_cnt, 0.0);
432 nd_leaftemp_vt.resize_and_preserve( slot_cnt, 0.0);
433
434 uptNH4Max_vt.resize_and_preserve( slot_cnt, 0.0); // max. ammonium uptake
435 uptNO3Max_vt.resize_and_preserve( slot_cnt, 0.0); // max. nitrate uptake
436 uptDONMax_vt.resize_and_preserve( slot_cnt, 0.0); // max. dissolved organic nitrogen uptake
437 uptNWetMax_vt.resize_and_preserve( slot_cnt, 0.0); // tot. nitrogen uptake
438 uptNWet_vt.resize_and_preserve( slot_cnt, 0.0); // tot. nitrogen uptake
439 uptNTot_vt.resize_and_preserve( slot_cnt, 0.0); // tot. nitrogen uptake
440
441 rFolOld_vt.resize_and_preserve( slot_cnt, 0.0);
442 rBudOld_vt.resize_and_preserve( slot_cnt, 0.0);
443 rSapOld_vt.resize_and_preserve( slot_cnt, 0.0);
444 rFrtOld_vt.resize_and_preserve( slot_cnt, 0.0);
445 rTraOld_vt.resize_and_preserve( slot_cnt, 0.0);
446 exsuLossOld_vt.resize_and_preserve( slot_cnt, 0.0);
447
448 uptNH4_vt.resize_and_preserve( slot_cnt, 0.0);
449 uptNO3_vt.resize_and_preserve( slot_cnt, 0.0);
450 uptNH3_vt.resize_and_preserve( slot_cnt, 0.0);
451 uptDON_vt.resize_and_preserve( slot_cnt, 0.0);
452
453 uptNH4Old_vt.resize_and_preserve( slot_cnt, 0.0);
454 uptNO3Old_vt.resize_and_preserve( slot_cnt, 0.0);
455 uptNH3Old_vt.resize_and_preserve( slot_cnt, 0.0);
456 uptDONOld_vt.resize_and_preserve( slot_cnt, 0.0);
457
458 uptNOxOld_vt.resize_and_preserve( slot_cnt, 0.0);
459 uptNHyOld_vt.resize_and_preserve(slot_cnt, 0.0);
460
461 while ( slot_cnt > uptNH4Max_vtsl.size())
462 {
463 std::vector<double> help_sl( sl_.soil_layer_cnt(), 0.0);
464 uptNH4Max_vtsl.push_back( help_sl);
465 }
466 while ( slot_cnt > uptNO3Max_vtsl.size())
467 {
468 std::vector<double> help_sl( sl_.soil_layer_cnt(), 0.0);
469 uptNO3Max_vtsl.push_back( help_sl);
470 }
471 while ( slot_cnt > uptDONMax_vtsl.size())
472 {
473 std::vector<double> help_sl( sl_.soil_layer_cnt(), 0.0);
474 uptDONMax_vtsl.push_back( help_sl);
475 }
476 while ( slot_cnt > foliage_age_na.size())
477 {
478 std::vector< int > help_sl( MoBiLE_MaximumAgeClasses, 0);
479 foliage_age_na.push_back( help_sl);
480 }
481
482 carbonuptake_vt.resize_and_preserve( slot_cnt, 0.0);
483 //xylem_resistance_smoothed_vt.resize_and_preserve(slot_cnt, 0.0);
484 xylem_resistance_smoothed_old_vt.resize_and_preserve(slot_cnt, 0.0);
485 psidecline_cum_vt.resize_and_preserve(slot_cnt, 0.0);
486 psidecline_daycum_vt.resize_and_preserve(slot_cnt, 0.0);
487 rehydrationindex_cum_vt.resize_and_preserve(slot_cnt, 0.0);
488
489 //do not initialize to zero!
490 mSapOpt_vt.resize_and_preserve( slot_cnt, 0.0);
491 mSapOld_vt.resize_and_preserve( slot_cnt, 0.0);
492 mCorOld_vt.resize_and_preserve( slot_cnt, 0.0);
493 qsaparea_vt.resize_and_preserve(slot_cnt, 0.0);
494 fsub_vt.resize_and_preserve(slot_cnt, 0.0);
495
496 mBudLoss_vt.resize_and_preserve( slot_cnt, 0.0); // dry matter transfered from buds to foliage
497 mSapLoss_vt.resize_and_preserve( slot_cnt, 0.0); // dry matter transfered from sapwood to corewood
498 ncFolOpt.resize_and_preserve( slot_cnt, 0.0); // optimum nitrogen concentration of the whole foliage of one species (gN gDW-1)
499 ncBudOpt.resize_and_preserve( slot_cnt, 0.0); // optimum nitrogen concentration of the whole structural storage of one species (gN gDW-1)
500 nDem_vt.resize_and_preserve( slot_cnt, 0.0); // species specific nitrogen demand (kgN)
501 nFol_vt.resize_and_preserve( slot_cnt, 0.0); // last days foliage nitrogen content (kg)
502 nFrt_vt.resize_and_preserve( slot_cnt, 0.0); // last days fine root nitrogen content (kg)
503 nSap_vt.resize_and_preserve( slot_cnt, 0.0); // last days sapwood nitrogen content (kg)
504 nCor_vt.resize_and_preserve( slot_cnt, 0.0); // last days corwood nitrogen content (kg)
505 nBud_vt.resize_and_preserve( slot_cnt, 0.0); // last days bud nitrogen content (kg)
506
507 n_bud_to_fol_vt.resize_and_preserve( vtsl, 0.0);
508 n_sap_to_cor_vt.resize_and_preserve( vtsl, 0.0);
509 n_bud_to_cor_vt.resize_and_preserve( vtsl, 0.0);
510 n_fol_to_cor_vt.resize_and_preserve( vtsl, 0.0);
511 n_frt_to_cor_vt.resize_and_preserve( vtsl, 0.0);
512 n_sap_to_litter_vt.resize_and_preserve( vtsl, 0.0);
513 n_sap_to_redistribute_vt.resize_and_preserve( vtsl, 0.0);
514 n_bud_to_redistribute_vt.resize_and_preserve( vtsl, 0.0);
515 n_fol_to_redistribute_vt.resize_and_preserve( vtsl, 0.0);
516 n_frt_to_redistribute_vt.resize_and_preserve( vtsl, 0.0);
517 n_sap_gain_vt.resize_and_preserve( vtsl, 0.0);
518 n_bud_gain_vt.resize_and_preserve( vtsl, 0.0);
519 n_fol_gain_vt.resize_and_preserve( vtsl, 0.0);
520 n_frt_gain_vt.resize_and_preserve( vtsl, 0.0);
521
522 return LDNDC_ERR_OK;
523}

References PSIM_ResizeVegetationVectors().

Referenced by PSIM_ResizeVegetationVectors().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ PSIM_StepInit()

lerr_t ldndc::PhysiologyGrowthPSIM::PSIM_StepInit ( )
protected
Returns
error code
618{
619 for ( size_t sl = 0; sl < sl_.soil_layer_cnt(); ++sl)
620 {
621 nh4_sl[sl] = sc_.nh4_sl[sl];
622 no3_sl[sl] = sc_.no3_sl[sl] + sc_.an_no3_sl[sl];
623 don_sl[sl] = sc_.don_sl[sl];
624 }
625
626 fl_cnt_ = m_veg->canopy_layers_used();
627
628 if ( subdaily_timemode())
629 {
630 temp_sl.reference( mc_.temp_sl);
631 ts_temp_fl.reference( mc_.temp_fl);
632
633 no_concentration_fl.reference( ac_.ts_no_concentration_fl);
634 no2_concentration_fl.reference( ac_.ts_no2_concentration_fl);
635 nh3_concentration_fl.reference( ac_.ts_nh3_concentration_fl);
636 nhy_uptake_fl.reference( ph_.ts_nhy_uptake_fl);
637 nox_uptake_fl.reference( ph_.ts_nox_uptake_fl);
638
639 for ( PlantIterator vt = this->m_veg->begin(); vt != this->m_veg->end(); ++vt)
640 {
641 MoBiLE_Plant *p = *vt;
642 carbonuptake_vt[p->slot] = 0.0;
643 for ( size_t fl = 0; fl < p->nb_foliagelayers(); ++fl)
644 {
645 carbonuptake_vt[p->slot] += p->carbonuptake_fl[fl];
646 }
647 }
648
649 // grazing event by external module
650 if ( lclock()->subday() == 1)
651 {
652 m_eventgraze.reset_daily_food_consumption();
653 }
654 }
655 else
656 {
657 temp_sl.reference( mc_.nd_temp_sl);
658 ts_temp_fl.reference( mc_.nd_temp_fl);
659
660 no_concentration_fl.reference( ac_.nd_no_concentration_fl);
661 no2_concentration_fl.reference( ac_.nd_no2_concentration_fl);
662 nh3_concentration_fl.reference( ac_.nd_nh3_concentration_fl);
663 nhy_uptake_fl.reference( ph_.nd_nhy_uptake_fl);
664 nox_uptake_fl.reference( ph_.nd_nox_uptake_fl);
665
666 for ( PlantIterator vt = this->m_veg->begin(); vt != this->m_veg->end(); ++vt)
667 {
668 MoBiLE_Plant *p = *vt;
669 carbonuptake_vt[p->slot] = 0.0;
670 for ( size_t fl = 0; fl < p->nb_foliagelayers(); ++fl)
671 {
672 carbonuptake_vt[p->slot] += p->d_carbonuptake_fl[fl];
673 }
674 }
675
676 m_eventgraze.reset_daily_food_consumption();
677 }
678
679 for ( PlantIterator vt = this->m_veg->begin(); vt != this->m_veg->end(); ++vt)
680 {
681 MoBiLE_Plant *p = *vt;
682
683 PSIM_Reset( p);
684
685 // leaf temperature
686 ts_leaftemp_vt[p->slot] = m_pf.leaf_temperature_( ts_temp_fl, p);
687 nd_leaftemp_vt[p->slot] = m_pf.leaf_temperature_( mc_.nd_temp_fl, p);
688 }
689
690 // nitrous oxygen concentration in the air
691 for ( size_t fl = 0; fl < fl_cnt_; ++fl)
692 {
693 cNOx_fl[fl] = no_concentration_fl[fl] + no2_concentration_fl[fl];
694 }
695
696 return LDNDC_ERR_OK;
697}

References PSIM_StepInit().

Referenced by PSIM_StepInit().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ C1

const double ldndc::PhysiologyGrowthPSIM::C1 = 0.0367
static

second parameter for temperature influence on vcmax activity

◆ CCOMNOX

const double ldndc::PhysiologyGrowthPSIM::CCOMNOX = 1.0
static

compensation NOx concentration without gas exchange [ppb]

◆ CSATNH3

const double ldndc::PhysiologyGrowthPSIM::CSATNH3 = 50.0
static

saturation NH3 concentration [ppb]

◆ CSATNOX

const double ldndc::PhysiologyGrowthPSIM::CSATNOX = 5.0
static

saturation NOx concentration [ppb]

◆ EPOTNOX

const double ldndc::PhysiologyGrowthPSIM::EPOTNOX = 1.0
static

potential specific emission rate of NOx [ppb]

◆ FMIN

const double ldndc::PhysiologyGrowthPSIM::FMIN = 0.05
static

average concentration of minerals others than nitrogen [kg/kgDW]

◆ FRFRT

const double ldndc::PhysiologyGrowthPSIM::FRFRT = 0.5
static

fraction of nitrate that is reduced in the roots

◆ IMAX_W

const int unsigned ldndc::PhysiologyGrowthPSIM::IMAX_W = 24
static

number of iteration steps within a day

◆ KMMM

const double ldndc::PhysiologyGrowthPSIM::KMMM = 0.0
static

Michaelis Menten constant

◆ PAMM

const double ldndc::PhysiologyGrowthPSIM::PAMM = 0.17
static

carbon costs for ammonia uptake

◆ PGDD

const double ldndc::PhysiologyGrowthPSIM::PGDD = 0.0075
static

parameter for GDD relation to temperature related site conditions

◆ PMIN

const double ldndc::PhysiologyGrowthPSIM::PMIN = 0.06
static

carbon costs for minerals

◆ PNIT

const double ldndc::PhysiologyGrowthPSIM::PNIT = 0.34
static

carbon costs for nitrate uptake

◆ PPHLOE

const double ldndc::PhysiologyGrowthPSIM::PPHLOE = 0.06
static

carbon costs for carbon transport from the leafs

◆ PREDFRT

const double ldndc::PhysiologyGrowthPSIM::PREDFRT = 1.72
static

carbon costs for nitrate reduction in the roots

◆ PREDSAP

const double ldndc::PhysiologyGrowthPSIM::PREDSAP = 0.855
static

carbon costs for nitrate reduction in the shoot

◆ PTW

const double ldndc::PhysiologyGrowthPSIM::PTW = 0.29
static

weighting factor for maximum temperature

◆ root_system

std::map< int, RootSystemDNDC > ldndc::PhysiologyGrowthPSIM::root_system
private

Root system.

  • rooting depth
  • root distribution

Referenced by PSIM_PlantingEvent().

◆ TAU

const double ldndc::PhysiologyGrowthPSIM::TAU = 330.0
static

first parameter for temperature influence on vcmax activity

◆ TGLIM

const double ldndc::PhysiologyGrowthPSIM::TGLIM = 6.0
static

soil temperature below which no fine root growth occurs (oC)

◆ TRMAX

const double ldndc::PhysiologyGrowthPSIM::TRMAX = 45.0
static

maximum temperature for maintanence respiration

◆ TRMIN

const double ldndc::PhysiologyGrowthPSIM::TRMIN = -7.0
static

minimum temperature for maintanence respiration

◆ TROPT

const double ldndc::PhysiologyGrowthPSIM::TROPT = 20.0
static

temperature for optimum maintanence respiration

◆ UPOTNH3

const double ldndc::PhysiologyGrowthPSIM::UPOTNH3 = 10000.0
static

potential specific uptake rate of NH3 (ppb)