HydroFemPhysics
The GeMA Hydraulic FEM Physics Plugin
Loading...
Searching...
No Matches
gmpHydraulicMaterialTwoPhase.h
Go to the documentation of this file.
1/************************************************************************
2**
3** Copyright (C) 2014 by Carlos Augusto Teixera Mendes
4** All rights reserved.
5**
6** This file is part of the "GeMA" software. It's use should respect
7** the terms in the license agreement that can be found together
8** with this source code.
9** It is provided AS IS, with NO WARRANTY OF ANY KIND,
10** INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR
11** A PARTICULAR PURPOSE.
12**
13************************************************************************/
14
24#ifndef _GEMA_PLUGIN_HYDRAULIC_MATERIAL_TWOPHASE_H_
25#define _GEMA_PLUGIN_HYDRAULIC_MATERIAL_TWOPHASE_H_
26
28
29class GMP_HYDRAULIC_PHYSICS_API_EXPORT GmpHydraulicMaterialTwoPhase: public GmpFemPhysicsCommonMaterial
30{
31protected:
72
73public:
74
76 GmpHydraulicMaterialTwoPhase(int typeIndex, QString typeName, const GmLogCategory& logger)
77 : GmpFemPhysicsCommonMaterial(typeIndex, typeName, logger) {}
78
80 static GmpFemPhysicsCommonMaterial* instance(GmSimulationData* simulation, int typeIndex, QString typeName, const GmLogCategory& logger)
81 {
82 Q_UNUSED(simulation);
83 return new GmpHydraulicMaterialTwoPhase(typeIndex, typeName, logger);
84 }
85
86 // Sets multiPhase material map
87 virtual const QVariantMap* materialMetaDataMap();
88
89 // Checks material loaded data.
90 bool checkLoadedData(const GmElement* e) const;
91
94 {
95 BrooksCorey,
96 vanGenuchten,
97 UMAT,
98 Liakopoulos,
99
100 // ------ NO ADDING BELOW THIS LINE
102 };
103
106 {
107 constant,
108 exponential,
109 linear,
110 idealGas,
111 superCriticalCO2,
112
113 // ------ NO ADDING BELOW THIS LINE
115 };
116
118 virtual void hydraulicConstitutiveModel(const GmElement* e, const GmVector* coord, int ip, GmMatrix& Kw, GmMatrix& Kc, double Sw, const GmpHydraulic::HMaterialPointAccessors& mp, int d) const ;
119
121 virtual void permeabilityStiffness(const GmElement* e, const GmVector* coord, int ip, GmMatrix& K) const;
122
124 virtual double liquidDensity(const GmElement* e, const GmVector* coord, int ip, const double Plref = 0.0, double Pl = 0.0) const;
125
127 virtual double liquidDensityPressureCompressibility(const GmElement* e, const GmVector* coord, int ip, double rho) const;
128
130 virtual double gasDensity(const GmElement* e, const GmVector* coord, int ip, const double Pgref = 0.0, double Pg = 0.0) const;
131
133 virtual double exponentialFluidDensity(const double rho0, const double K, const double P0, const double P) const;
134
136 virtual double exponentialFluidDensityCompressibility(const double rho, const double K) const;
137
139 virtual double linearFluidDensity(const double rho0, const double K, const double P0, const double P) const;
140
142 virtual double linearFluidDensityCompressibility(const double rho0, const double K) const;
143
145 virtual double gasDensityPressureCompressibility(const GmElement* e, const GmVector* coord, int ip, double rho) const;
146
148 virtual double idealGasDensity(const GmElement* e, const GmVector* coord, int ip, double Pg) const;
149
151 virtual double idealGasCompressibility(const GmElement* e, const GmVector* coord, int ip) const;
152
154 virtual double liquidSaturation(const GmElement* e, const GmVector* coord, int ip, double pc) const;
155
157 virtual double derivativeLiquidSaturation(const GmElement* e, const GmVector* coord, int ip, double Sl, double Pc = 0.0) const;
158
160 virtual double derivativeEffectiveSaturationDegree(const GmElement* e, const GmVector* coord, int ip) const;
161
163 virtual double derivativeLiquidRelativePermeability(const GmElement* e, const GmVector* coord, int ip, double Sl) const;
164
166 virtual double derivativeGasRelativePermeability(const GmElement* e, const GmVector* coord, int ip, double Sl) const;
167
169 virtual double effectiveSaturation(const GmElement* e, const GmVector* coord, int ip, double Sw) const;
170
172 virtual double liquidRelativePermeability(const GmElement* e, const GmVector* coord, int ip, double Sw) const;
173
175 virtual double gasRelativePermeability(const GmElement* e, const GmVector* coord, int ip, double Sw) const;
176
178 virtual int saturationLawId(const GmElement* e, const GmVector* coord, int ip) const
179 {
180 S_TRACE(); assert(e);
181 GmCellAccessor* SatLawAcc = propertyAc(SATLAW_ID);
182 if (SatLawAcc == NULL)
183 {
184 return 0;
185 }
186 return SatLawAcc->scalarValueAt(e, coord, ip);
187 }
188
190 virtual int liquidRelativePermeabilityId(const GmElement* e, const GmVector* coord, int ip) const
191 {
192 S_TRACE(); assert(e);
193 GmCellAccessor* LiqRelAcc = propertyAc(LRP_ID);
194 if (LiqRelAcc == NULL)
195 {
196 return 0;
197 }
198 return LiqRelAcc->scalarValueAt(e, coord, ip);
199 }
200
202 virtual int gasRelativePermeabilityId(const GmElement* e, const GmVector* coord, int ip) const
203 {
204 S_TRACE(); assert(e);
205 GmCellAccessor* GasRelAcc = propertyAc(GRP_ID);
206 if (GasRelAcc == NULL)
207 {
208 return 0;
209 }
210 return GasRelAcc->scalarValueAt(e, coord, ip);
211 }
212
214 virtual int liquidDensityModelId(const GmElement* e, const GmVector* coord, int ip) const
215 {
216 S_TRACE(); assert(e);
217 GmCellAccessor* FluidRhoAcc = propertyAc(LIQRHO_ID);
218 if (FluidRhoAcc == NULL)
219 {
220 return 0; // Constant density
221 }
222 return FluidRhoAcc->scalarValueAt(e, coord, ip);
223 }
224
226 virtual int gasDensityModelId(const GmElement* e, const GmVector* coord, int ip) const
227 {
228 S_TRACE(); assert(e);
229 GmCellAccessor* FluidRhoAcc = propertyAc(GASRHO_ID);
230 if (FluidRhoAcc == NULL)
231 {
232 return 0; // Constant density
233 }
234 return FluidRhoAcc->scalarValueAt(e, coord, ip);
235 }
236
238 virtual double intrinsicPermeability(const GmElement* e, const GmVector* coord, int ip) const
239 {
240 return propertyAc(K_ID)->scalarValueAt(e, coord, ip);
241 }
242
244 virtual bool checkIntrinsicPermeability(const GmElement* e, const GmVector* coord, int ip) const
245 {
246 S_TRACE(); assert(e);
247 // Check is element is an interface element
248 bool isInterface = e->geometry().isInterface();
249 if ((propertyAc(K_ID) == NULL) && (!isInterface))
250 {
251 return false;
252 }
253 return true;
254 }
255
257 virtual double porosity(const GmElement* e, const GmVector* coord, int ip) const
258 {
259 return propertyAc(Pht_ID)->scalarValueAt(e, coord, ip);
260 }
261
263 virtual bool checkPorosity(const GmElement* e, const GmVector* coord, int ip) const
264 {
265 S_TRACE(); assert(e);
266 // Check is element is an interface element
267 bool isInterface = e->geometry().isInterface();
268 if ((propertyAc(Pht_ID) == NULL) && (!isInterface))
269 {
270 return false;
271 }
272 return true;
273 }
274
276 double universalGasConstant(const GmElement* e, const GmVector* coord, int ip) const
277 {
278 return propertyAc(R_ID)->scalarValueAt(e, coord, ip);
279 }
280
282 virtual double temperature(const GmElement* e, const GmVector* coord, int ip) const
283 {
284 return propertyAc(T_ID)->scalarValueAt(e, coord, ip);
285 }
286
288 virtual double molarMassGas(const GmElement* e, const GmVector* coord, int ip) const
289 {
290 if (propertyAc(Mg_ID) == NULL)
291 {
292 return 0.0;
293 }
294 return propertyAc(Mg_ID)->scalarValueAt(e, coord, ip);
295 }
296
298 virtual double poreCompressibility(const GmElement* e, const GmVector* coord, int ip) const
299 {
300 if (propertyAc(Bp_ID) == NULL)
301 {
302 return 0.0;
303 }
304 return propertyAc(Bp_ID)->scalarValueAt(e, coord, ip);
305 }
306
308 virtual double liquidBulkModulus(const GmElement* e, const GmVector* coord, int ip) const
309 {
310 if (propertyAc(Kww_ID) == NULL)
311 {
312 return 1.0e25;
313 }
314 return propertyAc(Kww_ID)->scalarValueAt(e, coord, ip);
315 }
316
318 virtual double gasBulkModulus(const GmElement* e, const GmVector* coord, int ip) const
319 {
320 if (propertyAc(Kgg_ID) == NULL)
321 {
322 return 1.0e25;
323 }
324 return propertyAc(Kgg_ID)->scalarValueAt(e, coord, ip);
325 }
326
328 virtual double liquidReferencePressure(const GmElement* e, const GmVector* coord, int ip) const
329 {
330 return 0.0;
331 }
332
334 virtual double gasReferencePressure(const GmElement* e, const GmVector* coord, int ip) const
335 {
336 return 0.0;
337 }
338
340 virtual double liquidViscosity(const GmElement* e, const GmVector* coord, int ip) const
341 {
342 if (propertyAc(Uw_ID) == NULL)
343 {
344 return 1.0e25;
345 }
346 return propertyAc(Uw_ID)->scalarValueAt(e, coord, ip);
347 }
348
350 virtual double gasViscosity(const GmElement* e, const GmVector* coord, int ip) const
351 {
352 if (propertyAc(Ug_ID) == NULL)
353 {
354 return 1.0e25;
355 }
356 return propertyAc(Ug_ID)->scalarValueAt(e, coord, ip);
357 }
358
360 virtual double liqReferenceDensity(const GmElement* e, const GmVector* coord, int ip) const
361 {
362 if (propertyAc(Rhow_ID) == NULL)
363 {
364 return 0.0;
365 }
366 return propertyAc(Rhow_ID)->scalarValueAt(e, coord, ip);
367 }
368
369
371 virtual double gasReferenceDensity(const GmElement* e, const GmVector* coord, int ip) const
372 {
373 if (propertyAc(Rhog_ID) == NULL)
374 {
375 return 0.0;
376 }
377 return propertyAc(Rhog_ID)->scalarValueAt(e, coord, ip);
378 }
379
381 virtual double residualLiquidSaturation(const GmElement* e, const GmVector* coord, int ip) const
382 {
383 if (propertyAc(SLR_ID) == NULL)
384 {
385 return 0.0;
386 }
387 return propertyAc(SLR_ID)->scalarValueAt(e, coord, ip);
388 }
389
391 virtual double residualGasSaturation(const GmElement* e, const GmVector* coord, int ip) const
392 {
393 if (propertyAc(SGR_ID) == NULL)
394 {
395 return 0.0;
396 }
397 return propertyAc(SGR_ID)->scalarValueAt(e, coord, ip);
398 }
399
401 virtual double gasEntryPressure(const GmElement* e, const GmVector* coord, int ip) const
402 {
403 if (propertyAc(Pd_ID) == NULL)
404 {
405 return 0.0;
406 }
407 return propertyAc(Pd_ID)->scalarValueAt(e, coord, ip);
408 }
409
411 virtual double liquidPermeabilityFittingParameter(const GmElement* e, const GmVector* coord, int ip) const
412 {
413 if (propertyAc(LAMBDAL_ID) == NULL)
414 {
415 return 0.0;
416 }
417 return propertyAc(LAMBDAL_ID)->scalarValueAt(e, coord, ip);
418 }
419
421 virtual double gasPermeabilityFittingParameter(const GmElement* e, const GmVector* coord, int ip) const
422 {
423 if (propertyAc(LAMBDAG_ID) == NULL)
424 {
425 return 0.0;
426 }
427 return propertyAc(LAMBDAG_ID)->scalarValueAt(e, coord, ip);
428 }
429
431 virtual double saturationFittingParameter(const GmElement* e, const GmVector* coord, int ip) const
432 {
433 if (propertyAc(LAMBDA_ID) == NULL)
434 {
435 return 0.0;
436 }
437 return propertyAc(LAMBDA_ID)->scalarValueAt(e, coord, ip);
438 }
439
441 virtual double minimumRelativePermeability(const GmElement* e, const GmVector* coord, int ip) const
442 {
443 if (propertyAc(RPMIN_ID) == NULL)
444 {
445 return 1.0e-5;
446 }
447 return propertyAc(RPMIN_ID)->scalarValueAt(e, coord, ip);
448 }
449};
450
451#endif
bool isInterface() const
virtual GmCellGeometry geometry() const
Definition gmpHydraulicMaterialTwoPhase.h:30
virtual double liquidPermeabilityFittingParameter(const GmElement *e, const GmVector *coord, int ip) const
Returns the shape of the curve Krl x Sl.
Definition gmpHydraulicMaterialTwoPhase.h:411
virtual double minimumRelativePermeability(const GmElement *e, const GmVector *coord, int ip) const
Returns the minimum relative permeability.
Definition gmpHydraulicMaterialTwoPhase.h:441
virtual double gasPermeabilityFittingParameter(const GmElement *e, const GmVector *coord, int ip) const
Returns the shape of the curve Krg x Sl.
Definition gmpHydraulicMaterialTwoPhase.h:421
virtual double residualLiquidSaturation(const GmElement *e, const GmVector *coord, int ip) const
Returns the value of the residual water saturation degree.
Definition gmpHydraulicMaterialTwoPhase.h:381
virtual int liquidRelativePermeabilityId(const GmElement *e, const GmVector *coord, int ip) const
Returns the liquid phase relative permeability id.
Definition gmpHydraulicMaterialTwoPhase.h:190
virtual double porosity(const GmElement *e, const GmVector *coord, int ip) const
Returns the material porosity.
Definition gmpHydraulicMaterialTwoPhase.h:257
virtual double liqReferenceDensity(const GmElement *e, const GmVector *coord, int ip) const
Returns the liquid fluid density.
Definition gmpHydraulicMaterialTwoPhase.h:360
virtual double saturationFittingParameter(const GmElement *e, const GmVector *coord, int ip) const
Returns the shape of the curve Sw x pc.
Definition gmpHydraulicMaterialTwoPhase.h:431
virtual int gasRelativePermeabilityId(const GmElement *e, const GmVector *coord, int ip) const
Returns the gas phase relative permeability id.
Definition gmpHydraulicMaterialTwoPhase.h:202
TwoPhasePropertyIds
IDs for saturated material element properties.
Definition gmpHydraulicMaterialTwoPhase.h:34
@ Kww_ID
Id for retrieving the water bulk modulus accessor
Definition gmpHydraulicMaterialTwoPhase.h:41
@ GRP_ID
Id for retrieving the gas relative permeability id.
Definition gmpHydraulicMaterialTwoPhase.h:54
@ LIQRHO_ID
Id for retrieving the liquid density model.
Definition gmpHydraulicMaterialTwoPhase.h:48
@ LRP_ID
Id for retrieving the liquid relative permeability id.
Definition gmpHydraulicMaterialTwoPhase.h:45
@ Pht_ID
Id for retrieving the porosity accessor.
Definition gmpHydraulicMaterialTwoPhase.h:37
@ Uw_ID
Id for retrieving the water dynamic viscosity accessor
Definition gmpHydraulicMaterialTwoPhase.h:42
@ SATLAW_ID
Id for retrieving the saturation law id.
Definition gmpHydraulicMaterialTwoPhase.h:65
@ PCSLCURVE_ID
Id for retrieving the saturation law curve in the UMAT material.
Definition gmpHydraulicMaterialTwoPhase.h:66
@ Kgg_ID
Id for retrieving the gas bulk modulus accessor.
Definition gmpHydraulicMaterialTwoPhase.h:50
@ R_ID
Id for retrieving the gas density accessor.
Definition gmpHydraulicMaterialTwoPhase.h:59
@ NUM_PROPERTY_IDS
The number of property ids above.
Definition gmpHydraulicMaterialTwoPhase.h:70
@ Rhow_ID
Id for retrieving the water density accessor.
Definition gmpHydraulicMaterialTwoPhase.h:43
@ KRLCURVE_ID
Id for retrieving the liquid relative permeability curve in the UMAT material.
Definition gmpHydraulicMaterialTwoPhase.h:47
@ K_ID
Id for retrieving the intrinsic permeability accessor.
Definition gmpHydraulicMaterialTwoPhase.h:36
@ SLR_ID
Id for retrieving the residual water saturation degree.
Definition gmpHydraulicMaterialTwoPhase.h:46
@ Bp_ID
Id for retrieving the pore compressibility accessor.
Definition gmpHydraulicMaterialTwoPhase.h:38
@ T_ID
Id for retrieving the temperature accessor.
Definition gmpHydraulicMaterialTwoPhase.h:60
@ LAMBDAG_ID
Id for retrieving the curve Krg x Sl fitting parameter.
Definition gmpHydraulicMaterialTwoPhase.h:53
@ Rhog_ID
Id for retrieving the gas density accessor.
Definition gmpHydraulicMaterialTwoPhase.h:52
@ GASRHO_ID
Id for retrieving the gas density model.
Definition gmpHydraulicMaterialTwoPhase.h:57
@ RPMIN_ID
Id for retrieving the minimum relative permeability.
Definition gmpHydraulicMaterialTwoPhase.h:39
@ LAMBDA_ID
Id for retrieving the curve Sl x pc fitting parameter.
Definition gmpHydraulicMaterialTwoPhase.h:64
@ SGR_ID
Id for retrieving the residual water saturation degree.
Definition gmpHydraulicMaterialTwoPhase.h:55
@ LAMBDAL_ID
Id for retrieving the curve Krl x Sl fitting parameter.
Definition gmpHydraulicMaterialTwoPhase.h:44
@ KRGCURVE_ID
Id for retrieving the gas relative permeability curve in the UMAT material.
Definition gmpHydraulicMaterialTwoPhase.h:56
@ Ug_ID
Id for retrieving the gas dynamic viscosity accessor.
Definition gmpHydraulicMaterialTwoPhase.h:51
@ Mg_ID
Id for retrieving the molar mass accessor.
Definition gmpHydraulicMaterialTwoPhase.h:61
@ Pd_ID
Id for retrieving the pressure associated with the gas-entry value.
Definition gmpHydraulicMaterialTwoPhase.h:63
double universalGasConstant(const GmElement *e, const GmVector *coord, int ip) const
Returns the Universal gas constant R.
Definition gmpHydraulicMaterialTwoPhase.h:276
virtual double gasViscosity(const GmElement *e, const GmVector *coord, int ip) const
Returns the fluid dynamic viscosity.
Definition gmpHydraulicMaterialTwoPhase.h:350
virtual bool checkIntrinsicPermeability(const GmElement *e, const GmVector *coord, int ip) const
Check if continuum elements have the intrinsic permeability defined.
Definition gmpHydraulicMaterialTwoPhase.h:244
virtual double temperature(const GmElement *e, const GmVector *coord, int ip) const
Returns the Temperature from property table.
Definition gmpHydraulicMaterialTwoPhase.h:282
twoPhaseRelationships
IDs for the two-phase flow relationships.
Definition gmpHydraulicMaterialTwoPhase.h:94
@ NUM_TWOPHASEREL_IDS
The number of two-phase flow relationships.
Definition gmpHydraulicMaterialTwoPhase.h:101
virtual double liquidBulkModulus(const GmElement *e, const GmVector *coord, int ip) const
Returns the water bulk modulus.
Definition gmpHydraulicMaterialTwoPhase.h:308
virtual double residualGasSaturation(const GmElement *e, const GmVector *coord, int ip) const
Returns the value of the residual water saturation degree.
Definition gmpHydraulicMaterialTwoPhase.h:391
virtual double gasReferencePressure(const GmElement *e, const GmVector *coord, int ip) const
Return the gas fluid reference pressure.
Definition gmpHydraulicMaterialTwoPhase.h:334
virtual double molarMassGas(const GmElement *e, const GmVector *coord, int ip) const
Returns the material pore compressibility.
Definition gmpHydraulicMaterialTwoPhase.h:288
virtual double gasBulkModulus(const GmElement *e, const GmVector *coord, int ip) const
Returns the bulk modulus of another fluid.
Definition gmpHydraulicMaterialTwoPhase.h:318
GmpHydraulicMaterialTwoPhase(int typeIndex, QString typeName, const GmLogCategory &logger)
Constructor. Gets as parameters the material index and its name.
Definition gmpHydraulicMaterialTwoPhase.h:76
virtual int saturationLawId(const GmElement *e, const GmVector *coord, int ip) const
Returns the saturation law id.
Definition gmpHydraulicMaterialTwoPhase.h:178
virtual double liquidViscosity(const GmElement *e, const GmVector *coord, int ip) const
Returns the water dynamic viscosity.
Definition gmpHydraulicMaterialTwoPhase.h:340
virtual double poreCompressibility(const GmElement *e, const GmVector *coord, int ip) const
Returns the material pore compressibility.
Definition gmpHydraulicMaterialTwoPhase.h:298
virtual double gasEntryPressure(const GmElement *e, const GmVector *coord, int ip) const
Returns the value of the pressure associated with the gas-entry value.
Definition gmpHydraulicMaterialTwoPhase.h:401
virtual int gasDensityModelId(const GmElement *e, const GmVector *coord, int ip) const
Returns the gas fluid density model id.
Definition gmpHydraulicMaterialTwoPhase.h:226
virtual int liquidDensityModelId(const GmElement *e, const GmVector *coord, int ip) const
Returns the liquid fluid density model id.
Definition gmpHydraulicMaterialTwoPhase.h:214
virtual double gasReferenceDensity(const GmElement *e, const GmVector *coord, int ip) const
Returns the gas fluid density.
Definition gmpHydraulicMaterialTwoPhase.h:371
virtual bool checkPorosity(const GmElement *e, const GmVector *coord, int ip) const
Check if continuum elements have the porosity defined.
Definition gmpHydraulicMaterialTwoPhase.h:263
virtual double intrinsicPermeability(const GmElement *e, const GmVector *coord, int ip) const
Returns the intrinsic permeability.
Definition gmpHydraulicMaterialTwoPhase.h:238
static GmpFemPhysicsCommonMaterial * instance(GmSimulationData *simulation, int typeIndex, QString typeName, const GmLogCategory &logger)
A "factory" function used to register the material with the physics material factory.
Definition gmpHydraulicMaterialTwoPhase.h:80
fluidDensityModel
IDs for the two-phase flow relationships.
Definition gmpHydraulicMaterialTwoPhase.h:106
@ NUM_FLUIDDENSITY_IDS
The number of fluid density models.
Definition gmpHydraulicMaterialTwoPhase.h:114
virtual double liquidReferencePressure(const GmElement *e, const GmVector *coord, int ip) const
Return the liquid fluid reference pressure.
Definition gmpHydraulicMaterialTwoPhase.h:328
arma::mat GmMatrix
#define S_TRACE()
arma::vec GmVector
Declaration of the GmpHydraulicMaterialSaturated class.
Definition gmpHydraulic.h:47