34 DBUG(
"Assemble AnchorTerm.");
36 using GlobalDimVector = Eigen::Vector<double, GlobalDim>;
37 using GlobalDimMatrix = Eigen::Matrix<double, GlobalDim, GlobalDim>;
41 auto const element_id = element->getID();
46 std::vector<GlobalIndexType>
const global_indices =
48 assert(global_indices.size() == 2 * GlobalDim);
50 Eigen::Vector<double, 2 * GlobalDim>
const local_x =
53 Eigen::Vector<double, 2 * GlobalDim> local_rhs =
54 Eigen::Vector<double, 2 * GlobalDim>::Zero();
55 Eigen::Matrix<double, 2 * GlobalDim, 2 * GlobalDim> local_Jac =
56 Eigen::Matrix<double, 2 * GlobalDim, 2 * GlobalDim>::Zero();
60 auto node_local_indices = [](
int const i)
61 {
return Eigen::seqN(i, Eigen::fix<GlobalDim>, Eigen::fix<2>); };
63 auto node_coords = [element](
int const i)
64 {
return element->getNode(i)->asEigenVector3d(); };
65 GlobalDimVector
const l_original =
66 (node_coords(1) - node_coords(0)).
template head<GlobalDim>();
67 double const l_original_norm = l_original.norm();
70 auto u = [&local_x, &node_local_indices](
int const i)
71 {
return local_x(node_local_indices(i)); };
72 GlobalDimVector
const l = l_original + u(1) - u(0);
75 GlobalDimVector
const f = l_original / l_original_norm * K *
76 (l.norm() - l_original_norm) /
79 GlobalDimMatrix
const Df = l_original / l_original_norm * K *
80 l.transpose() / l.norm() / l_original_norm;
83 constexpr auto even_odd_sign = [](
int const n)
84 {
return (n % 2 == 0) ? 1.0 : -1.0; };
89 for (
int i = 0; i < 2; ++i)
91 local_rhs(node_local_indices(i)).noalias() += even_odd_sign(i) * f;
93 for (
int j = 0; j < 2; ++j)
95 local_Jac(node_local_indices(i), node_local_indices(j))
96 .noalias() += even_odd_sign(i) * even_odd_sign(j) * Df;
100 b.
add(global_indices, local_rhs);
103 jac->
add({global_indices, global_indices}, local_Jac);
AnchorTerm(std::unique_ptr< NumLib::LocalToGlobalIndexMap > source_term_dof_table, std::size_t const source_term_mesh_id, MeshLib::Mesh const &st_mesh, const int variable_id, ParameterLib::Parameter< double > const ¶meter)