diff --git a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h index 56d38818312ab628741143a10597c99d01ccdd05..a683ad2528b6869ee4c8e94644eb07743df67291 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h +++ b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h @@ -250,10 +250,9 @@ LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: NumLib::LocalToGlobalIndexMap const& dof_table, std::vector<double>& veloctiy_cache) const { - // auto const num_nodes = ShapeFunction_::NPOINTS; - auto const num_intpts = _shape_matrices.size(); auto const indices = NumLib::getIndices(_element.getID(), dof_table); auto const local_x = current_solution.get(indices); + auto const num_intpts = _integration_method.getNumberOfPoints(); veloctiy_cache.clear(); auto veloctiy_cache_vectors = MathLib::createZeroedMatrix< Eigen::Matrix<double, GlobalDim, Eigen::Dynamic, Eigen::RowMajor>>( @@ -262,16 +261,16 @@ LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: SpatialPosition pos; pos.setElementID(_element.getID()); const int material_id = _material_properties.getMaterialID(pos); - const Eigen::MatrixXd& perm = _material_properties.getPermeability( + const Eigen::MatrixXd& permeability = _material_properties.getPermeability( material_id, 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); + assert(permeability.rows() == GlobalDim || permeability.rows() == 1); if (!_coupling_term) { - computeDarcyVelocity(perm, local_x, veloctiy_cache_vectors); + computeDarcyVelocity(permeability, local_x, veloctiy_cache_vectors); } else { @@ -279,9 +278,10 @@ LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: getCurrentLocalSolutionsOfCoupledProcesses( _coupling_term->coupled_xs, indices); if (local_coupled_xs.empty()) - computeDarcyVelocity(perm, local_x, veloctiy_cache_vectors); + computeDarcyVelocity(permeability, local_x, veloctiy_cache_vectors); else - computeDarcyVelocityWithCoupling(perm, local_x, local_coupled_xs, + computeDarcyVelocityWithCoupling(permeability, local_x, + local_coupled_xs, veloctiy_cache_vectors); } @@ -291,9 +291,10 @@ LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: template <typename ShapeFunction, typename IntegrationMethod, unsigned GlobalDim> void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: - computeDarcyVelocity(Eigen::MatrixXd const& permeability, - std::vector<double> const& local_x, - LocalMatrixType& darcy_velocity_at_ips) const + computeDarcyVelocity( + Eigen::MatrixXd const& permeability, + std::vector<double> const& local_x, + MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips) const { if (permeability.size() == 1) // isotropic or 1D problem. computeDarcyVelocityLocal<IsotropicCalculator>(local_x, permeability, @@ -307,9 +308,10 @@ template <typename ShapeFunction, typename IntegrationMethod, unsigned GlobalDim> template <typename LaplacianGravityVelocityCalculator> void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: - computeDarcyVelocityLocal(std::vector<double> const& local_x, - Eigen::MatrixXd const& permeability, - LocalMatrixType& darcy_velocity_at_ips) const + computeDarcyVelocityLocal( + std::vector<double> const& local_x, + Eigen::MatrixXd const& permeability, + MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips) const { auto const local_matrix_size = local_x.size(); assert(local_matrix_size == ShapeFunction::NPOINTS); @@ -334,8 +336,8 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: _material_properties.getViscosity(p, _reference_temperature); LaplacianGravityVelocityCalculator::calculateVelocity( - ip, darcy_velocity_at_ips, local_p_vec, sm, permeability, mu, rho_g, - _gravitational_axis_id); + ip, local_p_vec, sm, permeability, mu, rho_g, + _gravitational_axis_id, darcy_velocity_at_ips); } } @@ -346,7 +348,7 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: Eigen::MatrixXd const& permeability, std::vector<double> const& local_x, std::unordered_map<std::type_index, const std::vector<double>> const& coupled_local_solutions, - LocalMatrixType& darcy_velocity_at_ips) const + MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips) const { const auto local_T = coupled_local_solutions.at(std::type_index( typeid(ProcessLib::HeatConduction::HeatConductionProcess))); @@ -368,7 +370,7 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: std::vector<double> const& local_x, std::vector<double> const& local_T, Eigen::MatrixXd const& permeability, - LocalMatrixType& darcy_velocity_at_ips) const + MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips) const { auto const local_matrix_size = local_x.size(); assert(local_matrix_size == ShapeFunction::NPOINTS); @@ -393,8 +395,8 @@ void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: const double mu = _material_properties.getViscosity(p, T); LaplacianGravityVelocityCalculator::calculateVelocity( - ip, darcy_velocity_at_ips, local_p_vec, sm, permeability, mu, rho_g, - _gravitational_axis_id); + ip, local_p_vec, sm, permeability, mu, rho_g, + _gravitational_axis_id, darcy_velocity_at_ips); } } @@ -426,10 +428,10 @@ template <typename ShapeFunction, typename IntegrationMethod, unsigned GlobalDim> void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: IsotropicCalculator::calculateVelocity( - unsigned ip, LocalMatrixType& darcy_velocity_at_ips, - Eigen::Map<const NodalVectorType> const& local_p, + unsigned const ip, Eigen::Map<const NodalVectorType> const& local_p, ShapeMatrices const& sm, Eigen::MatrixXd const& permeability, - double const mu, double const rho_g, int const gravitational_axis_id) + double const mu, double const rho_g, int const gravitational_axis_id, + MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips) { const double K = permeability(0, 0) / mu; // Compute the velocity @@ -465,10 +467,10 @@ template <typename ShapeFunction, typename IntegrationMethod, unsigned GlobalDim> void LiquidFlowLocalAssembler<ShapeFunction, IntegrationMethod, GlobalDim>:: AnisotropicCalculator::calculateVelocity( - unsigned ip, LocalMatrixType& darcy_velocity_at_ips, - Eigen::Map<const NodalVectorType> const& local_p, + unsigned const ip, Eigen::Map<const NodalVectorType> const& local_p, ShapeMatrices const& sm, Eigen::MatrixXd const& permeability, - double const mu, double const rho_g, int const gravitational_axis_id) + double const mu, double const rho_g, int const gravitational_axis_id, + MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips) { // Compute the velocity darcy_velocity_at_ips.col(ip).noalias() = diff --git a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h index c07fbfea53b4dd9637fdf1cb0191ae39bd5c303f..d4cbb1ae839d5ff64c3eed858244f1c5cb599820 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h +++ b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h @@ -61,7 +61,10 @@ public: std::vector<double>& /*cache*/) const = 0; protected: - /// Pointer that gets from Process class + // TODO: remove _coupling_term or move integration point data from local + // assembler class to a new class to make local assembler unique for each + //process. + /// Pointer that is set from a Process class. StaggeredCouplingTerm* _coupling_term; }; @@ -79,7 +82,7 @@ class LiquidFlowLocalAssembler : public LiquidFlowLocalAssemblerInterface using NodalVectorType = typename LocalAssemblerTraits::LocalVector; using GlobalDimVectorType = typename ShapeMatricesType::GlobalDimVectorType; - using LocalMatrixType = Eigen::Map< + using MatrixOfVelocityAtIntegrationPoints = Eigen::Map< Eigen::Matrix<double, GlobalDim, Eigen::Dynamic, Eigen::RowMajor>>; public: @@ -153,11 +156,11 @@ private: double const rho_g, int const gravitational_axis_id); static void calculateVelocity( - unsigned ip, LocalMatrixType& darcy_velocity_at_ips, - Eigen::Map<const NodalVectorType> const& local_p, + unsigned const ip, Eigen::Map<const NodalVectorType> const& local_p, ShapeMatrices const& sm, Eigen::MatrixXd const& permeability, double const mu, double const rho_g, - int const gravitational_axis_id); + int const gravitational_axis_id, + MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips); }; /** @@ -174,11 +177,11 @@ private: double const rho_g, int const gravitational_axis_id); static void calculateVelocity( - unsigned ip, LocalMatrixType& darcy_velocity_at_ips, - Eigen::Map<const NodalVectorType> const& local_p, + unsigned const ip, Eigen::Map<const NodalVectorType> const& local_p, ShapeMatrices const& sm, Eigen::MatrixXd const& permeability, double const mu, double const rho_g, - int const gravitational_axis_id); + int const gravitational_axis_id, + MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips); }; template <typename LaplacianGravityVelocityCalculator> @@ -198,28 +201,29 @@ private: std::vector<double>& local_K_data, std::vector<double>& local_b_data, SpatialPosition const& pos, Eigen::MatrixXd const& permeability); - void computeDarcyVelocity(Eigen::MatrixXd const& permeability, - std::vector<double> const& local_x, - LocalMatrixType& darcy_velocity_at_ips) const; + void computeDarcyVelocity( + Eigen::MatrixXd const& permeability, + std::vector<double> const& local_x, + MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips) const; void computeDarcyVelocityWithCoupling( Eigen::MatrixXd const& permeability, std::vector<double> const& local_x, std::unordered_map<std::type_index, const std::vector<double>> const& coupled_local_solutions, - LocalMatrixType& darcy_velocity_at_ips) const; + MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips) const; template <typename LaplacianGravityVelocityCalculator> void computeDarcyVelocityLocal( std::vector<double> const& local_x, Eigen::MatrixXd const& permeability, - LocalMatrixType& darcy_velocity_at_ips) const; + MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips) const; template <typename LaplacianGravityVelocityCalculator> void computeDarcyVelocityCoupledWithHeatTransportLocal( std::vector<double> const& local_x, std::vector<double> const& local_T, Eigen::MatrixXd const& permeability, - LocalMatrixType& darcy_velocity_at_ips) const; + MatrixOfVelocityAtIntegrationPoints& darcy_velocity_at_ips) const; const int _gravitational_axis_id; const double _gravitational_acceleration; diff --git a/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp b/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp index d398f7fc5cbdf18762a377b9c935605a7f41febf..74b635d78eed87825ff90a8c39d878615c3f4538 100644 --- a/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp +++ b/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp @@ -66,7 +66,7 @@ void LiquidFlowProcess::initializeConcreteProcess( pv.getShapeFunctionOrder(), _local_assemblers, mesh.isAxiallySymmetric(), integration_order, _gravitational_axis_id, _gravitational_acceleration, _reference_temperature, - *_material_properties, this->_coupling_term); + *_material_properties, _coupling_term); _secondary_variables.addSecondaryVariable( "darcy_velocity", diff --git a/ProcessLib/RichardsFlow/RichardsFlowFEM.h b/ProcessLib/RichardsFlow/RichardsFlowFEM.h index 53c3b1c5eb78e3a1e49559326496e49e2af16b8c..6d1ba5fe8b14342127cce3efde0a6526bb6a565f 100644 --- a/ProcessLib/RichardsFlow/RichardsFlowFEM.h +++ b/ProcessLib/RichardsFlow/RichardsFlowFEM.h @@ -251,7 +251,6 @@ public: NumLib::LocalToGlobalIndexMap const& dof_table, std::vector<double>& cache) const override { - // auto const num_nodes = ShapeFunction_::NPOINTS; auto const num_intpts = _shape_matrices.size(); auto const indices = NumLib::getIndices(