diff --git a/Applications/ApplicationsLib/ProjectData.cpp b/Applications/ApplicationsLib/ProjectData.cpp index 054015bfee0c402ad31b85dd7e783f4c453c46f7..e9d3bc5bc60df6b5df9fe465cbd3291db93cb33f 100644 --- a/Applications/ApplicationsLib/ProjectData.cpp +++ b/Applications/ApplicationsLib/ProjectData.cpp @@ -519,7 +519,7 @@ void ProjectData::parseProcesses(BaseLib::ConfigTree const& processes_config, process = ProcessLib::LiquidFlow::createLiquidFlowProcess( name, *_mesh_vec[0], std::move(jacobian_assembler), _process_variables, _parameters, integration_order, - process_config); + process_config, _mesh_vec, output_directory); } else #endif diff --git a/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp b/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp index e35096b916406af1f647e0b2094c1a27d9be0949..4ae75493d11566131ffbaa2284c62d7eb01ea1c5 100644 --- a/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp +++ b/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp @@ -31,7 +31,9 @@ std::unique_ptr<Process> createLiquidFlowProcess( std::vector<ProcessVariable> const& variables, std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters, unsigned const integration_order, - BaseLib::ConfigTree const& config) + BaseLib::ConfigTree const& config, + std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes, + std::string const& output_directory) { //! \ogs_file_param{prj__processes__process__type} config.checkConfigParameter("type", "LIQUID_FLOW"); @@ -99,11 +101,21 @@ std::unique_ptr<Process> createLiquidFlowProcess( INFO("The liquid flow is in homogeneous porous media."); } + std::unique_ptr<ProcessLib::SurfaceFluxData> surfaceflux; + auto calculatesurfaceflux_config = + //! \ogs_file_param{prj__processes__process__calculatesurfaceflux} + config.getConfigSubtreeOptional("calculatesurfaceflux"); + if (calculatesurfaceflux_config) + { + surfaceflux = ProcessLib::SurfaceFluxData::createSurfaceFluxData( + *calculatesurfaceflux_config, meshes, output_directory); + } + return std::make_unique<LiquidFlowProcess>( std::move(name), mesh, std::move(jacobian_assembler), parameters, integration_order, std::move(process_variables), std::move(secondary_variables), material_ids, gravity_axis_id, g, - reference_temperature, mat_config); + reference_temperature, mat_config, std::move(surfaceflux)); } } // namespace LiquidFlow diff --git a/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.h b/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.h index 18adc164b64fded253b6e76ab645959ac68f9102..db1ff098a5d8b13d0ad6eb17ff8d7d615a190f5b 100644 --- a/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.h +++ b/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.h @@ -26,6 +26,8 @@ std::unique_ptr<Process> createLiquidFlowProcess( std::vector<ProcessVariable> const& variables, std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters, unsigned const integration_order, - BaseLib::ConfigTree const& config); + BaseLib::ConfigTree const& config, + std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes, + std::string const& output_directory); } // namespace LiquidFlow } // namespace ProcessLib diff --git a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h index d35c32b83640ae384004c3e5c4ff667e7fe36253..63a60f7737186c674ca6bd0c29ff4be954365929 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h +++ b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h @@ -54,6 +54,47 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: } } +template <typename ShapeFunction, typename IntegrationMethod, + unsigned GlobalDim> +Eigen::Vector3d +LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>::getFlux( + MathLib::Point3d const& p_local_coords, double const t, + std::vector<double> const& local_x) const +{ + // eval dNdx and invJ at p + auto const fe = + NumLib::createIsoparametricFiniteElement<ShapeFunction, + ShapeMatricesType>(_element); + + typename ShapeMatricesType::ShapeMatrices shape_matrices( + ShapeFunction::DIM, GlobalDim, ShapeFunction::NPOINTS); + + // Note: Axial symmetry is set to false here, because we only need dNdx + // here, which is not affected by axial symmetry. + fe.computeShapeFunctions(p_local_coords.getCoords(), shape_matrices, + GlobalDim, false); + + // create pos object to access the correct media property + ParameterLib::SpatialPosition pos; + pos.setElementID(_element.getID()); + const int material_id = _material_properties.getMaterialID(pos); + + double pressure = 0.0; + NumLib::shapeFunctionInterpolate(local_x, shape_matrices.N, pressure); + const Eigen::MatrixXd& permeability = _material_properties.getPermeability( + material_id, t, pos, _element.getDimension(), pressure, + _reference_temperature); + const double mu = + _material_properties.getViscosity(pressure, _reference_temperature); + + Eigen::Vector3d flux(0.0, 0.0, 0.0); + flux.head<GlobalDim>() = + -permeability / mu * shape_matrices.dNdx * + Eigen::Map<const NodalVectorType>(local_x.data(), local_x.size()); + + return flux; +} + template <typename ShapeFunction, typename IntegrationMethod, unsigned GlobalDim> template <typename LaplacianGravityVelocityCalculator> diff --git a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h index 4cbd7559c7509eafa6779b3df2875bf3cebbaff1..7295ebc69905e4733d3594bc8673f39c226a8134 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h +++ b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h @@ -128,6 +128,12 @@ public: std::vector<double>& local_K_data, std::vector<double>& local_b_data) override; + /// Computes the flux in the point \c p_local_coords that is given in local + /// coordinates using the values from \c local_x. + Eigen::Vector3d getFlux(MathLib::Point3d const& p_local_coords, + double const t, + std::vector<double> const& local_x) const override; + Eigen::Map<const Eigen::RowVectorXd> getShapeMatrix( const unsigned integration_point) const override { diff --git a/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp b/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp index bc76bfd561e33acafc85352f224b087d041f089c..2daa63dbdc4716de6e5168a9e6b792c01f9fedf8 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp +++ b/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp @@ -18,6 +18,8 @@ #include "LiquidFlowLocalAssembler.h" #include "LiquidFlowMaterialProperties.h" #include "MeshLib/PropertyVector.h" +// TODO(TF) used for output of flux, if output classes are ready this has to be changed +#include "MeshLib/IO/writeMeshToFile.h" #include "ProcessLib/Utils/CreateLocalAssemblers.h" namespace ProcessLib @@ -37,7 +39,8 @@ LiquidFlowProcess::LiquidFlowProcess( int const gravitational_axis_id, double const gravitational_acceleration, double const reference_temperature, - BaseLib::ConfigTree const& config) + BaseLib::ConfigTree const& config, + std::unique_ptr<ProcessLib::SurfaceFluxData>&& surfaceflux) : Process(std::move(name), mesh, std::move(jacobian_assembler), parameters, integration_order, std::move(process_variables), std::move(secondary_variables)), @@ -45,7 +48,8 @@ LiquidFlowProcess::LiquidFlowProcess( _gravitational_acceleration(gravitational_acceleration), _reference_temperature(reference_temperature), _material_properties( - createLiquidFlowMaterialProperties(config, parameters, material_ids)) + createLiquidFlowMaterialProperties(config, parameters, material_ids)), + _surfaceflux(std::move(surfaceflux)) { DBUG("Create Liquid flow process."); } @@ -121,5 +125,39 @@ void LiquidFlowProcess::computeSecondaryVariableConcrete(const double t, x, _coupled_solutions); } +Eigen::Vector3d LiquidFlowProcess::getFlux( + std::size_t const element_id, + MathLib::Point3d const& p, + double const t, + std::vector<GlobalVector*> const& x) const +{ + // fetch local_x from primary variable + std::vector<GlobalIndexType> indices_cache; + auto const r_c_indices = NumLib::getRowColumnIndices( + element_id, *_local_to_global_index_map, indices_cache); + constexpr int process_id = 0; // monolithic scheme. + std::vector<double> local_x(x[process_id]->get(r_c_indices.rows)); + + return _local_assemblers[element_id]->getFlux(p, t, local_x); +} + +// this is almost a copy of the implementation in the GroundwaterFlow +void LiquidFlowProcess::postTimestepConcreteProcess( + std::vector<GlobalVector*> const& x, + const double t, + const double /*dt*/, + int const process_id) +{ + if (!_surfaceflux) // computing the surfaceflux is optional + { + return; + } + + ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; + _surfaceflux->integrate(x, t, *this, process_id, _integration_order, _mesh, + pv.getActiveElementIDs()); + _surfaceflux->save(t); +} + } // namespace LiquidFlow } // namespace ProcessLib diff --git a/ProcessLib/LiquidFlow/LiquidFlowProcess.h b/ProcessLib/LiquidFlow/LiquidFlowProcess.h index 719791cc43c70244d9f2bacf08853f163890549e..7c80706ae914a9aff36de9537e4a54c91fc09d27 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowProcess.h +++ b/ProcessLib/LiquidFlow/LiquidFlowProcess.h @@ -19,6 +19,7 @@ #include "MaterialLib/Fluid/FluidProperties/FluidProperties.h" #include "NumLib/DOF/LocalToGlobalIndexMap.h" #include "ProcessLib/Process.h" +#include "ProcessLib/SurfaceFlux/SurfaceFluxData.h" namespace MeshLib { @@ -69,19 +70,31 @@ public: int const gravitational_axis_id, double const gravitational_acceleration, double const reference_temperature, - BaseLib::ConfigTree const& config); + BaseLib::ConfigTree const& config, + std::unique_ptr<ProcessLib::SurfaceFluxData>&& surfaceflux); void computeSecondaryVariableConcrete(double const t, GlobalVector const& x, int const process_id) override; bool isLinear() const override { return true; } + + Eigen::Vector3d getFlux(std::size_t const element_id, + MathLib::Point3d const& p, + double const t, + std::vector<GlobalVector*> const& x) const override; + int getGravitationalAxisID() const { return _gravitational_axis_id; } double getGravitationalAcceleration() const { return _gravitational_acceleration; } + void postTimestepConcreteProcess(std::vector<GlobalVector*> const& x, + const double t, + const double dt, + int const process_id) override; + private: void initializeConcreteProcess( NumLib::LocalToGlobalIndexMap const& dof_table, @@ -105,6 +118,8 @@ private: std::vector<std::unique_ptr<LiquidFlowLocalAssemblerInterface>> _local_assemblers; + + std::unique_ptr<ProcessLib::SurfaceFluxData> _surfaceflux; }; } // namespace LiquidFlow diff --git a/ProcessLib/LiquidFlow/Tests.cmake b/ProcessLib/LiquidFlow/Tests.cmake index b0c7df40850436911324e3ca502db88e3e410ab3..bc1354b31c70e0c4e8d5c6a3e9aba94d1f42cf96 100644 --- a/ProcessLib/LiquidFlow/Tests.cmake +++ b/ProcessLib/LiquidFlow/Tests.cmake @@ -364,3 +364,33 @@ AddTest( time_dependent_heterogeneous_source_term_pcs_0_ts_120_t_1200.000000.vtu time_dependent_heterogeneous_source_term_pcs_0_ts_120_t_1200.000000.vtu pressure pressure 1e-7 1e-13 time_dependent_heterogeneous_source_term_pcs_0_ts_200_t_2000.000000.vtu time_dependent_heterogeneous_source_term_pcs_0_ts_200_t_2000.000000.vtu pressure pressure 1e-7 1e-13 ) + +AddTest( + NAME LiquidFlow_Flux_3D + PATH Parabolic/LiquidFlow/Flux + EXECUTABLE ogs + EXECUTABLE_ARGS cube_1e3_calculatesurfaceflux.prj + WRAPPER time + TESTER vtkdiff + REQUIREMENTS NOT OGS_USE_MPI + DIFF_DATA + cube_1x1x1_hex_1e3_complete_surface_left_right_dirichlet_specific_flux_t_0.432000_expected.vtu cube_1x1x1_hex_1e3_complete_surface_left_right_dirichlet_specific_flux_t_0.432000.vtu specific_flux specific_flux 1e-7 1e-13 + cube_1x1x1_hex_1e3_complete_surface_left_right_dirichlet_specific_flux_t_0.864000_expected.vtu cube_1x1x1_hex_1e3_complete_surface_left_right_dirichlet_specific_flux_t_0.864000.vtu specific_flux specific_flux 1e-7 1e-13 + LF_cube_1e3_calculatesurfaceflux_pcs_0_ts_1_t_0.432000_expected.vtu LF_cube_1e3_calculatesurfaceflux_pcs_0_ts_1_t_0.432000.vtu pressure pressure 1e-7 1e-13 + LF_cube_1e3_calculatesurfaceflux_pcs_0_ts_2_t_0.864000_expected.vtu LF_cube_1e3_calculatesurfaceflux_pcs_0_ts_2_t_0.864000.vtu pressure pressure 1e-7 1e-13 +) + +AddTest( + NAME LiquidFlow_Flux_2D + PATH Parabolic/LiquidFlow/Flux/2D + EXECUTABLE ogs + EXECUTABLE_ARGS square_1e1_calculatesurfaceflux.prj + WRAPPER time + TESTER vtkdiff + REQUIREMENTS NOT OGS_USE_MPI + DIFF_DATA + square_1x1_quad_1e1_complete_surface_left_right_dirichlet_specific_flux_t_0.432000_expected.vtu square_1x1_quad_1e1_complete_surface_left_right_dirichlet_specific_flux_t_0.432000.vtu specific_flux specific_flux 1e-7 1e-13 + square_1x1_quad_1e1_complete_surface_left_right_dirichlet_specific_flux_t_0.864000_expected.vtu square_1x1_quad_1e1_complete_surface_left_right_dirichlet_specific_flux_t_0.864000.vtu specific_flux specific_flux 1e-7 1e-13 + LF_square_1e1_surfaceflux_pcs_0_ts_1_t_0.432000_expected.vtu LF_square_1e1_surfaceflux_pcs_0_ts_1_t_0.432000.vtu pressure pressure 1e-7 1e-13 + LF_square_1e1_surfaceflux_pcs_0_ts_2_t_0.864000_expected.vtu LF_square_1e1_surfaceflux_pcs_0_ts_2_t_0.864000.vtu pressure pressure 1e-7 1e-13 +) diff --git a/ProcessLib/SurfaceFlux/SurfaceFluxLocalAssembler.h b/ProcessLib/SurfaceFlux/SurfaceFluxLocalAssembler.h index a3cbb1543164f751880555a2e3871cecd28b0ae0..79c07180d884565135a1b72e2c1298d0f05a658c 100644 --- a/ProcessLib/SurfaceFlux/SurfaceFluxLocalAssembler.h +++ b/ProcessLib/SurfaceFlux/SurfaceFluxLocalAssembler.h @@ -120,13 +120,34 @@ public: std::vector<GlobalVector*> const&)> getFlux) override { - auto surface_element_normal = - MeshLib::FaceRule::getSurfaceNormal(&_surface_element); - surface_element_normal.normalize(); - // At the moment (2016-09-28) the surface normal is not oriented - // according to the right hand rule - // for correct results it is necessary to multiply the normal with -1 - surface_element_normal *= -1; + auto get_surface_normal = + [this, &bulk_mesh]( + MeshLib::Element const& surface_element) -> MathLib::Vector3 { + MathLib::Vector3 surface_element_normal; + if (surface_element.getGeomType() == MeshLib::MeshElemType::LINE) + { + auto const bulk_normal = MeshLib::FaceRule::getSurfaceNormal( + bulk_mesh.getElements()[_bulk_element_id]); + MathLib::Vector3 const line{*_surface_element.getNodes()[0], + *_surface_element.getNodes()[1]}; + surface_element_normal = + MathLib::crossProduct(bulk_normal, line); + } + else + { + surface_element_normal = + MeshLib::FaceRule::getSurfaceNormal(&surface_element); + } + surface_element_normal.normalize(); + // At the moment (2016-09-28) the surface normal is not oriented + // according to the right hand rule + // for correct results it is necessary to multiply the normal + // with -1 + surface_element_normal *= -1; + return surface_element_normal; + }; + auto const surface_element_normal = + get_surface_normal(_surface_element); double element_area = 0.0; std::size_t const n_integration_points = @@ -142,7 +163,6 @@ public: bulk_mesh, _bulk_element_id, _bulk_face_id, wp); auto const bulk_flux = getFlux(_bulk_element_id, bulk_element_point, t, x); - for (int component_id(0); component_id < specific_flux.getNumberOfComponents(); ++component_id) diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/2D/LF_square_1e1_surfaceflux_pcs_0_ts_1_t_0.432000_expected.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/LF_square_1e1_surfaceflux_pcs_0_ts_1_t_0.432000_expected.vtu new file mode 100644 index 0000000000000000000000000000000000000000..7e3987acfb3ce9767c9d4fe13e83def1030ebf25 --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/LF_square_1e1_surfaceflux_pcs_0_ts_1_t_0.432000_expected.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a09fca3e1cf6cc900db49ed46c6bb874a291a41cead6e334b24f35504003510b +size 3284 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/2D/LF_square_1e1_surfaceflux_pcs_0_ts_2_t_0.864000_expected.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/LF_square_1e1_surfaceflux_pcs_0_ts_2_t_0.864000_expected.vtu new file mode 100644 index 0000000000000000000000000000000000000000..92c9ace5027ed8f1076adc7fa3c3c43c312879d7 --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/LF_square_1e1_surfaceflux_pcs_0_ts_2_t_0.864000_expected.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:960089f24280fbce95e7f376a4fb9a1caa3da98457fcc83ed4b3736e19c3df54 +size 3256 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1e1_calculatesurfaceflux.prj b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1e1_calculatesurfaceflux.prj new file mode 100644 index 0000000000000000000000000000000000000000..4cf7d704cada8c92fe450fa9cef57112e6236532 --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1e1_calculatesurfaceflux.prj @@ -0,0 +1,177 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<OpenGeoSysProject> + <meshes> + <mesh>square_1x1_quad_1e1.vtu</mesh> + <mesh>square_1x1_quad_1e1_complete_surface.vtu</mesh> + <mesh>square_1x1_quad_1e1_left.vtu</mesh> + <mesh>square_1x1_quad_1e1_right.vtu</mesh> + </meshes> + <processes> + <process> + <name>LiquidFlow</name> + <type>LIQUID_FLOW</type> + <integration_order>2</integration_order> + <darcy_gravity> + <!-- axis_id: 0, 1, or the dimension of space minus one --> + <axis_id>0</axis_id> + <!-- g>=0. g=0: non gravity term --> + <g>0.</g> + </darcy_gravity> + <process_variables> + <process_variable>pressure</process_variable> + </process_variables> + <secondary_variables> + <secondary_variable internal_name="darcy_velocity" output_name="v"/> + </secondary_variables> + <calculatesurfaceflux> + <mesh>square_1x1_quad_1e1_complete_surface</mesh> + <property_name>specific_flux</property_name> + <output_mesh>square_1x1_quad_1e1_complete_surface_left_right_dirichlet_specific_flux.vtu</output_mesh> + </calculatesurfaceflux> + <material_property> + <fluid> + <density> + <type>Constant</type> + <value> 78.68 </value> + </density> + <viscosity> + <type>Constant</type> + <value> 1.295e-4 </value> + </viscosity> + </fluid> + <porous_medium> + <porous_medium id="0"> + <permeability> + <permeability_tensor_entries>kappa1</permeability_tensor_entries> + <type>Constant</type> + </permeability> + <porosity> + <type>Constant</type> + <porosity_parameter>constant_porosity_parameter</porosity_parameter> + </porosity> + <storage> + <type>Constant</type> + <value> 8.05e-10 </value> + </storage> + </porous_medium> + </porous_medium> + </material_property> + </process> + </processes> + <time_loop> + <processes> + <process ref="LiquidFlow"> + <nonlinear_solver>basic_picard</nonlinear_solver> + <convergence_criterion> + <type>DeltaX</type> + <norm_type>NORM2</norm_type> + <abstol>1.e-10</abstol> + </convergence_criterion> + <time_discretization> + <type>BackwardEuler</type> + </time_discretization> + <time_stepping> + <type>FixedTimeStepping</type> + <t_initial> 0.0 </t_initial> + <t_end> 0.864 </t_end> + <timesteps> + <pair> + <repeat>2</repeat> + <delta_t>0.432</delta_t> + </pair> + </timesteps> + </time_stepping> + </process> + </processes> + <output> + <type>VTK</type> + <prefix>LF_square_1e1_surfaceflux</prefix> + <timesteps> + <pair> + <repeat> 1 </repeat> + <each_steps> 1 </each_steps> + </pair> + </timesteps> + <variables> + <variable> pressure </variable> + <variable> v </variable> + </variables> + </output> + </time_loop> + <parameters> + <parameter> + <name>p0</name> + <type>Constant</type> + <value>5e6</value> + </parameter> + <parameter> + <name>p_Dirichlet_left</name> + <type>Constant</type> + <value>1e7</value> + </parameter> + <parameter> + <name>p_Dirichlet_right</name> + <type>Constant</type> + <value>1e6</value> + </parameter> + <parameter> + <name>constant_porosity_parameter</name> + <type>Constant</type> + <value>1</value> + </parameter> + <parameter> + <name>kappa1</name> + <type>Constant</type> + <values>9.2e-12 0 0 9.2e-12</values> + </parameter> + <parameter> + <name>p_spatial</name> + <type>Constant</type> + <value>1</value> + </parameter> + </parameters> + <process_variables> + <process_variable> + <name>pressure</name> + <components>1</components> + <order>1</order> + <initial_condition>p0</initial_condition> + <boundary_conditions> + <boundary_condition> + <mesh>square_1x1_quad_1e1_left</mesh> + <type>Dirichlet</type> + <parameter>p_Dirichlet_left</parameter> + </boundary_condition> + <boundary_condition> + <mesh>square_1x1_quad_1e1_right</mesh> + <type>Dirichlet</type> + <parameter>p_Dirichlet_right</parameter> + </boundary_condition> + </boundary_conditions> + </process_variable> + </process_variables> + <nonlinear_solvers> + <nonlinear_solver> + <name>basic_picard</name> + <type>Picard</type> + <max_iter>10</max_iter> + <linear_solver>general_linear_solver</linear_solver> + </nonlinear_solver> + </nonlinear_solvers> + <linear_solvers> + <linear_solver> + <name>general_linear_solver</name> + <lis>-i cg -p jacobi -tol 1e-16 -maxiter 10000</lis> + <eigen> + <solver_type>CG</solver_type> + <precon_type>DIAGONAL</precon_type> + <max_iteration_step>10000</max_iteration_step> + <error_tolerance>1e-16</error_tolerance> + </eigen> + <petsc> + <prefix>lf</prefix> + <parameters>-lf_ksp_type cg -lf_pc_type bjacobi -lf_ksp_rtol 1e-16 -lf_ksp_max_it 10000</parameters> + </petsc> + </linear_solver> + </linear_solvers> +</OpenGeoSysProject> diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1.vtu new file mode 100644 index 0000000000000000000000000000000000000000..830ecc4b5589b969669e6eb03a1cc93221c47918 --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16b826f3e01dafe34f447332b39a2a01cfa9e330c9ff7706190d0f420570c364 +size 2276 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_complete_surface.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_complete_surface.vtu new file mode 100644 index 0000000000000000000000000000000000000000..2098258b30e31e1c8a8b09fa398519e73107d74b --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_complete_surface.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17da3e834d5c3aa33c7bcd5f69eeffe45226d10070ec1efde9d0b1d515f6c892 +size 3535 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_complete_surface_left_right_dirichlet_specific_flux_t_0.432000_expected.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_complete_surface_left_right_dirichlet_specific_flux_t_0.432000_expected.vtu new file mode 100644 index 0000000000000000000000000000000000000000..f80be5ffeb55fbb35e977680f923fc092aefc63c --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_complete_surface_left_right_dirichlet_specific_flux_t_0.432000_expected.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf38c54df6739ac7ab831bf2605ed356f0519e3d382a31dfb49d08bddffea466 +size 4030 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_complete_surface_left_right_dirichlet_specific_flux_t_0.864000_expected.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_complete_surface_left_right_dirichlet_specific_flux_t_0.864000_expected.vtu new file mode 100644 index 0000000000000000000000000000000000000000..b271da6628e131ed048c825d65839f92abb86328 --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_complete_surface_left_right_dirichlet_specific_flux_t_0.864000_expected.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c2583ec787a3ee56c18217b09b34bdda1de66008c9f4ecd9e0c653dd187cb8a +size 4030 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_left.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_left.vtu new file mode 100644 index 0000000000000000000000000000000000000000..5bb68bcde16a3f147172f076812d256be47094fe --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_left.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb3a7aa685ad561fdf455dd462467cab1e124fedc44e6c0f14befe33d83e6cd5 +size 3637 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_right.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_right.vtu new file mode 100644 index 0000000000000000000000000000000000000000..4dacd3f1682870cf9f130ed7b54c6e7261a372e6 --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/2D/square_1x1_quad_1e1_right.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e39f78e2cabffd2f4f1313b774ca9464b8ffdf7fc97aa94b66bae80d162c850 +size 3659 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/LF_cube_1e3_calculatesurfaceflux_pcs_0_ts_0_t_0.000000_expected.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/LF_cube_1e3_calculatesurfaceflux_pcs_0_ts_0_t_0.000000_expected.vtu new file mode 100644 index 0000000000000000000000000000000000000000..1bd0b3bfdf2645457f36b5b7ac66ea7af9677573 --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/LF_cube_1e3_calculatesurfaceflux_pcs_0_ts_0_t_0.000000_expected.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3928650be26b5dc4a48e0a635fdfc20eaa912e48c32d6d8c6533c87fee70622b +size 39859 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/LF_cube_1e3_calculatesurfaceflux_pcs_0_ts_1_t_0.432000_expected.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/LF_cube_1e3_calculatesurfaceflux_pcs_0_ts_1_t_0.432000_expected.vtu new file mode 100644 index 0000000000000000000000000000000000000000..03b608491d059f3a5df79c37ba27566a2e823c4a --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/LF_cube_1e3_calculatesurfaceflux_pcs_0_ts_1_t_0.432000_expected.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4b22d3aa39091be0e2b9a1759f9824855175de911f58344b6686f59e43cd6f2 +size 46835 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/LF_cube_1e3_calculatesurfaceflux_pcs_0_ts_2_t_0.864000_expected.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/LF_cube_1e3_calculatesurfaceflux_pcs_0_ts_2_t_0.864000_expected.vtu new file mode 100644 index 0000000000000000000000000000000000000000..8fff68e1f419f1749e3f9f48de19849d5b2908f4 --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/LF_cube_1e3_calculatesurfaceflux_pcs_0_ts_2_t_0.864000_expected.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01b5c7d2ce1ccedbb1a4fbe5a544ad502bf36ef47772db4cec78afc3c8e4f182 +size 46755 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1e3_calculatesurfaceflux.prj b/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1e3_calculatesurfaceflux.prj new file mode 100644 index 0000000000000000000000000000000000000000..b1b890a967422118e6b3d7e74759ff9046dbd1c0 --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1e3_calculatesurfaceflux.prj @@ -0,0 +1,177 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<OpenGeoSysProject> + <meshes> + <mesh>cube_1x1x1_hex_1e3.vtu</mesh> + <mesh>cube_1x1x1_hex_1e3_complete_surface.vtu</mesh> + <mesh>cube_1x1x1_hex_1e3_left.vtu</mesh> + <mesh>cube_1x1x1_hex_1e3_right.vtu</mesh> + </meshes> + <processes> + <process> + <name>LiquidFlow</name> + <type>LIQUID_FLOW</type> + <integration_order>2</integration_order> + <darcy_gravity> + <!-- axis_id: 0, 1, or the dimension of space minus one --> + <axis_id>0</axis_id> + <!-- g>=0. g=0: non gravity term --> + <g>0.</g> + </darcy_gravity> + <process_variables> + <process_variable>pressure</process_variable> + </process_variables> + <secondary_variables> + <secondary_variable internal_name="darcy_velocity" output_name="v"/> + </secondary_variables> + <calculatesurfaceflux> + <mesh>cube_1x1x1_hex_1e3_complete_surface</mesh> + <property_name>specific_flux</property_name> + <output_mesh>cube_1x1x1_hex_1e3_complete_surface_left_right_dirichlet_specific_flux.vtu</output_mesh> + </calculatesurfaceflux> + <material_property> + <fluid> + <density> + <type>Constant</type> + <value> 78.68 </value> + </density> + <viscosity> + <type>Constant</type> + <value> 1.295e-4 </value> + </viscosity> + </fluid> + <porous_medium> + <porous_medium id="0"> + <permeability> + <permeability_tensor_entries>kappa1</permeability_tensor_entries> + <type>Constant</type> + </permeability> + <porosity> + <type>Constant</type> + <porosity_parameter>constant_porosity_parameter</porosity_parameter> + </porosity> + <storage> + <type>Constant</type> + <value> 8.05e-10 </value> + </storage> + </porous_medium> + </porous_medium> + </material_property> + </process> + </processes> + <time_loop> + <processes> + <process ref="LiquidFlow"> + <nonlinear_solver>basic_picard</nonlinear_solver> + <convergence_criterion> + <type>DeltaX</type> + <norm_type>NORM2</norm_type> + <abstol>1.e-10</abstol> + </convergence_criterion> + <time_discretization> + <type>BackwardEuler</type> + </time_discretization> + <time_stepping> + <type>FixedTimeStepping</type> + <t_initial> 0.0 </t_initial> + <t_end> 0.864 </t_end> + <timesteps> + <pair> + <repeat>2</repeat> + <delta_t>0.432</delta_t> + </pair> + </timesteps> + </time_stepping> + </process> + </processes> + <output> + <type>VTK</type> + <prefix>LF_cube_1e3_calculatesurfaceflux</prefix> + <timesteps> + <pair> + <repeat> 1 </repeat> + <each_steps> 1 </each_steps> + </pair> + </timesteps> + <variables> + <variable> pressure </variable> + <variable> v </variable> + </variables> + </output> + </time_loop> + <parameters> + <parameter> + <name>p0</name> + <type>Constant</type> + <value>5e6</value> + </parameter> + <parameter> + <name>p_Dirichlet_left</name> + <type>Constant</type> + <value>1e7</value> + </parameter> + <parameter> + <name>p_Dirichlet_right</name> + <type>Constant</type> + <value>1e6</value> + </parameter> + <parameter> + <name>constant_porosity_parameter</name> + <type>Constant</type> + <value>1</value> + </parameter> + <parameter> + <name>kappa1</name> + <type>Constant</type> + <values>9.2e-12 0 0 0 9.2e-12 0 0 0 9.2e-12</values> + </parameter> + <parameter> + <name>p_spatial</name> + <type>Constant</type> + <value>1</value> + </parameter> + </parameters> + <process_variables> + <process_variable> + <name>pressure</name> + <components>1</components> + <order>1</order> + <initial_condition>p0</initial_condition> + <boundary_conditions> + <boundary_condition> + <mesh>cube_1x1x1_hex_1e3_left</mesh> + <type>Dirichlet</type> + <parameter>p_Dirichlet_left</parameter> + </boundary_condition> + <boundary_condition> + <mesh>cube_1x1x1_hex_1e3_right</mesh> + <type>Dirichlet</type> + <parameter>p_Dirichlet_right</parameter> + </boundary_condition> + </boundary_conditions> + </process_variable> + </process_variables> + <nonlinear_solvers> + <nonlinear_solver> + <name>basic_picard</name> + <type>Picard</type> + <max_iter>10</max_iter> + <linear_solver>general_linear_solver</linear_solver> + </nonlinear_solver> + </nonlinear_solvers> + <linear_solvers> + <linear_solver> + <name>general_linear_solver</name> + <lis>-i cg -p jacobi -tol 1e-16 -maxiter 10000</lis> + <eigen> + <solver_type>CG</solver_type> + <precon_type>DIAGONAL</precon_type> + <max_iteration_step>10000</max_iteration_step> + <error_tolerance>1e-16</error_tolerance> + </eigen> + <petsc> + <prefix>lf</prefix> + <parameters>-lf_ksp_type cg -lf_pc_type bjacobi -lf_ksp_rtol 1e-16 -lf_ksp_max_it 10000</parameters> + </petsc> + </linear_solver> + </linear_solvers> +</OpenGeoSysProject> diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3.vtu new file mode 100644 index 0000000000000000000000000000000000000000..500d9f815a5726e303aa4f8c220220c9bb517c7d --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3e77b980dc0a4cefc19ba02eca4ad07ded3dc97497a01f169c719fc738a6bc9 +size 23197 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_complete_surface.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_complete_surface.vtu new file mode 100644 index 0000000000000000000000000000000000000000..303a9f426e18ba598faa5a55f8538f6f5d306b24 --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_complete_surface.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f405c070ea2cab30321345825eff7421fb1a5401cc2887a68da26e4e04d0b70 +size 65673 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_complete_surface_left_right_dirichlet_specific_flux_t_0.432000_expected.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_complete_surface_left_right_dirichlet_specific_flux_t_0.432000_expected.vtu new file mode 100644 index 0000000000000000000000000000000000000000..d2018339442f61f182df59373021b6109e692dfa --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_complete_surface_left_right_dirichlet_specific_flux_t_0.432000_expected.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c40d5de97b2704c8260f3afec3d5d381b6614b3b6121518535a90ec738764cac +size 79556 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_complete_surface_left_right_dirichlet_specific_flux_t_0.864000_expected.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_complete_surface_left_right_dirichlet_specific_flux_t_0.864000_expected.vtu new file mode 100644 index 0000000000000000000000000000000000000000..4b51b65f9ec78cd50e344735f893baf7e1ec2932 --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_complete_surface_left_right_dirichlet_specific_flux_t_0.864000_expected.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e2fb642aa3ca416db53112da6cbceed72e2a74369297c48bd26964ee95dcdb6 +size 79556 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_left.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_left.vtu new file mode 100644 index 0000000000000000000000000000000000000000..0c67788fb0ebf2ae70ceb7434487759729ccbb57 --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_left.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b76bf4e7791dcd0431554367369cd2c49fd24c6d0784b73d55333667b73d1bc +size 12897 diff --git a/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_right.vtu b/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_right.vtu new file mode 100644 index 0000000000000000000000000000000000000000..cb08cfb5227fb22b26a87ee682d0ba2e5a4f393a --- /dev/null +++ b/Tests/Data/Parabolic/LiquidFlow/Flux/cube_1x1x1_hex_1e3_right.vtu @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efcc5a635b6616ee00d7f8df481c3dfedbab2984a2e5ffb317386095681d19e4 +size 12898