Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MappingApplication] Fixing pure 2D geometry in 2D-3D projection mapper #12847

Merged
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
5f074d8
[MappingApplication] Fixing pure 2D geometry in 2D-3D projection mapper
loumalouomega Nov 14, 2024
2a7bfc6
base files added
AlejandroCornejo Nov 3, 2024
f4a58a0
add more
AlejandroCornejo Nov 3, 2024
bb59ef5
remove bug
AlejandroCornejo Nov 3, 2024
c4d69ec
more code
AlejandroCornejo Nov 3, 2024
8950a3e
adding
AlejandroCornejo Nov 4, 2024
cdb9e1a
shape funct
AlejandroCornejo Nov 4, 2024
df714fb
derivatives of shape functions
AlejandroCornejo Nov 4, 2024
2a40aa0
add utils for truss rotations
AlejandroCornejo Nov 4, 2024
e64714e
more code
AlejandroCornejo Nov 4, 2024
b3c5c21
rotations
AlejandroCornejo Nov 4, 2024
57bba97
calculate LHS
AlejandroCornejo Nov 4, 2024
06617cf
calc LHS
AlejandroCornejo Nov 5, 2024
70a84d8
RHS
AlejandroCornejo Nov 5, 2024
00b4969
registering elements
AlejandroCornejo Nov 5, 2024
b4febf5
minor
AlejandroCornejo Nov 5, 2024
85aa00a
minor
AlejandroCornejo Nov 6, 2024
ec0b698
remove space
AlejandroCornejo Nov 6, 2024
394a50b
prints
AlejandroCornejo Nov 6, 2024
c9b7a78
missing C
AlejandroCornejo Nov 6, 2024
0b0c6b0
good print now
AlejandroCornejo Nov 6, 2024
68aad82
adding 2d2N test input
AlejandroCornejo Nov 6, 2024
886edde
adding test
AlejandroCornejo Nov 8, 2024
e4a1c50
results
AlejandroCornejo Nov 8, 2024
a865389
improve truss cl
AlejandroCornejo Nov 8, 2024
75e67ee
add check
AlejandroCornejo Nov 8, 2024
ad23c9e
adding 2D3N test
AlejandroCornejo Nov 8, 2024
d228b1f
unused var
AlejandroCornejo Nov 9, 2024
d693974
avoid repetition
AlejandroCornejo Nov 11, 2024
ae150be
reordering register of FEs
AlejandroCornejo Nov 13, 2024
fa88eed
minor in test
AlejandroCornejo Nov 13, 2024
bc03bea
add chack and avoid a repet
AlejandroCornejo Nov 13, 2024
0dafe18
add new res file 2D3N
AlejandroCornejo Nov 13, 2024
5674629
[GeoMechanicsApplication] Replaced manual mock functions with standar…
rfaasse Nov 13, 2024
e9c98da
Add RegistryItem::IsSameType
jcotela Jul 17, 2024
0ac94a5
Register variable by application
jcotela Jul 17, 2024
8e0d2c2
Deregister variables when destroying application
jcotela Jul 17, 2024
ab6da2c
MPI fix
loumalouomega Nov 14, 2024
8193a9f
Merge branch 'master' into mapping/fixing-pure-2d-geometry-in-pure-2D…
loumalouomega Nov 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ using GeometryType = Geometry<NodeType>;

/**
* @brief This method retrieves the first geometry from a model part
* @param rModelPart The input model part
* @param rModelPart The input model part
* @return The first geometry of the model part
*/
GeometryType::Pointer GetGeometryFromModelPart(const ModelPart& rModelPart)
Expand Down Expand Up @@ -85,9 +85,12 @@ unsigned int DetermineModelPartMaximumLocalDimension(ModelPart& rModelPart)
* @brief This method determines the 2D model part
* @param rFirstModelPart The first ModelPart
* @param rSecondModelPart The second ModelPart
* @return The 2D model part
* @return The 2D model part
*/
ModelPart& Determine2DModelPart(ModelPart& rFirstModelPart, ModelPart& rSecondModelPart)
ModelPart& Determine2DModelPart(
ModelPart& rFirstModelPart,
ModelPart& rSecondModelPart
)
{
// Getting the maximum local space dimension
const unsigned int max_local_space_dimension_1 = DetermineModelPartMaximumLocalDimension(rFirstModelPart);
Expand All @@ -110,9 +113,12 @@ ModelPart& Determine2DModelPart(ModelPart& rFirstModelPart, ModelPart& rSecondMo
* @details The counter part of the previous method
* @param rFirstModelPart The first ModelPart
* @param rSecondModelPart The second ModelPart
* @return The 3D model part
* @return The 3D model part
*/
ModelPart& Determine3DModelPart(ModelPart& rFirstModelPart, ModelPart& rSecondModelPart)
ModelPart& Determine3DModelPart(
ModelPart& rFirstModelPart,
ModelPart& rSecondModelPart
)
{
// Getting the maximum local space dimension
const unsigned int max_local_space_dimension_1 = DetermineModelPartMaximumLocalDimension(rFirstModelPart);
Expand Down Expand Up @@ -476,32 +482,41 @@ class Projection3D2DMapper
GeometryType::CoordinatesArrayType aux_coords;
noalias(mPointPlane.Coordinates()) = p_geometry->Center();
p_geometry->PointLocalCoordinates(aux_coords, mPointPlane);
noalias(mNormalPlane) = p_geometry->UnitNormal(aux_coords);
const bool is_pure_2d_geometry = p_geometry->LocalSpaceDimension() == p_geometry->WorkingSpaceDimension() ? true : false;
if (is_pure_2d_geometry) {
mNormalPlane[0] = 0.0;
mNormalPlane[1] = 0.0;
mNormalPlane[2] = 1.0;
} else {
noalias(mNormalPlane) = p_geometry->UnitNormal(aux_coords);
}

// Doing a check that all normals are aligned
std::size_t check_normal;
const double numerical_limit = std::numeric_limits<double>::epsilon() * 1.0e4;
struct normal_check {
normal_check(array_1d<double, 3>& rNormal) : reference_normal(rNormal) {};
array_1d<double, 3> reference_normal;
GeometryType::CoordinatesArrayType aux_coords;
};
if (mEntityTypeMesh == EntityTypeMesh::CONDITIONS) {
check_normal = block_for_each<SumReduction<std::size_t>>(r_2d_model_part.Conditions(), normal_check(mNormalPlane), [&numerical_limit](auto& r_cond, normal_check& nc) {
auto& r_geom = r_cond.GetGeometry();
r_geom.PointLocalCoordinates(nc.aux_coords, r_geom.Center());
const auto normal = r_geom.UnitNormal(nc.aux_coords);
return (norm_2(normal - nc.reference_normal) > numerical_limit);
});
} else {
check_normal = block_for_each<SumReduction<std::size_t>>(r_2d_model_part.Elements(), normal_check(mNormalPlane), [&numerical_limit](auto& r_elem, normal_check& nc) {
auto& r_geom = r_elem.GetGeometry();
r_geom.PointLocalCoordinates(nc.aux_coords, r_geom.Center());
const auto normal = r_geom.UnitNormal(nc.aux_coords);
return (norm_2(normal - nc.reference_normal) > numerical_limit);
});
if (!is_pure_2d_geometry) {
std::size_t check_normal;
const double numerical_limit = std::numeric_limits<double>::epsilon() * 1.0e4;
struct normal_check {
normal_check(array_1d<double, 3>& rNormal) : reference_normal(rNormal) {};
array_1d<double, 3> reference_normal;
GeometryType::CoordinatesArrayType aux_coords;
};
if (mEntityTypeMesh == EntityTypeMesh::CONDITIONS) {
check_normal = block_for_each<SumReduction<std::size_t>>(r_2d_model_part.Conditions(), normal_check(mNormalPlane), [&numerical_limit](auto& r_cond, normal_check& nc) {
auto& r_geom = r_cond.GetGeometry();
r_geom.PointLocalCoordinates(nc.aux_coords, r_geom.Center());
const auto normal = r_geom.UnitNormal(nc.aux_coords);
return (norm_2(normal - nc.reference_normal) > numerical_limit);
});
} else {
check_normal = block_for_each<SumReduction<std::size_t>>(r_2d_model_part.Elements(), normal_check(mNormalPlane), [&numerical_limit](auto& r_elem, normal_check& nc) {
auto& r_geom = r_elem.GetGeometry();
r_geom.PointLocalCoordinates(nc.aux_coords, r_geom.Center());
const auto normal = r_geom.UnitNormal(nc.aux_coords);
return (norm_2(normal - nc.reference_normal) > numerical_limit);
});
}
KRATOS_ERROR_IF_NOT(check_normal == 0) << "The 2D reference model part has not consistent normals. Please check that is properly aligned" << std::endl;
}
KRATOS_ERROR_IF_NOT(check_normal == 0) << "The 2D reference model part has not consistent normals. Please check that is properly aligned" << std::endl;

// The partition that sends
if (is_distributed) {
Expand Down
Loading