Skip to content
Snippets Groups Projects
Commit 816b34c2 authored by wenqing's avatar wenqing
Browse files

[LF] Added a creator for LiquidFlowMaterialProperties and revised

 the associated source code.
parent 14c5bccb
No related branches found
No related tags found
No related merge requests found
/**
* \copyright
* Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org)
* Distributed under a Modified BSD License.
* See accompanying file LICENSE.txt or
* http://www.opengeosys.org/project/license
*
* \file CreateLiquidFlowMaterialProperties.cpp
*
* Created on December 14, 2016, 1:20 PM
*/
#include "CreateLiquidFlowMaterialProperties.h"
#include "BaseLib/ConfigTree.h"
#include "BaseLib/reorderVector.h"
#include "MeshLib/PropertyVector.h"
#include "MaterialLib/Fluid/FluidProperty.h"
#include "MaterialLib/PorousMedium/Porosity/Porosity.h"
#include "MaterialLib/PorousMedium/Storage/Storage.h"
#include "MaterialLib/Fluid/FluidProperties/CreateFluidProperties.h"
#include "MaterialLib/Fluid/FluidPropertyHeaders.h"
#include "MaterialLib/PorousMedium/PorousPropertyHeaders.h"
#include "LiquidFlowMaterialProperties.h"
namespace ProcessLib
{
namespace LiquidFlow
{
class LiquidFlowMaterialProperties;
std::unique_ptr<LiquidFlowMaterialProperties>
createLiquidFlowMaterialProperties(
BaseLib::ConfigTree const& config, bool const has_material_ids,
MeshLib::PropertyVector<int> const& material_ids)
{
DBUG("Reading material properties of liquid flow process.");
//! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__fluid}
auto const& fluid_config = config.getConfigSubtree("fluid");
auto fluid_properties =
MaterialLib::Fluid::createFluidProperties(fluid_config);
// Get porous properties
std::vector<Eigen::MatrixXd> intrinsic_permeability_models;
std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
porosity_models;
std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
storage_models;
std::vector<int> mat_ids;
//! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium}
auto const& poro_config = config.getConfigSubtree("porous_medium");
//! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium}
for (auto const& conf : poro_config.getConfigSubtreeList("porous_medium"))
{
//! \ogs_file_attr{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium__id}
auto const id = conf.getConfigAttributeOptional<int>("id");
mat_ids.push_back(*id);
//! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium__permeability}
auto const& perm_conf = conf.getConfigSubtree("permeability");
intrinsic_permeability_models.emplace_back(
MaterialLib::PorousMedium::createPermeabilityModel(perm_conf));
//! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium__porosity}
auto const& poro_conf = conf.getConfigSubtree("porosity");
auto n = MaterialLib::PorousMedium::createPorosityModel(poro_conf);
porosity_models.emplace_back(std::move(n));
//! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium__storage}
auto const& stora_conf = conf.getConfigSubtree("storage");
auto beta = MaterialLib::PorousMedium::createStorageModel(stora_conf);
storage_models.emplace_back(std::move(beta));
}
BaseLib::reorderVector(intrinsic_permeability_models, mat_ids);
BaseLib::reorderVector(porosity_models, mat_ids);
BaseLib::reorderVector(storage_models, mat_ids);
return std::unique_ptr<LiquidFlowMaterialProperties>(
new LiquidFlowMaterialProperties(
std::move(fluid_properties),
std::move(intrinsic_permeability_models),
std::move(porosity_models), std::move(storage_models),
has_material_ids, material_ids));
}
} // end of namespace
} // end of namespace
/**
* \copyright
* Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org)
* Distributed under a Modified BSD License.
* See accompanying file LICENSE.txt or
* http://www.opengeosys.org/project/license
*
* \file CreateLiquidFlowMaterialProperties.h
*
* Created on December 14, 2016, 1:20 PM
*/
#pragma once
#include <memory>
namespace BaseLib
{
class ConfigTree;
}
namespace MeshLib
{
template <typename PROP_VAL_TYPE>
class PropertyVector;
}
namespace ProcessLib
{
namespace LiquidFlow
{
class LiquidFlowMaterialProperties;
/// Create an instance of class LiquidFlowMaterialProperties
std::unique_ptr<LiquidFlowMaterialProperties>
createLiquidFlowMaterialProperties(
BaseLib::ConfigTree const& config, bool const has_material_ids,
MeshLib::PropertyVector<int> const& material_ids);
} // end of namespace
} // end of namespace
......@@ -30,10 +30,10 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>::
{
SpatialPosition pos;
pos.setElementID(_element.getID());
_material_properties.setMaterialID(pos);
_material_properties->setMaterialID(pos);
const Eigen::MatrixXd& perm =
_material_properties.getPermeability(t, pos, _element.getDimension());
_material_properties->getPermeability(t, pos, _element.getDimension());
// Note: For Inclined 1D in 2D/3D or 2D element in 3D, the first item in
// the assert must be changed to perm.rows() == _element->getDimension()
assert(perm.rows() == GlobalDim || perm.rows() == 1);
......@@ -87,16 +87,16 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>::
// Assemble mass matrix, M
local_M.noalias() +=
_material_properties.getMassCoefficient(
_material_properties->getMassCoefficient(
t, pos, porosity_variable, storage_variable, p, _temperature) *
sm.N.transpose() * sm.N * integration_factor;
// Compute density:
const double rho_g =
_material_properties.getLiquidDensity(p, _temperature) *
_material_properties->getLiquidDensity(p, _temperature) *
_gravitational_acceleration;
// Compute viscosity:
const double mu = _material_properties.getViscosity(p, _temperature);
const double mu = _material_properties->getViscosity(p, _temperature);
// Assemble Laplacian, K, and RHS by the gravitational term
LaplacianGravityVelocityCalculator::calculateLaplacianAndGravityTerm(
......@@ -113,9 +113,9 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>::
{
SpatialPosition pos;
pos.setElementID(_element.getID());
_material_properties.setMaterialID(pos);
_material_properties->setMaterialID(pos);
const Eigen::MatrixXd& perm =
_material_properties.getPermeability(t, pos, _element.getDimension());
_material_properties->getPermeability(t, pos, _element.getDimension());
// Note: For Inclined 1D in 2D/3D or 2D element in 3D, the first item in
// the assert must be changed to perm.rows() == _element->getDimension()
......@@ -155,10 +155,10 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>::
// TODO : compute _temperature from the heat transport pcs
const double rho_g =
_material_properties.getLiquidDensity(p, _temperature) *
_material_properties->getLiquidDensity(p, _temperature) *
_gravitational_acceleration;
// Compute viscosity:
const double mu = _material_properties.getViscosity(p, _temperature);
const double mu = _material_properties->getViscosity(p, _temperature);
LaplacianGravityVelocityCalculator::calculateVelocity(
_darcy_velocities, local_p_vec, sm, perm, ip, mu, rho_g,
......
......@@ -13,6 +13,7 @@
#pragma once
#include <vector>
#include <memory>
#include "MathLib/LinAlg/Eigen/EigenMapTools.h"
#include "NumLib/Extrapolation/ExtrapolatableElement.h"
......@@ -61,13 +62,15 @@ class LiquidFlowLocalAssembler : public LiquidFlowLocalAssemblerInterface
using GlobalDimVectorType = typename ShapeMatricesType::GlobalDimVectorType;
public:
LiquidFlowLocalAssembler(MeshLib::Element const& element,
std::size_t const /*local_matrix_size*/,
bool const is_axially_symmetric,
unsigned const integration_order,
int const gravitational_axis_id,
double const gravitational_acceleration,
LiquidFlowMaterialProperties& material_propertries)
LiquidFlowLocalAssembler(
MeshLib::Element const& element,
std::size_t const /*local_matrix_size*/,
bool const is_axially_symmetric,
unsigned const integration_order,
int const gravitational_axis_id,
double const gravitational_acceleration,
std::unique_ptr<LiquidFlowMaterialProperties> const&
material_propertries)
: _element(element),
_integration_method(integration_order),
_shape_matrices(initShapeMatrices<ShapeFunction, ShapeMatricesType,
......@@ -186,7 +189,7 @@ private:
const int _gravitational_axis_id;
const double _gravitational_acceleration;
LiquidFlowMaterialProperties& _material_properties;
const std::unique_ptr<LiquidFlowMaterialProperties>& _material_properties;
double _temperature;
};
......
......@@ -33,50 +33,6 @@ namespace ProcessLib
{
namespace LiquidFlow
{
LiquidFlowMaterialProperties::LiquidFlowMaterialProperties(
BaseLib::ConfigTree const& config,
bool const has_material_ids,
MeshLib::PropertyVector<int> const& material_ids)
: _has_material_ids(has_material_ids), _material_ids(material_ids)
{
DBUG("Reading material properties of liquid flow process.");
//! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__fluid}
auto const& fluid_config = config.getConfigSubtree("fluid");
_fluid_properties = MaterialLib::Fluid::createFluidProperties(fluid_config);
// Get porous properties
std::vector<int> mat_ids;
//! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium}
auto const& poro_config = config.getConfigSubtree("porous_medium");
//! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium}
for (auto const& conf : poro_config.getConfigSubtreeList("porous_medium"))
{
//! \ogs_file_attr{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium__id}
auto const id = conf.getConfigAttributeOptional<int>("id");
mat_ids.push_back(*id);
//! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium__permeability}
auto const& perm_conf = conf.getConfigSubtree("permeability");
_intrinsic_permeability_models.emplace_back(
MaterialLib::PorousMedium::createPermeabilityModel(perm_conf));
//! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium__porosity}
auto const& poro_conf = conf.getConfigSubtree("porosity");
auto n = MaterialLib::PorousMedium::createPorosityModel(poro_conf);
_porosity_models.emplace_back(std::move(n));
//! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium__storage}
auto const& stora_conf = conf.getConfigSubtree("storage");
auto beta = MaterialLib::PorousMedium::createStorageModel(stora_conf);
_storage_models.emplace_back(std::move(beta));
}
BaseLib::reorderVector(_intrinsic_permeability_models, mat_ids);
BaseLib::reorderVector(_porosity_models, mat_ids);
BaseLib::reorderVector(_storage_models, mat_ids);
}
void LiquidFlowMaterialProperties::setMaterialID(const SpatialPosition& pos)
{
if (!_has_material_ids)
......
......@@ -18,6 +18,9 @@
#include "MaterialLib/Fluid/FluidProperty.h"
#include "MaterialLib/Fluid/FluidProperties/FluidProperties.h"
#include "MaterialLib/PorousMedium/Porosity/Porosity.h"
#include "MaterialLib/PorousMedium/Storage/Storage.h"
namespace MaterialLib
{
namespace Fluid
......@@ -26,15 +29,6 @@ class FluidProperties;
}
}
namespace MaterialLib
{
namespace PorousMedium
{
class Porosity;
class Storage;
}
}
namespace BaseLib
{
class ConfigTree;
......@@ -58,9 +52,23 @@ public:
typedef MaterialLib::Fluid::FluidProperty::ArrayType ArrayType;
LiquidFlowMaterialProperties(
BaseLib::ConfigTree const& config,
std::unique_ptr<MaterialLib::Fluid::FluidProperties>&& fluid_properties,
std::vector<Eigen::MatrixXd>&& intrinsic_permeability_models,
std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&&
porosity_models,
std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&&
storage_models,
bool const has_material_ids,
MeshLib::PropertyVector<int> const& material_ids);
MeshLib::PropertyVector<int> const& material_ids)
: _has_material_ids(has_material_ids),
_material_ids(material_ids),
_fluid_properties(std::move(fluid_properties)),
_intrinsic_permeability_models(
std::move(intrinsic_permeability_models)),
_porosity_models(std::move(porosity_models)),
_storage_models(std::move(storage_models))
{
}
void setMaterialID(const SpatialPosition& pos);
......@@ -94,8 +102,6 @@ public:
double getViscosity(const double p, const double T) const;
private:
std::unique_ptr<MaterialLib::Fluid::FluidProperties> _fluid_properties;
/// A flag to indicate whether the reference member, _material_ids,
/// is not assigned.
const bool _has_material_ids;
......@@ -105,10 +111,14 @@ private:
MeshLib::PropertyVector<int> const& _material_ids;
int _current_material_id = 0;
std::vector<Eigen::MatrixXd> _intrinsic_permeability_models;
std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
const std::unique_ptr<MaterialLib::Fluid::FluidProperties>
_fluid_properties;
const std::vector<Eigen::MatrixXd> _intrinsic_permeability_models;
const std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
_porosity_models;
std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
const std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
_storage_models;
// Note: For the statistical data of porous media, they could be read from
......
......@@ -22,6 +22,8 @@
#include "MaterialLib/PorousMedium/Porosity/Porosity.h"
#include "MaterialLib/PorousMedium/Storage/Storage.h"
#include "CreateLiquidFlowMaterialProperties.h"
namespace ProcessLib
{
namespace LiquidFlow
......@@ -44,8 +46,8 @@ LiquidFlowProcess::LiquidFlowProcess(
std::move(secondary_variables), std::move(named_function_caller)),
_gravitational_axis_id(gravitational_axis_id),
_gravitational_acceleration(gravitational_acceleration),
_material_properties(
LiquidFlowMaterialProperties(config, has_material_ids, material_ids))
_material_properties(createLiquidFlowMaterialProperties(
config, has_material_ids, material_ids))
{
DBUG("Create Liquid flow process.");
}
......
......@@ -12,6 +12,8 @@
#pragma once
#include <memory>
#include "NumLib/DOF/LocalToGlobalIndexMap.h"
#include "ProcessLib/Process.h"
......@@ -88,7 +90,7 @@ private:
const int _gravitational_axis_id;
const double _gravitational_acceleration;
LiquidFlowMaterialProperties _material_properties;
const std::unique_ptr<LiquidFlowMaterialProperties> _material_properties;
std::vector<std::unique_ptr<LiquidFlowLocalAssemblerInterface>>
_local_assemblers;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment