Skip to content

Commit a14b9dc

Browse files
committed
Merge branch 'develop' of https://github.com/SCOREC/core into develop
2 parents b967fb1 + 3d2f838 commit a14b9dc

File tree

11 files changed

+176
-19
lines changed

11 files changed

+176
-19
lines changed

apf/apf.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,9 @@ double computeCosAngleInTri(Mesh* m, MeshEntity* tri,
466466
double computeCosAngleInTet(Mesh* m, MeshEntity* tet,
467467
MeshEntity* e1, MeshEntity* e2, const Matrix3x3& Q);
468468

469+
Vector3 computeFaceNormalAtEdgeInTet(Mesh* m, MeshEntity* tet,
470+
MeshEntity* face, MeshEntity* edge, Matrix3x3 Q);
471+
469472
Vector3 computeFaceNormalAtVertex(Mesh* m, MeshEntity* face,
470473
MeshEntity* vert, const Matrix3x3& Q);
471474

apf/apfSimplexAngleCalcs.cc

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -116,22 +116,23 @@ static double computeEdgeEdgeCosAngleInTri(Mesh* m, MeshEntity* tri,
116116
return t1*t2;
117117
}
118118

119-
static Vector3 computeFaceNormalAtEdge(Mesh* m, /*MeshEntity* tet,*/
119+
Vector3 computeFaceNormalAtEdgeInTet(Mesh* m, MeshEntity* tet,
120120
MeshEntity* face, MeshEntity* edge, Matrix3x3 Q)
121121
{
122+
PCU_ALWAYS_ASSERT(m->getType(tet) == Mesh::TET);
122123
PCU_ALWAYS_ASSERT(m->getType(face) == Mesh::TRIANGLE);
123124
PCU_ALWAYS_ASSERT(m->getType(edge) == Mesh::EDGE);
124125

125-
MeshEntity* fe[3];
126-
m->getDownward(face, 1, fe);
126+
MeshEntity* te[6];
127+
m->getDownward(tet, 1, te);
127128
int index = -1;
128-
for (int i = 0; i < 3; i++)
129-
if (fe[i] == edge) {
129+
for (int i = 0; i < 6; i++)
130+
if (te[i] == edge) {
130131
index = i;
131132
break;
132133
}
133-
PCU_ALWAYS_ASSERT(index > -1 && index < 3);
134-
Vector3 xi; // corresponding parametric coord in tri of the mid-edge point
134+
PCU_ALWAYS_ASSERT(index > -1 && index < 6);
135+
Vector3 xi; // corresponding parametric coord in tet for the mid-edge point
135136
switch (index) {
136137
case 0:
137138
xi = Vector3(0.5, 0.0, 0.0);
@@ -142,17 +143,44 @@ static Vector3 computeFaceNormalAtEdge(Mesh* m, /*MeshEntity* tet,*/
142143
case 2:
143144
xi = Vector3(0.0, 0.5, 0.0);
144145
break;
146+
case 3:
147+
xi = Vector3(0.0, 0.0, 0.5);
148+
break;
149+
case 4:
150+
xi = Vector3(0.5, 0.0, 0.5);
151+
break;
152+
case 5:
153+
xi = Vector3(0.0, 0.5, 0.5);
154+
break;
145155
default:
146156
break;
147157
}
148-
MeshElement* faceElem = createMeshElement(m, face);
158+
MeshElement* tetElem = createMeshElement(m, tet);
149159
Matrix3x3 J;
150-
getJacobian(faceElem, xi, J);
151-
destroyMeshElement(faceElem);
160+
getJacobian(tetElem, xi, J);
161+
destroyMeshElement(tetElem);
162+
163+
// get the two columns of Jacobian corresponding to face tangents
164+
MeshEntity* tf[4];
165+
m->getDownward(tet, 2, tf);
166+
index = -1;
167+
for (int i = 0; i < 4; i++)
168+
if (tf[i] == face) {
169+
index = i;
170+
break;
171+
}
172+
PCU_ALWAYS_ASSERT(index > -1 && index < 4);
152173

153174
// transform Jacobian into Metric space
154175
J = getJacobianInMetric(J, Q);
155-
return cross(J[0], J[1]).normalize();
176+
if (index == 0)
177+
return cross(J[0], J[1]).normalize();
178+
else if (index == 1)
179+
return cross(J[2], J[0]).normalize();
180+
else if (index == 2)
181+
return cross(J[2]-J[0], J[1]-J[0]).normalize();
182+
else
183+
return cross(J[1], J[2]).normalize();
156184
}
157185

158186

@@ -180,8 +208,8 @@ static double computeFaceFaceCosAngleInTet(Mesh* m, MeshEntity* tet,
180208
}
181209

182210
PCU_ALWAYS_ASSERT(sharedEdge);
183-
Vector3 f1n = computeFaceNormalAtEdge(m, /*tet,*/ face1, sharedEdge, Q);
184-
Vector3 f2n = computeFaceNormalAtEdge(m, /*tet,*/ face2, sharedEdge, Q);
211+
Vector3 f1n = computeFaceNormalAtEdgeInTet(m, tet, face1, sharedEdge, Q);
212+
Vector3 f2n = computeFaceNormalAtEdgeInTet(m, tet, face2, sharedEdge, Q);
185213
// turn f2n so you get the inside angle
186214
f2n = Vector3(0.0, 0.0, 0.0) - f2n;
187215
return f1n * f2n;

ma/maFaceSplit.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,8 @@ Entity* makeSplitVertOnFace(Adapt* a, Entity* face)
172172
Vector param(0,0,0);
173173
if (a->input->shouldTransferParametric)
174174
transferParametricOnTriSplit(m, face, xi, param);
175+
if (a->input->shouldTransferToClosestPoint)
176+
transferToClosestPointOnTriSplit(m, face, xi, param);
175177
Entity* vert = buildVertex(a, c, point, param);
176178
st->onVertex(me, xi, vert);
177179
sf->interpolate(me, xi, vert);

ma/maInput.cc

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ void setDefaultValues(Input* in)
3030
in->shouldCoarsen = true;
3131
in->shouldSnap = in->mesh->canSnap();
3232
in->shouldTransferParametric = in->mesh->canSnap();
33+
in->shouldTransferToClosestPoint = false;
3334
in->shouldHandleMatching = in->mesh->hasMatching();
3435
in->shouldFixShape = true;
3536
in->shouldForceAdaptation = false;
@@ -46,6 +47,8 @@ void setDefaultValues(Input* in)
4647
in->goodQuality = 0.2;
4748
//this basically turns off short edge removal...
4849
in->maximumEdgeRatio = 100.0;
50+
//2D mesh adapt performs better if forceAdapt is on
51+
in->shouldForceAdaptation = true;
4952
}
5053
in->shouldCheckQualityForDoubleSplits = false;
5154
in->validQuality = 1e-10;
@@ -91,8 +94,13 @@ void validateInput(Input* in)
9194
&&( ! in->mesh->canSnap()))
9295
rejectInput("user requested parametric coordinate transfer "
9396
"but the geometric model does not support it");
94-
if (in->shouldSnap && ( ! in->shouldTransferParametric))
95-
rejectInput("snapping requires parametric coordinate transfer");
97+
if (in->shouldTransferToClosestPoint
98+
&&( ! in->mesh->canSnap()))
99+
rejectInput("user requested transfer to closest point on model"
100+
"but the geometric model does not support it");
101+
if (in->shouldSnap && ( ! (in->shouldTransferParametric ||
102+
in->shouldTransferToClosestPoint)))
103+
rejectInput("snapping requires parametric coordinate transfer or transfer to closest point");
96104
if ((in->mesh->hasMatching())
97105
&&( ! in->shouldHandleMatching))
98106
rejectInput("the mesh has matching entities but matched support is off");

ma/maInput.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ class Input
5151
/** \brief whether to transfer parametric coordinates
5252
\details requires modeler support, see gmi_reparam */
5353
bool shouldTransferParametric;
54+
/** \brief whether to transfer to the parametric coords of the closest point
55+
\details requires modeler support, see gmi_closest_point */
56+
bool shouldTransferToClosestPoint;
5457
/** \brief whether to update matched entity info (limited support) */
5558
bool shouldHandleMatching;
5659
/** \brief whether to run shape correction (default true) */

ma/maLayerTemplates.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ void splitQuad_4(Refine* r, Entity* q, Entity** v)
5151
Vector param(0,0,0); //prevents uninitialized values
5252
if (a->input->shouldTransferParametric)
5353
transferParametricOnQuadSplit(m, q, sv[0] ,sv[2], 0.5, param);
54+
if (a->input->shouldTransferToClosestPoint)
55+
transferToClosestPointOnQuadSplit(m, q, sv[0] ,sv[2], 0.5, param);
5456
Entity* cv = buildVertex(a, m->toModel(q), point, param);
5557
a->solutionTransfer->onVertex(me,xi,cv);
5658
a->sizeField->interpolate(me,xi,cv);

ma/maRefine.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ Entity* makeSplitVert(Refine* r, Entity* edge)
142142
Vector param(0,0,0); //prevents uninitialized values
143143
if (a->input->shouldTransferParametric)
144144
transferParametricOnEdgeSplit(m,edge,0.5,param);
145+
if (a->input->shouldTransferToClosestPoint)
146+
transferToClosestPointOnEdgeSplit(m,edge,0.5,param);
145147
Entity* vert = buildVertex(a,c,point,param);
146148
st->onVertex(me,xi,vert);
147149
sf->interpolate(me,xi,vert);

ma/maSnap.cc

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,79 @@ void transferParametricOnQuadSplit(
597597
ma::transferParametricBetween(m, g, v, y, p);
598598
}
599599

600+
void getClosestPointParametricCoordinates(
601+
apf::Mesh* m,
602+
Model* g,
603+
double t,
604+
Vector const& a,
605+
Vector const& b,
606+
Vector& p)
607+
{
608+
Vector testPt = a * (1 - t) + b * t;
609+
Vector targetPt;
610+
m->getClosestPoint(g, testPt, targetPt, p);
611+
(void) targetPt;
612+
}
613+
614+
void transferToClosestPointOnEdgeSplit(
615+
Mesh* m,
616+
Entity* e,
617+
double t,
618+
Vector& p)
619+
{
620+
Model* g = m->toModel(e);
621+
int modelDimension = m->getModelType(g);
622+
if (m->getDimension()==3 && modelDimension==3) return;
623+
Entity* ev[2];
624+
m->getDownward(e,0,ev);
625+
Vector a = getPosition(m, ev[0]);
626+
Vector b = getPosition(m, ev[1]);
627+
getClosestPointParametricCoordinates(m, g, t, a, b, p);
628+
}
629+
630+
void transferToClosestPointOnTriSplit(
631+
Mesh* m,
632+
Entity* face,
633+
const Vector& xi,
634+
Vector& param)
635+
{
636+
Model* g = m->toModel(face);
637+
int modelDimension = m->getModelType(g);
638+
if (m->getDimension() == 3 && modelDimension == 3) return;
639+
Entity* tv[3];
640+
m->getDownward(face, 0, tv);
641+
Vector x[3];
642+
643+
for (int i = 0; i < 3; i++) {
644+
x[i] = getPosition(m, tv[i]);
645+
}
646+
647+
Vector testPt = x[0] * xi[0] + x[1] * xi[1] + x[2] * xi[2];
648+
Vector targetPt;
649+
650+
m->getClosestPoint(g, testPt, targetPt, param);
651+
(void) targetPt;
652+
}
653+
654+
void transferToClosestPointOnQuadSplit(
655+
Mesh* m,
656+
Entity* quad,
657+
Entity* v01,
658+
Entity* v32,
659+
double y,
660+
Vector& p)
661+
{
662+
Model* g = m->toModel(quad);
663+
int modelDimension = m->getModelType(g);
664+
if (modelDimension==m->getDimension()) return;
665+
Vector a = getPosition(m, v01);
666+
Vector b = getPosition(m, v32);
667+
Vector testPt = a * (1 - y) + b * y;
668+
Vector targetPt;
669+
m->getClosestPoint(g, testPt, targetPt, p);
670+
(void) targetPt;
671+
}
672+
600673
static void getSnapPoint(Mesh* m, Entity* v, Vector& x)
601674
{
602675
m->getPoint(v,0,x);

ma/maSnap.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,31 @@ void transferParametricOnQuadSplit(
4646
double y,
4747
Vector& p);
4848

49+
void getClosestPointParametricCoordinates(
50+
apf::Mesh* m,
51+
Model* g,
52+
double t,
53+
Vector const& a,
54+
Vector const& b,
55+
Vector& p);
56+
void transferToClosestPointOnEdgeSplit(
57+
Mesh* m,
58+
Entity* e,
59+
double t,
60+
Vector& p);
61+
void transferToClosestPointOnTriSplit(
62+
Mesh* m,
63+
Entity* face,
64+
const Vector& xi,
65+
Vector& param);
66+
void transferToClosestPointOnQuadSplit(
67+
Mesh* m,
68+
Entity* quad,
69+
Entity* v01,
70+
Entity* v32,
71+
double y,
72+
Vector& p);
73+
4974
}
5075

5176
#endif

mds/apfMDS.cc

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -891,7 +891,10 @@ void deriveMdlFromManifold(Mesh2* mesh, bool* isModelVert,
891891
"MeshTag name \"_classifn_data\" is used internally in this method\n");
892892
apf::MeshTag* classifnTag = mesh->createIntTag("_classifn_data", 2);
893893
int tagData[2], newTagData[2];
894-
long minAvbl = 0;
894+
long minAvbl = 1;
895+
// This is set by during apf::construct, and using anything else leads to an
896+
// additional region
897+
long DEFAULT_REGION_ID = 0;
895898

896899
PCU_ALWAYS_ASSERT_VERBOSE(!mesh->findTag("_vert_id"),
897900
"MeshTag name \"_vert_id\" is used internally in this method\n");
@@ -984,7 +987,8 @@ void deriveMdlFromManifold(Mesh2* mesh, bool* isModelVert,
984987
m->getIntTag(ent, classifnTag, tagData);
985988
mds_update_model_for_entity(m->mesh, id, tagData[0], tagData[1]);
986989
} else {
987-
mds_update_model_for_entity(m->mesh, id, m->getDimension(), minAvbl);
990+
mds_update_model_for_entity(m->mesh, id, m->getDimension(),
991+
DEFAULT_REGION_ID);
988992
}
989993
}
990994
}
@@ -1003,7 +1007,10 @@ void derive2DMdlFromManifold(Mesh2* mesh, bool* isModelVert,
10031007
"MeshTag name \"_classifn_data\" is used internally in this method\n");
10041008
apf::MeshTag* classifnTag = mesh->createIntTag("_classifn_data", 2);
10051009
int tagData[2], newTagData[2];
1006-
long minAvbl = 0;
1010+
long minAvbl = 1;
1011+
// This is set by during apf::construct, and using anything else leads to an
1012+
// additional region
1013+
long DEFAULT_REGION_ID = 0;
10071014

10081015
PCU_ALWAYS_ASSERT_VERBOSE(!mesh->findTag("_vert_id"),
10091016
"MeshTag name \"_vert_id\" is used internally in this method\n");
@@ -1069,7 +1076,8 @@ void derive2DMdlFromManifold(Mesh2* mesh, bool* isModelVert,
10691076
m->getIntTag(ent, classifnTag, tagData);
10701077
mds_update_model_for_entity(m->mesh, id, tagData[0], tagData[1]);
10711078
} else {
1072-
mds_update_model_for_entity(m->mesh, id, m->getDimension(), minAvbl);
1079+
mds_update_model_for_entity(m->mesh, id, m->getDimension(),
1080+
DEFAULT_REGION_ID);
10731081
}
10741082
}
10751083
}

0 commit comments

Comments
 (0)