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

Pr small brep surface new constructor #13094

Merged
merged 16 commits into from
Feb 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
49 changes: 49 additions & 0 deletions kratos/geometries/brep_surface.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class BrepSurface
typedef Geometry<typename TContainerPointType::value_type> BaseType;
typedef Geometry<typename TContainerPointType::value_type> GeometryType;
typedef typename GeometryType::Pointer GeometryPointer;
using GeometrySurrogateArrayType = DenseVector<GeometryPointer>;

typedef GeometryData::IntegrationMethod IntegrationMethod;

Expand Down Expand Up @@ -163,6 +164,8 @@ class BrepSurface
mInnerLoopArray = rOther.mInnerLoopArray;
mEmbeddedEdgesArray = rOther.mEmbeddedEdgesArray;
mIsTrimmed = rOther.mIsTrimmed;
mpSurrogateInnerLoopGeometries = rOther.mpSurrogateInnerLoopGeometries;
mpSurrogateOuterLoopGeometries = rOther.mpSurrogateOuterLoopGeometries;
return *this;
}

Expand All @@ -176,6 +179,8 @@ class BrepSurface
mInnerLoopArray = rOther.mInnerLoopArray;
mEmbeddedEdgesArray = rOther.mEmbeddedEdgesArray;
mIsTrimmed = rOther.mIsTrimmed;
mpSurrogateInnerLoopGeometries = rOther.mpSurrogateInnerLoopGeometries;
mpSurrogateOuterLoopGeometries = rOther.mpSurrogateOuterLoopGeometries;
return *this;
}

Expand Down Expand Up @@ -550,6 +555,42 @@ class BrepSurface
return GeometryData::KratosGeometryType::Kratos_Brep_Surface;
}

/**
* @brief Set the Surrogate Outer Loop Geometries object
* @param pSurrogateOuterLoopArray
*/
void SetSurrogateOuterLoopGeometries(GeometrySurrogateArrayType &rSurrogateOuterLoopArray)
{
mpSurrogateOuterLoopGeometries = &rSurrogateOuterLoopArray;
}

/**
* @brief Set the Surrogate Inner Loop Geometries object
* @param pSurrogateInnerLoopArray
*/
void SetSurrogateInnerLoopGeometries(GeometrySurrogateArrayType &rSurrogateInnerLoopArray)
{
mpSurrogateInnerLoopGeometries = &rSurrogateInnerLoopArray;
}

/**
* @brief Get the Surrogate Inner Loop Geometries object
* @return GeometrySurrogateArrayType
*/
GeometrySurrogateArrayType& GetSurrogateInnerLoopGeometries()
{
return *mpSurrogateInnerLoopGeometries;
}

/**
* @brief Get the Surrogate Outer Loop Geometries object
* @return GeometrySurrogateArrayType
*/
GeometrySurrogateArrayType& GetSurrogateOuterLoopGeometries()
{
return *mpSurrogateOuterLoopGeometries;
}

///@}
///@name Information
///@{
Expand Down Expand Up @@ -595,6 +636,10 @@ class BrepSurface

BrepCurveOnSurfaceArrayType mEmbeddedEdgesArray;

GeometrySurrogateArrayType* mpSurrogateInnerLoopGeometries;
GeometrySurrogateArrayType* mpSurrogateOuterLoopGeometries;


/** IsTrimmed is used to optimize processes as
* e.g. creation of integration domain.
*/
Expand All @@ -614,6 +659,8 @@ class BrepSurface
rSerializer.save("InnerLoopArray", mInnerLoopArray);
rSerializer.save("EmbeddedEdgesArray", mEmbeddedEdgesArray);
rSerializer.save("IsTrimmed", mIsTrimmed);
rSerializer.save("SurrogateInnerLoopGeometries", mpSurrogateInnerLoopGeometries);
rSerializer.save("SurrogateOuterLoopGeometries", mpSurrogateOuterLoopGeometries);
}

void load( Serializer& rSerializer ) override
Expand All @@ -624,6 +671,8 @@ class BrepSurface
rSerializer.load("InnerLoopArray", mInnerLoopArray);
rSerializer.load("EmbeddedEdgesArray", mEmbeddedEdgesArray);
rSerializer.load("IsTrimmed", mIsTrimmed);
rSerializer.save("SurrogateInnerLoopGeometries", mpSurrogateInnerLoopGeometries);
rSerializer.save("SurrogateOuterLoopGeometries", mpSurrogateOuterLoopGeometries);
}

BrepSurface()
Expand Down
57 changes: 57 additions & 0 deletions kratos/tests/cpp_tests/geometries/test_brep_surface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,5 +195,62 @@ namespace Testing {
//auto results = p_brep_curve_on_surface.GlobalDerivatives(coords, 3);
//KRATOS_WATCH(results[0])
}

KRATOS_TEST_CASE_IN_SUITE(NurbsBrepSurfaceSurrogate, KratosCoreGeometriesFastSuite)
{
auto p_surface = GenerateReferenceNodeSurfaceHalfCirclePointer();

using BrepSurfaceType = BrepSurface<PointerVector<Node>, true, PointerVector<Point>>;
using BrepCurveOnSurfaceLoopArrayType = typename BrepSurfaceType::BrepCurveOnSurfaceLoopArrayType;

rubenzorrilla marked this conversation as resolved.
Show resolved Hide resolved
using GeometrySurrogateArrayType = typename BrepSurfaceType::GeometrySurrogateArrayType;


BrepCurveOnSurfaceLoopArrayType outer_loops, inner_loops;

Model model;
ModelPart& rSurrogateModelPartOuter = model.CreateModelPart("surrogate_model_part_outer");
rSurrogateModelPartOuter.CreateNewProperties(0);
rSurrogateModelPartOuter.CreateNewNode(1, 0.0, 0.0, 0.0);
rSurrogateModelPartOuter.CreateNewNode(2, 2.0, 0.0, 0.0);
rSurrogateModelPartOuter.CreateNewNode(3, 2.0, 2.0, 0.0);
rSurrogateModelPartOuter.CreateNewNode(4, 0.0, 2.0, 0.0);

Properties::Pointer p_prop = rSurrogateModelPartOuter.pGetProperties(0);
rSurrogateModelPartOuter.CreateNewCondition("LineCondition2D2N", 1, {{1, 2}}, p_prop);
rSurrogateModelPartOuter.CreateNewCondition("LineCondition2D2N", 2, {{2, 3}}, p_prop);
rSurrogateModelPartOuter.CreateNewCondition("LineCondition2D2N", 3, {{3, 4}}, p_prop);
rSurrogateModelPartOuter.CreateNewCondition("LineCondition2D2N", 4, {{4, 1}}, p_prop);

GeometrySurrogateArrayType surrogate_outer_loop_geometries(rSurrogateModelPartOuter.NumberOfConditions());
GeometrySurrogateArrayType surrogate_inner_loop_geometries(rSurrogateModelPartOuter.NumberOfConditions());

int count = 0;
for (auto i_cond : rSurrogateModelPartOuter.Conditions())
{
surrogate_outer_loop_geometries[count] = i_cond.pGetGeometry();
count++;
}

count = 0;
for (auto i_cond : rSurrogateModelPartOuter.Conditions())
{
surrogate_inner_loop_geometries[count] = i_cond.pGetGeometry();
count++;
}

auto p_brep_surface =
Kratos::make_shared<BrepSurfaceType>(
p_surface,
outer_loops,
inner_loops);

p_brep_surface->SetSurrogateInnerLoopGeometries(surrogate_inner_loop_geometries);
p_brep_surface->SetSurrogateOuterLoopGeometries(surrogate_outer_loop_geometries);

KRATOS_EXPECT_EQ(p_brep_surface->GetSurrogateInnerLoopGeometries().size(), 4);
KRATOS_EXPECT_EQ(p_brep_surface->GetSurrogateOuterLoopGeometries().size(), 4);

}
} // namespace Testing.
} // namespace Kratos.
Loading