Skip to content

Commit d0e305f

Browse files
authored
Merge pull request #1968 from amgebauer/move-constr2D-tests-to-new-solids
Move all constr2D tests to new solid elements
2 parents 077db15 + e1aff6b commit d0e305f

File tree

9 files changed

+586
-697
lines changed

9 files changed

+586
-697
lines changed

src/adapter/4C_adapter_str_structure_new.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -606,9 +606,13 @@ void Adapter::StructureBaseAlgorithmNew::detect_element_technologies(
606606
if (shell7p->get_ele_tech().find(Inpar::Solid::EleTech::eas) != shell7p->get_ele_tech().end())
607607
iseas_local = 1;
608608

609-
Discret::Elements::Solid<3>* solid = dynamic_cast<Discret::Elements::Solid<3>*>(actele);
610-
if (solid != nullptr)
611-
if (solid->have_eas()) iseas_local = 1;
609+
const auto* solid3 = dynamic_cast<Discret::Elements::Solid<3>*>(actele);
610+
if (solid3 != nullptr)
611+
if (solid3->have_eas()) iseas_local = 1;
612+
613+
const auto* solid2 = dynamic_cast<Discret::Elements::Solid<2>*>(actele);
614+
if (solid2 != nullptr)
615+
if (solid2->have_eas()) iseas_local = 1;
612616

613617
// Detect non-additive rotation-vector DOFs --------------------------------
614618
if (actele->element_type() == Discret::Elements::Beam3rType::instance() or

src/core/legacy_enum_definitions/4C_legacy_enum_definitions_element_actions.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ namespace Core::Elements
4141
struct_calc_reset_istep, //!< reset elementwise internal variables, during iteration to last
4242
//!< converged state
4343
struct_calc_energy, //!< compute internal energy
44+
calc_struct_constrarea,
45+
calc_struct_areaconstrstiff,
4446
struct_postprocess_thickness, //!< postprocess thickness of membrane finite elements
4547
struct_init_gauss_point_data_output, //!< initialize quantities for output of gauss point
4648
//!< data
@@ -99,6 +101,10 @@ namespace Core::Elements
99101
return struct_calc_reset_istep;
100102
else if (action == "calc_struct_energy")
101103
return struct_calc_energy;
104+
else if (action == "calc_struct_constrarea")
105+
return calc_struct_constrarea;
106+
else if (action == "calc_struct_areaconstrstiff")
107+
return calc_struct_areaconstrstiff;
102108
else if (action == "struct_init_gauss_point_data_output")
103109
return struct_init_gauss_point_data_output;
104110
else if (action == "struct_gauss_point_data_output")
@@ -150,6 +156,10 @@ namespace Core::Elements
150156
return "struct_calc_stress";
151157
case struct_calc_thickness:
152158
return "struct_calc_thickness";
159+
case calc_struct_constrarea:
160+
return "calc_struct_constrarea";
161+
case calc_struct_areaconstrstiff:
162+
return "calc_struct_areaconstrstiff";
153163
case struct_calc_eleload:
154164
return "struct_calc_eleload";
155165
case struct_calc_fsiload:

src/solid_3D_ele/4C_solid_3D_ele_calc_lib_plane.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,8 +313,10 @@ double Discret::Elements::evaluate_material_strain_energy(Mat::So3Material& mate
313313
const Core::LinAlg::SymmetricTensor<double, 2, 2>& gl_strain, Teuchos::ParameterList& params,
314314
const Mat::EvaluationContext<2>& context, const int gp, const int eleGID)
315315
{
316+
constexpr auto dummy_defgrd =
317+
Core::LinAlg::get_full(Core::LinAlg::TensorGenerators::identity<double, 2, 2>);
316318
const Core::LinAlg::Tensor<double, 2, 2> defgrd =
317-
Discret::Elements::compute_deformation_gradient_from_gl_strains({}, gl_strain);
319+
Discret::Elements::compute_deformation_gradient_from_gl_strains(dummy_defgrd, gl_strain);
318320

319321
double strain_energy = 0.0;
320322
transform_to_3d(material, element_properties, defgrd, gl_strain, params, context, gp, eleGID,

src/solid_3D_ele/4C_solid_3D_ele_line.cpp

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@
77

88
#include "4C_solid_3D_ele_line.hpp"
99

10+
#include "4C_fem_discretization.hpp"
11+
#include "4C_fem_general_cell_type_traits.hpp"
12+
#include "4C_fem_general_extract_values.hpp"
13+
#include "4C_legacy_enum_definitions_element_actions.hpp"
1014
#include "4C_linalg_serialdensematrix.hpp"
15+
#include "4C_linalg_tensor.hpp"
1116
#include "4C_solid_3D_ele_neumann_evaluator.hpp"
1217
#include "4C_utils_exceptions.hpp"
1318

@@ -19,6 +24,32 @@
1924
FOUR_C_NAMESPACE_OPEN
2025

2126

27+
namespace
28+
{
29+
template <Core::FE::CellType celltype, unsigned dim>
30+
std::array<Core::LinAlg::Tensor<double, dim>, Core::FE::num_nodes(celltype)>
31+
evaluate_current_coordinates(const Core::Elements::Element& ele,
32+
const Core::FE::Discretization& discretization, const std::vector<int>& lm)
33+
{
34+
constexpr unsigned num_dofs = dim * Core::FE::num_nodes(celltype);
35+
std::array<double, num_dofs> mydisp =
36+
Core::FE::extract_values_as_array<num_dofs>(*discretization.get_state("displacement"), lm);
37+
38+
std::array<Core::LinAlg::Tensor<double, dim>, Core::FE::num_nodes(celltype)>
39+
current_nodal_coordinates;
40+
41+
for (int i = 0; i < Core::FE::num_nodes(celltype); ++i)
42+
{
43+
for (std::size_t d = 0; d < dim; ++d)
44+
{
45+
current_nodal_coordinates[i](d) = ele.nodes()[i]->x()[d] + mydisp[i * dim + d];
46+
}
47+
}
48+
49+
return current_nodal_coordinates;
50+
}
51+
} // namespace
52+
2253
template <unsigned dim>
2354
Discret::Elements::SolidLineType<dim> Discret::Elements::SolidLineType<dim>::instance_;
2455

@@ -107,12 +138,92 @@ void Discret::Elements::SolidLine<dim>::print(std::ostream& os) const
107138
Element::print(os);
108139
}
109140

141+
template <unsigned dim>
142+
int Discret::Elements::SolidLine<dim>::evaluate(Teuchos::ParameterList& params,
143+
Core::FE::Discretization& discretization, std::vector<int>& lm,
144+
Core::LinAlg::SerialDenseMatrix& elematrix1, Core::LinAlg::SerialDenseMatrix& elematrix2,
145+
Core::LinAlg::SerialDenseVector& elevector1, Core::LinAlg::SerialDenseVector& elevector2,
146+
Core::LinAlg::SerialDenseVector& elevector3)
147+
{
148+
set_params_interface_ptr(params);
149+
150+
Core::Elements::ActionType act =
151+
Core::Elements::string_to_action_type(params.get<std::string>("action"));
152+
153+
switch (act)
154+
{
155+
case Core::Elements::ActionType::calc_struct_constrarea:
156+
{
157+
FOUR_C_ASSERT_ALWAYS(
158+
shape() == Core::FE::CellType::line2, "Area Constraint only works for line2 elements!");
159+
160+
constexpr Core::FE::CellType celltype = Core::FE::CellType::line2;
161+
162+
163+
// We are not interested in volume of ghosted elements
164+
if (Core::Communication::my_mpi_rank(discretization.get_comm()) != owner()) return 0;
165+
166+
auto current_nodal_coordinates =
167+
evaluate_current_coordinates<celltype, dim>(*this, discretization, lm);
168+
169+
elevector3[0] = 0.5 * (current_nodal_coordinates[0](1) + current_nodal_coordinates[1](1)) *
170+
(current_nodal_coordinates[1](0) - current_nodal_coordinates[0](0));
171+
}
172+
break;
173+
case Core::Elements::ActionType::calc_struct_areaconstrstiff:
174+
{
175+
FOUR_C_ASSERT_ALWAYS(
176+
shape() == Core::FE::CellType::line2, "Area Constraint only works for line2 elements!");
177+
178+
constexpr Core::FE::CellType celltype = Core::FE::CellType::line2;
179+
180+
// We are not interested in volume of ghosted elements
181+
if (Core::Communication::my_mpi_rank(discretization.get_comm()) != owner()) return 0;
182+
183+
auto current_nodal_coordinates =
184+
evaluate_current_coordinates<celltype, dim>(*this, discretization, lm);
185+
186+
FOUR_C_ASSERT(elevector1.length() == 4,
187+
"Expected elevector1 to have size 4 for line2 area constraint! Given vector has size {}",
188+
elevector1.length());
189+
FOUR_C_ASSERT(elematrix1.num_cols() == 4 && elematrix1.num_rows() == 4,
190+
"Expected elematrix1 to have 4 rows and 4 columns for line2 area constraint! Given "
191+
"matrix has {} rows and {} columns",
192+
elematrix1.num_rows(), elematrix1.num_cols());
193+
194+
elevector1[0] = 0.5 * (current_nodal_coordinates[0](1) + current_nodal_coordinates[1](1));
195+
elevector1[1] = 0.5 * (current_nodal_coordinates[0](0) - current_nodal_coordinates[1](0));
196+
elevector1[2] = -0.5 * (current_nodal_coordinates[0](1) + current_nodal_coordinates[1](1));
197+
elevector1[3] = 0.5 * (current_nodal_coordinates[0](0) - current_nodal_coordinates[1](0));
198+
elevector2 = elevector1;
199+
200+
elematrix1.put_scalar(0.0);
201+
elematrix1(0, 1) = 0.5;
202+
elematrix1(0, 3) = 0.5;
203+
elematrix1(1, 0) = 0.5;
204+
elematrix1(1, 2) = -0.5;
205+
elematrix1(2, 1) = -0.5;
206+
elematrix1(2, 3) = -0.5;
207+
elematrix1(3, 0) = 0.5;
208+
elematrix1(3, 2) = -0.5;
209+
210+
elevector3[0] = 0.5 * (current_nodal_coordinates[0](1) + current_nodal_coordinates[1](1)) *
211+
(current_nodal_coordinates[1](0) - current_nodal_coordinates[0](0));
212+
}
213+
break;
214+
default:
215+
FOUR_C_THROW("Unknown type of action {} for SolidLine element", action_type_to_string(act));
216+
}
217+
return 0;
218+
}
219+
110220
template <unsigned dim>
111221
int Discret::Elements::SolidLine<dim>::evaluate_neumann(Teuchos::ParameterList& params,
112222
Core::FE::Discretization& discretization, const Core::Conditions::Condition& condition,
113223
std::vector<int>& lm, Core::LinAlg::SerialDenseVector& elevec1,
114224
Core::LinAlg::SerialDenseMatrix* elemat1)
115225
{
226+
static_assert(dim == 2 || dim == 3, "SolidLine element only implemented for 2D and 3D!");
116227
set_params_interface_ptr(params);
117228

118229
const double total_time = std::invoke(

src/solid_3D_ele/4C_solid_3D_ele_line.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@ namespace Discret::Elements
9797
return SolidLineType<dim>::instance();
9898
}
9999

100+
int evaluate(Teuchos::ParameterList& params, Core::FE::Discretization& discretization,
101+
std::vector<int>& lm, Core::LinAlg::SerialDenseMatrix& elematrix1,
102+
Core::LinAlg::SerialDenseMatrix& elematrix2, Core::LinAlg::SerialDenseVector& elevector1,
103+
Core::LinAlg::SerialDenseVector& elevector2,
104+
Core::LinAlg::SerialDenseVector& elevector3) override;
105+
100106
int evaluate_neumann(Teuchos::ParameterList& params, Core::FE::Discretization& discretization,
101107
const Core::Conditions::Condition& condition, std::vector<int>& lm,
102108
Core::LinAlg::SerialDenseVector& elevec1,

0 commit comments

Comments
 (0)