38 namespace DeltaHamiltonian {
44 assert( cd.
Check() &&
"CoreData not ok in ElasticWall DeltaHamiltonian");
48 void ElasticWall::Initialize(
const CoreData& cd)
50 m_mesh = cd.m_mesh.get();
51 const auto& p = cd.m_parameters->get_child(
"cell_mechanics");
53 m_elastic_modulus = p.get<
double>(
"elastic_modulus");
54 m_lambda_alignment = p.get<
double>(
"lambda_alignment");
55 m_lambda_bend = p.get<
double>(
"lambda_bend");
56 m_lambda_cell_length = p.get<
double>(
"lambda_celllength");
57 m_lambda_length = p.get<
double>(
"lambda_length", 0.0);
58 m_rp_stiffness = p.get<
double>(
"relative_perimeter_stiffness");
59 m_target_node_distance = p.get<
double>(
"target_node_distance");
62 double ElasticWall::operator()(
const NeighborNodes& nb,
Node* n, std::array<double, 3> move)
67 const auto& nb1 = nb.
GetNb1();
68 const auto& nb2 = nb.
GetNb2();
69 const array<double, 3> now_p = *n;
70 const array<double, 3> mov_p = now_p + move;
71 const array<double, 3> nb1_p = *nb1;
72 const array<double, 3> nb2_p = *nb2;
74 if (!cell->IsBoundaryPolygon()) {
79 const auto del_area = 0.5 * ((mov_p[0] - now_p[0]) * (nb1_p[1] - nb2_p[1])
80 + (mov_p[1] - now_p[1]) * (nb2_p[0] - nb1_p[0]));
82 dh += del_area * (2.0 * (cell->GetTargetArea() - cell->
GetArea()) + del_area);
87 dh += m_elastic_modulus * DHelper::ElasticWallTerm(
88 cell, n, m_mesh->GetNodeOwningWalls(n), m_rp_stiffness, nb1_p, nb2_p, now_p, mov_p);
93 if (abs(m_lambda_length) > 1.0e-7) {
94 const bool at_b = n->IsAtBoundary();
95 const double w1 = (at_b && nb1->IsAtBoundary()) ? m_rp_stiffness : 1.0;
96 const double w2 = (at_b && nb2->IsAtBoundary()) ? m_rp_stiffness : 1.0;
97 const double old1 = Norm(now_p - nb1_p) - m_target_node_distance;
98 const double old2 = Norm(now_p - nb2_p) - m_target_node_distance;
99 const double new1 = Norm(mov_p - nb1_p) - m_target_node_distance;
100 const double new2 = Norm(mov_p - nb2_p) - m_target_node_distance;
102 dh += m_lambda_length * (w1 * (new1 * new1 - old1 * old1) + w2 * (new2 * new2 - old2 * old2));
108 if ((abs(m_lambda_cell_length) > 1.0e-7) || (abs(m_lambda_alignment) > 1.0e-7)) {
110 const auto new_geo = ModifyForMove(old_geo, nb1_p, nb2_p, now_p, mov_p);
111 const auto old_tup = old_geo.GetEllipseAxes();
112 const auto new_tup = new_geo.GetEllipseAxes();
117 if (abs(m_lambda_cell_length) > 1.0e-7) {
118 const double t_old = cell->GetTargetLength() - get<0>(old_tup);
119 const double t_new = cell->GetTargetLength() - get<0>(new_tup);
121 dh += m_lambda_cell_length * (t_new * t_new - t_old * t_old);
127 if (abs(m_lambda_alignment) > 1.0e-7) {
128 dh += m_lambda_alignment * DHelper::AlignmentTerm(get<1>(old_tup), get<1>(new_tup));
136 if (abs(m_lambda_bend) > 1.0e-7) {
137 dh += m_lambda_bend * DHelper::BendingTerm(nb1_p, nb2_p, now_p, mov_p);
Core data with mesh, parameters, random engine and time data.
A cell contains walls and nodes.
Cell * GetCell() const
Return the cell of this Neighbor pair.
Core data used during model execution.
Combo header for circular iterator.
Interface for NeighborNodes.
Interface/Implementation for GeoData.
Namespace for components of the Default model group.
Namespace for the core simulator.
Node * GetNb1() const
Return first node of this Neighbor pair.
Structure of neighboring nodes: two neighboring nodes from standpoint of a given cell with an orderin...
Node * GetNb2() const
Return second node of this Neighbor pair.
Interface/Implementation for DeltaHamiltonian::DHelper.
GeoData GetGeoData() const
Return GeData (area, centroid, area moment of inertia).
Interface for DeltaHamiltonian::ElasticWall.
double GetArea() const
Return the area of the cell.
bool Check() const
Verify all pointers non-null.