Skip to content

Commit 1eef758

Browse files
authored
Merge pull request #3397 from roystgnr/added_sides_fixes
Fix for added_sides, more robust HEX+SIDE_HIERARCHIC, additional unit tests
2 parents ba5d5f5 + 52e4d2b commit 1eef758

File tree

3 files changed

+56
-7
lines changed

3 files changed

+56
-7
lines changed

src/fe/fe_hierarchic_shape_3D.C

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,9 @@ Real FE<3,SIDE_HIERARCHIC>::shape(const Elem * elem,
874874
libmesh_assert_less(i, 6*dofs_per_side);
875875

876876
const unsigned int sidenum = cube_side(p);
877+
if (sidenum > 5)
878+
return std::numeric_limits<Real>::quiet_NaN();
879+
877880
const unsigned int dof_offset = sidenum * dofs_per_side;
878881

879882
if (i < dof_offset) // i is on a previous side
@@ -1095,6 +1098,9 @@ Real FE<3,SIDE_HIERARCHIC>::shape_deriv(const Elem * elem,
10951098
libmesh_assert_less(i, 6*dofs_per_side);
10961099

10971100
const unsigned int sidenum = cube_side(p);
1101+
if (sidenum > 5)
1102+
return std::numeric_limits<Real>::quiet_NaN();
1103+
10981104
const unsigned int dof_offset = sidenum * dofs_per_side;
10991105

11001106
if (i < dof_offset) // i is on a previous side
@@ -1346,6 +1352,9 @@ Real FE<3,SIDE_HIERARCHIC>::shape_second_deriv(const Elem * elem,
13461352
libmesh_assert_less(i, 6*dofs_per_side);
13471353

13481354
const unsigned int sidenum = cube_side(p);
1355+
if (sidenum > 5)
1356+
return std::numeric_limits<Real>::quiet_NaN();
1357+
13491358
const unsigned int dof_offset = sidenum * dofs_per_side;
13501359

13511360
if (i < dof_offset) // i is on a previous side
@@ -1578,8 +1587,10 @@ unsigned int cube_side (const Point & p)
15781587
return 4;
15791588
else if (zeta > maxabs_xi_eta)
15801589
return 5;
1581-
else
1582-
libmesh_error_msg("Cannot determine side to evaluate");
1590+
1591+
// We need to be able to return invalid values for cases where
1592+
// mixed FE are being evaluated together on edges and vertices
1593+
return 65535;
15831594
}
15841595

15851596

src/systems/equation_systems.C

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -900,13 +900,13 @@ EquationSystems::build_parallel_solution_vector(const std::set<std::string> * sy
900900
{
901901
// Retrieve index into global solution vector.
902902
std::size_t node_index =
903-
libmesh_map_find(discontinuous_node_indices,
904-
std::make_tuple(elem->id(), s, n));
903+
nv * libmesh_map_find(discontinuous_node_indices,
904+
std::make_tuple(elem->id(), s, n));
905905

906906
for (unsigned int d=0; d < n_vec_dim; d++)
907907
{
908-
parallel_soln.add(node_index*n_vec_dim+d, nodal_soln[n_vec_dim*n+d]);
909-
repeat_count.add(node_index*n_vec_dim+d, 1);
908+
parallel_soln.add(node_index + (var_inc+d + var_num), nodal_soln[n_vec_dim*n+d]);
909+
repeat_count.add(node_index + (var_inc+d + var_num), 1);
910910
}
911911
}
912912
}

tests/mesh/mesh_input.C

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,18 @@ public:
114114
#endif // !LIBMESH_USE_COMPLEX_NUMBERS
115115

116116
CPPUNIT_TEST( testExodusWriteAddedSidesEdgeC0 );
117+
CPPUNIT_TEST( testExodusWriteAddedSidesMixedEdgeC0 );
117118
// CPPUNIT_TEST( testExodusWriteAddedSidesEdgeDisc ); // need is_on_face fixes
118119
CPPUNIT_TEST( testExodusWriteAddedSidesTriC0 );
120+
CPPUNIT_TEST( testExodusWriteAddedSidesMixedTriC0 );
119121
// CPPUNIT_TEST( testExodusWriteAddedSidesTriDisc ); // Need aligned faces
120122
CPPUNIT_TEST( testExodusWriteAddedSidesQuadC0 );
123+
CPPUNIT_TEST( testExodusWriteAddedSidesMixedQuadC0 );
121124
// CPPUNIT_TEST( testExodusWriteAddedSidesQuadDisc ); // need is_on_face fixes
122125
// CPPUNIT_TEST( testExodusWriteAddedSidesTetC0 ); // BROKEN!?! WHY!?!
123126
// CPPUNIT_TEST( testExodusWriteAddedSidesTetDisc );
124127
CPPUNIT_TEST( testExodusWriteAddedSidesHexC0 );
128+
CPPUNIT_TEST( testExodusWriteAddedSidesMixedHexC0 );
125129
CPPUNIT_TEST( testExodusWriteAddedSidesHexDisc );
126130

127131
CPPUNIT_TEST( testExodusFileMappingsPlateWithHole);
@@ -748,7 +752,9 @@ public:
748752
(Number (*exact_sol)(const Point &, const Parameters &, const
749753
std::string &, const std::string &),
750754
const ElemType elem_type,
751-
const Order order)
755+
const Order order,
756+
const std::vector<FEType> earlier_vars = {},
757+
const std::vector<FEType> later_vars = {})
752758
{
753759
constexpr unsigned int nx = added_sides_nxyz[0],
754760
ny = added_sides_nxyz[1],
@@ -770,8 +776,16 @@ public:
770776

771777
EquationSystems es(mesh);
772778
System & sys = es.add_system<System> ("SimpleSystem");
779+
int varnum = 1;
780+
for (auto vartype : earlier_vars)
781+
sys.add_variable("earlier_"+std::to_string(varnum++), vartype);
782+
773783
sys.add_variable("u", order, SIDE_HIERARCHIC);
774784

785+
varnum = 1;
786+
for (auto vartype : later_vars)
787+
sys.add_variable("later_"+std::to_string(varnum++), vartype);
788+
775789
if (dim == 3)
776790
MeshTools::Generation::build_cube
777791
(mesh, nx, ny, nz, 0., 1., 0., 1., 0., 1., elem_type);
@@ -965,6 +979,12 @@ public:
965979
testExodusWriteAddedSides(six_x_plus_sixty_y, EDGE3, SECOND);
966980
}
967981

982+
void testExodusWriteAddedSidesMixedEdgeC0()
983+
{
984+
testExodusWriteAddedSides(six_x_plus_sixty_y, EDGE3, FIRST, {{FIRST, LAGRANGE}});
985+
testExodusWriteAddedSides(six_x_plus_sixty_y, EDGE3, SECOND, {}, {{FIRST, LAGRANGE}});
986+
}
987+
968988
void testExodusWriteAddedSidesEdgeDisc()
969989
{
970990
testExodusWriteAddedSides(designed_for_side_elems, EDGE3, SECOND);
@@ -976,6 +996,12 @@ public:
976996
testExodusWriteAddedSides(six_x_plus_sixty_y, TRI6, SECOND);
977997
}
978998

999+
void testExodusWriteAddedSidesMixedTriC0()
1000+
{
1001+
testExodusWriteAddedSides(six_x_plus_sixty_y, TRI6, FIRST, {{SECOND, HIERARCHIC}});
1002+
testExodusWriteAddedSides(six_x_plus_sixty_y, TRI6, SECOND, {}, {{SECOND, SZABAB}});
1003+
}
1004+
9791005
void testExodusWriteAddedSidesTriDisc()
9801006
{
9811007
testExodusWriteAddedSides(designed_for_side_elems, TRI6, SECOND);
@@ -987,6 +1013,12 @@ public:
9871013
testExodusWriteAddedSides(six_x_plus_sixty_y, QUAD9, SECOND);
9881014
}
9891015

1016+
void testExodusWriteAddedSidesMixedQuadC0()
1017+
{
1018+
testExodusWriteAddedSides(six_x_plus_sixty_y, QUAD9, FIRST, {{SECOND, LAGRANGE}});
1019+
testExodusWriteAddedSides(six_x_plus_sixty_y, QUAD9, SECOND, {}, {{FIRST, LAGRANGE}});
1020+
}
1021+
9901022
void testExodusWriteAddedSidesQuadDisc()
9911023
{
9921024
testExodusWriteAddedSides(designed_for_side_elems, QUAD9, SECOND);
@@ -1009,6 +1041,12 @@ public:
10091041
testExodusWriteAddedSides(six_x_plus_sixty_y, HEX27, SECOND);
10101042
}
10111043

1044+
void testExodusWriteAddedSidesMixedHexC0()
1045+
{
1046+
testExodusWriteAddedSides(six_x_plus_sixty_y, HEX27, FIRST, {{FIRST, LAGRANGE}});
1047+
testExodusWriteAddedSides(six_x_plus_sixty_y, HEX27, SECOND, {}, {{SECOND, HIERARCHIC}});
1048+
}
1049+
10121050
void testExodusWriteAddedSidesHexDisc()
10131051
{
10141052
testExodusWriteAddedSides(designed_for_side_elems, HEX27, SECOND);

0 commit comments

Comments
 (0)