diff --git a/Applications/CLI/Tests.cmake b/Applications/CLI/Tests.cmake index 41740a1a19e47b1d749bcdf1d8c31b8d0320678c..0ff22ee4240061ac23b90624661d861473051b33 100644 --- a/Applications/CLI/Tests.cmake +++ b/Applications/CLI/Tests.cmake @@ -598,7 +598,8 @@ if(NOT OGS_USE_MPI) TESTER vtkdiff ABSTOL 1e-8 RELTOL 1e-8 DIFF_DATA - sat1D.vtu sat_1D_pcs_0_ts_1_t_1.000000.vtu AnalyticSolution pressure + sat1D.vtu sat_1D_pcs_0_ts_1_t_1.000000.vtu AnalyticPressure pressure + sat1D.vtu sat_1D_pcs_0_ts_1_t_1.000000.vtu AnalyticVec v_x ) AddTest( NAME LiquidFlow_PressureBCatCornerOfAnisotropicSquare @@ -620,7 +621,9 @@ if(NOT OGS_USE_MPI) TESTER vtkdiff ABSTOL 1e-8 RELTOL 1e-8 DIFF_DATA - mesh2D.vtu gravity_driven_pcs_0_ts_1_t_1.000000.vtu AnalyticSolution pressure + mesh2D.vtu gravity_driven_pcs_0_ts_1_t_1.000000.vtu AnalyticPressure pressure + mesh2D.vtu gravity_driven_pcs_0_ts_1_t_1.000000.vtu AnalyticVx v_x + mesh2D.vtu gravity_driven_pcs_0_ts_1_t_1.000000.vtu AnalyticVy v_y ) AddTest( NAME LiquidFlow_AxisymTheis @@ -877,7 +880,8 @@ else() TESTER vtkdiff ABSTOL 1e-8 RELTOL 1e-8 DIFF_DATA - sat1D.vtu sat_1D_pcs_0_ts_1_t_1.000000.vtu AnalyticSolution pressure + sat1D.vtu sat_1D_pcs_0_ts_1_t_1.000000.vtu AnalyticPressure pressure + sat1D.vtu sat_1D_pcs_0_ts_1_t_1.000000.vtu AnalyticVec v_x ) AddTest( NAME LiquidFlow_GravityDriven @@ -888,7 +892,9 @@ else() TESTER vtkdiff ABSTOL 1e-8 RELTOL 1e-8 DIFF_DATA - mesh2D.vtu gravity_driven_pcs_0_ts_1_t_1.000000.vtu AnalyticSolution pressure + mesh2D.vtu gravity_driven_pcs_0_ts_1_t_1.000000.vtu AnalyticPressure pressure + mesh2D.vtu gravity_driven_pcs_0_ts_1_t_1.000000.vtu AnalyticVx v_x + mesh2D.vtu gravity_driven_pcs_0_ts_1_t_1.000000.vtu AnalyticVy v_y ) AddTest( NAME LiquidFlow_PressureBCatCornerOfAnisotropicSquare diff --git a/ProcessLib/GroundwaterFlow/GroundwaterFlowFEM.h b/ProcessLib/GroundwaterFlow/GroundwaterFlowFEM.h index 6e102649406bb6902c04d85023d9e856bd7442d5..e0c902dbb204a22ec6cae232039a1256305b26c7 100644 --- a/ProcessLib/GroundwaterFlow/GroundwaterFlowFEM.h +++ b/ProcessLib/GroundwaterFlow/GroundwaterFlowFEM.h @@ -105,11 +105,34 @@ public: local_K.noalias() += sm.dNdx.transpose() * k * sm.dNdx * sm.detJ * sm.integralMeasure * wp.getWeight(); + } + } + + void computeSecondaryVariableConcrete( + const double t, + std::vector<double> const& local_x) override + { + auto const local_matrix_size = local_x.size(); + // This assertion is valid only if all nodal d.o.f. use the same shape + // matrices. + assert(local_matrix_size == ShapeFunction::NPOINTS * NUM_NODAL_DOF); + + unsigned const n_integration_points = + _integration_method.getNumberOfPoints(); + + const auto local_x_vec = + MathLib::toVector<NodalVectorType>(local_x, local_matrix_size); + + SpatialPosition pos; + pos.setElementID(_element.getID()); + for (unsigned ip = 0; ip < n_integration_points; ip++) + { + pos.setIntegrationPoint(ip); + auto const& sm = _shape_matrices[ip]; + auto const k = _process_data.hydraulic_conductivity(t, pos)[0]; // Darcy velocity only computed for output. - GlobalDimVectorType const darcy_velocity = - -k * sm.dNdx * Eigen::Map<const NodalVectorType>( - local_x.data(), ShapeFunction::NPOINTS); + GlobalDimVectorType const darcy_velocity = -k * sm.dNdx * local_x_vec; for (unsigned d = 0; d < GlobalDim; ++d) { diff --git a/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.cpp b/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.cpp index 4bb40f2c8781b0b6442a2435196184d73abd0224..1bc2bebb302e6ef599aebb3e51a0346e8dc8bbce 100644 --- a/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.cpp +++ b/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.cpp @@ -100,5 +100,15 @@ void GroundwaterFlowProcess::assembleWithJacobianConcreteProcess( dx_dx, M, K, b, Jac); } + +void GroundwaterFlowProcess::computeSecondaryVariableConcrete(const double t, + GlobalVector const& x) +{ + DBUG("Compute the velocity for GroundwaterFlowProcess."); + GlobalExecutor::executeMemberOnDereferenced( + &GroundwaterFlowLocalAssemblerInterface::computeSecondaryVariable, + _local_assemblers, *_local_to_global_index_map, t, x); +} + } // namespace GroundwaterFlow } // namespace ProcessLib diff --git a/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.h b/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.h index 6bfa9c65676864bde8d3965dcbaf8ff452eb6ae8..7d2fc9129e573e7279f4f885e31906d82e7f529f 100644 --- a/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.h +++ b/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.h @@ -88,6 +88,9 @@ public: } } + void computeSecondaryVariableConcrete(double const t, + GlobalVector const& x) override; + private: void initializeConcreteProcess( NumLib::LocalToGlobalIndexMap const& dof_table, diff --git a/ProcessLib/HeatConduction/HeatConductionFEM.h b/ProcessLib/HeatConduction/HeatConductionFEM.h index c9de972da3151b33b560e3198db3383fb993d0bb..e2fad4f8534ed8a3a245519394645aea51fd2ec2 100644 --- a/ProcessLib/HeatConduction/HeatConductionFEM.h +++ b/ProcessLib/HeatConduction/HeatConductionFEM.h @@ -116,10 +116,33 @@ public: local_M.noalias() += sm.N.transpose() * density * heat_capacity * sm.N * sm.detJ * wp.getWeight() * sm.integralMeasure; + } + } + + void computeSecondaryVariableConcrete( + const double t, + std::vector<double> const& local_x) override + { + auto const local_matrix_size = local_x.size(); + // This assertion is valid only if all nodal d.o.f. use the same shape + // matrices. + assert(local_matrix_size == ShapeFunction::NPOINTS * NUM_NODAL_DOF); + + unsigned const n_integration_points = + _integration_method.getNumberOfPoints(); + + SpatialPosition pos; + pos.setElementID(_element.getID()); + const auto local_x_vec = + MathLib::toVector<NodalVectorType>(local_x, local_matrix_size); + + for (unsigned ip = 0; ip < n_integration_points; ip++) + { + pos.setIntegrationPoint(ip); + auto const& sm = _shape_matrices[ip]; + auto const k = _process_data.thermal_conductivity(t, pos)[0]; // heat flux only computed for output. - GlobalDimVectorType const heat_flux = - -k * sm.dNdx * Eigen::Map<const NodalVectorType>( - local_x.data(), ShapeFunction::NPOINTS); + GlobalDimVectorType const heat_flux = -k * sm.dNdx * local_x_vec; for (unsigned d = 0; d < GlobalDim; ++d) { diff --git a/ProcessLib/HeatConduction/HeatConductionProcess.cpp b/ProcessLib/HeatConduction/HeatConductionProcess.cpp index 617b90ff0ca5d6804205c92587cc09e380e1bfbb..4f1801bb034a2a9f5351623049607e05c074fba4 100644 --- a/ProcessLib/HeatConduction/HeatConductionProcess.cpp +++ b/ProcessLib/HeatConduction/HeatConductionProcess.cpp @@ -96,5 +96,14 @@ void HeatConductionProcess::assembleWithJacobianConcreteProcess( dx_dx, M, K, b, Jac); } +void HeatConductionProcess::computeSecondaryVariableConcrete(const double t, + GlobalVector const& x) +{ + DBUG("Compute heat flux for HeatConductionProcess."); + GlobalExecutor::executeMemberOnDereferenced( + &HeatConductionLocalAssemblerInterface::computeSecondaryVariable, + _local_assemblers, *_local_to_global_index_map, t, x); +} + } // namespace HeatConduction } // namespace ProcessLib diff --git a/ProcessLib/HeatConduction/HeatConductionProcess.h b/ProcessLib/HeatConduction/HeatConductionProcess.h index 7b754a2d36f94812a91398f66a076838f4ba992c..5d180db20656d9b4e3796033dc1ef44002f142d6 100644 --- a/ProcessLib/HeatConduction/HeatConductionProcess.h +++ b/ProcessLib/HeatConduction/HeatConductionProcess.h @@ -38,7 +38,9 @@ public: //! @{ bool isLinear() const override { return true; } - //! @} + + void computeSecondaryVariableConcrete(double const t, + GlobalVector const& x) override; private: void initializeConcreteProcess( diff --git a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h index 34c42024fdb6badc912870991fdd1e4e6221b3b1..3d8720aab9a3afc1edfe4be68e33ecf337104868 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h +++ b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h @@ -40,16 +40,16 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: assert(perm.rows() == GlobalDim || perm.rows() == 1); if (perm.size() == 1) // isotropic or 1D problem. - local_assemble<IsotropicLaplacianAndGravityTermCalculator>( + local_assemble<IsotropicCalculator>( t, local_x, local_M_data, local_K_data, local_b_data, pos, perm); else - local_assemble<AnisotropicLaplacianAndGravityTermCalculator>( + local_assemble<AnisotropicCalculator>( t, local_x, local_M_data, local_K_data, local_b_data, pos, perm); } template <typename ShapeFunction, typename IntegrationMethod, unsigned GlobalDim> -template <typename LaplacianAndGravityTermCalculator> +template <typename LaplacianGravityVelocityCalculator> void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: local_assemble(double const t, std::vector<double> const& local_x, std::vector<double>& local_M_data, @@ -100,7 +100,7 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: const double mu = _material_properties.getViscosity(p, _temperature); // Assemble Laplacian, K, and RHS by the gravitational term - LaplacianAndGravityTermCalculator::calculate( + LaplacianGravityVelocityCalculator::calculateLaplacianAndGravityTerm( local_K, local_b, sm, perm, integration_factor, mu, rho_g, _gravitational_axis_id); } @@ -109,7 +109,68 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: template <typename ShapeFunction, typename IntegrationMethod, unsigned GlobalDim> void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: - IsotropicLaplacianAndGravityTermCalculator::calculate( + computeSecondaryVariableConcrete(double const t, + std::vector<double> const& local_x) +{ + SpatialPosition pos; + pos.setElementID(_element.getID()); + _material_properties.setMaterialID(pos); + const Eigen::MatrixXd& perm = + _material_properties.getPermeability(t, pos, _element.getDimension()); + + // Note: For Inclined 1D in 2D/3D or 2D element in 3D, the first item in + // the assert must be changed to perm.rows() == _element->getDimension() + assert(perm.rows() == GlobalDim || perm.rows() == 1); + + if (perm.size() == 1) // isotropic or 1D problem. + computeSecondaryVariableLocal<IsotropicCalculator>(t, local_x, pos, + perm); + else + computeSecondaryVariableLocal<AnisotropicCalculator>(t, local_x, pos, + perm); +} + +template <typename ShapeFunction, typename IntegrationMethod, + unsigned GlobalDim> +template <typename LaplacianGravityVelocityCalculator> +void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: + computeSecondaryVariableLocal(double const /*t*/, + std::vector<double> const& local_x, + SpatialPosition const& /*pos*/, + Eigen::MatrixXd const& perm) +{ + auto const local_matrix_size = local_x.size(); + assert(local_matrix_size == ShapeFunction::NPOINTS); + + const auto local_p_vec = + MathLib::toVector<NodalVectorType>(local_x, local_matrix_size); + + unsigned const n_integration_points = + _integration_method.getNumberOfPoints(); + + for (unsigned ip = 0; ip < n_integration_points; ip++) + { + auto const& sm = _shape_matrices[ip]; + double p = 0.; + NumLib::shapeFunctionInterpolate(local_x, sm.N, p); + // TODO : compute _temperature from the heat transport pcs + + const double rho_g = + _material_properties.getLiquidDensity(p, _temperature) * + _gravitational_acceleration; + // Compute viscosity: + const double mu = _material_properties.getViscosity(p, _temperature); + + LaplacianGravityVelocityCalculator + ::calculateVelocity(_darcy_velocities, local_p_vec, sm, perm, + ip, mu, rho_g, _gravitational_axis_id); + } +} + +template <typename ShapeFunction, typename IntegrationMethod, + unsigned GlobalDim> +void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: + IsotropicCalculator::calculateLaplacianAndGravityTerm( Eigen::Map<NodalMatrixType>& local_K, Eigen::Map<NodalVectorType>& local_b, ShapeMatrices const& sm, Eigen::MatrixXd const& perm, double const integration_factor, @@ -133,7 +194,28 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: template <typename ShapeFunction, typename IntegrationMethod, unsigned GlobalDim> void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: - AnisotropicLaplacianAndGravityTermCalculator::calculate( + IsotropicCalculator::calculateVelocity( + std::vector<std::vector<double>>& darcy_velocities, + Eigen::Map<const NodalVectorType> const& local_p, + ShapeMatrices const& sm, Eigen::MatrixXd const& perm, unsigned const ip, + double const mu, double const rho_g, int const gravitational_axis_id) +{ + const double K = perm(0, 0) / mu; + // Compute the velocity + GlobalDimVectorType darcy_velocity = -K * sm.dNdx * local_p; + // gravity term + if (gravitational_axis_id >= 0) + darcy_velocity[gravitational_axis_id] -= K * rho_g; + for (unsigned d = 0; d < GlobalDim; ++d) + { + darcy_velocities[d][ip] = darcy_velocity[d]; + } +} + +template <typename ShapeFunction, typename IntegrationMethod, + unsigned GlobalDim> +void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: + AnisotropicCalculator::calculateLaplacianAndGravityTerm( Eigen::Map<NodalMatrixType>& local_K, Eigen::Map<NodalVectorType>& local_b, ShapeMatrices const& sm, Eigen::MatrixXd const& perm, double const integration_factor, @@ -150,6 +232,29 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: fac * rho_g * sm.dNdx.transpose() * perm.col(gravitational_axis_id); } } + +template <typename ShapeFunction, typename IntegrationMethod, + unsigned GlobalDim> +void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: + AnisotropicCalculator::calculateVelocity( + std::vector<std::vector<double>>& darcy_velocities, + Eigen::Map<const NodalVectorType> const& local_p, + ShapeMatrices const& sm, Eigen::MatrixXd const& perm, unsigned const ip, + double const mu, double const rho_g, int const gravitational_axis_id) +{ + // Compute the velocity + GlobalDimVectorType darcy_velocity = -perm * sm.dNdx * local_p / mu; + if (gravitational_axis_id >= 0) + { + darcy_velocity.noalias() -= + rho_g * perm.col(gravitational_axis_id) / mu; + } + for (unsigned d = 0; d < GlobalDim; ++d) + { + darcy_velocities[d][ip] = darcy_velocity[d]; + } +} + } // end of namespace } // end of namespace diff --git a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h index 6b34deaa09d3a3d943147f8d9bb0672be49daf96..0073c353e923a62e6cddd488fd3e6cc224c00959 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h +++ b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h @@ -85,6 +85,9 @@ public: std::vector<double>& local_K_data, std::vector<double>& local_b_data) override; + void computeSecondaryVariableConcrete( + double const /*t*/, std::vector<double> const& local_x) override; + Eigen::Map<const Eigen::RowVectorXd> getShapeMatrix( const unsigned integration_point) const override { @@ -130,33 +133,45 @@ private: * Calculator of the Laplacian and the gravity term for anisotropic * permeability tensor */ - struct AnisotropicLaplacianAndGravityTermCalculator + struct AnisotropicCalculator { - static void calculate(Eigen::Map<NodalMatrixType>& local_K, - Eigen::Map<NodalVectorType>& local_b, - ShapeMatrices const& sm, - Eigen::MatrixXd const& perm, - double const integration_factor, double const mu, - double const rho_g, - int const gravitational_axis_id); + static void calculateLaplacianAndGravityTerm( + Eigen::Map<NodalMatrixType>& local_K, + Eigen::Map<NodalVectorType>& local_b, ShapeMatrices const& sm, + Eigen::MatrixXd const& perm, double const integration_factor, + double const mu, double const rho_g, + int const gravitational_axis_id); + + static void calculateVelocity( + std::vector<std::vector<double>>& darcy_velocities, + Eigen::Map<const NodalVectorType> const& local_p, + ShapeMatrices const& sm, Eigen::MatrixXd const& perm, + unsigned const ip, double const mu, double const rho_g, + int const gravitational_axis_id); }; /** * Calculator of the Laplacian and the gravity term for isotropic * permeability tensor */ - struct IsotropicLaplacianAndGravityTermCalculator + struct IsotropicCalculator { - static void calculate(Eigen::Map<NodalMatrixType>& local_K, - Eigen::Map<NodalVectorType>& local_b, - ShapeMatrices const& sm, - Eigen::MatrixXd const& perm, - double const integration_factor, double const mu, - double const rho_g, - int const gravitational_axis_id); + static void calculateLaplacianAndGravityTerm( + Eigen::Map<NodalMatrixType>& local_K, + Eigen::Map<NodalVectorType>& local_b, ShapeMatrices const& sm, + Eigen::MatrixXd const& perm, double const integration_factor, + double const mu, double const rho_g, + int const gravitational_axis_id); + + static void calculateVelocity( + std::vector<std::vector<double>>& darcy_velocities, + Eigen::Map<const NodalVectorType> const& local_p, + ShapeMatrices const& sm, Eigen::MatrixXd const& perm, + unsigned const ip, double const mu, double const rho_g, + int const gravitational_axis_id); }; - template <typename LaplacianAndGravityTermCalculator> + template <typename LaplacianGravityVelocityCalculator> void local_assemble(double const t, std::vector<double> const& local_x, std::vector<double>& local_M_data, std::vector<double>& local_K_data, @@ -164,6 +179,12 @@ private: SpatialPosition const& pos, Eigen::MatrixXd const& perm); + template <typename LaplacianGravityVelocityCalculator> + void computeSecondaryVariableLocal(double const /*t*/, + std::vector<double> const& local_x, + SpatialPosition const& pos, + Eigen::MatrixXd const& perm); + const int _gravitational_axis_id; const double _gravitational_acceleration; LiquidFlowMaterialProperties& _material_properties; diff --git a/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp b/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp index e06ff0db8b1c4ac87d1de67aaf44c293d57b9d39..795fe907b11880d7c670cce54b7da6937cb31d7f 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp +++ b/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp @@ -113,5 +113,14 @@ void LiquidFlowProcess::assembleWithJacobianConcreteProcess( dx_dx, M, K, b, Jac); } +void LiquidFlowProcess::computeSecondaryVariableConcrete(const double t, + GlobalVector const& x) +{ + DBUG("Compute the velocity for LiquidFlowProcess."); + GlobalExecutor::executeMemberOnDereferenced( + &LiquidFlowLocalAssemblerInterface::computeSecondaryVariable, + _local_assemblers, *_local_to_global_index_map, t, x); +} + } // end of namespace } // end of namespace diff --git a/ProcessLib/LiquidFlow/LiquidFlowProcess.h b/ProcessLib/LiquidFlow/LiquidFlowProcess.h index ff1a5aac2052550c6cfd6c6cf592925b79c09ffc..60f0151e3f925b9a32ddacc55da4b2ac23d60421 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowProcess.h +++ b/ProcessLib/LiquidFlow/LiquidFlowProcess.h @@ -69,6 +69,9 @@ public: double const gravitational_acceleration, BaseLib::ConfigTree const& config); + void computeSecondaryVariableConcrete(double const t, + GlobalVector const& x) override; + bool isLinear() const override { return true; } private: void initializeConcreteProcess( diff --git a/ProcessLib/LocalAssemblerInterface.cpp b/ProcessLib/LocalAssemblerInterface.cpp index 5e572b76b0521637cdaedf49b57dfdbfc2f3bd43..c35897c1f4a981ebe1348ede53bdf09486247c69 100644 --- a/ProcessLib/LocalAssemblerInterface.cpp +++ b/ProcessLib/LocalAssemblerInterface.cpp @@ -26,6 +26,16 @@ void LocalAssemblerInterface::assembleWithJacobian( "assembler."); } +void LocalAssemblerInterface::computeSecondaryVariable( + std::size_t const mesh_item_id, + NumLib::LocalToGlobalIndexMap const& dof_table, + double const t, GlobalVector const& x) +{ + auto const indices = NumLib::getIndices(mesh_item_id, dof_table); + auto const local_x = x.get(indices); + computeSecondaryVariableConcrete(t, local_x); +} + void LocalAssemblerInterface::preTimestep( std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const& dof_table, GlobalVector const& x, diff --git a/ProcessLib/LocalAssemblerInterface.h b/ProcessLib/LocalAssemblerInterface.h index fc0520fd0005a190e9c8a1ec06fbdcdf490f9322..959ab56d9f5ea91fefb62d7660d6797032c2f324 100644 --- a/ProcessLib/LocalAssemblerInterface.h +++ b/ProcessLib/LocalAssemblerInterface.h @@ -45,6 +45,10 @@ public: std::vector<double>& local_b_data, std::vector<double>& local_Jac_data); + virtual void computeSecondaryVariable(std::size_t const mesh_item_id, + NumLib::LocalToGlobalIndexMap const& dof_table, + const double t, GlobalVector const& x); + virtual void preTimestep(std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const& dof_table, GlobalVector const& x, double const t, @@ -70,6 +74,9 @@ private: } virtual void postTimestepConcrete(std::vector<double> const& /*local_x*/) {} + + virtual void computeSecondaryVariableConcrete + (double const /*t*/, std::vector<double> const& /*local_x*/) {} }; } // namespace ProcessLib diff --git a/ProcessLib/Process.cpp b/ProcessLib/Process.cpp index 27e20af297e6476cb3d73ea6d0237f84d03d32d7..0e906ca47769d21f685cbf24121f2bf4a167544b 100644 --- a/ProcessLib/Process.cpp +++ b/ProcessLib/Process.cpp @@ -242,6 +242,11 @@ void Process::postTimestep(GlobalVector const& x) postTimestepConcreteProcess(x); } +void Process::computeSecondaryVariable( const double t, GlobalVector const& x) +{ + computeSecondaryVariableConcrete(t, x); +} + void Process::preIteration(const unsigned iter, const GlobalVector &x) { // In every new iteration cached values of secondary variables are expired. diff --git a/ProcessLib/Process.h b/ProcessLib/Process.h index 7ee405f8d4ac0456d12ab1b3e3dd1e42e47bc539..b8ed73c921ca7e7f57b4f687fef8b89cfffd2377 100644 --- a/ProcessLib/Process.h +++ b/ProcessLib/Process.h @@ -59,6 +59,9 @@ public: void preIteration(const unsigned iter, GlobalVector const& x) override final; + /// compute secondary variables for the coupled equations or for output. + void computeSecondaryVariable(const double t, GlobalVector const& x); + NumLib::IterationResult postIteration(GlobalVector const& x) override final; void initialize(); @@ -148,6 +151,9 @@ private: virtual void preIterationConcreteProcess(const unsigned /*iter*/, GlobalVector const& /*x*/){} + virtual void computeSecondaryVariableConcrete(const double /*t*/, + GlobalVector const& /*x*/) {} + virtual NumLib::IterationResult postIterationConcreteProcess( GlobalVector const& /*x*/) { diff --git a/ProcessLib/UncoupledProcessesTimeLoop.cpp b/ProcessLib/UncoupledProcessesTimeLoop.cpp index aa5548d1a6c519be479558af526dd1f677b07da7..8ba27a8827246727f5c1441983b9d7b74ff4de43 100644 --- a/ProcessLib/UncoupledProcessesTimeLoop.cpp +++ b/ProcessLib/UncoupledProcessesTimeLoop.cpp @@ -505,6 +505,8 @@ bool UncoupledProcessesTimeLoop::loop() nonlinear_solver_succeeded = solveOneTimeStepOneProcess( x, timestep, t, delta_t, *spd, *_output); + pcs.computeSecondaryVariable(t, x); + INFO("[time] Solving process #%u took %g s in timestep #%u.", timestep, time_timestep.elapsed(), pcs_idx); diff --git a/Tests/Data b/Tests/Data index 95d086de5e3c6db78c07002cec395809a157ad3b..8254884e43b6ac088e70ce74e23b7c0b72e886e6 160000 --- a/Tests/Data +++ b/Tests/Data @@ -1 +1 @@ -Subproject commit 95d086de5e3c6db78c07002cec395809a157ad3b +Subproject commit 8254884e43b6ac088e70ce74e23b7c0b72e886e6