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 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)
1490{
1491 m_eventgraze.update_available_freshfood_c( m_veg, species_groups_select_t< species::grass >());
1492
1493 for ( PlantIterator vt = m_veg->begin(); vt != m_veg->end(); ++vt)
1494 {
1495 MoBiLE_Plant *p = (*vt);
1496 if ( p->group() == "grass")
1497 {
1498 lerr_t rc_graze = m_eventgraze.event_graze_physiology( *vt);
1499 if ( (rc_graze != LDNDC_ERR_EVENT_MATCH) &&
1500 (rc_graze != LDNDC_ERR_EVENT_EMPTY_QUEUE))
1501 {
1502 LOGERROR("Grazing not successful");
1503 return rc_graze;
1504 }
1505 }
1506 }
1507
1508 // cutting event by external module
1509 lerr_t rc_cut = m_eventcut.event_cut_physiology( m_veg, species_groups_select_t< species::grass >());
1510 if ( (rc_cut != LDNDC_ERR_EVENT_MATCH) &&
1511 (rc_cut != LDNDC_ERR_EVENT_EMPTY_QUEUE))
1512 {
1513 LOGERROR("Cutting not successful");
1514 return rc_cut;
1515 }
1516 else if (rc_cut == LDNDC_ERR_EVENT_MATCH)
1517 {
1518 for (PlantIterator vt = m_veg->begin(); vt != m_veg->end(); ++vt)
1519 {
1520 MoBiLE_Plant* p = (*vt);
1521 m_treedyn.OnStructureChange(p);
1522 }
1523 }
1524
1525 return LDNDC_ERR_OK;
1526}

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 in different plant compartments.

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

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

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
865{
866 for ( PlantIterator vt = this->m_veg->begin(); vt != this->m_veg->end(); ++vt)
867 {
868 MoBiLE_Plant *p = *vt;
869
870 for (size_t fl = 0; fl < p->nb_foliagelayers(); ++fl)
871 {
872 m_photo.vpd_fl[fl] = mc_.vpd_fl[fl];
873 m_photo.rh_fl[fl] = cl_.rel_humidity_subday( lclock_ref());
874 m_photo.temp_fl[fl] = mc_.temp_fl[fl];
875 m_photo.parsun_fl[fl] = mc_.parsun_fl[fl];
876 m_photo.parshd_fl[fl] = mc_.parshd_fl[fl];
877 m_photo.tFol_fl[fl] = mc_.tFol_fl[fl];
878 m_photo.co2_concentration_fl[fl] = ac_.ts_co2_concentration_fl[fl];
879 m_photo.sunlitfoliagefraction_fl[fl] = mc_.ts_sunlitfoliagefraction_fl[fl];
880 }
881 m_photo.nd_airpressure = mc_.nd_airpressure;
882
883 m_photo.set_vegetation_base_state( p);
884
885 m_photo.set_vegetation_non_stomatal_water_limitation_state( p->xylem_resistance, p->psi_mean, p->psi_sr, p->psi_pd);
886
887 m_photo.solve();
888
889 m_photo.get_vegetation_state( p);
890 }
891
892 return LDNDC_ERR_OK;
893}

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())

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

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
523{
524 std::vector< std::pair< MoBiLE_Plant *, species::wood_properties_t const * > > trees_planted;
525
526 EventAttributes const * ev_plant = NULL;
527 while ( (ev_plant = m_PlantEvents.pop()) != NULL)
528 {
529 MoBiLE_Plant *vt = m_veg->get_plant( ev_plant->get( "/name", "?"));
530 if ( !vt)
531 {
532 KLOGERROR( "Handling plant event failed [species=", ev_plant->get( "/name", "?"),"]");
533 return LDNDC_ERR_RUNTIME_ERROR;
534 }
535
536 species_t const * sp = NULL;
537 if ( m_species)
538 {
539 sp = m_species->get_species( vt->cname());
540 }
541
542 root_system.insert( { vt->slot, RootSystemDNDC( m_state, io_kcomm) } );
543
544 lerr_t rc_plant = LDNDC_ERR_OK;
545 char const * group = ev_plant->get( "/group", "?");
546 if ( cbm::is_equal( group, "wood"))
547 {
548 rc_plant = m_pf.initialize_tree( vt, sp->wood(), /*branchfraction_opt,*/ crownlength_opt, competition_opt);
549 if ( rc_plant)
550 {
551 KLOGERROR( "Plant initialization failed [species=", vt->name(),"]");
552 return LDNDC_ERR_FAIL;
553 }
554
555 //trees_planted.push_back( std::make_pair( vt, sp->wood()));
556 }
557 else if ( cbm::is_equal( group, "grass"))
558 {
559 rc_plant = m_pf.initialize_grass( vt, sp->grass());
560 }
561 else if ( cbm::is_equal( group, "crop"))
562 {
563 rc_plant = m_pf.initialize_crop( vt, sp->crop());
564 }
565 if ( rc_plant)
566 {
567 KLOGERROR( "Plant initialization failed [species=", vt->name(),"]");
568 return LDNDC_ERR_FAIL;
569 }
570
571 // initialize local state variables after planting
572 if ( vt->dEmerg > 0)
573 {
574 if ( (int)lclock()->yearday() > vt->dEmerg)
575 {
576 days_since_emergence[vt->slot] = (int)(lclock()->yearday()) - vt->dEmerg;
577 }
578 else
579 {
580 // use 366 on purpose to ensure always: days_since_emergence > 0
581 days_since_emergence[vt->slot] = (int)(lclock()->yearday()) + (366 - vt->dEmerg);
582 }
583 }
584 else
585 {
586 days_since_emergence[vt->slot] = 0;
587 }
588
589 if ( lclock()->yearday() >= PSIM_YEAR_START)
590 {
591 phenological_year[vt->slot] = lclock()->year();
592 }
593 else
594 {
595 phenological_year[vt->slot] = lclock()->year() - 1;
596 }
597
598 foliage_age_of_start_senescence[vt->slot] = m_pf.get_foliage_age_of_senescence( vt, 0.0);
599
600 for ( size_t na = 0; na < vt->nb_ageclasses(); ++na)
601 {
602 foliage_age_na[vt->slot][na] = m_pf.get_foliage_age( PSIM_YEAR_START, lclock()->yearday(), na);
603 }
604 }
605
606
607 /* each tree was initialized without knowing the trees planted after it:
608 * repeat so that all see each other (shared crown cover, competition) */
609 if ( trees_planted.size() > 1)
610 {
611 for (size_t t = 0; t < trees_planted.size(); ++t)
612 {
613 lerr_t rc_plant = m_pf.initialize_tree(trees_planted[t].first, trees_planted[t].second,
614 /*branchfraction_opt,*/ crownlength_opt, competition_opt);
615 if (rc_plant)
616 {
617 KLOGERROR("Plant initialization failed [species=", trees_planted[t].first->name(), "]");
618 return LDNDC_ERR_FAIL;
619 }
620 }
621 }
622
623 return LDNDC_ERR_OK;
624}
cbm::string_t crownlength_opt
...
Definition psim.h:119
std::map< int, RootSystemDNDC > root_system
Root system.
Definition psim.h:384
bool competition_opt
...
Definition psim.h:125

References 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
3528{
3529 double potential_transpiration_sum( 0.0);
3530
3531 for ( PlantIterator vt = m_veg->begin(); vt != m_veg->end(); ++vt)
3532 {
3533 MoBiLE_Plant *p( *vt);
3534
3535 double potential_transpiration_vt( 0.0);
3536 if (vt->IS_WOOD())
3537 {
3538 if ( wc_.transpiration_method == substate_watercycle_t::WATERUSEEFFICIENCY)
3539 {
3540 potential_transpiration_vt += potential_transpiration_soil_atmosphere_limited(
3541 sl_,
3542 mc_.nd_watervaporsaturationdeficit,
3543 ph_.carbonuptake(m_veg, fl_cnt_),
3544 p->f_area,
3545 vt->WUECMAX(),
3546 vt->WUECMIN(),
3547 sc_.h_sl,
3548 wc_.wc_sl,
3549 wc_.wc_wp_sl,
3550 wc_.wc_fc_sl);
3551 }
3552 else // transpiration_method == "treewaterdeficit", "potentialtranspiration"
3553 {
3554 potential_transpiration_vt += potential_transpiration_stomatal_conductance_limited(
3555 p->nb_foliagelayers(),
3556 vt->GSMIN(),
3557 vt->GSMAX(),
3558 p->lai_fl,
3559 mc_.vpd_fl,
3560 p->relativeconductance_fl) * cbm::HR_IN_DAY * lclock()->day_fraction();
3561 }
3562 }
3563 else
3564 {
3565 potential_transpiration_vt += potential_transpiration_unlimited(
3566 ac_.nd_co2_concentration,
3567 ph_.carbonuptake( m_veg, fl_cnt_),
3568 vt->WUECMAX());
3569 }
3570
3571 p->f_ptransp = potential_transpiration_vt;
3572 potential_transpiration_sum += potential_transpiration_vt;
3573 wc_.accumulated_potentialtranspiration += potential_transpiration_vt;
3574 }
3575
3576 for ( PlantIterator vt = m_veg->begin(); vt != m_veg->end(); ++vt)
3577 {
3578 MoBiLE_Plant* p( *vt);
3579 if (cbm::flt_greater_zero( potential_transpiration_sum))
3580 {
3581 p->f_ptransp /= potential_transpiration_sum;
3582 }
3583 else
3584 {
3585 p->f_ptransp = 0.0;
3586 }
3587 }
3588
3589 return LDNDC_ERR_OK;
3590}
double potential_transpiration_soil_atmosphere_limited(soillayers::input_class_soillayers_t const &, double _vpd, double _carbon_uptake, double _f_area, double _wuecmax, double _wuecmin, lvector_t< double > const &_h_sl, lvector_t< double > const &_wc, lvector_t< double > const &_wc_min, lvector_t< double > const &_wc_max)
Returns potential transpiration in [m].
Definition ld_transpiration.cpp:105
double potential_transpiration_stomatal_conductance_limited(size_t, double gsmin, double gsmax, double *_lai_fl, lvector_t< double > _vpd_fl, double *_relative_conductance_fl)
Returns potential transpiration in [m].
Definition ld_transpiration.cpp:297
double potential_transpiration_unlimited(double _co2, double _carbon_uptake, double _wuecmax)
Returns potential transpiration in [m].
Definition ld_transpiration.cpp:50

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

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

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)