/trunk/SIFEL/METR/SRC/consol_awf1c.cpp |
---|
1,9 → 1,8 |
/* |
File: consol_awf1c.cpp |
Author: Tomas Krejci, 12/09/2008, revised 23/08/2012 |
Purpose: material model for saturated-nonsaturated one-phase flow in deforming medium |
sources: Lewis and Schrefler's book pp. 86-89, initial material parameters are set for benchmark on page n. 168; |
Author: Tomas Krejci, 12/09/2008, revised 23/08/2012, and revised 13/11/2023 |
Purpose: material model for saturated-nonsaturated one-phase flow (water) in deforming medium plus vapour diffusion |
sources: Lewis and Schrefler's book |
unknowns: TRFEL: number of unknowns=1, pw = liqud water pressure; MEFEL: according to problem_type |
*/ |
23,27 → 22,27 |
con_awf1matc::con_awf1matc() |
{ |
compress = 0; //compressible grains: 0=no; 1=yes |
// |
alpha = 1.0;//Biot's constant [-] alpha = 1 - kt/ks |
// |
rhos = 2000.0;//solid grain density [kg/m^3] |
rhos0 = 2000.0;//initial solid grain density [kg/m^3] |
// |
ks = 2.167e6;//bulk modulus of solid phase (grains) [Pa] |
// |
kw = 2.0e9;//bulk modulus of water [Pa] |
// |
phi0 = 0.297;//initial porosity [-] |
// |
kintr = 4.5e-13;//intrinsic permeability [m^2] |
rhow0 = 1000.0;//reference water density [kg/m^3] |
// |
rhow = 1000.0;//water density [kg/m^3] |
// |
muw0 = 1.0e-3;//water viscosity [Pa.s] |
// |
///////////////////////////////////////////////////////// |
t0 = 293.15; //reference temperature |
mefel_units = 1.0;//basic units for pressures = Pa (Pascals) |
//STATE VARIABLES |
mw = 18.01528; //molar mass of water kg.mol-1 |
gasr = 8314.41; //universal gas constant J.mol-1.K-1 |
// PHYSICAL PROPERTIES OF WATER VAPOUR |
c8 = -5.8002206e+03; |
c9 = 1.3914993; |
c10 =-4.8640239e-02; |
c11 = 4.1764768e-05; |
c12 = -1.4452093e-08; |
c13 = 6.5459673; |
} |
con_awf1matc::~con_awf1matc() |
55,41 → 54,94 |
@param in - input file |
12/9/2008, TKr |
13/11/2023, TKr |
*/ |
void con_awf1matc::read(XFILE *in) |
{ |
{ |
xfscanf (in,"%k%m","waterflowmechtype",&waterflowmechtype_kwdset, &model_type); //water flow model type |
xfscanf (in,"%lf %lf %lf %lf %d %d", &alpha, &phi0, &rhos0, &t0, &sr_type, &xi_type); |
xfscanf (in,"%k%m","waterflowmechtype",&waterflowmechtype_kwdset, &model_type); |
switch (model_type){ |
case lewis_and_schrefler_coup:{//Lewis and Schrefler's model |
xfscanf (in,"%lf %lf %lf %lf %lf %lf %lf %lf", &alpha, &ks, &phi0, &kw, &rhow, &muw0, &kintr, &rhos); |
case lewis_and_schrefler_coup: |
case lewis_and_schrefler_mefel_coup: {//Lewis and Schrefler's model |
//retention curve type: |
switch (sr_type){ |
case baroghel_sr:{//Baroghle-Bouny approach |
baroghel_ret.read(in); |
break; |
} |
case bazant_sr:{//Bazant approach |
break; |
} |
case lewis_and_schrefler_sr:{//Lewis and Schrefler's book |
lewis_ret.read(in); |
break; |
} |
case gardner_exponential_sr:{//dependent on saturation degree: |
gardner_ret.read(in); |
break; |
} |
case potts_log_linear_sr:{//exponential |
potts_ret.read(in); |
break; |
} |
case van_genuchten_sr:{//partially saturated medium =Van Genuchten model |
van_genuchten_ret.read(in); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium =Van Genuchten model |
//van_genuchten_ret.read2(in); |
break; |
} |
case mefel_sr:{//from MEFEL |
break; |
} |
case table_sr:{//from table |
//reading of retention curve: |
data.read (in); |
break; |
} |
case masin_sr:{//extended formulation from Brooks and Correy according to Masin |
masin_ret.read(in); |
break; |
} |
case febex_granit_sr:{//FEBEX granit |
febex_granit_ret.read(in); |
break; |
} |
default:{ |
print_err ("unknown model type is required", __FILE__, __LINE__, __func__); |
abort(); |
} |
} |
switch (xi_type){ |
case biot_xi: |
break; |
case biot_reduced_xi:{//coefficient for effective stress factor reduction |
xfscanf (in,"%le %le", &gamma,&lambda0); |
break; |
} |
case biot_masin_xi:{ |
xfscanf (in,"%le %le", &gamma,&s_entry); |
break; |
} |
case masin_xi: |
break; |
default:{ |
print_err ("unknown model type is required", __FILE__, __LINE__, __func__); |
abort(); |
} |
} |
break; |
} |
case lewis_and_schrefler_mefel_coup:{//Lewis and Schrefler's model and moisture storage functions is included in MEFEL |
xfscanf (in,"%lf %lf %lf %lf %lf %lf %lf %lf %lf", &mefel_units, &alpha, &ks, &phi0, &kw, &rhow, &muw0, &kintr, &rhos); |
break; |
} |
case van_genuchten_coup:{//partially saturated medium =Van Genuchten model |
xfscanf (in,"%le %le %le %le %le %le %le %le %le", &mefel_units, &alpha, &ks, &phi0, &kw, &rhow, &muw0, &kintr, &rhos); |
van_genuchten_ret.read(in); |
break; |
} |
case consol_camclay_coup://fully saturated isotropic consolidation with changing porosity from cam-clay model |
case consol_camclay_mech_coup:{ |
xfscanf (in,"%lf %lf %lf %lf %lf %lf %lf %lf %lf", &mefel_units, &alpha, &ks, &phi0, &kw, &rhow, &muw0, &kintr, &rhos); |
break; |
} |
default:{ |
fprintf (stderr,"\n unknown model type is required"); |
fprintf (stderr,"\n in function (%s, line %d).\n",__FILE__,__LINE__); |
print_err ("unknown model type is required", __FILE__, __LINE__, __func__); |
abort(); |
} |
} |
// incompressible grains: |
if(compress == 0) |
alpha = 1.0; |
} |
98,35 → 150,10 |
@param out - output file |
12/9/2008, TKr |
13/11/2023, TKr |
*/ |
void con_awf1matc::print(FILE *out) |
{ |
fprintf(out," %d",model_type); |
switch (model_type){ |
case lewis_and_schrefler_coup:{//Lewis and Schrefler's model |
fprintf (out," %le %le %le %le %le %le %le %le\n", alpha, ks, phi0, kw, rhow, muw0, kintr, rhos); |
break; |
} |
case lewis_and_schrefler_mefel_coup:{//Lewis and Schrefler's model and moisture storage functions is included in MEFEL |
fprintf (out," %le %le %le %le %le %le %le %le %le\n", mefel_units, alpha, ks, phi0, kw, rhow, muw0, kintr, rhos); |
break; |
} |
case van_genuchten_coup:{//partially saturated medium =Van Genuchten model |
fprintf (out,"\n %le %le %le %le %le %le %le %le %le \n", mefel_units, alpha, ks, phi0, kw, rhow, muw0, kintr, rhos); |
van_genuchten_ret.print(out); |
break; |
} |
case consol_camclay_coup://fully saturated isotropic consolidation with changing porosity from cam-clay model |
case consol_camclay_mech_coup:{ |
fprintf (out," %le %le %le %le %le %le %le %le %le\n", mefel_units, alpha, ks, phi0, kw, rhow, muw0, kintr, rhos); |
break; |
} |
default:{ |
fprintf (stderr,"\n unknown model type is required"); |
fprintf (stderr,"\n in function (%s, line %d).\n",__FILE__,__LINE__); |
} |
} |
} |
889,40 → 916,89 |
/** |
function computes degree of saturation(sorption curve) |
function computes degree of saturation(water retention curve) |
@param pw - water pressure |
@param ipp - number of integration point |
@retval sw - degree of saturation |
12/9/2008, TKr |
13/11/2021, TKr |
*/ |
double con_awf1matc::get_sw(double pw, long ipp) |
{ |
double sw; |
sw = 0.0; |
switch (model_type){ |
case lewis_and_schrefler_coup:{//Lewis and Schrefler's book |
switch (sr_type){ |
case bazant_sr:{//Bazant |
sw = bazant_ret.sat(-pw,t0); |
break; |
} |
case lewis_and_schrefler_sr:{//Lewis and Schrefler's book |
sw = lewis_ret.sw(pw); |
break; |
} |
case lewis_and_schrefler_mefel_coup:{//Lewis and Schrefler's model and moisture storage functions is included in MEFEL |
sw = Tm->givenontransq(saturation_deg, ipp); //actual saturation degree from models included in TRFEL |
case mefel_sr:{//saturation degree ind its derivative are obtained from mefel; |
sw = Tm->givenontransq(saturation_deg, ipp); //actual saturation degree |
break; |
} |
case van_genuchten_coup:{//partially saturated medium = Van Genuchten model |
sw = van_genuchten_ret.sw(pw); |
case table_sr:{//saturation degree and its derivative are obtained from table; |
//actual saturation degree |
if (data.tfunc == tab) |
{ |
if ((pw < data.tabf->x[0]) || (pw > data.tabf->x[data.tabf->asize-1])) |
{ |
print_err("required value %le is out of table range <%le;%le> on ip=%ld\n", |
__FILE__, __LINE__, __func__, pw, data.tabf->x[0], data.tabf->x[data.tabf->asize-1], ipp); |
abort(); |
} |
} |
sw = data.getval (pw); |
break; |
} |
case consol_camclay_coup://fully saturated isotropic consolidation with changing porosity from cam-clay model |
case consol_camclay_mech_coup:{ |
sw = 1.0; |
/* case gardner_exponential_sr:{//partially saturated medium = Exponential model, Gardner |
sw = gardner_ret.sw(pw); |
break; |
} |
case potts_log_linear_sr:{//partially saturated medium = Log linear model, Potts |
sw = potts_ret.sw(pw); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model |
//sw = van_genuchten_ret.sw2(pw); |
break; |
} |
*/ |
case van_genuchten_sr:{//partially saturated medium = Van Genuchten model |
sw = van_genuchten_ret.sw(pw,t0); |
break; |
} |
case masin_sr:{//extended formulation from Brooks and Correy according to Masin |
double e=0.0,dpw=0.0,por=0.0; |
if(Tm->nontransq != NULL){ |
por = Tm->givenontransq(porosity, ipp);// from mefel |
e = por/(1-por); |
} |
else{ |
e = phi0/(1-phi0); |
} |
dpw = Tm->ip[ipp].av[0]-Tm->ip[ipp].pv[0]; |
sw = masin_ret.sw(-pw,-dpw,e,t0);//positive value of suction |
break; |
} |
case febex_granit_sr:{//FEBEX granit |
sw = febex_granit_ret.sw(-pw); |
break; |
} |
default:{ |
fprintf (stderr,"\n unknown model type is required"); |
fprintf (stderr,"\n in function (%s, line %d).\n",__FILE__,__LINE__); |
print_err ("unknown model type is required", __FILE__, __LINE__, __func__); |
abort(); |
} |
} |
return(sw); |
929,7 → 1005,67 |
} |
/** |
function computes effective stress factor xi |
@param pw - water pressure |
@param ipp - number of integration point |
@retval xi - factor xi |
13/11/2023, TKr |
*/ |
double con_awf1matc::get_xi(double pw, long ipp) |
{ |
double suc=0.0,sr=0.0,xi=0.0; |
switch (xi_type){ |
case biot_xi: |
xi = get_sw(pw,ipp); |
break; |
case biot_reduced_xi: |
//xi = gamma*get_sw(pw,ipp); |
sr = get_sw(pw,ipp); |
//xi = pow(sr,(gamma/lambda0)); |
xi = pow(sr,gamma); |
xi = (1-gamma)*xi; |
break; |
case biot_masin_xi:{//according to masin for testing |
sr = get_sw(pw,ipp); |
suc = -pw; |
if (suc>=s_entry) |
xi = pow((s_entry/suc),gamma); |
else |
xi = 1.0; |
if (suc>=s_entry) |
xi = (1-gamma)*xi; |
else |
xi = 1.0; |
break; |
} |
case masin_xi:{ |
double e=0.0,dpw=0.0,por=0.0; |
if(Tm->nontransq != NULL){ |
por = Tm->givenontransq(porosity, ipp);// from mefel |
e = por/(1-por); |
} |
else{ |
e = phi0/(1-phi0); |
} |
dpw = Tm->ip[ipp].av[0]-Tm->ip[ipp].pv[0]; |
xi = masin_ret.psi(-pw,-dpw,e,t0);//positive value of suction |
break; |
} |
default:{ |
print_err ("unknown model type is required", __FILE__, __LINE__, __func__); |
abort(); |
} |
} |
return(xi); |
} |
/** |
function returns porosity |
@retval phi - porosity |
949,12 → 1085,6 |
phi = Tm->givenontransq(porosity, ipp); //actual porosity from models included in TRFEL |
break; |
} |
case van_genuchten_coup://partially saturated medium = Van Genuchten model |
case consol_camclay_coup://fully saturated isotropic consolidation with changing porosity from cam-clay model |
case consol_camclay_mech_coup:{ |
phi = phi0; |
break; |
} |
default:{ |
fprintf (stderr,"\n unknown model type is required"); |
fprintf (stderr,"\n in function (%s, line %d).\n",__FILE__,__LINE__); |
974,7 → 1104,7 |
*/ |
double con_awf1matc::get_rhos(double /*pw*/,long /*ipp*/) |
{ |
return(rhos); |
return(rhos0); |
} |
988,32 → 1118,18 |
*/ |
double con_awf1matc::get_kuw(double pw,long ipp) |
{ |
double s,kuw; |
double chi,kuw; |
switch (model_type){ |
case van_genuchten_coup://partially saturated medium = Van Genuchten model |
case lewis_and_schrefler_coup:{//Lewis and Schrefler's model |
s = get_sw(pw,ipp); |
kuw = -alpha*s;//p. 88 |
//kuw = 0.0;//this is for testing |
chi = get_xi(pw,ipp); |
kuw = -chi;//effective stress parameter |
break; |
} |
case lewis_and_schrefler_mefel_coup:{//Lewis and Schrefler's model and moisture storage functions is included in MEFEL |
//psi = -Tm->givenontransq(effective_stress_factor, ipp); //actual effective stress factor |
//kuw = -psi;// generalized |
//s = get_sw(pw,ipp); |
//kuw = -alpha*s;//p. 88 |
kuw = 0.0;// this part is in MEFEL already included //promyslet??!! |
kuw = 0.0;// this part is in MEFEL already included |
break; |
} |
case consol_camclay_coup://fully saturated isotropic consolidation with changing porosity from cam-clay model |
case consol_camclay_mech_coup:{ |
s = get_sw(pw,ipp); |
kuw = -alpha*s;//debug??!! |
//kuw = 0.0; |
break; |
} |
default:{ |
fprintf (stderr,"\n unknown model type is required"); |
fprintf (stderr,"\n in function (%s, line %d).\n",__FILE__,__LINE__); |
1069,39 → 1185,32 |
@retval capwu - capacity coefficient |
12/9/2008, TKr |
13/11/2023, TKr |
*/ |
double con_awf1matc::get_capwu(double pw,long ipp) |
{ |
double sw,capwu,n,dsr_depsv; |
double capwu; |
double sw,sg,rhogw; |
//double n,dsr_depsv; |
capwu = 0.0; |
sw = get_sw(pw,ipp); |
rhogw = get_rhogw(pw); |
sg = 1.0 - sw; |
capwu = (sg*rhogw + sw*rhow0)*alpha;//p. 394 or p. 95 multiplied by rhogw and plus vapour effect |
switch (model_type){ |
case van_genuchten_coup://partially saturated medium = Van Genuchten model |
case lewis_and_schrefler_coup:{//Lewis and Schrefler's model |
sw = get_sw(pw,ipp); |
capwu = alpha*sw;//p. 88 |
break; |
} |
case lewis_and_schrefler_mefel_coup:{//Lewis and Schrefler's model and moisture storage functions is included in MEFEL |
sw = get_sw(pw,ipp); |
//psi = -Tm->givenontransq(effective_stress_factor, ipp); //actual effective stress factor |
//capwu = psi;// generalized |
capwu = alpha*sw;//p. 88 |
n = get_phi(pw,ipp); |
dsr_depsv = Tm->givenontransq(der_saturation_deg_depsv, ipp); //actual derivative of saturation degree with respect to volumetric strain |
//capwu = capwu + n*dsr_depsv;//influence of volumetric strain on saturation degree //commented for debug??!! |
capwu = 0.0;//debug??!! |
//n = get_porosity(pw,pg,t,ipp); |
//dsr_depsv = Tm->givenontransq(der_saturation_deg_depsv, ipp); //actual derivative of saturation degree with respect to volumetric strain |
//capwu = capwu + n*(rhow - rhogw)*dsr_depsv;//influence of volumetric strain on saturation degree |
capwu = 0.0;// this part is in TRFEL already included |
break; |
} |
case consol_camclay_coup://fully saturated isotropic consolidation with changing porosity from cam-clay model |
case consol_camclay_mech_coup:{ |
sw = get_sw(pw,ipp); |
capwu = alpha*sw; |
break; |
} |
default:{ |
fprintf (stderr,"\n unknown model type is required"); |
fprintf (stderr,"\n in function (%s, line %d).\n",__FILE__,__LINE__); |
1119,7 → 1228,7 |
@retval fu1 - first part for right-hand side for balance equation |
12/9/2008, TKr |
13/11/2023, TKr |
*/ |
double con_awf1matc::get_fu1(double pw,long ipp) |
{ |
1126,27 → 1235,19 |
double sw,n,fu1; |
switch (model_type){ |
case van_genuchten_coup://partially saturated medium = Van Genuchten model |
case lewis_and_schrefler_coup:{//Lewis and Schrefler's model |
sw = get_sw(pw,ipp); |
n = get_phi(pw,ipp); |
fu1 = rhos*(1-n) + sw*n*rhow;//p. 88 |
fu1 = rhos0*(1-n) + sw*n*rhow0;//p. 88 |
break; |
} |
case lewis_and_schrefler_mefel_coup:{//Lewis and Schrefler's model and moisture storage functions is included in MEFEL |
sw = get_sw(pw,ipp); |
n = get_phi(pw,ipp); |
fu1 = rhos*(1-n) + sw*n*rhow;//p. 88 |
fu1 = rhos0*(1-n) + sw*n*rhow0;//p. 88 |
fu1 = 0.0;// temporarily no gravity acceleration effect is assumed |
break; |
} |
case consol_camclay_coup://fully saturated isotropic consolidation with changing porosity from cam-clay model |
case consol_camclay_mech_coup:{ |
sw = get_sw(pw,ipp); |
n = get_phi(pw,ipp); |
fu1 = rhos*(1-n) + sw*n*rhow; |
break; |
} |
default:{ |
fprintf (stderr,"\n unknown model type is required"); |
fprintf (stderr,"\n in function (%s, line %d).\n",__FILE__,__LINE__); |
1154,3 → 1255,75 |
} |
return(fu1); |
} |
/** |
function computes mass concentration of water vapour air in gas phase |
@param pw - pore water pressure |
@retval rhogw - mass concentration of water vapour air in gas phase |
13/11/2023, TKr |
*/ |
double con_awf1matc::get_rhogw(double pw) |
{ |
double rhogw,pgw; |
pgw = get_pgw(pw); |
rhogw = pgw/t0/gasr*mw; |
return(rhogw); |
} |
/** |
function computes water vapour pressure = Kelvin equation |
@param pw - pore water pressure |
@retval pgw - water vapour pressure = Kelvin equation |
13/11/2023, TKr |
*/ |
double con_awf1matc::get_pgw(double pw) |
{ |
double pgw,pgws,pc; |
pgws = get_pgws(t0); |
pc = -pw; |
pgw = pgws*exp(-1.0*pc*mw/rhow0/gasr/t0); |
check_math_err(); |
return(pgw); |
} |
/** |
function computes water vapour saturation pressure |
@param t - temperature |
@retval pgws - water vapour saturation pressure |
13/11/2023, TKr |
*/ |
double con_awf1matc::get_pgws(double t) |
{ |
double t1,t2,t3,pgws,psl; |
t1 = 1.0/t; |
t2 = t*t; |
t3 = t*t*t; |
psl = c8*t1 + c9 + c10*t + c11*t2 + c12*t3 + c13*log(t); |
pgws = exp(psl); |
return(pgws); |
} |
/trunk/SIFEL/METR/SRC/consol_awf1c.h |
---|
2,8 → 2,16 |
#define CON_AWF1MATC_H |
#include "genfile.h" |
#include "aliast.h" |
#include "aliasc.h" |
#include "baroghel_reten.h" |
#include "bazant_reten.h" |
#include "lewis_schrefler.h" |
#include "gardner.h" |
#include "potts.h" |
#include "van_genuchten.h" |
#include "masin_reten.h" |
#include "febex_granit_reten.h" |
/** |
This class defines model for water flow in soils (deformable porous medium) |
47,6 → 55,7 |
void rhs3d1 (matrix &d,long ri,long ci,long ipp); |
double get_sw(double pw,long ipp); |
double get_xi(double pw, long ipp); |
double get_phi(double pw,long ipp); |
double get_rhos(double pw,long ipp); |
58,21 → 67,39 |
double get_fu1(double pw,long ipp); |
double get_rhogw(double pw); |
double get_pgw(double pw); |
double get_pgws(double t); |
double nu; |
/// Baroghel retention curve: |
baroghel_reten baroghel_ret; |
/// Bazant retention curve: |
bazant_reten bazant_ret; |
/// Lewis and Schrefler's retention curve: |
lewis_reten lewis_ret; |
/// Gardner's retention curve: |
gardner_reten gardner_ret; |
/// Potts' retention curve: |
potts_reten potts_ret; |
/// van Genuchten's retention curve: |
van_genuchten_reten van_genuchten_ret; |
/// Masin's retention curve for bentonite |
masin_reten masin_ret; |
/// general function for retention curve given by set of data |
gfunct data; |
/// FEBEX retention curve |
febex_granit_reten febex_granit_ret; |
private: |
waterflowmechtype model_type; |
int compress; |
double alpha,phi0,rhos; |
double ks,kw,kintr,rhow,muw0; |
double mefel_units; //basic units for pressures = Pa (Pascals) |
int sr_type,xi_type; |
double alpha,phi0,rhos0,rhow0,t0; |
double gamma,lambda0,s_entry; |
double c8,c9,c10,c11,c12,c13; |
double mw,gasr; |
}; |
#endif |
/trunk/SIFEL/METR/SRC/consol_awf2c.cpp |
---|
1040,7 → 1040,7 |
} |
case van_genuchten2_coup:{//partially saturated medium = Van Genuchten model |
pw = pw/mefel_units; |
sw = van_genuchten_ret.sw(pw); |
//sw = van_genuchten_ret.sw(pw,t0); |
break; |
} |
default:{ |
/trunk/SIFEL/METR/SRC/consol_wf1c.cpp |
---|
23,16 → 23,15 |
con_wf1matc::con_wf1matc() |
{ |
compress = 0; //compressible grains: 0=no; 1=yes |
// |
alpha = 1.0;//Biot's constant [-] alpha = 1 - kt/ks |
// |
rhos = 2000.0;//solid grain density [kg/m^3] |
rhos0 = 2000.0;//initial solid grain density [kg/m^3] |
// |
phi0 = 0.297;//initial porosity [-] |
// |
rhow = 1000.0;//water density [kg/m^3] |
rhow0 = 1000.0;//reference water density [kg/m^3] |
// |
t0 = 293.15; //reference temperature |
} |
con_wf1matc::~con_wf1matc() |
50,12 → 49,82 |
{ |
xfscanf (in,"%k%m","waterflowmechtype",&waterflowmechtype_kwdset, &model_type); //water flow model type |
xfscanf (in,"%d", &compress); //compressibility of grains |
xfscanf (in,"%lf %lf %lf %lf %d %d", &alpha, &phi0, &rhos0, &t0, &sr_type, &xi_type); |
switch (model_type){ |
case lewis_and_schrefler_coup: |
case lewis_and_schrefler_mefel_coup: {//Lewis and Schrefler's model |
xfscanf (in,"%lf %lf %lf %d", &alpha, &phi0, &rhos, &sr_type); |
case lewis_and_schrefler_mefel_coup: {//Lewis and Schrefler's model |
//retention curve type: |
switch (sr_type){ |
case baroghel_sr:{//Baroghle-Bouny approach |
baroghel_ret.read(in); |
break; |
} |
case bazant_sr:{//Bazant approach |
break; |
} |
case lewis_and_schrefler_sr:{//Lewis and Schrefler's book |
lewis_ret.read(in); |
break; |
} |
case gardner_exponential_sr:{//dependent on saturation degree: |
gardner_ret.read(in); |
break; |
} |
case potts_log_linear_sr:{//exponential |
potts_ret.read(in); |
break; |
} |
case van_genuchten_sr:{//partially saturated medium =Van Genuchten model |
van_genuchten_ret.read(in); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium =Van Genuchten model |
//van_genuchten_ret.read2(in); |
break; |
} |
case mefel_sr:{//from MEFEL |
break; |
} |
case table_sr:{//from table |
//reading of retention curve: |
data.read (in); |
break; |
} |
case masin_sr:{//extended formulation from Brooks and Correy according to Masin |
masin_ret.read(in); |
break; |
} |
case febex_granit_sr:{//FEBEX granit |
febex_granit_ret.read(in); |
break; |
} |
default:{ |
print_err ("unknown model type is required", __FILE__, __LINE__, __func__); |
abort(); |
} |
} |
switch (xi_type){ |
case biot_xi: |
break; |
case biot_reduced_xi:{//coefficient for effective stress factor reduction |
xfscanf (in,"%le %le", &gamma,&lambda0); |
break; |
} |
case biot_masin_xi:{ |
xfscanf (in,"%le %le", &gamma,&s_entry); |
break; |
} |
case masin_xi: |
break; |
default:{ |
print_err ("unknown model type is required", __FILE__, __LINE__, __func__); |
abort(); |
} |
} |
break; |
} |
default:{ |
63,46 → 132,6 |
abort(); |
} |
} |
//retention curve type: |
switch (sr_type){ |
case lewis_and_schrefler_sr:{//Lewis and Schrefler's book |
lewis_ret.read(in); |
break; |
} |
case gardner_exponential_sr:{//dependent on saturation degree: |
gardner_ret.read(in); |
break; |
} |
case potts_log_linear_sr:{//exponential |
potts_ret.read(in); |
break; |
} |
case van_genuchten_sr:{//partially saturated medium =Van Genuchten model |
van_genuchten_ret.read(in); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium =Van Genuchten model |
//van_genuchten_ret.read2(in); |
break; |
} |
case mefel_sr:{//from MEFEL |
break; |
} |
case table_sr:{//from table |
//reading of retention curve: |
data.read (in); |
break; |
} |
default:{ |
print_err ("unknown model type is required", __FILE__, __LINE__, __func__); |
abort(); |
} |
} |
// incompressible grains: |
//if(compress == 0) |
//alpha = 1.0; |
} |
111,36 → 140,10 |
@param out - output file |
12/9/2008, TKr |
13/11/2023, TKr |
*/ |
void con_wf1matc::print(FILE */*out*/) |
{ |
/* fprintf(out," %d",model_type); |
switch (model_type){ |
case lewis_and_schrefler_coup:{//Lewis and Schrefler's model |
fprintf (out," %le %le %le %le %le %le %le %le\n", alpha, ks, phi0, kw, rhow, muw0, kintr, rhos); |
break; |
} |
case lewis_and_schrefler_mefel_coup:{//Lewis and Schrefler's model and moisture storage functions is included in MEFEL |
fprintf (out," %le %le %le %le %le %le %le %le %le\n", mefel_units, alpha, ks, phi0, kw, rhow, muw0, kintr, rhos); |
break; |
} |
case van_genuchten_coup:{//partially saturated medium =Van Genuchten model |
fprintf (out,"\n %le %le %le %le %le %le %le %le %le \n", mefel_units, alpha, ks, phi0, kw, rhow, muw0, kintr, rhos); |
van_genuchten_ret.print(out); |
break; |
} |
case consol_camclay_coup://fully saturated isotropic consolidation with changing porosity from cam-clay model |
case consol_camclay_mech_coup:{ |
fprintf (out," %le %le %le %le %le %le %le %le %le\n", mefel_units, alpha, ks, phi0, kw, rhow, muw0, kintr, rhos); |
break; |
} |
default:{ |
fprintf (stderr,"\n unknown model type is required"); |
fprintf (stderr,"\n in function (%s, line %d).\n",__FILE__,__LINE__); |
} |
} |
*/ |
} |
903,26 → 906,33 |
/** |
function computes degree of saturation(sorption curve) |
function computes degree of saturation(water retention curve) |
@param pw - water pressure |
@param ipp - number of integration point |
@retval sw - degree of saturation |
12/9/2008, TKr |
13/11/2021, TKr |
*/ |
double con_wf1matc::get_sw(double pw, long ipp) |
{ |
double sw; |
sw = 0.0; |
switch (sr_type){ |
case bazant_sr:{//Bazant |
sw = bazant_ret.sat(-pw,t0); |
break; |
} |
case lewis_and_schrefler_sr:{//Lewis and Schrefler's book |
sw = lewis_ret.sw(pw); |
break; |
} |
case mefel_sr:{//saturation degree ind its derivative are obtained from mefel; |
sw = Tm->givenontransq(saturation_deg, ipp); //actual saturation degree |
break; |
sw = Tm->givenontransq(saturation_deg, ipp); //actual saturation degree |
break; |
} |
case table_sr:{//saturation degree and its derivative are obtained from table; |
//actual saturation degree |
939,7 → 949,7 |
break; |
} |
case gardner_exponential_sr:{//partially saturated medium = Exponential model, Gardner |
sw = gardner_ret.sw(pw); |
break; |
949,7 → 959,7 |
break; |
} |
case van_genuchten_sr:{//partially saturated medium = Van Genuchten model |
sw = van_genuchten_ret.sw(pw); |
sw = van_genuchten_ret.sw(pw,t0); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model |
956,6 → 966,24 |
//sw = van_genuchten_ret.sw2(pw); |
break; |
} |
case masin_sr:{//extended formulation from Brooks and Correy according to Masin |
double e=0.0,dpw=0.0,por=0.0; |
if(Tm->nontransq != NULL){ |
por = Tm->givenontransq(porosity, ipp);// from mefel |
e = por/(1-por); |
} |
else{ |
e = phi0/(1-phi0); |
} |
dpw = Tm->ip[ipp].av[0]-Tm->ip[ipp].pv[0]; |
sw = masin_ret.sw(-pw,-dpw,e,t0);//positive value of suction |
break; |
} |
case febex_granit_sr:{//FEBEX granit |
sw = febex_granit_ret.sw(-pw); |
break; |
} |
default:{ |
print_err ("unknown model type is required", __FILE__, __LINE__, __func__); |
abort(); |
965,7 → 993,70 |
} |
/** |
function computes effective stress factor xi |
@param pw - water pressure |
@param ipp - number of integration point |
@retval xi - factor xi |
13/11/2023, TKr |
*/ |
double con_wf1matc::get_xi(double pw, long ipp) |
{ |
double suc=0.0,sr=0.0,xi=0.0; |
switch (xi_type){ |
case biot_xi: |
xi = get_sw(pw,ipp); |
break; |
case biot_reduced_xi: |
//xi = gamma*get_sw(pw,ipp); |
sr = get_sw(pw,ipp); |
//xi = pow(sr,(gamma/lambda0)); |
xi = pow(sr,gamma); |
xi = (1-gamma)*xi; |
break; |
case biot_masin_xi:{//according to masin for testing |
sr = get_sw(pw,ipp); |
suc = -pw; |
if (suc>=s_entry) |
xi = pow((s_entry/suc),gamma); |
else |
xi = 1.0; |
if (suc>=s_entry) |
xi = (1-gamma)*xi; |
else |
xi = 1.0; |
break; |
} |
case masin_xi:{ |
double e=0.0,dpw=0.0,por=0.0; |
if(Tm->nontransq != NULL){ |
por = Tm->givenontransq(porosity, ipp);// from mefel |
e = por/(1-por); |
} |
else{ |
e = phi0/(1-phi0); |
} |
dpw = Tm->ip[ipp].av[0]-Tm->ip[ipp].pv[0]; |
xi = masin_ret.psi(-pw,-dpw,e,t0);//positive value of suction |
break; |
} |
default:{ |
print_err ("unknown model type is required", __FILE__, __LINE__, __func__); |
abort(); |
} |
} |
return(xi); |
} |
/** |
function returns porosity |
@retval phi - porosity |
1004,7 → 1095,7 |
*/ |
double con_wf1matc::get_rhos(double /*pw*/,long /*ipp*/) |
{ |
return(rhos); |
return(rhos0); |
} |
1018,12 → 1109,12 |
*/ |
double con_wf1matc::get_kuw(double pw,long ipp) |
{ |
double s,kuw; |
double chi,kuw; |
switch (model_type){ |
case lewis_and_schrefler_coup:{//Lewis and Schrefler's model |
s = get_sw(pw,ipp); |
kuw = -alpha*s;//p. 88 |
chi = get_xi(pw,ipp); |
kuw = -chi;//effective stress parameter |
break; |
} |
case lewis_and_schrefler_mefel_coup:{//Lewis and Schrefler's model and moisture storage functions is included in MEFEL |
1130,13 → 1221,13 |
case lewis_and_schrefler_coup:{//Lewis and Schrefler's model |
sw = get_sw(pw,ipp); |
n = get_phi(pw,ipp); |
fu1 = rhos*(1-n) + sw*n*rhow;//p. 88 |
fu1 = rhos0*(1-n) + sw*n*rhow0;//p. 88 |
break; |
} |
case lewis_and_schrefler_mefel_coup:{//Lewis and Schrefler's model and moisture storage functions is included in MEFEL |
sw = get_sw(pw,ipp); |
n = get_phi(pw,ipp); |
fu1 = rhos*(1-n) + sw*n*rhow;//p. 88 |
fu1 = rhos0*(1-n) + sw*n*rhow0;//p. 88 |
fu1 = 0.0;// temporarily no gravity acceleration effect is assumed |
break; |
} |
/trunk/SIFEL/METR/SRC/consol_wf1c.h |
---|
2,11 → 2,16 |
#define CON_WF1MATC_H |
#include "genfile.h" |
#include "baroghel_reten.h" |
#include "bazant_reten.h" |
#include "lewis_schrefler.h" |
#include "gardner.h" |
#include "potts.h" |
#include "van_genuchten.h" |
#include "masin_reten.h" |
#include "febex_granit_reten.h" |
/** |
This class defines model for water flow in soils (deformable porous medium) |
*/ |
49,6 → 54,7 |
void rhs3d1 (matrix &d,long ri,long ci,long ipp); |
double get_sw(double pw,long ipp); |
double get_xi(double pw, long ipp); |
double get_phi(double pw,long ipp); |
double get_rhos(double pw,long ipp); |
62,6 → 68,10 |
double nu; |
/// Baroghel retention curve: |
baroghel_reten baroghel_ret; |
/// Bazant retention curve: |
bazant_reten bazant_ret; |
/// Lewis and Schrefler's retention curve: |
lewis_reten lewis_ret; |
/// Gardner's retention curve: |
70,15 → 80,20 |
potts_reten potts_ret; |
/// van Genuchten's retention curve: |
van_genuchten_reten van_genuchten_ret; |
/// Masin's retention curve for bentonite |
masin_reten masin_ret; |
/// general function for retention curve given by set of data |
gfunct data; |
/// FEBEX retention curve |
febex_granit_reten febex_granit_ret; |
private: |
waterflowmechtype model_type; |
int compress,sr_type; |
double alpha,phi0,rhos,rhow; |
int sr_type,xi_type; |
double alpha,phi0,rhos0,rhow0,t0; |
double gamma,lambda0,s_entry; |
}; |
#endif |
/trunk/SIFEL/METR/SRC/consol_wf2c.cpp |
---|
1040,7 → 1040,7 |
} |
case van_genuchten2_coup:{//partially saturated medium = Van Genuchten model |
pw = pw/mefel_units; |
sw = van_genuchten_ret.sw(pw); |
//sw = van_genuchten_ret.sw(pw); |
break; |
} |
default:{ |
/trunk/SIFEL/TRFEL/SRC/consol_awf1.cpp |
---|
367,59 → 367,10 |
@param in - input file |
01/05/2008, TKr |
13/11/2023, TKr |
*/ |
void con_awf1mat::print(FILE *out) |
{ |
/* fprintf (out,"\n %d ", int(model_type)); |
fprintf (out,"\n %d ", compress); |
switch (model_type){ |
case lewis_and_schrefler:{//Lewis and Schrefler's book |
fprintf (out,"\n %le %le %le %le %le %le %le %le \n", alpha, ks, phi0, kw, rhow, muw0, kintr, rhos0); |
lewis_ret.print(out); |
break; |
} |
case lewis_and_schrefler_mefel:{//Lewis and Schrefler's book |
fprintf (out,"\n %le %le %le %le %le %le %le %le %d %le %le %d \n", mefel_units, alpha, ks, phi0, kw, rhow, muw0, kintr, krw_type, rhos0, pw_bc, vol_strain_effect); |
break; |
} |
case lewis_and_schrefler_mefel_table:{//Lewis and Schrefler's book |
fprintf (out,"\n %le %le %le %le %le %le %le %le %d %le %le %d \n", mefel_units, alpha, ks, phi0, kw, rhow, muw0, kintr, krw_type, rhos0, pw_bc, vol_strain_effect); |
//printing of retention curve: |
data.print (out); |
fprintf (out,"\n"); |
break; |
} |
case gardner_exponential:{//partially saturated medium = Exponential model, Gardner |
gardner_ret.print(out); |
break; |
} |
case potts_log_linear:{//partially saturated medium = Log linear model, Potts |
potts_ret.print(out); |
break; |
} |
case van_genuchten:{//partially saturated medium =Van Genuchten model |
fprintf (out,"\n %le %le %le %le %le %le %le %le %le %le %d \n", mefel_units, alpha, ks, phi0, kw, rhow, muw0, kintr, rhos0, pw_bc, vol_strain_effect); |
van_genuchten_ret.print(out); |
break; |
} |
case consol_camclay: |
case consol_camclay_mech:{//fully saturated isotropic consolidation with changing porosity from cam-clay model |
fprintf (out,"\n %le %le %le %le \n", kintr, phi0, m, pw_bc); |
break; |
} |
default:{ |
print_err ("unknown model type is required", __FILE__, __LINE__, __func__); |
abort(); |
} |
} |
*/ |
} |
646,7 → 597,7 |
} |
case van_genuchten_sr:{//partially saturated medium = Van Genuchten model |
sw = van_genuchten_ret.sw(pw); |
sw = van_genuchten_ret.sw(pw,t0); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model type 2 |
728,7 → 679,7 |
} |
*/ |
case van_genuchten_sr:{//partially saturated medium = Van Genuchten model |
dsw_dpw = van_genuchten_ret.dsw_dpw(pw); |
dsw_dpw = van_genuchten_ret.dsw_dpw(pw,t0); |
break; |
} |
case masin_sr:{//extended formulation from Brooks and Correy according to Masin |
849,7 → 800,7 |
break; |
} |
case 7:{ |
krw = van_genuchten_ret.get_krw(pw); |
krw = van_genuchten_ret.get_krw(pw,t0); |
} |
case 9:{//bazant |
sw = get_sw(pw,ipp); |
/trunk/SIFEL/TRFEL/SRC/consol_awf2.cpp |
---|
653,7 → 653,7 |
} |
case van_genuchten_sr:{//partially saturated medium = Van Genuchten model |
sw = van_genuchten_ret.sw(pw); |
sw = van_genuchten_ret.sw(pw,t0); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model type 2 |
726,7 → 726,7 |
} |
case van_genuchten_sr:{//partially saturated medium = Van Genuchten model |
dsw_dpc = -van_genuchten_ret.dsw_dpw(pw); |
dsw_dpc = -van_genuchten_ret.dsw_dpw(pw,t0); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model |
898,7 → 898,7 |
pg = pg - p0;//pore gas pressure without atmospheric pressure |
pc = pg - pw; |
krw = van_genuchten_ret.get_krw(-pc); |
krw = van_genuchten_ret.get_krw(-pc,t0); |
} |
case 9:{//bazant |
sw = get_sw(pw,pg,ipp); |
/trunk/SIFEL/TRFEL/SRC/consol_hawf3.cpp |
---|
763,7 → 763,7 |
//pg = pg - p0;//pore gas pressure without atmospheric pressure//debug?? |
pc = pg - pw; |
sw = van_genuchten_ret.sw(-pc);//suction = capillary pressure |
sw = van_genuchten_ret.sw(-pc,t);//suction = capillary pressure |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model type 2 |
852,7 → 852,7 |
//pg = pg - p0;//pore gas pressure without atmospheric pressure//debug?? |
pc = pg - pw; |
dsw_dpc = -van_genuchten_ret.dsw_dpw(-pc);//suction = capillary pressure |
dsw_dpc = -van_genuchten_ret.dsw_dpw(-pc,t);//suction = capillary pressure |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model |
941,7 → 941,7 |
//pg = pg - p0;//pore gas pressure without atmospheric pressure//debug?? |
pc = pg - pw; |
dsw_dt = van_genuchten_ret.dsw_dt(-pc); |
dsw_dt = van_genuchten_ret.dsw_dt(-pc,t); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model |
1121,7 → 1121,7 |
pg = pg - p0;//pore gas pressure without atmospheric pressure |
pc = pg - pw; |
krw = van_genuchten_ret.get_krw(-pc); |
krw = van_genuchten_ret.get_krw(-pc,t); |
} |
case 9:{//bazant |
sw = get_sw(pw,pg,t,ipp); |
/trunk/SIFEL/TRFEL/SRC/consol_hwf2.cpp |
---|
595,7 → 595,7 |
break; |
} |
case van_genuchten_sr:{//partially saturated medium = Van Genuchten model |
sw = van_genuchten_ret.sw(pw); |
sw = van_genuchten_ret.sw(pw,t); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model |
674,7 → 674,7 |
break; |
} |
case van_genuchten_sr:{//partially saturated medium = Van Genuchten model |
dsw_dpw = van_genuchten_ret.dsw_dpw(pw); |
dsw_dpw = van_genuchten_ret.dsw_dpw(pw,t); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model |
753,7 → 753,7 |
break; |
} |
case van_genuchten_sr:{//partially saturated medium = Van Genuchten model |
dsw_dt = van_genuchten_ret.dsw_dt(pw); |
dsw_dt = van_genuchten_ret.dsw_dt(pw,t); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model |
876,7 → 876,7 |
break; |
} |
case 7:{ |
krw = van_genuchten_ret.get_krw(pw); |
krw = van_genuchten_ret.get_krw(pw,t); |
} |
case 9:{//bazant |
sw = get_sw(pw,t,ipp); |
/trunk/SIFEL/TRFEL/SRC/consol_wf1.cpp |
---|
358,59 → 358,11 |
@param in - input file |
01/05/2008, TKr |
13/11/2023, TKr |
*/ |
void con_wf1mat::print(FILE */*out*/) |
{ |
/* |
fprintf (out,"\n %d ", int(model_type)); |
fprintf (out,"\n %d ", compress); |
switch (model_type){ |
case lewis_and_schrefler:{//Lewis and Schrefler's book |
fprintf (out,"\n %le %le %le %le %le %le %le %le \n", alpha, ks, phi0, kw, rhow, muw0, kintr, rhos0); |
lewis_ret.print(out); |
break; |
} |
case lewis_and_schrefler_mefel:{//Lewis and Schrefler's book |
fprintf (out,"\n %le %le %le %le %le %le %le %le %d %le %le %d \n", mefel_units, alpha, ks, phi0, kw, rhow, muw0, kintr, krw_type, rhos0, pw_bc, vol_strain_effect); |
break; |
} |
case lewis_and_schrefler_mefel_table:{//Lewis and Schrefler's book |
fprintf (out,"\n %le %le %le %le %le %le %le %le %d %le %le %d \n", mefel_units, alpha, ks, phi0, kw, rhow, muw0, kintr, krw_type, rhos0, pw_bc, vol_strain_effect); |
//printing of retention curve: |
data.print (out); |
fprintf (out,"\n"); |
break; |
} |
case gardner_exponential:{//partially saturated medium = Exponential model, Gardner |
gardner_ret.print(out); |
break; |
} |
case potts_log_linear:{//partially saturated medium = Log linear model, Potts |
potts_ret.print(out); |
break; |
} |
case van_genuchten:{//partially saturated medium =Van Genuchten model |
fprintf (out,"\n %le %le %le %le %le %le %le %le %le %le %d \n", mefel_units, alpha, ks, phi0, kw, rhow, muw0, kintr, rhos0, pw_bc, vol_strain_effect); |
van_genuchten_ret.print(out); |
break; |
} |
case consol_camclay: |
case consol_camclay_mech:{//fully saturated isotropic consolidation with changing porosity from cam-clay model |
fprintf (out,"\n %le %le %le %le \n", kintr, phi0, m, pw_bc); |
break; |
} |
default:{ |
print_err ("unknown model type is required", __FILE__, __LINE__, __func__); |
abort(); |
} |
} |
*/ |
} |
644,7 → 596,7 |
break; |
} |
case van_genuchten_sr:{//partially saturated medium = Van Genuchten model |
sw = van_genuchten_ret.sw(pw); |
sw = van_genuchten_ret.sw(pw,t0); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model |
721,7 → 673,7 |
break; |
} |
case van_genuchten_sr:{//partially saturated medium = Van Genuchten model |
dsw_dpw = van_genuchten_ret.dsw_dpw(pw); |
dsw_dpw = van_genuchten_ret.dsw_dpw(pw,t0); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model |
814,7 → 766,7 |
break; |
} |
case 7:{ |
krw = van_genuchten_ret.get_krw(-pw); |
krw = van_genuchten_ret.get_krw(-pw,t0); |
} |
case 9:{//bazant |
sw = get_sw(pw,ipp); |
/trunk/SIFEL/TRFEL/SRC/consol_wf2.cpp |
---|
52,6 → 52,8 |
pw_bc = 0.0; //free boundary pressure |
rel_gas_press = 0; |
t0 = 293.15; // reference temperature |
} |
con_wf2mat::~con_wf2mat() |
580,7 → 582,7 |
} |
case van_genuchten_sr:{//partially saturated medium = Van Genuchten model |
sw = van_genuchten_ret.sw(pw); |
sw = van_genuchten_ret.sw(pw,t0); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model type 2 |
630,7 → 632,7 |
} |
case van_genuchten_sr:{//partially saturated medium = Van Genuchten model |
dsw_dpc = -van_genuchten_ret.dsw_dpw(pw); |
dsw_dpc = -van_genuchten_ret.dsw_dpw(pw,t0); |
break; |
} |
case van_genuchten2_sr:{//partially saturated medium = Van Genuchten model |
/trunk/SIFEL/TRFEL/SRC/consol_wf2.h |
---|
124,6 → 124,7 |
int rel_gas_press; //relative gas pressure according to ambient air; yes=1=relative pg, no=0=absolute pg |
double sirr,ssat,lambda_krw; |
double bb1,phi01; //permeability parameters |
double t0; |
}; |
#endif |
/trunk/SIFEL/TRFEL/SRC/febex_granit_reten.cpp |
---|
0,0 → 1,142 |
/* |
File: febex_granit_retn.cpp |
Author: Tomas Krejci, 19/06/23 |
Purpose: retention curve accorging to FEBEX experiment - granit Grimsel |
sources: DECOVALEX project report |
*/ |
#include <stdio.h> |
#include <stdlib.h> |
#include <math.h> |
#include "globalt.h" |
#include "febex_granit_reten.h" |
febex_granit_reten::febex_granit_reten() |
{ |
consta = 1.74e6; //reference suction Pa |
n1 = 1.68; //exponent 1 |
n2 = 0.405; //exponent 2 |
//FEBEX granit krw: |
m1 = 0.5; |
m2 = 1.68; |
m3 = 0.595; |
m4 = 2.0; |
} |
febex_granit_reten::~febex_granit_reten() |
{} |
/** |
function reads parameters |
@param in - input file |
TKr 3/04/2018 |
*/ |
void febex_granit_reten::read(XFILE *in) |
{ |
xfscanf (in,"%lf %lf %lf", &consta, &n1, &n2); |
xfscanf (in,"%lf %lf %lf %lf", &m1, &m2, &m3, &m4); |
} |
/** |
function reads parameters |
@param in - input file |
TKr 3/04/2018 |
*/ |
void febex_granit_reten::print(FILE *out) |
{ |
fprintf (out," %lf %lf %lf", consta, n1, n2); |
fprintf (out," %lf %lf %lf %lf", m1, m2, m3, m4); |
} |
/** |
function computes saturation degree |
@param s - suction |
@retval sw - saturation degree |
TKr 3/04/2018 |
*/ |
double febex_granit_reten::sw(double s) |
{ |
double sw=0.0; |
if(s <= 0.0) |
sw = 1.0; |
else{ |
sw = pow((s/consta),(1.0/n2)); |
sw = pow((sw + 1),(-1.0/n1)); |
} |
return(sw); |
} |
/** |
function computes partial derivative of degree of saturation with respect to pw, specific water content |
@param s - suction |
@retval dsw_ds - partial derivative of degree of saturation with respect to suction |
TKr 3/04/2018 |
*/ |
double febex_granit_reten::dsw_ds(double s) |
{ |
double dsw_ds=0.0; |
if(s <= 0.0) |
dsw_ds = 0.0; |
else{ |
dsw_ds = pow((s/consta),(1.0/n2)); |
dsw_ds = pow((dsw_ds + 1),(-1.0/n1 - 1.0)); |
dsw_ds = -1.0*pow((s/consta),(1.0/n2))*dsw_ds; |
dsw_ds = dsw_ds/(n2*n1*s); |
} |
return(dsw_ds); |
} |
/** |
function computes partial derivative of degree of saturation with respect to t |
@param s - suction |
@retval dsw_dt - partial derivative of degree of saturation with respect to temperature |
TKr 3/04/2018 |
*/ |
double febex_granit_reten::dsw_dt(double pw) |
{ |
double dsw_dt; |
dsw_dt = 0.0; |
return(dsw_dt); |
} |
/** |
function computes relative permeability |
@param sw - saturation degree |
@retval krw - relative permeability for water |
TKr 3/04/2018 |
*/ |
double febex_granit_reten::get_krw(double sw) |
{ |
double krw; |
krw = pow(sw,m2); |
krw = pow((1.0 - krw),m3); |
krw = pow((1.0 - krw),m4); |
krw = krw*pow(sw,m1); |
return (krw); |
} |
/trunk/SIFEL/TRFEL/SRC/febex_granit_reten.h |
---|
0,0 → 1,30 |
#ifndef FEBEX_GRANIT_RETEN_H |
#define FEBEX_GRANIT_RETEN_H |
#include "genfile.h" |
/** |
This class defines retention curve of Van_Genuchten and Schrefler's model |
*/ |
class febex_granit_reten |
{ |
public: |
febex_granit_reten(); //constructor |
~febex_granit_reten(); //destructor |
void read(XFILE *in); |
void print(FILE *out); |
double sw(double pw); |
double dsw_ds(double pw); |
double dsw_dt(double pw); |
double get_krw(double sw); |
private: |
double consta,n1,n2; |
//FEBEX granit krw: |
double m1,m2,m3,m4; |
}; |
#endif |
/trunk/SIFEL/TRFEL/SRC/van_genuchten.cpp |
---|
32,15 → 32,20 |
ssat = 1.0; //saturation degree [-] |
sirr = 0.2; //irreversible saturation degree [-] |
ksat = 0.1; //saturation permeability [??] |
//first fomulation |
gamaw = 10.0; //water weigth [kN/m^3] |
delta = 20.0; //parameter in m^(-1); delta = 20.0 [1/m]; delta = 0.2 [1/cm] |
expn = 2.0; //parameter n |
expm = 0.0; //parameter m |
expn = 2.0; //parameter n - exponent |
expm = 0.0; //parameter m - exponent |
p0 = 0.0; //parameter |
pd = 0.0; //parameter |
lambda0 = 1.0; //parameter |
lambdap = 1.0; //parameter |
//second formulation |
p0 = 0.0; //suction - pore-air entry value |
pd = 0.0; //suction value at fully dry conditions |
lambda0 = 1.0; //parameter - exponent |
lambdap = 1.0; //parameter - exponent |
sig0 = 0.072; //surface tension water-gas at reference temperature t0 |
t0 = 293.15; //reference temperature t0 (20 deg.C) |
} |
van_genuchten_reten::~van_genuchten_reten() |
74,7 → 79,7 |
break; |
} |
case 3:{//extended for hight suction - other expression |
xfscanf (in,"%lf %lf %lf %lf %lf %lf", &ssat, &sirr, &p0, &lambda0, &pd, &lambdap); |
xfscanf (in,"%lf %lf %lf %lf %lf %lf %lf %lf", &ssat, &sirr, &p0, &lambda0, &pd, &lambdap, &sig0, &t0); |
break; |
} |
default:{ |
108,7 → 113,7 |
break; |
} |
case 3:{//extended for expansive clays and temperature dependent |
fprintf (out,"\n%lf %lf %lf %lf %lf %lf\n", ssat, sirr, p0, lambda0, pd, lambdap); |
fprintf (out,"\n%lf %lf %lf %lf %lf %lf %lf %lf\n", ssat, sirr, p0, lambda0, pd, lambdap, sig0, t0); |
break; |
} |
default:{ |
122,13 → 127,14 |
function computes saturation degree |
@param pw - pore water pressure |
@param t - temperature |
@retval sw - saturation degree |
TKr 3/04/2018 |
*/ |
double van_genuchten_reten::sw(double pw) |
double van_genuchten_reten::sw(double pw, double t) |
{ |
double sw,hp,theta,fd=1.0,ft=1.0; |
double sw,hp,theta,fd=1.0,ft=1.0,sigt,a; |
switch (vg_ret_type){ |
case 0:{//classical expression |
170,13 → 176,21 |
} |
break; |
} |
case 3:{//extended for hight suction and temperature effect (in Pa) - not implemented yet |
case 3:{//extended for hight suction and temperature effect (in Pa) |
if(pw >= 0.0){ |
sw = 1.0;//for positive pressure (suction) |
} |
else{ |
expm = 1.0/(1.0-lambda0); |
fd = pow((1.0-(-pw)/pd),lambdap); |
if (t < 633.15){ |
a = (374.15-(t-273.15))/647.3;// temperature in deg.C |
sigt = (1.0 - 0.625*a)*(0.2358*pow(a,1.256)); |
} |
else |
sigt = 0.0019106*exp(0.05*(633.15-t)); |
p0 = p0*sigt/sig0; |
expm = 1.0/(1.0-lambda0); |
fd = pow((1.0-(-pw)/pd),lambdap); |
ft = 1.0;//temp |
theta = pow(1+(pow((-pw/p0),expm)),-lambda0)*fd*ft; |
sw = sirr + (ssat - sirr)*theta; |
197,13 → 211,14 |
function computes partial derivative of degree of saturation with respect to pw, specific water content |
@param pw - water pressure |
@param t - temperature |
@retval dsw_dpw - partial derivative of degree of saturation with respect to pw |
TKr 3/04/2018 |
*/ |
double van_genuchten_reten::dsw_dpw(double pw) |
double van_genuchten_reten::dsw_dpw(double pw, double t) |
{ |
double dsw_dpw,hp,fd,theta,dtheta_dpw,dfd_dpw; |
double dsw_dpw,hp,fd,theta,dtheta_dpw,dfd_dpw,sigt,a; |
switch (vg_ret_type){ |
case 0:{//classical expression |
249,7 → 264,7 |
} |
break; |
} |
case 3:{//extended for hight suction and temperature effect (in Pa) - not implemented yet |
case 3:{//extended for hight suction and temperature effect (in Pa) |
if(pw >= 0.0){ |
dsw_dpw = 0.0; |
} |
256,6 → 271,15 |
else{ |
expm = 1.0/(1.0-lambda0); |
fd = pow((1.0-pw/pd),lambdap); |
if (t < 633.15){ |
a = (374.15-(t-273.15))/647.3;// temperature in deg.C |
sigt = (1.0 - 0.625*a)*(0.2358*pow(a,1.256)); |
} |
else |
sigt = 0.0019106*exp(0.05*(633.15-t)); |
p0 = p0*sigt/sig0; |
theta = pow(1+(pow((-pw/p0),expm)),-lambda0); |
dtheta_dpw = -lambda0*pow(1+(pow((-pw/p0),expm)),-lambda0-1.0)*expm*pow((-pw/p0),expm-1)*(-1.0/p0); |
dfd_dpw = lambdap*pow((1.0-pw/pd),lambdap-1.0)*(1.0/pd); |
278,11 → 302,12 |
function computes partial derivative of degree of saturation with respect to t |
@param pw - water pressure |
@param t - temperature |
@retval dsw_dt - partial derivative of degree of saturation with respect to t |
TKr 3/04/2018 |
*/ |
double van_genuchten_reten::dsw_dt(double /*pw*/) |
double van_genuchten_reten::dsw_dt(double pw, double t) |
{ |
double dsw_dt; |
311,11 → 336,12 |
function computes water relative permeability |
@param pw - water pressure |
@param t - temperature |
@retval krw - water relative permeability |
TKr 3/04/2018 |
*/ |
double van_genuchten_reten::get_krw(double pw) |
double van_genuchten_reten::get_krw(double pw, double t) |
{ |
double krw,hp; |
337,7 → 363,7 |
case 1:{//other expression |
double sr = 0.0; |
sr = sw(pw); |
sr = sw(pw,t); |
krw = pow(sr,(1.0/lambda0)); |
krw = pow((1.0-krw),lambda0); |
krw = pow(krw,2.0); |
/trunk/SIFEL/TRFEL/SRC/van_genuchten.h |
---|
16,16 → 16,17 |
void read(XFILE *in); |
void print(FILE *out); |
double sw(double pw); |
double dsw_dpw(double pw); |
double dsw_dt(double pw); |
double get_krw(double pw); |
double sw(double pw, double t); |
double dsw_dpw(double pw, double t); |
double dsw_dt(double pw, double t); |
double get_krw(double pw, double t); |
double get_k(double pw); |
private: |
long vg_ret_type; |
double ssat,sirr,ksat,gamaw,delta,expn,expm; |
double p0,pd,lambda0,lambdap; |
double p0,pd,lambda0,lambdap; |
double sig0,t0; |
}; |