void tick (const double dt, const double rain, const Geometry& geo, const SoilWater& soil_water, Treelog& msg) { // Ice content. std::map<const Horizon*, double> ice; for (std::size_t c = 0; c < geo.cell_size (); c++) ice[horizon_[c]] += soil_water.X_ice (c) * geo.cell_volume (c); for (std::map<const Horizon*, double>::const_iterator i = ice.begin (); i != ice.end (); i++) { const Horizon *const hor = (*i).first; const double total_ice = (*i).second; const double total_volume = volume[hor]; const double Ice = total_ice / total_volume; hor->hydraulic->tick (dt, rain, Ice, msg); } }
double Movement1D::surface_snow_T (const Soil& soil, const SoilWater& soil_water, const SoilHeat& soil_heat, const double T_snow, const double K_snow, const double dZs) const { // Information about soil. const double K_soil = soil.heat_conductivity (0, soil_water.Theta (0), soil_water.X_ice (0)) * 1e-7 * 100.0 / 3600.0; // [erg/cm/h/dg C] -> [W/m/dg C] const double Z = -geo->cell_z (0) / 100.0; // [cm] -> [m] const double T_soil = soil_heat.T (0); // [dg C] daisy_assert (T_soil > -100.0); daisy_assert (T_soil < 50.0); const double T = (K_soil / Z * T_soil + K_snow / dZs * T_snow) / (K_soil / Z + K_snow / dZs); daisy_assert (T > -100.0); daisy_assert (T < 50.0); return T; }