Skip to content

Commit

Permalink
More functions for refinement/grid adaptation.
Browse files Browse the repository at this point in the history
  • Loading branch information
anaegel committed Jan 13, 2025
1 parent c77b870 commit b51160e
Showing 1 changed file with 76 additions and 7 deletions.
83 changes: 76 additions & 7 deletions ugbase/bridge/domain_bridges/refinement_bridge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,12 @@ static RefinementMark StringToRefinementMark(std::string markType)
{
TrimString(markType);
std::transform(markType.begin(), markType.end(), markType.begin(), ::tolower);
if(markType == "closure") return RM_CLOSURE;
if(markType == "local") return RM_LOCAL;
if(markType == "refine") return RM_REFINE;
if(markType == "coarsen") return RM_COARSEN;


UG_THROW("StringToRefinementMark: non-supported type: "<<markType);
return RM_NONE;
}
Expand Down Expand Up @@ -1252,9 +1255,10 @@ void MarkForCoarsen_ElementsByLuaCallback(TDomain& dom, SmartPtr<IRefiner> refin
}



template <class TDomain, class TSubsetHandler, class TElem>
void MarkForRefinement_ElementsInSubset(TDomain& dom, IRefiner& refiner,
TSubsetHandler& sh, int subsetIndex)
void MarkForAdaption_ElementsInSubset_(TDomain& dom, IRefiner& refiner,
TSubsetHandler& sh, int subsetIndex, RefinementMark rmMark)
{
PROFILE_FUNC();
typedef typename GridObjectCollection::traits<TElem>::iterator iterator_t;
Expand All @@ -1265,11 +1269,27 @@ void MarkForRefinement_ElementsInSubset(TDomain& dom, IRefiner& refiner,
for(iterator_t iter = goc.begin<TElem>(lvl);
iter != goc.end<TElem>(lvl); ++iter)
{
refiner.mark(*iter);
refiner.mark(*iter, rmMark);
}
}
}

template <class TDomain, class TSubsetHandler, class TElem>
void MarkForAdaption_ElementsInSubset(TDomain& dom, IRefiner& refiner,
TSubsetHandler& sh, int subsetIndex, std::string markType)
{
RefinementMark rmMark = StringToRefinementMark(markType);
MarkForAdaption_ElementsInSubset_<TDomain,TSubsetHandler,TElem>(dom, refiner, sh, subsetIndex, rmMark);
}


template <class TDomain, class TSubsetHandler, class TElem>
void MarkForRefinement_ElementsInSubset(TDomain& dom, IRefiner& refiner,
TSubsetHandler& sh, int subsetIndex)
{
MarkForAdaption_ElementsInSubset_<TDomain,TSubsetHandler,TElem>(dom, refiner, sh, subsetIndex, RM_REFINE);
}


template <class TDomain, class TElem>
void MarkForAdaption_ElementsContainingPoint(TDomain& dom, IRefiner& refiner,
Expand Down Expand Up @@ -1486,20 +1506,53 @@ void MarkNeighborsForAnisotropicRefinement(IRefiner& refiner, bool sideNbrsOnly)
refiner.mark_neighborhood(1, RM_ANISOTROPIC, sideNbrsOnly);
}

void MarkNeighborsForLocalRefinement(IRefiner& refiner, bool sideNbrsOnly)
{
refiner.mark_neighborhood(1, RM_LOCAL, sideNbrsOnly);
}



template <class TDomain>
void MarkForRefinement_AnisotropicDirection (
TDomain& dom,
IRefiner& refiner,
MathVector<TDomain::dim>& dir,
const MathVector<TDomain::dim>& dir,
number minEdgeRatio)
{
MarkForRefinement_AnisotropicDirection_<TDomain>
(dom, refiner, dir, minEdgeRatio, RM_CLOSURE);
}


template <class TDomain>
void MarkForRefinement_AnisotropicDirection2 (
TDomain& dom,
IRefiner& refiner,
const MathVector<TDomain::dim>& dir,
number minEdgeRatio, std::string markType)
{
MarkForRefinement_AnisotropicDirection_<TDomain>
(dom, refiner, dir, minEdgeRatio, StringToRefinementMark(markType));
}


template <class TDomain>
void MarkForRefinement_AnisotropicDirection_ (
TDomain& dom,
IRefiner& refiner,
const MathVector<TDomain::dim>& dir,
number minEdgeRatio,
RefinementMark elem_default_mark)

{
using std::min;
using std::max;

typedef MathVector<TDomain::dim> vector_t;
typedef typename domain_traits<TDomain::dim>::element_type TElem;

// (normalized) user direction d
vector_t ndir;
VecNormalize(ndir, dir);

Expand All @@ -1519,22 +1572,28 @@ void MarkForRefinement_AnisotropicDirection (
number longestNormalEdgeSq = 0;

// we'll mark all elements as closure since we use copy elements anyway
refiner.mark(elem, RM_CLOSURE);
refiner.mark(elem, elem_default_mark);

anisoEdges.clear();
normalEdges.clear();

mg.associated_elements(assEdges, elem);
for_each_in_vec(Edge* e, assEdges){

// normalized edge direction e
vector_t edgeDir;
VecSubtract(edgeDir, aaPos[e->vertex(0)], aaPos[e->vertex(1)]);
VecNormalize(edgeDir, edgeDir);

// e*d = cos(alpha)
number dot = VecDot(edgeDir, ndir);
if((dot + SMALL >= 1) || (dot - SMALL <= -1)){
if((dot + SMALL >= 1.0) || (dot - SMALL <= -1.0)){
// measure shortest edge in direction
anisoEdges.push_back(e);
shortestAnisoEdgeSq = min(shortestAnisoEdgeSq, EdgeLengthSq(e, aaPos));
}
else{
// measure longest normal edge
normalEdges.push_back(e);
longestNormalEdgeSq = max(longestNormalEdgeSq, EdgeLengthSq(e, aaPos));
}
Expand Down Expand Up @@ -1784,7 +1843,10 @@ static void Common(Registry& reg, string grp)
&MarkNeighborsForFullRefinement,
grp, "", "refiner#sideNeighborsOnly")
.add_function("MarkNeighborsForAnisotropicRefinement",
&MarkNeighborsForAnisotropicRefinement,
&MarkNeighborsForAnisotropicRefinement,
grp, "", "refiner#sideNeighborsOnly")
.add_function("MarkNeighborsForLocalRefinement",
&MarkNeighborsForLocalRefinement,
grp, "", "refiner#sideNeighborsOnly");

reg.add_function("AddShadowCopyAdjuster", &AddShadowCopyAdjuster, grp, "", "refiner");
Expand Down Expand Up @@ -1875,6 +1937,10 @@ static void Domain(Registry& reg, string grp)
&MarkForRefinement_ElementsInSubset<domain_type, MGSubsetHandler,
typename domain_traits<TDomain::dim>::element_type>,
grp, "", "dom#refiner#subsetHandler#subsetIndex")
.add_function("MarkForAdaption_ElementsInSubset",
&MarkForAdaption_ElementsInSubset<domain_type, MGSubsetHandler,
typename domain_traits<TDomain::dim>::element_type>,
grp, "", "dom#refiner#subsetHandler#subsetIndex#mark")
.add_function("MarkForRefinement_VerticesInSubset",
&MarkForRefinement_ElementsInSubset<domain_type, MGSubsetHandler, Vertex>,
grp, "", "dom#refiner#subsetHandler#subsetIndex")
Expand Down Expand Up @@ -1908,6 +1974,9 @@ static void Domain(Registry& reg, string grp)
.add_function("MarkForRefinement_AnisotropicDirection",
&MarkForRefinement_AnisotropicDirection<domain_type>,
grp, "", "dom#refiner#dir#minEdgeRatio")
.add_function("MarkForRefinement_AnisotropicDirection2",
&MarkForRefinement_AnisotropicDirection2<domain_type>,
grp, "", "dom#refiner#dir#minEdgeRatio")
.add_function("MarkForRefinement_EdgeDirection",
&MarkForRefinement_EdgeDirection<domain_type>,
grp, "", "dom#refiner#dir#minDeviationAngle#maxDeviationAngle#selectFlipped")
Expand Down

0 comments on commit b51160e

Please sign in to comment.