void PorousFlowFullySaturated::addMaterials() { PorousFlowSinglePhaseBase::addMaterials(); // add Materials if (_deps.dependsOn(_included_objects, "pressure_saturation_qp")) { // saturation is always unity, so is trivially calculated using PorousFlow1PhaseFullySaturated std::string material_type = "PorousFlow1PhaseFullySaturated"; InputParameters params = _factory.getValidParams(material_type); std::string material_name = "PorousFlowFullySaturated_1PhaseP_qp"; params.set<UserObjectName>("PorousFlowDictator") = _dictator_name; params.set<std::vector<VariableName>>("porepressure") = {_pp_var}; params.set<bool>("at_nodes") = false; _problem->addMaterial(material_type, material_name, params); } if (_deps.dependsOn(_included_objects, "pressure_saturation_nodal")) { std::string material_type = "PorousFlow1PhaseFullySaturated"; InputParameters params = _factory.getValidParams(material_type); std::string material_name = "PorousFlowFullySaturated_1PhaseP"; params.set<UserObjectName>("PorousFlowDictator") = _dictator_name; params.set<std::vector<VariableName>>("porepressure") = {_pp_var}; params.set<bool>("at_nodes") = true; _problem->addMaterial(material_type, material_name, params); } if (_deps.dependsOn(_included_objects, "volumetric_strain_qp") || _deps.dependsOn(_included_objects, "volumetric_strain_nodal")) addVolumetricStrainMaterial(_coupled_displacements, true); if (_deps.dependsOn(_included_objects, "relative_permeability_qp")) addRelativePermeabilityCorey(false, 0, 0.0, 0.0, 0.0); if (_deps.dependsOn(_included_objects, "relative_permeability_nodal")) addRelativePermeabilityCorey(true, 0, 0.0, 0.0, 0.0); }
void PorousFlowBasicTHM::act() { PorousFlowSinglePhaseBase::act(); // add the kernels if (_current_task == "add_kernel") { std::string kernel_name = "PorousFlowBasicTHM_DarcyFlow"; std::string kernel_type = "PorousFlowFullySaturatedDarcyBase"; InputParameters params = _factory.getValidParams(kernel_type); params.set<UserObjectName>("PorousFlowDictator") = _dictator_name; params.set<RealVectorValue>("gravity") = _gravity; params.set<bool>("multiply_by_density") = _multiply_by_density; params.set<NonlinearVariableName>("variable") = _pp_var; _problem->addKernel(kernel_type, kernel_name, params); } if (_current_task == "add_kernel" && _simulation_type == SimulationTypeChoiceEnum::TRANSIENT) { std::string kernel_name = "PorousFlowBasicTHM_MassTimeDerivative"; std::string kernel_type = "PorousFlowFullySaturatedMassTimeDerivative"; InputParameters params = _factory.getValidParams(kernel_type); params.set<UserObjectName>("PorousFlowDictator") = _dictator_name; params.set<NonlinearVariableName>("variable") = _pp_var; params.set<Real>("biot_coefficient") = _biot_coefficient; params.set<bool>("multiply_by_density") = _multiply_by_density; params.set<MooseEnum>("coupling_type") = parameters().get<MooseEnum>("coupling_type"); _problem->addKernel(kernel_type, kernel_name, params); } if ((_coupling_type == CouplingTypeEnum::ThermoHydro || _coupling_type == CouplingTypeEnum::ThermoHydroMechanical) && _current_task == "add_kernel") { std::string kernel_name = "PorousFlowBasicTHM_HeatAdvection"; std::string kernel_type = "PorousFlowFullySaturatedHeatAdvection"; InputParameters params = _factory.getValidParams(kernel_type); params.set<NonlinearVariableName>("variable") = _temperature_var[0]; params.set<UserObjectName>("PorousFlowDictator") = _dictator_name; params.set<RealVectorValue>("gravity") = _gravity; _problem->addKernel(kernel_type, kernel_name, params); } // add Materials if (_deps.dependsOn(_objects_to_add, "pressure_saturation_qp") && _current_task == "add_material") { std::string material_type = "PorousFlow1PhaseFullySaturated"; InputParameters params = _factory.getValidParams(material_type); std::string material_name = "PorousFlowBasicTHM_1PhaseP_qp"; params.set<UserObjectName>("PorousFlowDictator") = _dictator_name; params.set<std::vector<VariableName>>("porepressure") = {_pp_var}; params.set<bool>("at_nodes") = false; _problem->addMaterial(material_type, material_name, params); } if (_deps.dependsOn(_objects_to_add, "pressure_saturation_nodal") && _current_task == "add_material") { std::string material_type = "PorousFlow1PhaseFullySaturated"; InputParameters params = _factory.getValidParams(material_type); std::string material_name = "PorousFlowBasicTHM_1PhaseP"; params.set<UserObjectName>("PorousFlowDictator") = _dictator_name; params.set<std::vector<VariableName>>("porepressure") = {_pp_var}; params.set<bool>("at_nodes") = true; _problem->addMaterial(material_type, material_name, params); } if ((_deps.dependsOn(_objects_to_add, "volumetric_strain_qp") || _deps.dependsOn(_objects_to_add, "volumetric_strain_nodal")) && (_coupling_type == CouplingTypeEnum::HydroMechanical || _coupling_type == CouplingTypeEnum::ThermoHydroMechanical)) addVolumetricStrainMaterial(_coupled_displacements, false); if (_deps.dependsOn(_objects_to_add, "relative_permeability_qp")) addRelativePermeabilityCorey(false, 0, 0.0, 0.0, 0.0); if (_deps.dependsOn(_objects_to_add, "relative_permeability_nodal")) addRelativePermeabilityCorey(true, 0, 0.0, 0.0, 0.0); }
void PorousFlowUnsaturated::act() { PorousFlowSinglePhaseBase::act(); // add the kernels if (_current_task == "add_kernel") { std::string kernel_name = "PorousFlowUnsaturated_AdvectiveFlux"; std::string kernel_type = "PorousFlowAdvectiveFlux"; InputParameters params = _factory.getValidParams(kernel_type); params.set<UserObjectName>("PorousFlowDictator") = _dictator_name; params.set<RealVectorValue>("gravity") = _gravity; for (unsigned i = 0; i < _num_mass_fraction_vars; ++i) { kernel_name = "PorousFlowUnsaturated_AdvectiveFlux" + Moose::stringify(i); params.set<unsigned int>("fluid_component") = i; params.set<NonlinearVariableName>("variable") = _mass_fraction_vars[i]; _problem->addKernel(kernel_type, kernel_name, params); } kernel_name = "PorousFlowUnsaturated_AdvectiveFlux" + Moose::stringify(_num_mass_fraction_vars); params.set<unsigned int>("fluid_component") = _num_mass_fraction_vars; params.set<NonlinearVariableName>("variable") = _pp_var; _problem->addKernel(kernel_type, kernel_name, params); } if (_current_task == "add_kernel" && _simulation_type == SimulationTypeChoiceEnum::TRANSIENT) { std::string kernel_name = "PorousFlowUnsaturated_MassTimeDerivative"; std::string kernel_type = "PorousFlowMassTimeDerivative"; InputParameters params = _factory.getValidParams(kernel_type); params.set<UserObjectName>("PorousFlowDictator") = _dictator_name; for (unsigned i = 0; i < _num_mass_fraction_vars; ++i) { kernel_name = "PorousFlowUnsaturated_MassTimeDerivative" + Moose::stringify(i); params.set<unsigned int>("fluid_component") = i; params.set<NonlinearVariableName>("variable") = _mass_fraction_vars[i]; _problem->addKernel(kernel_type, kernel_name, params); } kernel_name = "PorousFlowUnsaturated_MassTimeDerivative" + Moose::stringify(_num_mass_fraction_vars); params.set<unsigned int>("fluid_component") = _num_mass_fraction_vars; params.set<NonlinearVariableName>("variable") = _pp_var; _problem->addKernel(kernel_type, kernel_name, params); } if ((_coupling_type == CouplingTypeEnum::HydroMechanical || _coupling_type == CouplingTypeEnum::ThermoHydroMechanical) && _current_task == "add_kernel" && _simulation_type == SimulationTypeChoiceEnum::TRANSIENT) { std::string kernel_name = "PorousFlowUnsaturated_MassVolumetricExpansion"; std::string kernel_type = "PorousFlowMassVolumetricExpansion"; InputParameters params = _factory.getValidParams(kernel_type); params.set<UserObjectName>("PorousFlowDictator") = _dictator_name; for (unsigned i = 0; i < _num_mass_fraction_vars; ++i) { kernel_name = "PorousFlowUnsaturated_MassVolumetricExpansion" + Moose::stringify(i); params.set<unsigned>("fluid_component") = i; params.set<NonlinearVariableName>("variable") = _mass_fraction_vars[i]; _problem->addKernel(kernel_type, kernel_name, params); } kernel_name = "PorousFlowUnsaturated_MassVolumetricExpansion" + Moose::stringify(_num_mass_fraction_vars); params.set<unsigned>("fluid_component") = _num_mass_fraction_vars; params.set<NonlinearVariableName>("variable") = _pp_var; _problem->addKernel(kernel_type, kernel_name, params); } if ((_coupling_type == CouplingTypeEnum::ThermoHydro || _coupling_type == CouplingTypeEnum::ThermoHydroMechanical) && _current_task == "add_kernel") { std::string kernel_name = "PorousFlowUnsaturated_HeatAdvection"; std::string kernel_type = "PorousFlowHeatAdvection"; InputParameters params = _factory.getValidParams(kernel_type); params.set<NonlinearVariableName>("variable") = _temperature_var[0]; params.set<UserObjectName>("PorousFlowDictator") = _dictator_name; params.set<RealVectorValue>("gravity") = _gravity; _problem->addKernel(kernel_type, kernel_name, params); } // Add the capillary pressure UserObject std::string capillary_pressure_name = "PorousFlowUnsaturated_CapillaryPressureVG"; addCapillaryPressureVG(_van_genuchten_m, _van_genuchten_alpha, capillary_pressure_name); if (_deps.dependsOn(_objects_to_add, "PorousFlowPS_qp") && _current_task == "add_material") { std::string material_type = "PorousFlow1PhaseP"; InputParameters params = _factory.getValidParams(material_type); std::string material_name = "PorousFlowUnsaturated_1PhaseP_VG_qp"; params.set<UserObjectName>("PorousFlowDictator") = _dictator_name; params.set<std::vector<VariableName>>("porepressure") = {_pp_var}; params.set<UserObjectName>("capillary_pressure") = capillary_pressure_name; _problem->addMaterial(material_type, material_name, params); } if (_deps.dependsOn(_objects_to_add, "PorousFlowPS_nodal") && _current_task == "add_material") { std::string material_type = "PorousFlow1PhaseP"; InputParameters params = _factory.getValidParams(material_type); std::string material_name = "PorousFlowUnsaturated_1PhaseP_VG_nodal"; params.set<UserObjectName>("PorousFlowDictator") = _dictator_name; params.set<std::vector<VariableName>>("porepressure") = {_pp_var}; params.set<UserObjectName>("capillary_pressure") = capillary_pressure_name; params.set<bool>("at_nodes") = true; _problem->addMaterial(material_type, material_name, params); } if (_deps.dependsOn(_objects_to_add, "PorousFlowRelativePermeability_qp")) { if (_relperm_type == RelpermTypeChoiceEnum::FLAC) addRelativePermeabilityFLAC(false, 0, _relative_permeability_exponent, _s_res, _s_res); else addRelativePermeabilityCorey(false, 0, _relative_permeability_exponent, _s_res, _s_res); } if (_deps.dependsOn(_objects_to_add, "PorousFlowRelativePermeability_nodal")) { if (_relperm_type == RelpermTypeChoiceEnum::FLAC) addRelativePermeabilityFLAC(true, 0, _relative_permeability_exponent, _s_res, _s_res); else addRelativePermeabilityCorey(true, 0, _relative_permeability_exponent, _s_res, _s_res); } if (_deps.dependsOn(_objects_to_add, "PorousFlowVolumetricStrain_qp") || _deps.dependsOn(_objects_to_add, "PorousFlowVolumetricStrain_nodal")) addVolumetricStrainMaterial(_coupled_displacements, true); // add relevant AuxVariables and AuxKernels if (_add_saturation_aux) addSaturationAux(0); }