Subversion Repositories sifel

Compare Revisions

Ignore whitespace Rev 783 → Rev 784

/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;
 
};