double HydratingHeMoMaterial :: giveCharacteristicValue(MatResponseMode rmode, GaussPoint *gp, TimeStep *tStep) { double answer = 0; if ( ( rmode >= Capacity_ww ) && ( rmode <= Capacity_wh ) ) { // standard HeMoTK values answer = HeMoTKMaterial :: giveCharacteristicValue(rmode, gp, tStep); if ( castAt && ( tStep->giveTargetTime() < castAt ) ) { answer *= PRECAST_CAPACITY_COEFF; // ~Zero capacity before cast } } else if ( ( rmode >= IntSource_ww ) && ( rmode <= IntSource_wh ) ) { // Internal source values if ( !hydrationLHS ) { answer = 0; } else if ( hydrationModel ) { //!!! better via HydrationModelInterface FloatArray vec = static_cast< TransportMaterialStatus * >( giveStatus(gp) )->giveTempField(); if ( vec.giveSize() < 2 ) { vec.resize(2); vec.at(2) = 1.0; // saturated if undefined } else { vec.at(2) = inverse_sorption_isotherm( vec.at(2) ); // compute relative humidity } answer = hydrationModel->giveCharacteristicValue(vec, rmode, gp, tStep) / tStep->giveTimeIncrement(); if ( ( rmode == IntSource_ww ) || ( rmode == IntSource_hw ) ) { answer *= give_dphi_dw( vec.at(2) ); } } } else { OOFEM_ERROR("unknown MatResponseMode (%s)", __MatResponseModeToString(rmode) ); } return answer; }
double HeMoTKMaterial :: get_b(double w, double t) { // Function calculates coefficient b // sat ... degree of saturation double b, sat, phi, dphi_dw; phi = inverse_sorption_isotherm(w); dphi_dw = give_dphi_dw(w); sat = get_sat(w, t); b = por * rho_gws * ( phi + ( 1 - sat ) * dphi_dw ); return ( b ); }
double HeMoTKMaterial :: perm_ww(double w, double t) { // Function calculates permability water content-water content (k_ww) // phi ... relative humidity // delta_gw ... water vapor permeability // dphi_dw ... differentiation of relative with respect to water content // p_gws ... saturation water vapor pressure double k_ww, phi, delta_gw, dphi_dw, p_gws; phi = inverse_sorption_isotherm(w); delta_gw = give_delta_gw(phi); dphi_dw = give_dphi_dw(w); p_gws = give_p_gws(t); k_ww = delta_gw * p_gws * dphi_dw; return ( k_ww ); }