std::unique_ptr<FluidProperties> createFluidProperties( BaseLib::ConfigTree const& config) { //! \ogs_file_param{material__fluid__density} auto const& rho_conf = config.getConfigSubtree("density"); auto liquid_density = MaterialLib::Fluid::createFluidDensityModel(rho_conf); //! \ogs_file_param{material__fluid__viscosity} auto const& mu_conf = config.getConfigSubtree("viscosity"); auto viscosity = MaterialLib::Fluid::createViscosityModel(mu_conf); const bool is_mu_density_dependent = (viscosity->getName().find("density dependent") != std::string::npos); bool is_cp_density_dependent = false; std::unique_ptr<MaterialLib::Fluid::FluidProperty> specific_heat_capacity = nullptr; auto heat_capacity__opt_conf = //! \ogs_file_param{material__fluid__specific_heat_capacity} config.getConfigSubtreeOptional("specific_heat_capacity"); if (heat_capacity__opt_conf) { const auto& heat_capacity_conf = *heat_capacity__opt_conf; specific_heat_capacity = createSpecificFluidHeatCapacityModel(heat_capacity_conf); is_cp_density_dependent = (specific_heat_capacity->getName().find("density dependent") != std::string::npos); } bool is_KT_density_dependent = false; std::unique_ptr<MaterialLib::Fluid::FluidProperty> thermal_conductivity = nullptr; auto const& thermal_conductivity_opt_conf = //! \ogs_file_param{material__fluid__thermal_conductivity} config.getConfigSubtreeOptional("thermal_conductivity"); if (thermal_conductivity_opt_conf) { auto const& thermal_conductivity_conf = *thermal_conductivity_opt_conf; thermal_conductivity = MaterialLib::Fluid::createFluidThermalConductivityModel( thermal_conductivity_conf); is_KT_density_dependent = (specific_heat_capacity->getName().find("density dependent") != std::string::npos); } if (is_mu_density_dependent || is_cp_density_dependent || is_KT_density_dependent) return std::make_unique< MaterialLib::Fluid::FluidPropertiesWithDensityDependentModels>( std::move(liquid_density), std::move(viscosity), std::move(specific_heat_capacity), std::move(thermal_conductivity), is_mu_density_dependent, is_cp_density_dependent, is_KT_density_dependent); return std::make_unique< MaterialLib::Fluid::PrimaryVariableDependentFluidProperties>( std::move(liquid_density), std::move(viscosity), std::move(specific_heat_capacity), std::move(thermal_conductivity)); }
static std::tuple<BoreholeGeometry, RefrigerantProperties, GroutParameters, FlowAndTemperatureControl, PipeConfigurationCoaxial> parseBHECoaxialConfig( BaseLib::ConfigTree const& config, std::map<std::string, std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const& curves) { auto const borehole_geometry = //! \ogs_file_param{prj__processes__process__HEAT_TRANSPORT_BHE__borehole_heat_exchangers__borehole_heat_exchanger__borehole} createBoreholeGeometry(config.getConfigSubtree("borehole")); //! \ogs_file_param{prj__processes__process__HEAT_TRANSPORT_BHE__borehole_heat_exchangers__borehole_heat_exchanger__pipes} auto const& pipes_config = config.getConfigSubtree("pipes"); //! \ogs_file_param{prj__processes__process__HEAT_TRANSPORT_BHE__borehole_heat_exchangers__borehole_heat_exchanger__pipes__outer} Pipe const outer_pipe = createPipe(pipes_config.getConfigSubtree("outer")); Pipe const inner_pipe = //! \ogs_file_param{prj__processes__process__HEAT_TRANSPORT_BHE__borehole_heat_exchangers__borehole_heat_exchanger__pipes__inner} createPipe(pipes_config.getConfigSubtree("inner")); const auto pipe_longitudinal_dispersion_length = //! \ogs_file_param{prj__processes__process__HEAT_TRANSPORT_BHE__borehole_heat_exchangers__borehole_heat_exchanger__pipes__longitudinal_dispersion_length} pipes_config.getConfigParameter<double>( "longitudinal_dispersion_length"); PipeConfigurationCoaxial const pipes{inner_pipe, outer_pipe, pipe_longitudinal_dispersion_length}; //! \ogs_file_param{prj__processes__process__HEAT_TRANSPORT_BHE__borehole_heat_exchangers__borehole_heat_exchanger__grout} auto const grout = createGroutParameters(config.getConfigSubtree("grout")); auto const refrigerant = //! \ogs_file_param{prj__processes__process__HEAT_TRANSPORT_BHE__borehole_heat_exchangers__borehole_heat_exchanger__refrigerant} createRefrigerantProperties(config.getConfigSubtree("refrigerant")); auto const flowAndTemperatureControl = createFlowAndTemperatureControl( //! \ogs_file_param{prj__processes__process__HEAT_TRANSPORT_BHE__borehole_heat_exchangers__borehole_heat_exchanger__flow_and_temperature_control} config.getConfigSubtree("flow_and_temperature_control"), curves, refrigerant); return {borehole_geometry, refrigerant, grout, flowAndTemperatureControl, pipes}; }
std::unique_ptr<Process> createGroundwaterFlowProcess( MeshLib::Mesh& mesh, Process::NonlinearSolver& nonlinear_solver, std::unique_ptr<Process::TimeDiscretization>&& time_discretization, std::vector<ProcessVariable> const& variables, std::vector<std::unique_ptr<ParameterBase>> const& parameters, BaseLib::ConfigTree const& config) { //! \ogs_file_param{process__type} config.checkConfigParameter("type", "GROUNDWATER_FLOW"); DBUG("Create GroundwaterFlowProcess."); // Process variable. auto process_variables = findProcessVariables( variables, config, {//! \ogs_file_param_special{process__GROUNDWATER_FLOW__process_variables__process_variable} "process_variable"}); // Hydraulic conductivity parameter. auto& hydraulic_conductivity = findParameter<double, MeshLib::Element const&>( config, //! \ogs_file_param_special{process__GROUNDWATER_FLOW__hydraulic_conductivity} "hydraulic_conductivity", parameters); DBUG("Use \'%s\' as hydraulic conductivity parameter.", hydraulic_conductivity.name.c_str()); GroundwaterFlowProcessData process_data{hydraulic_conductivity}; SecondaryVariableCollection secondary_variables{ //! \ogs_file_param{process__secondary_variables} config.getConfigSubtreeOptional("secondary_variables"), {//! \ogs_file_param_special{process__GROUNDWATER_FLOW__secondary_variables__darcy_velocity_x} "darcy_velocity_x", //! \ogs_file_param_special{process__GROUNDWATER_FLOW__secondary_variables__darcy_velocity_y} "darcy_velocity_y", //! \ogs_file_param_special{process__GROUNDWATER_FLOW__secondary_variables__darcy_velocity_z} "darcy_velocity_z"}}; ProcessOutput //! \ogs_file_param{process__output} process_output{config.getConfigSubtree("output"), process_variables, secondary_variables}; return std::unique_ptr<Process>{new GroundwaterFlowProcess{ mesh, nonlinear_solver, std::move(time_discretization), std::move(process_variables), std::move(process_data), std::move(secondary_variables), std::move(process_output)}}; }
ProjectData::ProjectData(BaseLib::ConfigTree const& project_config, std::string const& project_directory, std::string const& output_directory) { std::string const geometry_file = BaseLib::copyPathToFileName( //! \ogs_file_param{prj__geometry} project_config.getConfigParameter<std::string>("geometry"), project_directory); detail::readGeometry(geometry_file, *_geoObjects); { //! \ogs_file_param{prj__mesh} auto const mesh_param = project_config.getConfigParameter("mesh"); std::string const mesh_file = BaseLib::copyPathToFileName( mesh_param.getValue<std::string>(), project_directory); MeshLib::Mesh* const mesh = MeshLib::IO::readMeshFromFile(mesh_file); if (!mesh) { OGS_FATAL("Could not read mesh from \'%s\' file. No mesh added.", mesh_file.c_str()); } if (auto const axially_symmetric = //! \ogs_file_attr{prj__mesh__axially_symmetric} mesh_param.getConfigAttributeOptional<bool>("axially_symmetric")) { mesh->setAxiallySymmetric(*axially_symmetric); } _mesh_vec.push_back(mesh); } //! \ogs_file_param{prj__curves} parseCurves(project_config.getConfigSubtreeOptional("curves")); //! \ogs_file_param{prj__parameters} parseParameters(project_config.getConfigSubtree("parameters")); //! \ogs_file_param{prj__process_variables} parseProcessVariables(project_config.getConfigSubtree("process_variables")); //! \ogs_file_param{prj__processes} parseProcesses(project_config.getConfigSubtree("processes"), project_directory, output_directory); //! \ogs_file_param{prj__linear_solvers} parseLinearSolvers(project_config.getConfigSubtree("linear_solvers")); //! \ogs_file_param{prj__nonlinear_solvers} parseNonlinearSolvers(project_config.getConfigSubtree("nonlinear_solvers")); //! \ogs_file_param{prj__time_loop} parseTimeLoop(project_config.getConfigSubtree("time_loop"), output_directory); }
std::unique_ptr<RelativePermeability> createRelativePermeabilityModel( BaseLib::ConfigTree const& config) { //! \ogs_file_param{material__porous_medium__relative_permeability__type} auto const type = config.peekConfigParameter<std::string>("type"); if (type == "WettingPhaseVanGenuchten") { return createWettingPhaseVanGenuchten(config); } if (type == "NonWettingPhaseVanGenuchten") { return createNonWettingPhaseVanGenuchten(config); } if (type == "WettingPhaseBrooksCoreyOilGas") { return createWettingPhaseBrooksCoreyOilGas(config); } if (type == "NonWettingPhaseBrooksCoreyOilGas") { return createNonWettingPhaseBrooksCoreyOilGas(config); } if (type == "Curve") { //! \ogs_file_param{material__porous_medium__relative_permeability__type} config.checkConfigParameter("type", "Curve"); //! \ogs_file_param{material__porous_medium__relative_permeability__Curve__curve} auto const& curve_config = config.getConfigSubtree("curve"); auto curve = MathLib::createPiecewiseLinearCurve<MathLib ::PiecewiseLinearInterpolation>(curve_config); return std::make_unique<RelativePermeabilityCurve>(std::move(curve)); } OGS_FATAL( "The relative permeability model %s is unavailable.\n" "The available models are:" "\n\tWettingPhaseVanGenuchten," "\n\tNonWettingPhaseVanGenuchten," "\n\tWettingPhaseBrooksCoreyOilGas," "\n\tNonWettingPhaseBrooksCoreyOilGas,", "\n\tCurve.\n", type.data()); }
std::vector<std::reference_wrapper<ProcessVariable>> findProcessVariables( std::vector<ProcessVariable> const& variables, BaseLib::ConfigTree const& process_config, std::initializer_list<std::string> tag_names) { std::vector<std::reference_wrapper<ProcessVariable>> vars; vars.reserve(tag_names.size()); //! \ogs_file_param{process__process_variables} auto const pv_conf = process_config.getConfigSubtree("process_variables"); for (auto const& tag : tag_names) { vars.emplace_back(findProcessVariable(variables, pv_conf, tag)); } return vars; }
std::unique_ptr<Process> createTESProcess( MeshLib::Mesh& mesh, std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler, std::vector<ProcessVariable> const& variables, std::vector<std::unique_ptr<ParameterBase>> const& parameters, unsigned const integration_order, BaseLib::ConfigTree const& config) { //! \ogs_file_param{prj__processes__process__type} config.checkConfigParameter("type", "TES"); DBUG("Create TESProcess."); //! \ogs_file_param{prj__processes__process__TES__process_variables} auto const pv_config = config.getConfigSubtree("process_variables"); auto per_process_variables = findProcessVariables( variables, pv_config, { //! \ogs_file_param_special{prj__processes__process__TES__process_variables__fluid_pressure} "fluid_pressure", //! \ogs_file_param_special{prj__processes__process__TES__process_variables__temperature} "temperature", //! \ogs_file_param_special{prj__processes__process__TES__process_variables__vapour_mass_fraction} "vapour_mass_fraction"}); std::vector<std::vector<std::reference_wrapper<ProcessVariable>>> process_variables; process_variables.push_back(std::move(per_process_variables)); SecondaryVariableCollection secondary_variables; NumLib::NamedFunctionCaller named_function_caller( {"TES_pressure", "TES_temperature", "TES_vapour_mass_fraction"}); ProcessLib::createSecondaryVariables(config, secondary_variables, named_function_caller); return std::make_unique<TESProcess>( mesh, std::move(jacobian_assembler), parameters, integration_order, std::move(process_variables), std::move(secondary_variables), std::move(named_function_caller), config); }
std::unique_ptr<TwoPhaseFlowWithPrhoMaterialProperties> createTwoPhaseFlowPrhoMaterialProperties( BaseLib::ConfigTree const& config, boost::optional<MeshLib::PropertyVector<int> const&> material_ids, std::vector<std::unique_ptr<ParameterBase>> const& parameters) { DBUG("Reading material properties of two-phase flow process."); //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__fluid} auto const& fluid_config = config.getConfigSubtree("fluid"); // Get fluid properties //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__liquid_density} auto const& rho_conf = fluid_config.getConfigSubtree("liquid_density"); auto _liquid_density = MaterialLib::Fluid::createFluidDensityModel(rho_conf); //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__gas_density} auto const& rho_gas_conf = fluid_config.getConfigSubtree("gas_density"); auto _gas_density = MaterialLib::Fluid::createFluidDensityModel(rho_gas_conf); //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__liquid_viscosity} auto const& mu_conf = fluid_config.getConfigSubtree("liquid_viscosity"); auto _viscosity = MaterialLib::Fluid::createViscosityModel(mu_conf); //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__gas_viscosity} auto const& mu_gas_conf = fluid_config.getConfigSubtree("gas_viscosity"); auto _gas_viscosity = MaterialLib::Fluid::createViscosityModel(mu_gas_conf); // Get porous properties std::vector<int> mat_ids; std::vector<int> mat_krel_ids; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> _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< std::unique_ptr<MaterialLib::PorousMedium::CapillaryPressureSaturation>> _capillary_pressure_models; std::vector< std::unique_ptr<MaterialLib::PorousMedium::RelativePermeability>> _relative_permeability_models; //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium} auto const& poro_config = config.getConfigSubtree("porous_medium"); //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium} for (auto const& conf : poro_config.getConfigSubtreeList("porous_medium")) { //! \ogs_file_attr{prj__processes__process__TWOPHASE_FLOW_PRHO__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__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__permeability} auto const& permeability_conf = conf.getConfigSubtree("permeability"); _intrinsic_permeability_models.emplace_back( MaterialLib::PorousMedium::createPermeabilityModel( permeability_conf, parameters)); //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__porosity} auto const& porosity_conf = conf.getConfigSubtree("porosity"); auto n = MaterialLib::PorousMedium::createPorosityModel(porosity_conf, parameters); _porosity_models.emplace_back(std::move(n)); //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__storage} auto const& storage_conf = conf.getConfigSubtree("storage"); auto beta = MaterialLib::PorousMedium::createStorageModel(storage_conf); _storage_models.emplace_back(std::move(beta)); auto const& capillary_pressure_conf = //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__capillary_pressure} conf.getConfigSubtree("capillary_pressure"); auto pc = MaterialLib::PorousMedium::createCapillaryPressureModel( capillary_pressure_conf); _capillary_pressure_models.emplace_back(std::move(pc)); auto const& krel_config = //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__relative_permeability} conf.getConfigSubtree("relative_permeability"); for ( auto const& krel_conf : //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__relative_permeability__relative_permeability} krel_config.getConfigSubtreeList("relative_permeability")) { auto const krel_id = //! \ogs_file_attr{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__relative_permeability__relative_permeability__id} krel_conf.getConfigAttributeOptional<int>("id"); mat_krel_ids.push_back(*krel_id); auto krel_n = MaterialLib::PorousMedium::createRelativePermeabilityModel( krel_conf); _relative_permeability_models.emplace_back(std::move(krel_n)); } BaseLib::reorderVector(_relative_permeability_models, mat_krel_ids); } BaseLib::reorderVector(_intrinsic_permeability_models, mat_ids); BaseLib::reorderVector(_porosity_models, mat_ids); BaseLib::reorderVector(_storage_models, mat_ids); return std::make_unique<TwoPhaseFlowWithPrhoMaterialProperties>( material_ids, std::move(_liquid_density), std::move(_viscosity), std::move(_gas_density), std::move(_gas_viscosity), std::move(_intrinsic_permeability_models), std::move(_porosity_models), std::move(_storage_models), std::move(_capillary_pressure_models), std::move(_relative_permeability_models)); }
std::unique_ptr<Process> createTwoPhaseFlowWithPPProcess( MeshLib::Mesh& mesh, std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler, std::vector<ProcessVariable> const& variables, std::vector<std::unique_ptr<ParameterBase>> const& parameters, unsigned const integration_order, BaseLib::ConfigTree const& config, std::map<std::string, std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const& curves) { //! \ogs_file_param{prj__processes__process__type} config.checkConfigParameter("type", "TWOPHASE_FLOW_PP"); DBUG("Create TwoPhaseFlowProcess with PP model."); //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PP__process_variables} auto const pv_config = config.getConfigSubtree("process_variables"); auto per_process_variables = findProcessVariables( variables, pv_config, {//! \ogs_file_param_special{prj__processes__process__TWOPHASE_FLOW_PP__process_variables__gas_pressure} "gas_pressure", //! \ogs_file_param_special{prj__processes__process__TWOPHASE_FLOW_PP__process_variables__capillary_pressure} "capillary_pressure"}); std::vector<std::vector<std::reference_wrapper<ProcessVariable>>> process_variables; process_variables.push_back(std::move(per_process_variables)); SecondaryVariableCollection secondary_variables; NumLib::NamedFunctionCaller named_function_caller( {"TwoPhaseFlow_pressure"}); ProcessLib::createSecondaryVariables(config, secondary_variables, named_function_caller); // Specific body force std::vector<double> const b = //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PP__specific_body_force} config.getConfigParameter<std::vector<double>>("specific_body_force"); assert(!b.empty() && b.size() < 4); Eigen::VectorXd specific_body_force(b.size()); bool const has_gravity = MathLib::toVector(b).norm() > 0; if (has_gravity) std::copy_n(b.data(), b.size(), specific_body_force.data()); //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PP__mass_lumping} auto const mass_lumping = config.getConfigParameter<bool>("mass_lumping"); auto& temperature = findParameter<double>( config, //! \ogs_file_param_special{prj__processes__process__TWOPHASE_FLOW_PP__temperature} "temperature", parameters, 1); //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PP__material_property} auto const& mat_config = config.getConfigSubtree("material_property"); auto const material_ids = materialIDs(mesh); if (material_ids) { INFO("The twophase flow is in heterogeneous porous media."); } else { INFO("The twophase flow is in homogeneous porous media."); } std::unique_ptr<TwoPhaseFlowWithPPMaterialProperties> material = createTwoPhaseFlowWithPPMaterialProperties(mat_config, material_ids, parameters); TwoPhaseFlowWithPPProcessData process_data{ specific_body_force, has_gravity, mass_lumping, temperature, std::move(material)}; return std::make_unique<TwoPhaseFlowWithPPProcess>( mesh, std::move(jacobian_assembler), parameters, integration_order, std::move(process_variables), std::move(process_data), std::move(secondary_variables), std::move(named_function_caller), mat_config, curves); }
std::unique_ptr<Process> createSmallDeformationProcess( MeshLib::Mesh& mesh, std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler, std::vector<ProcessVariable> const& variables, std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters, boost::optional<ParameterLib::CoordinateSystem> const& local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const& config) { //! \ogs_file_param{prj__processes__process__type} config.checkConfigParameter("type", "SMALL_DEFORMATION_WITH_LIE"); DBUG("Create SmallDeformationProcess with LIE."); // Process variables //! \ogs_file_param{prj__processes__process__SMALL_DEFORMATION_WITH_LIE__process_variables} auto const pv_conf = config.getConfigSubtree("process_variables"); auto range = //! \ogs_file_param{prj__processes__process__SMALL_DEFORMATION_WITH_LIE__process_variables__process_variable} pv_conf.getConfigParameterList<std::string>("process_variable"); std::vector<std::reference_wrapper<ProcessVariable>> per_process_variables; std::size_t n_var_du = 0; for (std::string const& pv_name : range) { if (pv_name != "displacement" && pv_name.find("displacement_jump") != 0) { OGS_FATAL( "Found a process variable name '%s'. It should be " "'displacement' or 'displacement_jumpN' or " "'displacement_junctionN'"); } if (pv_name.find("displacement_jump") == 0) { n_var_du++; } auto variable = std::find_if(variables.cbegin(), variables.cend(), [&pv_name](ProcessVariable const& v) { return v.getName() == pv_name; }); if (variable == variables.end()) { OGS_FATAL( "Could not find process variable '%s' in the provided " "variables " "list for config tag <%s>.", pv_name.c_str(), "process_variable"); } DBUG("Found process variable '%s' for config tag <%s>.", variable->getName().c_str(), "process_variable"); per_process_variables.emplace_back( const_cast<ProcessVariable&>(*variable)); } if (n_var_du < 1) { OGS_FATAL("No displacement jump variables are specified"); } DBUG("Associate displacement with process variable '%s'.", per_process_variables.back().get().getName().c_str()); if (per_process_variables.back().get().getNumberOfComponents() != DisplacementDim) { OGS_FATAL( "Number of components of the process variable '%s' is different " "from the displacement dimension: got %d, expected %d", per_process_variables.back().get().getName().c_str(), per_process_variables.back().get().getNumberOfComponents(), DisplacementDim); } std::vector<std::vector<std::reference_wrapper<ProcessVariable>>> process_variables; process_variables.push_back(std::move(per_process_variables)); auto solid_constitutive_relations = MaterialLib::Solids::createConstitutiveRelations<DisplacementDim>( parameters, local_coordinate_system, config); // Fracture constitutive relation. // read type; auto const fracture_model_config = //! \ogs_file_param{prj__processes__process__SMALL_DEFORMATION_WITH_LIE__fracture_model} config.getConfigSubtree("fracture_model"); auto const frac_type = //! \ogs_file_param{prj__processes__process__SMALL_DEFORMATION_WITH_LIE__fracture_model__type} fracture_model_config.peekConfigParameter<std::string>("type"); std::unique_ptr<MaterialLib::Fracture::FractureModelBase<DisplacementDim>> fracture_model = nullptr; if (frac_type == "LinearElasticIsotropic") { fracture_model = MaterialLib::Fracture::createLinearElasticIsotropic< DisplacementDim>(parameters, fracture_model_config); } else if (frac_type == "MohrCoulomb") { fracture_model = MaterialLib::Fracture::createMohrCoulomb<DisplacementDim>( parameters, fracture_model_config); } else if (frac_type == "CohesiveZoneModeI") { fracture_model = MaterialLib::Fracture::CohesiveZoneModeI::createCohesiveZoneModeI< DisplacementDim>(parameters, fracture_model_config); } else { OGS_FATAL( "Cannot construct fracture constitutive relation of given type " "'%s'.", frac_type.c_str()); } // Fracture properties std::vector<FractureProperty> fracture_properties; for ( auto fracture_properties_config : //! \ogs_file_param{prj__processes__process__SMALL_DEFORMATION_WITH_LIE__fracture_properties} config.getConfigSubtreeList("fracture_properties")) { fracture_properties.emplace_back( fracture_properties.size(), //! \ogs_file_param{prj__processes__process__SMALL_DEFORMATION_WITH_LIE__fracture_properties__material_id} fracture_properties_config.getConfigParameter<int>("material_id"), ParameterLib::findParameter<double>( //! \ogs_file_param_special{prj__processes__process__SMALL_DEFORMATION_WITH_LIE__fracture_properties__initial_aperture} fracture_properties_config, "initial_aperture", parameters, 1)); } if (n_var_du < fracture_properties.size()) { OGS_FATAL( "The number of displacement jumps and the number of " "<fracture_properties> " "are not consistent"); } // Reference temperature const auto& reference_temperature = //! \ogs_file_param{prj__processes__process__SMALL_DEFORMATION_WITH_LIE__reference_temperature} config.getConfigParameter<double>( "reference_temperature", std::numeric_limits<double>::quiet_NaN()); SmallDeformationProcessData<DisplacementDim> process_data( materialIDs(mesh), std::move(solid_constitutive_relations), std::move(fracture_model), std::move(fracture_properties), reference_temperature); SecondaryVariableCollection secondary_variables; NumLib::NamedFunctionCaller named_function_caller( {"SmallDeformation_displacement"}); ProcessLib::createSecondaryVariables(config, secondary_variables, named_function_caller); return std::make_unique<SmallDeformationProcess<DisplacementDim>>( mesh, std::move(jacobian_assembler), parameters, integration_order, std::move(process_variables), std::move(process_data), std::move(secondary_variables), std::move(named_function_caller)); }
std::unique_ptr<Process> createLiquidFlowProcess( MeshLib::Mesh& mesh, std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler, std::vector<ProcessVariable> const& variables, std::vector<std::unique_ptr<ParameterBase>> const& parameters, unsigned const integration_order, BaseLib::ConfigTree const& config) { //! \ogs_file_param{process__type} config.checkConfigParameter("type", "LIQUID_FLOW"); DBUG("Create LiquidFlowProcess."); // Process variable. auto process_variables = findProcessVariables( variables, config, {//! \ogs_file_param_special{process__LIQUID_FLOW__process_variables__process_variable} "process_variable"}); SecondaryVariableCollection secondary_variables; NumLib::NamedFunctionCaller named_function_caller({"LiquidFlow_pressure"}); ProcessLib::parseSecondaryVariables(config, secondary_variables, named_function_caller); // Get the gravity vector for the Darcy velocity //! \ogs_file_param{process__LIQUID_FLOW__darcy_gravity} auto const& darcy_g_config = config.getConfigSubtree("darcy_gravity"); const int gravity_axis_id_input = //! \ogs_file_param_special{process__LIQUID_FLOW__darcy_gravity_axis_id} darcy_g_config.getConfigParameter<int>("axis_id"); assert(gravity_axis_id_input < static_cast<int>(mesh.getDimension())); const double g = //! \ogs_file_param_special{process__LIQUID_FLOW__darcy_gravity_g} darcy_g_config.getConfigParameter<double>("g"); assert(g >= 0.); const int gravity_axis_id = (g == 0.) ? -1 : gravity_axis_id_input; //! \ogs_file_param{process__LIQUID_FLOW__material_property} auto const& mat_config = config.getConfigSubtree("material_property"); auto const& mat_ids = mesh.getProperties().getPropertyVector<int>("MaterialIDs"); if (mat_ids) { INFO("The liquid flow is in heterogeneous porous media."); const bool has_material_ids = true; return std::unique_ptr<Process>{new LiquidFlowProcess{ mesh, std::move(jacobian_assembler), parameters, integration_order, std::move(process_variables), std::move(secondary_variables), std::move(named_function_caller), *mat_ids, has_material_ids, gravity_axis_id, g, mat_config}}; } else { INFO("The liquid flow is in homogeneous porous media."); MeshLib::Properties dummy_property; // For a reference argument of LiquidFlowProcess(...). auto const& dummy_property_vector = dummy_property.createNewPropertyVector<int>( "MaterialIDs", MeshLib::MeshItemType::Cell, 1); // Since dummy_property_vector is only visible in this function, // the following constant, has_material_ids, is employed to indicate // that material_ids does not exist. const bool has_material_ids = false; return std::unique_ptr<Process>{new LiquidFlowProcess{ mesh, std::move(jacobian_assembler), parameters, integration_order, std::move(process_variables), std::move(secondary_variables), std::move(named_function_caller), *dummy_property_vector, has_material_ids, gravity_axis_id, g, mat_config}}; } }
std::unique_ptr<RichardsFlowMaterialProperties> createRichardsFlowMaterialProperties( BaseLib::ConfigTree const& config, MeshLib::PropertyVector<int> const* const material_ids, std::vector<std::unique_ptr<ParameterBase>> const& parameters) { DBUG("Reading material properties of Richards flow process."); //! \ogs_file_param{prj__processes__process__RICHARDS_FLOW__material_property__fluid} auto const& fluid_config = config.getConfigSubtree("fluid"); auto fluid_properties = MaterialLib::Fluid::createFluidProperties(fluid_config); // Get porous properties std::vector<int> mat_ids; std::vector<int> mat_krel_ids; std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> 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< std::unique_ptr<MaterialLib::PorousMedium::CapillaryPressureSaturation>> capillary_pressure_models; std::vector< std::unique_ptr<MaterialLib::PorousMedium::RelativePermeability>> relative_permeability_models; //! \ogs_file_param{prj__processes__process__RICHARDS_FLOW__material_property__porous_medium} auto const& poro_config = config.getConfigSubtree("porous_medium"); //! \ogs_file_param{prj__processes__process__RICHARDS_FLOW__material_property__porous_medium__porous_medium} for (auto const& conf : poro_config.getConfigSubtreeList("porous_medium")) { //! \ogs_file_attr{prj__processes__process__RICHARDS_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__RICHARDS_FLOW__material_property__porous_medium__porous_medium__permeability} auto const& permeability_conf = conf.getConfigSubtree("permeability"); intrinsic_permeability_models.emplace_back( MaterialLib::PorousMedium::createPermeabilityModel( permeability_conf, parameters)); //! \ogs_file_param{prj__processes__process__RICHARDS_FLOW__material_property__porous_medium__porous_medium__porosity} auto const& porosity_conf = conf.getConfigSubtree("porosity"); auto n = MaterialLib::PorousMedium::createPorosityModel(porosity_conf, parameters); porosity_models.emplace_back(std::move(n)); //! \ogs_file_param{prj__processes__process__RICHARDS_FLOW__material_property__porous_medium__porous_medium__storage} auto const& storage_conf = conf.getConfigSubtree("storage"); auto beta = MaterialLib::PorousMedium::createStorageModel(storage_conf); storage_models.emplace_back(std::move(beta)); auto const& capillary_pressure_conf = //! \ogs_file_param{prj__processes__process__RICHARDS_FLOW__material_property__porous_medium__porous_medium__capillary_pressure} conf.getConfigSubtree("capillary_pressure"); auto pc = MaterialLib::PorousMedium::createCapillaryPressureModel( capillary_pressure_conf); capillary_pressure_models.emplace_back(std::move(pc)); auto const& krel_config = //! \ogs_file_param{prj__processes__process__RICHARDS_FLOW__material_property__porous_medium__porous_medium__relative_permeability} conf.getConfigSubtree("relative_permeability"); auto krel = MaterialLib::PorousMedium::createRelativePermeabilityModel( krel_config); relative_permeability_models.emplace_back(std::move(krel)); } BaseLib::reorderVector(intrinsic_permeability_models, mat_ids); BaseLib::reorderVector(porosity_models, mat_ids); BaseLib::reorderVector(storage_models, mat_ids); return std::unique_ptr<RichardsFlowMaterialProperties>{ new RichardsFlowMaterialProperties{ material_ids, std::move(fluid_properties), std::move(intrinsic_permeability_models), std::move(porosity_models), std::move(storage_models), std::move(capillary_pressure_models), std::move(relative_permeability_models)}}; }
std::unique_ptr<Process> createPhaseFieldProcess( MeshLib::Mesh& mesh, std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler, std::vector<ProcessVariable> const& variables, std::vector<std::unique_ptr<ParameterBase>> const& parameters, unsigned const integration_order, BaseLib::ConfigTree const& config) { //! \ogs_file_param{prj__processes__process__type} config.checkConfigParameter("type", "PHASE_FIELD"); DBUG("Create PhaseFieldProcess."); auto const staggered_scheme = //! \ogs_file_param{prj__processes__process__PHASE_FIELD__coupling_scheme} config.getConfigParameterOptional<std::string>("coupling_scheme"); const bool use_monolithic_scheme = !(staggered_scheme && (*staggered_scheme == "staggered")); // Process variable. //! \ogs_file_param{prj__processes__process__PHASE_FIELD__process_variables} auto const pv_config = config.getConfigSubtree("process_variables"); ProcessVariable* variable_ph; ProcessVariable* variable_u; std::vector<std::vector<std::reference_wrapper<ProcessVariable>>> process_variables; if (use_monolithic_scheme) // monolithic scheme. { auto per_process_variables = findProcessVariables( variables, pv_config, {//! \ogs_file_param_special{prj__processes__process__PHASE_FIELD__process_variables__phasefield} "phasefield", //! \ogs_file_param_special{prj__processes__process__PHASE_FIELD__process_variables__displacement} "displacement"}); variable_ph = &per_process_variables[0].get(); variable_u = &per_process_variables[1].get(); process_variables.push_back(std::move(per_process_variables)); } else // staggered scheme. { using namespace std::string_literals; for (auto const& variable_name : {"phasefield"s, "displacement"s}) { auto per_process_variables = findProcessVariables(variables, pv_config, {variable_name}); process_variables.push_back(std::move(per_process_variables)); } variable_ph = &process_variables[0][0].get(); variable_u = &process_variables[1][0].get(); } DBUG("Associate displacement with process variable \'%s\'.", variable_u->getName().c_str()); if (variable_u->getNumberOfComponents() != DisplacementDim) { OGS_FATAL( "Number of components of the process variable '%s' is different " "from the displacement dimension: got %d, expected %d", variable_u->getName().c_str(), variable_u->getNumberOfComponents(), DisplacementDim); } DBUG("Associate phase field with process variable \'%s\'.", variable_ph->getName().c_str()); if (variable_ph->getNumberOfComponents() != 1) { OGS_FATAL( "Pressure process variable '%s' is not a scalar variable but has " "%d components.", variable_ph->getName().c_str(), variable_ph->getNumberOfComponents()); } // Constitutive relation. // read type; auto const constitutive_relation_config = //! \ogs_file_param{prj__processes__process__PHASE_FIELD__constitutive_relation} config.getConfigSubtree("constitutive_relation"); auto const phasefield_parameters_config = //! \ogs_file_param{prj__processes__process__PHASE_FIELD__phasefield_parameters} config.getConfigSubtree("phasefield_parameters"); auto const type = //! \ogs_file_param{prj__processes__process__PHASE_FIELD__constitutive_relation__type} constitutive_relation_config.peekConfigParameter<std::string>("type"); std::unique_ptr<MaterialLib::Solids::PhaseFieldExtension<DisplacementDim>> material = nullptr; if (type == "LinearElasticIsotropic") { auto elastic_model = MaterialLib::Solids::createLinearElasticIsotropic< DisplacementDim>(parameters, constitutive_relation_config); material = std::make_unique<MaterialLib::Solids::LinearElasticIsotropicPhaseField< DisplacementDim>>(std::move(elastic_model->getMaterialProperties())); } else { OGS_FATAL( "Cannot construct constitutive relation of given type \'%s\'.", type.c_str()); } // Residual stiffness auto& residual_stiffness = findParameter<double>( phasefield_parameters_config, //! \ogs_file_param_special{prj__processes__process__PHASE_FIELD__phasefield_parameters__residual_stiffness} "residual_stiffness", parameters, 1); DBUG("Use \'%s\' as residual stiffness.", residual_stiffness.name.c_str()); // Crack resistance auto& crack_resistance = findParameter<double>( phasefield_parameters_config, //! \ogs_file_param_special{prj__processes__process__PHASE_FIELD__phasefield_parameters__crack_resistance} "crack_resistance", parameters, 1); DBUG("Use \'%s\' as crack resistance.", crack_resistance.name.c_str()); // Crack length scale auto& crack_length_scale = findParameter<double>( phasefield_parameters_config, //! \ogs_file_param_special{prj__processes__process__PHASE_FIELD__phasefield_parameters__crack_length_scale} "crack_length_scale", parameters, 1); DBUG("Use \'%s\' as crack length scale.", crack_length_scale.name.c_str()); // Kinetic coefficient auto& kinetic_coefficient = findParameter<double>( phasefield_parameters_config, //! \ogs_file_param_special{prj__processes__process__PHASE_FIELD__phasefield_parameters__kinetic_coefficient} "kinetic_coefficient", parameters, 1); DBUG("Use \'%s\' as kinetic coefficient.", kinetic_coefficient.name.c_str()); // Solid density auto& solid_density = findParameter<double>( config, //! \ogs_file_param_special{prj__processes__process__PHASE_FIELD__solid_density} "solid_density", parameters, 1); DBUG("Use \'%s\' as solid density parameter.", solid_density.name.c_str()); // History field auto& history_field = findParameter<double>( phasefield_parameters_config, //! \ogs_file_param_special{prj__processes__process__PHASE_FIELD__phasefield_parameters__history_field} "history_field", parameters, 1); DBUG("Use \'%s\' as history field.", history_field.name.c_str()); // Specific body force Eigen::Matrix<double, DisplacementDim, 1> specific_body_force; { std::vector<double> const b = //! \ogs_file_param{prj__processes__process__PHASE_FIELD__specific_body_force} config.getConfigParameter<std::vector<double>>( "specific_body_force"); if (b.size() != DisplacementDim) OGS_FATAL( "The size of the specific body force vector does not match the " "displacement dimension. Vector size is %d, displacement " "dimension is %d", b.size(), DisplacementDim); std::copy_n(b.data(), b.size(), specific_body_force.data()); } PhaseFieldProcessData<DisplacementDim> process_data{ std::move(material), residual_stiffness, crack_resistance, crack_length_scale, kinetic_coefficient, solid_density, history_field, specific_body_force}; SecondaryVariableCollection secondary_variables; NumLib::NamedFunctionCaller named_function_caller( {"PhaseField_displacement"}); ProcessLib::createSecondaryVariables(config, secondary_variables, named_function_caller); return std::make_unique<PhaseFieldProcess<DisplacementDim>>( mesh, std::move(jacobian_assembler), parameters, integration_order, std::move(process_variables), std::move(process_data), std::move(secondary_variables), std::move(named_function_caller), use_monolithic_scheme); }
std::unique_ptr<Process> createHydroMechanicsProcess( MeshLib::Mesh& mesh, std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler, std::vector<ProcessVariable> const& variables, std::vector<std::unique_ptr<ParameterBase>> const& parameters, unsigned const integration_order, BaseLib::ConfigTree const& config) { //! \ogs_file_param{prj__processes__process__type} config.checkConfigParameter("type", "HYDRO_MECHANICS"); DBUG("Create HydroMechanicsProcess."); // Process variable. //! \ogs_file_param{prj__processes__process__HYDRO_MECHANICS__process_variables} auto const pv_config = config.getConfigSubtree("process_variables"); auto process_variables = findProcessVariables( variables, pv_config, { //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS__process_variables__pressure} "pressure", //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS__process_variables__displacement} "displacement" }); DBUG("Associate displacement with process variable \'%s\'.", process_variables[1].get().getName().c_str()); if (process_variables[1].get().getNumberOfComponents() != DisplacementDim) { OGS_FATAL( "Number of components of the process variable '%s' is different " "from the displacement dimension: got %d, expected %d", process_variables[1].get().getName().c_str(), process_variables[1].get().getNumberOfComponents(), DisplacementDim); } DBUG("Associate pressure with process variable \'%s\'.", process_variables[0].get().getName().c_str()); if (process_variables[0].get().getNumberOfComponents() != 1) { OGS_FATAL( "Pressure process variable '%s' is not a scalar variable but has " "%d components.", process_variables[0].get().getName().c_str(), process_variables[0].get().getNumberOfComponents()); } // Constitutive relation. // read type; auto const constitutive_relation_config = //! \ogs_file_param{prj__processes__process__HYDRO_MECHANICS__constitutive_relation} config.getConfigSubtree("constitutive_relation"); auto const type = //! \ogs_file_param{prj__processes__process__HYDRO_MECHANICS__constitutive_relation__type} constitutive_relation_config.peekConfigParameter<std::string>("type"); std::unique_ptr<MaterialLib::Solids::MechanicsBase<DisplacementDim>> material = nullptr; if (type == "LinearElasticIsotropic") { material = MaterialLib::Solids::createLinearElasticIsotropic<DisplacementDim>( parameters, constitutive_relation_config); } else { OGS_FATAL( "Cannot construct constitutive relation of given type \'%s\'.", type.c_str()); } // Intrinsic permeability auto& intrinsic_permeability = findParameter<double>( config, //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS__intrinsic_permeability} "intrinsic_permeability", parameters, 1); DBUG("Use \'%s\' as intrinsic conductivity parameter.", intrinsic_permeability.name.c_str()); // Storage coefficient auto& specific_storage = findParameter<double>( config, //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS__specific_storage} "specific_storage", parameters, 1); DBUG("Use \'%s\' as storage coefficient parameter.", specific_storage.name.c_str()); // Fluid viscosity auto& fluid_viscosity = findParameter<double>( config, //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS__fluid_viscosity} "fluid_viscosity", parameters, 1); DBUG("Use \'%s\' as fluid viscosity parameter.", fluid_viscosity.name.c_str()); // Fluid density auto& fluid_density = findParameter<double>( config, //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS__fluid_density} "fluid_density", parameters, 1); DBUG("Use \'%s\' as fluid density parameter.", fluid_density.name.c_str()); // Biot coefficient auto& biot_coefficient = findParameter<double>( config, //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS__biot_coefficient} "biot_coefficient", parameters, 1); DBUG("Use \'%s\' as Biot coefficient parameter.", biot_coefficient.name.c_str()); // Porosity auto& porosity = findParameter<double>( config, //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS__porosity} "porosity", parameters, 1); DBUG("Use \'%s\' as porosity parameter.", porosity.name.c_str()); // Solid density auto& solid_density = findParameter<double>( config, //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS__solid_density} "solid_density", parameters, 1); DBUG("Use \'%s\' as solid density parameter.", solid_density.name.c_str()); // Specific body force Eigen::Matrix<double, DisplacementDim, 1> specific_body_force; { std::vector<double> const b = //! \ogs_file_param{prj__processes__process__HYDRO_MECHANICS__specific_body_force} config.getConfigParameter<std::vector<double>>( "specific_body_force"); if (specific_body_force.size() != DisplacementDim) OGS_FATAL( "The size of the specific body force vector does not match the " "displacement dimension. Vector size is %d, displacement " "dimension is %d", specific_body_force.size(), DisplacementDim); std::copy_n(b.data(), b.size(), specific_body_force.data()); } HydroMechanicsProcessData<DisplacementDim> process_data{ std::move(material), intrinsic_permeability, specific_storage, fluid_viscosity, fluid_density, biot_coefficient, porosity, solid_density, specific_body_force}; SecondaryVariableCollection secondary_variables; NumLib::NamedFunctionCaller named_function_caller( {"HydroMechanics_displacement"}); ProcessLib::parseSecondaryVariables(config, secondary_variables, named_function_caller); return std::unique_ptr<HydroMechanicsProcess<DisplacementDim>> { new HydroMechanicsProcess<DisplacementDim>{ mesh, std::move(jacobian_assembler), parameters, integration_order, std::move(process_variables), std::move(process_data), std::move(secondary_variables), std::move(named_function_caller) } }; }
std::unique_ptr<Process> createSmallDeformationProcess( MeshLib::Mesh& mesh, std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler, std::vector<ProcessVariable> const& variables, std::vector<std::unique_ptr<ParameterBase>> const& parameters, unsigned const integration_order, BaseLib::ConfigTree const& config) { //! \ogs_file_param{process__type} config.checkConfigParameter("type", "SMALL_DEFORMATION_WITH_LIE"); DBUG("Create SmallDeformationProcess with LIE."); // Process variables auto const pv_conf = config.getConfigSubtree("process_variables"); auto range = pv_conf.getConfigParameterList<std::string>("process_variable"); std::vector<std::reference_wrapper<ProcessVariable>> process_variables; for (std::string const& pv_name : range) { if (pv_name != "displacement" && pv_name.find("displacement_jump")==std::string::npos) OGS_FATAL("Found a process variable name '%s'. It should be 'displacement' or 'displacement_jumpN'"); auto variable = std::find_if( variables.cbegin(), variables.cend(), [&pv_name](ProcessVariable const& v) { return v.getName() == pv_name; }); if (variable == variables.end()) { OGS_FATAL( "Could not find process variable '%s' in the provided variables " "list for config tag <%s>.", pv_name.c_str(), "process_variable"); } DBUG("Found process variable \'%s\' for config tag <%s>.", variable->getName().c_str(), "process_variable"); process_variables.emplace_back(const_cast<ProcessVariable&>(*variable)); } if (process_variables.size() > 2) OGS_FATAL("Currently only one displacement jump is supported"); DBUG("Associate displacement with process variable \'%s\'.", process_variables.back().get().getName().c_str()); if (process_variables.back().get().getNumberOfComponents() != DisplacementDim) { OGS_FATAL( "Number of components of the process variable '%s' is different " "from the displacement dimension: got %d, expected %d", process_variables.back().get().getName().c_str(), process_variables.back().get().getNumberOfComponents(), DisplacementDim); } // Constitutive relation. // read type; auto const constitutive_relation_config = //! \ogs_file_param{process__SMALL_DEFORMATION_WITH_LIE__constitutive_relation} config.getConfigSubtree("constitutive_relation"); auto const type = constitutive_relation_config.peekConfigParameter<std::string>("type"); std::unique_ptr<MaterialLib::Solids::MechanicsBase<DisplacementDim>> material = nullptr; if (type == "LinearElasticIsotropic") { material = MaterialLib::Solids::createLinearElasticIsotropic<DisplacementDim>( parameters, constitutive_relation_config); } else { OGS_FATAL( "Cannot construct constitutive relation of given type \'%s\'.", type.c_str()); } // Fracture constitutive relation. // read type; auto const fracture_constitutive_relation_config = //! \ogs_file_param{process__SMALL_DEFORMATION_WITH_LIE__constitutive_relation} config.getConfigSubtree("fracture_constitutive_relation"); auto const frac_type = fracture_constitutive_relation_config.peekConfigParameter<std::string>("type"); std::unique_ptr<MaterialLib::Fracture::FractureModelBase<DisplacementDim>> fracture_model = nullptr; if (frac_type == "LinearElasticIsotropic") { fracture_model = MaterialLib::Fracture::createLinearElasticIsotropic<DisplacementDim>( parameters, fracture_constitutive_relation_config); } else if (frac_type == "MohrCoulomb") { fracture_model = MaterialLib::Fracture::createMohrCoulomb<DisplacementDim>( parameters, fracture_constitutive_relation_config); } else { OGS_FATAL( "Cannot construct fracture constitutive relation of given type \'%s\'.", frac_type.c_str()); } // Fracture properties //! \ogs_file_param{process__SMALL_DEFORMATION_WITH_LIE__fracture_properties} auto fracture_properties_config = config.getConfigSubtree("fracture_properties"); auto ¶_b0 = ProcessLib::findParameter<double>(fracture_properties_config, "initial_aperture", parameters, 1); std::unique_ptr<FractureProperty> frac_prop(new FractureProperty()); frac_prop->mat_id = fracture_properties_config.getConfigParameter<int>("material_id"); frac_prop->aperture0 = ¶_b0; SmallDeformationProcessData<DisplacementDim> process_data( std::move(material), std::move(fracture_model), std::move(frac_prop)); SecondaryVariableCollection secondary_variables; NumLib::NamedFunctionCaller named_function_caller( {"SmallDeformation_displacement"}); ProcessLib::parseSecondaryVariables(config, secondary_variables, named_function_caller); return std::unique_ptr<SmallDeformationProcess<DisplacementDim>>{ new SmallDeformationProcess<DisplacementDim>{ mesh, std::move(jacobian_assembler), parameters, integration_order, std::move(process_variables), std::move(process_data), std::move(secondary_variables), std::move(named_function_caller)}}; }
TESProcess::TESProcess( MeshLib::Mesh& mesh, Process::NonlinearSolver& nonlinear_solver, std::unique_ptr<Process::TimeDiscretization>&& time_discretization, std::vector<std::reference_wrapper<ProcessVariable>>&& process_variables, SecondaryVariableCollection&& secondary_variables, ProcessOutput&& process_output, const BaseLib::ConfigTree& config) : Process( mesh, nonlinear_solver, std::move(time_discretization), std::move(process_variables), std::move(secondary_variables), std::move(process_output)) { DBUG("Create TESProcess."); // physical parameters for local assembly { std::vector<std::pair<std::string, double*>> params{ {"fluid_specific_heat_source", &_assembly_params.fluid_specific_heat_source}, {"fluid_specific_isobaric_heat_capacity", &_assembly_params.cpG}, {"solid_specific_heat_source", &_assembly_params.solid_specific_heat_source}, {"solid_heat_conductivity", &_assembly_params.solid_heat_cond}, {"solid_specific_isobaric_heat_capacity", &_assembly_params.cpS}, {"tortuosity", &_assembly_params.tortuosity}, {"diffusion_coefficient", &_assembly_params.diffusion_coefficient_component}, {"porosity", &_assembly_params.poro}, {"solid_density_dry", &_assembly_params.rho_SR_dry}, {"solid_density_initial", &_assembly_params.initial_solid_density}}; for (auto const& p : params) { if (auto const par = config.getConfigParameterOptional<double>(p.first)) { DBUG("setting parameter `%s' to value `%g'", p.first.c_str(), *par); *p.second = *par; } } } // characteristic values of primary variables { std::vector<std::pair<std::string, Trafo*>> const params{ {"characteristic_pressure", &_assembly_params.trafo_p}, {"characteristic_temperature", &_assembly_params.trafo_T}, {"characteristic_vapour_mass_fraction", &_assembly_params.trafo_x}}; for (auto const& p : params) { if (auto const par = config.getConfigParameterOptional<double>(p.first)) { INFO("setting parameter `%s' to value `%g'", p.first.c_str(), *par); *p.second = Trafo{*par}; } } } // permeability if (auto par = config.getConfigParameterOptional<double>("solid_hydraulic_permeability")) { DBUG( "setting parameter `solid_hydraulic_permeability' to isotropic " "value `%g'", *par); const auto dim = mesh.getDimension(); _assembly_params.solid_perm_tensor = Eigen::MatrixXd::Identity(dim, dim) * (*par); } // reactive system _assembly_params.react_sys = Adsorption::AdsorptionReaction::newInstance( config.getConfigSubtree("reactive_system")); // debug output if (auto const param = config.getConfigParameterOptional<bool>("output_element_matrices")) { DBUG("output_element_matrices: %s", (*param) ? "true" : "false"); _assembly_params.output_element_matrices = *param; } // TODO somewhere else /* if (auto const param = config.getConfigParameterOptional<bool>("output_global_matrix")) { DBUG("output_global_matrix: %s", (*param) ? "true" : "false"); this->_process_output.output_global_matrix = *param; } */ }
std::unique_ptr<LiquidFlowMaterialProperties> createLiquidFlowMaterialProperties( BaseLib::ConfigTree const& config, std::vector<std::unique_ptr<ParameterBase>> const& parameters, 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<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> 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; auto const& porous_medium_configs = //! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium} config.getConfigSubtree("porous_medium"); for ( auto const& porous_medium_config : //! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium} porous_medium_configs.getConfigSubtreeList("porous_medium")) { //! \ogs_file_attr{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium__id} auto const id = porous_medium_config.getConfigAttribute<int>("id"); mat_ids.push_back(id); auto const& permeability_config = //! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium__permeability} porous_medium_config.getConfigSubtree("permeability"); intrinsic_permeability_models.emplace_back( MaterialLib::PorousMedium::createPermeabilityModel( permeability_config, parameters)); auto const& porosity_config = //! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium__porosity} porous_medium_config.getConfigSubtree("porosity"); auto n = MaterialLib::PorousMedium::createPorosityModel(porosity_config, parameters); porosity_models.emplace_back(std::move(n)); auto const& storage_config = //! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium__storage} porous_medium_config.getConfigSubtree("storage"); auto beta = MaterialLib::PorousMedium::createStorageModel(storage_config); 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::make_unique<LiquidFlowMaterialProperties>( std::move(fluid_properties), std::move(intrinsic_permeability_models), std::move(porosity_models), std::move(storage_models), has_material_ids, material_ids); }