1143 double mSum(0.0),maintResp(0.0),fResp(0.0);
1144 double dcTot(0.0),dcSapC(0.0),dcBudC(0.0),dcFrtC(0.0),dBudY(0.0),dSapY(0.0);
1145 double fm_vt(0.0),fwood(0.0);
1150 dcTot = (CanopyGrossPsnMo
1151 - (CanopyGrossPsnMo - NetPsnMo) - WoodMRespMo - RootMRespMo
1152 - FolGRespMo - WoodGRespMo - RootGRespMo);
1160 maintResp = WoodMRespMo + RootMRespMo + (CanopyGrossPsnMo - NetPsnMo);
1161 if (maintResp > 0.0)
1163 fResp = (maintResp + dcTot) / maintResp;
1172 WoodMRespMo *= fResp;
1173 RootMRespMo *= fResp;
1175 NetPsnMo = CanopyGrossPsnMo - fResp * (CanopyGrossPsnMo - NetPsnMo);
1176 dcTot = (CanopyGrossPsnMo
1177 - (CanopyGrossPsnMo - NetPsnMo) - WoodMRespMo - RootMRespMo
1178 - FolGRespMo - WoodGRespMo - RootGRespMo);
1182 if (dcTot < 0.0 && std::abs(dcTot) > p->mSap)
1190 dcTot = (CanopyGrossPsnMo
1191 - (CanopyGrossPsnMo - NetPsnMo) - WoodMRespMo - RootMRespMo
1192 - FolGRespMo - WoodGRespMo - RootGRespMo);
1199 if (dcTot > 0.0 && p->dvsFlushOld >= 1.0)
1201 fwood = (*p)->QWODFOLMIN() / (1.0 + (*p)->QWODFOLMIN());
1203 else if (BudC + WoodC * 0.2 > 0.0 && p->dvsFlushOld >= 1.0)
1205 fwood = WoodC * 0.2 / (BudC + WoodC * 0.2);
1212 dcFrtC = std::max(0.0, std::min(dcTot, RootCAddMo));
1213 dcSapC = (dcTot-dcFrtC) * fwood;
1214 dcBudC = (dcTot-dcFrtC) * (1.0 - fwood);
1219 mSum += (p->mFol + p->mFrt + p->mSap + p->mBud);
1229 fm_vt = ((p->mFol + p->mFrt + p->mSap + p->mBud) / mSum);
1236 fm_vt *= cbm::KG_IN_G;
1244 p->d_dcFol = FolProdCMo * fm_vt;
1245 mBudLoss_vt[p->slot] = p->d_dcFol / cbm::CCDM;
1246 p->d_dcFrt = dcFrtC * fm_vt;
1247 p->d_dcSap = dcSapC * fm_vt;
1248 p->d_dcBud = dcBudC * fm_vt;
1251 double const sap_wood_frac(
sap_wood_fraction( p->lai_pot, p->qsfa, p->height_at_canopy_start,
1252 p->height_max, p->rooting_depth));
1253 double const dc_sum( std::max( 0.0, p->d_dcFol)
1254 + std::max( 0.0, p->d_dcFrt)
1255 + std::max( 0.0, p->d_dcSap)
1256 + std::max( 0.0, p->d_dcBud));
1257 double const dc_below( std::max( 0.0, p->d_dcFrt) + std::max( 0.0, p->d_dcSap * sap_wood_frac));
1259 p->d_rFol = (CanopyGrossPsnMo - NetPsnMo) * fm_vt;
1260 p->d_rFrt = RootMRespMo * fm_vt;
1261 p->d_rSap = WoodMRespMo * fm_vt;
1262 p->d_rSapBelow = (p->d_rSap * sap_wood_frac);
1264 p->d_rRes = p->d_rFol + p->d_rFrt + p->d_rSap + p->d_rBud;
1266 p->d_rGro = (WoodGRespMo + RootGRespMo + FolGRespMo) * fm_vt;
1267 p->d_rGroBelow = ((dc_sum > 0.0) ? p->d_rGro * dc_below / dc_sum : 0.0);
1270 p->d_sFol = FolLitSum * fm_vt;
1271 for (
size_t sl = 0; sl < sl_.soil_layer_cnt(); ++sl)
1273 p->d_sFrt_sl[sl] += RootProdCMo / cbm::CCDM * fm_vt * p->fFrt_sl[sl];
1276 mSapLoss_vt[p->slot] = 0.0;
1277 if ((( p->mSap * 0.99999)) > ((p->mFol + p->mBud) * (*p)->QWODFOLMIN()))
1279 mSapLoss_vt[p->slot] = std::min(
SRATEMAX * p->mSap, p->mSap - (p->mFol + p->mBud) * (*p)->QWODFOLMIN());
1280 if (mSapLoss_vt[p->slot] < 0.0)
1282 mSapLoss_vt[p->slot] = 0.0;
1285 p->d_sWoodAbove = mSapLoss_vt[p->slot] * p->f_branch;
1288 dBudY = transfDWsb * fm_vt;
1289 dSapY = transfDWbs * fm_vt;
1294 dBudY = std::max(-1 * (p->mCor + mSapLoss_vt[p->slot] * (1.0-p->f_branch)), transfDWsb * fm_vt);
1298 dSapY = std::max(-1 * (p->mSap + (p->d_dcSap / cbm::CCDM - mSapLoss_vt[p->slot])), transfDWbs * fm_vt);
1302 p->mFol = FolMass * fm_vt;
1303 p->mFrt += ((p->d_dcFrt / cbm::CCDM - cbm::sum( p->d_sFrt_sl, sl_.soil_layer_cnt())));
1304 p->mSap += ((p->d_dcSap / cbm::CCDM - mSapLoss_vt[p->slot]) - dBudY);
1305 p->mBud += ((p->d_dcBud / cbm::CCDM - mBudLoss_vt[p->slot]) + dBudY - dSapY);
1306 p->mCor += (mSapLoss_vt[p->slot] * (1.0-p->f_branch) + dSapY);
1309 p->mFol_na[0] += p->d_dcFol;
1315 if ( p->mFol_na[na] < 0.0)
1317 p->mFol_na[na] = 0.0;
1323 p->mBudStart = p->mBud;
1324 p->mFolMax += (FolMassMax * fm_vt);
1325 p->mFolMin += (FolMassMin * fm_vt);
1330 if (( p->mFrt > 1e-7) || (-1 * p->mFrt > 1e-7))
1332 KLOGWARN(
" mFrt-C-leak in PNET [day=",lclock_ref().now().to_string(),
",mFrt=",p->mFrt,
"]");
1339 if (p->mSap > 1e-7 || -1 * p->mSap > 1e-7)
1341 KLOGWARN(
" mSap-C-leak in PNET [day=",lclock_ref().now().to_string(),
",mSap=",p->mSap,
"]");
1348 if (p->mBud > 1e-7 || -1 * p->mBud > 1e-7)
1350 KLOGWARN(
" mBud-C-leak in PNET [day=",lclock_ref().now().to_string(),
",mBud=",p->mBud,
"]");
1355 if (( p->growing_degree_days >= (*p)->GDDFOLSTART()) && ( p->dEmerg == 0))
1357 p->dEmerg = lclock_ref().yearday();
1362 && ( p->f_area > 0.0)
1363 && (lclock_ref().yearday() > (
unsigned int)((*p)->SENESCSTART()+year_start_-1)
1364 || lclock_ref().yearday() < year_start_)
1365 && lclock_ref().yearday() != lclock_ref().days_in_year())
1368 p->dvsMort = 1.0 - (FolMass / p->f_area - FolMassMin) / ( std::max(FolMass / p->f_area, FolMassMax) - FolMassMin);
1376 if (p->dvsMort < 0.0)
1380 else if (p->dvsMort > 1.0)
1385 size_t fl_cnt( p->nb_foliagelayers());
1386 m_pf.update_foliage_layer_biomass_and_lai( p, fl_cnt, 0.001);
1389 for (
size_t fl = 0; fl < fl_cnt; ++fl)
1391 p->d_carbonuptake_fl[fl] = LayerGrossPsn[fl] * cbm::KG_IN_G;
static const double SRATEMAX
Definition: pnet.h:51
double LDNDC_API sap_wood_fraction(double _lai_max, double _qsfa, double _height_min, double _height_max, double _depth)
sap_wood_fraction The calculation of the fraction of sapwood in coarse roots is based on the idealize...
Definition: ld_sapwoodfraction.cpp:15
size_t get_na_max_pnet()
Definition: pnet.cpp:466