36 std::vector<GlobalVector*>
const& x,
37 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
38 std::vector<double>& cache)
const = 0;
41template <
typename ShapeFunction,
int GlobalDim>
59 std::size_t
const local_matrix_size,
61 bool is_axially_symmetric,
73 assert(local_matrix_size == ShapeFunction::NPOINTS *
NUM_NODAL_DOF);
74 (void)local_matrix_size;
78 std::vector<double>
const& local_x,
79 std::vector<double>
const& ,
80 std::vector<double>& local_M_data,
81 std::vector<double>& local_K_data,
82 std::vector<double>& )
override
84 auto const local_matrix_size = local_x.size();
87 assert(local_matrix_size == ShapeFunction::NPOINTS *
NUM_NODAL_DOF);
90 local_M_data, local_matrix_size, local_matrix_size);
92 local_K_data, local_matrix_size, local_matrix_size);
94 unsigned const n_integration_points =
101 for (
unsigned ip = 0; ip < n_integration_points; ip++)
115 double T_int_pt = 0.0;
123 .value(vars, pos, t, dt));
124 auto const specific_heat_capacity =
127 specific_heat_capacity)
128 .template value<double>(vars, pos, t, dt);
131 .template value<double>(vars, pos, t, dt);
133 local_K.noalias() += sm.dNdx.transpose() * k * sm.dNdx * sm.detJ *
134 wp.getWeight() * sm.integralMeasure;
135 local_M.noalias() += sm.N.transpose() * density *
136 specific_heat_capacity * sm.N * sm.detJ *
137 wp.getWeight() * sm.integralMeasure;
141 local_M = local_M.colwise().sum().eval().asDiagonal();
146 std::vector<double>
const& local_x,
147 std::vector<double>
const& local_x_prev,
148 std::vector<double>& local_rhs_data,
149 std::vector<double>& local_Jac_data)
override
151 auto const local_matrix_size = local_x.size();
154 assert(local_matrix_size == ShapeFunction::NPOINTS *
NUM_NODAL_DOF);
156 auto x = Eigen::Map<NodalVectorType const>(local_x.data(),
159 auto x_prev = Eigen::Map<NodalVectorType const>(local_x_prev.data(),
163 local_Jac_data, local_matrix_size, local_matrix_size);
165 local_rhs_data, local_matrix_size);
168 NodalMatrixType::Zero(local_matrix_size, local_matrix_size);
170 NodalMatrixType::Zero(local_matrix_size, local_matrix_size);
172 unsigned const n_integration_points =
179 for (
unsigned ip = 0; ip < n_integration_points; ip++)
195 double T_int_pt = 0.0;
203 .value(vars, pos, t, dt));
204 auto const specific_heat_capacity =
207 specific_heat_capacity)
208 .template value<double>(vars, pos, t, dt);
211 .template value<double>(vars, pos, t, dt);
213 laplace.noalias() += sm.dNdx.transpose() * k * sm.dNdx * w;
215 sm.N.transpose() * density * specific_heat_capacity * sm.N * w;
219 storage = storage.colwise().sum().eval().asDiagonal();
222 local_Jac.noalias() += laplace + storage / dt;
223 local_rhs.noalias() -= laplace * x + storage * (x - x_prev) / dt;
227 const unsigned integration_point)
const override
232 return Eigen::Map<const Eigen::RowVectorXd>(N.data(), N.size());
237 std::vector<GlobalVector*>
const& x,
238 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
239 std::vector<double>& cache)
const override
241 int const process_id = 0;
244 assert(!indices.empty());
245 auto const& local_x = x[process_id]->get(indices);
247 auto const T_nodal_values = Eigen::Map<const NodalVectorType>(
248 local_x.data(), ShapeFunction::NPOINTS);
250 unsigned const n_integration_points =
257 double const dt = std::numeric_limits<double>::quiet_NaN();
260 Eigen::Matrix<double, GlobalDim, Eigen::Dynamic, Eigen::RowMajor>>(
261 cache, GlobalDim, n_integration_points);
263 for (
unsigned ip = 0; ip < n_integration_points; ip++)
282 .value(vars, pos, t, dt));
285 cache_mat.col(ip).noalias() = -k * sm.dNdx * T_nodal_values;
296 std::vector<ShapeMatrices, Eigen::aligned_allocator<ShapeMatrices>>
EigenFixedShapeMatrixPolicy< ShapeFunction, GlobalDim > ShapeMatrixPolicyType
virtual std::vector< double > const & getIntPtHeatFlux(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const =0
HeatConductionProcessData const & _process_data
typename LocalAssemblerTraits::LocalVector NodalVectorType
typename ShapeMatricesType::GlobalDimVectorType GlobalDimVectorType
std::vector< double > const & getIntPtHeatFlux(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const override
void assembleWithJacobian(double const t, double const dt, std::vector< double > const &local_x, std::vector< double > const &local_x_prev, std::vector< double > &local_rhs_data, std::vector< double > &local_Jac_data) override
void assemble(double const t, double const dt, std::vector< double > const &local_x, std::vector< double > const &, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &) override
typename ShapeMatricesType::ShapeMatrices ShapeMatrices
ProcessLib::LocalAssemblerTraits< ShapeMatricesType, ShapeFunction::NPOINTS, NUM_NODAL_DOF, GlobalDim > LocalAssemblerTraits
LocalAssemblerData(MeshLib::Element const &element, std::size_t const local_matrix_size, NumLib::GenericIntegrationMethod const &integration_method, bool is_axially_symmetric, HeatConductionProcessData const &process_data)
ShapeMatrixPolicyType< ShapeFunction, GlobalDim > ShapeMatricesType
std::vector< ShapeMatrices, Eigen::aligned_allocator< ShapeMatrices > > _shape_matrices
Eigen::Map< const Eigen::RowVectorXd > getShapeMatrix(const unsigned integration_point) const override
Provides the shape matrix at the given integration point.
MeshLib::Element const & _element
NumLib::GenericIntegrationMethod const & _integration_method
typename LocalAssemblerTraits::LocalMatrix NodalMatrixType
constexpr Eigen::Matrix< double, GlobalDim, GlobalDim > formEigenTensor(MaterialPropertyLib::PropertyDataType const &values)
Eigen::Map< Vector > createZeroedVector(std::vector< double > &data, Eigen::VectorXd::Index size)
Eigen::Map< Matrix > createZeroedMatrix(std::vector< double > &data, Eigen::MatrixXd::Index rows, Eigen::MatrixXd::Index cols)
void shapeFunctionInterpolate(const NodalValues &, const ShapeMatrix &)
std::vector< GlobalIndexType > getIndices(std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table)
std::array< double, 3 > interpolateCoordinates(MeshLib::Element const &e, typename ShapeMatricesType::ShapeMatrices::ShapeType const &N)
const unsigned NUM_NODAL_DOF
detail::LocalAssemblerTraitsFixed< ShpPol, NNodes, NodalDOF, Dim > LocalAssemblerTraits
NumLib::ShapeMatrices< NodalRowVectorType, DimNodalMatrixType, DimMatrixType, GlobalDimNodalMatrixType > ShapeMatrices
VectorType< GlobalDim > GlobalDimVectorType
Vector< NNodes *NodalDOF > LocalVector
Matrix< NNodes *NodalDOF, NNodes *NodalDOF > LocalMatrix