Skip to content

Commit 21beba3

Browse files
authored
Merge pull request #4071 from farscape-project/refactor
Refactor nodal_soln code
2 parents 957398d + 0c0946e commit 21beba3

18 files changed

+146
-349
lines changed

include/fe/fe_macro.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@
118118

119119
#endif //LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
120120

121+
#define UNPACK( ... ) __VA_ARGS__
121122

122123
#define LIBMESH_FE_NODAL_SOLN_DIM(_fetype, _funcname, _dim) \
123124
template <> \
@@ -126,13 +127,13 @@ void FE<_dim,_fetype>::nodal_soln(const Elem * elem, \
126127
const std::vector<Number> & elem_soln,\
127128
std::vector<Number> & nodal_soln, \
128129
const bool add_p_level) \
129-
{ _funcname(elem, order, elem_soln, nodal_soln, add_p_level); }
130+
{ UNPACK _funcname(elem, order, elem_soln, nodal_soln, add_p_level); }
130131

131132
#define LIBMESH_FE_NODAL_SOLN(fetype, _funcname) \
132-
LIBMESH_FE_NODAL_SOLN_DIM(fetype, _funcname, 0) \
133-
LIBMESH_FE_NODAL_SOLN_DIM(fetype, _funcname, 1) \
134-
LIBMESH_FE_NODAL_SOLN_DIM(fetype, _funcname, 2) \
135-
LIBMESH_FE_NODAL_SOLN_DIM(fetype, _funcname, 3)
133+
LIBMESH_FE_NODAL_SOLN_DIM(fetype, (_funcname), 0) \
134+
LIBMESH_FE_NODAL_SOLN_DIM(fetype, (_funcname), 1) \
135+
LIBMESH_FE_NODAL_SOLN_DIM(fetype, (_funcname), 2) \
136+
LIBMESH_FE_NODAL_SOLN_DIM(fetype, (_funcname), 3)
136137

137138

138139
#define LIBMESH_FE_SIDE_NODAL_SOLN_DIM(_fetype, _dim) \

include/numerics/type_tensor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ TypeTensor<T>::TypeTensor(const TypeVector<T2> & vx,
647647
const TypeVector<T2> & vy)
648648
{
649649
libmesh_assert_equal_to (LIBMESH_DIM, 2);
650-
#if LIBMESH_DIM > 2
650+
#if LIBMESH_DIM > 1
651651
_coords[0] = vx(0);
652652
_coords[1] = vx(1);
653653
_coords[2] = vy(0);

src/fe/fe_bernstein.C

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,7 @@ void bernstein_nodal_soln(const Elem * elem,
6161
{
6262
libmesh_assert_equal_to (elem_soln.size(), 1);
6363

64-
const Number val = elem_soln[0];
65-
66-
for (unsigned int n=0; n<n_nodes; n++)
67-
nodal_soln[n] = val;
64+
std::fill(nodal_soln.begin(), nodal_soln.end(), elem_soln[0]);
6865

6966
return;
7067
}
@@ -85,19 +82,16 @@ void bernstein_nodal_soln(const Elem * elem,
8582
std::vector<Point> refspace_nodes;
8683
FEBase::get_refspace_nodes(elem_type,refspace_nodes);
8784
libmesh_assert_equal_to (refspace_nodes.size(), n_nodes);
85+
libmesh_assert_equal_to (elem_soln.size(), n_sf);
8886

89-
for (unsigned int n=0; n<n_nodes; n++)
90-
{
91-
libmesh_assert_equal_to (elem_soln.size(), n_sf);
87+
// Zero before summation
88+
std::fill(nodal_soln.begin(), nodal_soln.end(), 0);
9289

93-
// Zero before summation
94-
nodal_soln[n] = 0;
95-
96-
// u_i = Sum (alpha_i phi_i)
97-
for (unsigned int i=0; i<n_sf; i++)
98-
nodal_soln[n] += elem_soln[i] *
99-
FEInterface::shape(fe_type, elem, i, refspace_nodes[n]);
100-
}
90+
for (unsigned int n=0; n<n_nodes; n++)
91+
// u_i = Sum (alpha_i phi_i)
92+
for (unsigned int i=0; i<n_sf; i++)
93+
nodal_soln[n] += elem_soln[i] *
94+
FEInterface::shape(fe_type, elem, i, refspace_nodes[n]);
10195

10296
return;
10397
}

src/fe/fe_clough.C

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,19 +63,16 @@ void clough_nodal_soln(const Elem * elem,
6363
std::vector<Point> refspace_nodes;
6464
FEBase::get_refspace_nodes(elem_type,refspace_nodes);
6565
libmesh_assert_equal_to (refspace_nodes.size(), n_nodes);
66+
libmesh_assert_equal_to (elem_soln.size(), n_sf);
6667

67-
for (unsigned int n=0; n<n_nodes; n++)
68-
{
69-
libmesh_assert_equal_to (elem_soln.size(), n_sf);
70-
71-
// Zero before summation
72-
nodal_soln[n] = 0;
68+
// Zero before summation
69+
std::fill(nodal_soln.begin(), nodal_soln.end(), 0);
7370

74-
// u_i = Sum (alpha_i phi_i)
75-
for (unsigned int i=0; i<n_sf; i++)
76-
nodal_soln[n] += elem_soln[i] *
77-
FEInterface::shape(fe_type, elem, i, refspace_nodes[n]);
78-
}
71+
for (unsigned int n=0; n<n_nodes; n++)
72+
// u_i = Sum (alpha_i phi_i)
73+
for (unsigned int i=0; i<n_sf; i++)
74+
nodal_soln[n] += elem_soln[i] *
75+
FEInterface::shape(fe_type, elem, i, refspace_nodes[n]);
7976

8077
return;
8178
}

src/fe/fe_hermite.C

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,17 @@ void hermite_nodal_soln(const Elem * elem,
5454
std::vector<Point> refspace_nodes;
5555
FEBase::get_refspace_nodes(elem_type,refspace_nodes);
5656
libmesh_assert_equal_to (refspace_nodes.size(), n_nodes);
57+
libmesh_assert_equal_to (elem_soln.size(), n_sf);
5758

58-
for (unsigned int n=0; n<n_nodes; n++)
59-
{
60-
libmesh_assert_equal_to (elem_soln.size(), n_sf);
59+
// Zero before summation
60+
std::fill(nodal_soln.begin(), nodal_soln.end(), 0);
6161

62-
// Zero before summation
63-
nodal_soln[n] = 0;
62+
for (unsigned int n=0; n<n_nodes; n++)
63+
// u_i = Sum (alpha_i phi_i)
64+
for (unsigned int i=0; i<n_sf; i++)
65+
nodal_soln[n] += elem_soln[i] *
66+
FEInterface::shape(fe_type, elem, i, refspace_nodes[n], add_p_level);
6467

65-
// u_i = Sum (alpha_i phi_i)
66-
for (unsigned int i=0; i<n_sf; i++)
67-
nodal_soln[n] += elem_soln[i] *
68-
FEInterface::shape(fe_type, elem, i, refspace_nodes[n], add_p_level);
69-
}
7068
} // hermite_nodal_soln()
7169

7270

src/fe/fe_hierarchic.C

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,7 @@ void hierarchic_nodal_soln(const Elem * elem,
5757
{
5858
libmesh_assert_equal_to (elem_soln.size(), 1);
5959

60-
const Number val = elem_soln[0];
61-
62-
for (unsigned int n=0; n<n_nodes; n++)
63-
nodal_soln[n] = val;
60+
std::fill(nodal_soln.begin(), nodal_soln.end(), elem_soln[0]);
6461

6562
return;
6663
}
@@ -76,19 +73,16 @@ void hierarchic_nodal_soln(const Elem * elem,
7673
std::vector<Point> refspace_nodes;
7774
FEBase::get_refspace_nodes(elem_type,refspace_nodes);
7875
libmesh_assert_equal_to (refspace_nodes.size(), n_nodes);
76+
libmesh_assert_equal_to (elem_soln.size(), n_sf);
7977

80-
for (unsigned int n=0; n<n_nodes; n++)
81-
{
82-
libmesh_assert_equal_to (elem_soln.size(), n_sf);
78+
// Zero before summation
79+
std::fill(nodal_soln.begin(), nodal_soln.end(), 0);
8380

84-
// Zero before summation
85-
nodal_soln[n] = 0;
86-
87-
// u_i = Sum (alpha_i phi_i)
88-
for (unsigned int i=0; i<n_sf; i++)
89-
nodal_soln[n] += elem_soln[i] *
90-
FEInterface::shape(fe_type, elem, i, refspace_nodes[n]);
91-
}
81+
for (unsigned int n=0; n<n_nodes; n++)
82+
// u_i = Sum (alpha_i phi_i)
83+
for (unsigned int i=0; i<n_sf; i++)
84+
nodal_soln[n] += elem_soln[i] *
85+
FEInterface::shape(fe_type, elem, i, refspace_nodes[n]);
9286

9387
return;
9488
}

src/fe/fe_hierarchic_vec.C

Lines changed: 16 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,16 @@ void hierarchic_vec_nodal_soln(const Elem * elem,
7474
libmesh_assert_equal_to (refspace_nodes.size(), n_nodes);
7575
libmesh_assert_equal_to (elem_soln.size(), n_sf*dim);
7676

77+
// Zero before summation
78+
std::fill(nodal_soln.begin(), nodal_soln.end(), 0);
79+
7780
for (unsigned int n=0; n<n_nodes; n++)
7881
for (int d=0; d != dim; ++d)
79-
{
80-
const unsigned int ni=n*dim+d;
81-
nodal_soln[ni] = 0;
82-
83-
// u_i = Sum (alpha_i phi_i); we're here only looking
84-
// at vector components in direction d
85-
for (unsigned int i=0; i<n_sf; i++)
86-
nodal_soln[ni] += elem_soln[i*dim+d] *
87-
FEInterface::shape(fe_type, elem, i, refspace_nodes[n]);
88-
}
82+
// u_i = Sum (alpha_i phi_i); we're here only looking
83+
// at vector components in direction d
84+
for (unsigned int i=0; i<n_sf; i++)
85+
nodal_soln[n*dim+d] += elem_soln[i*dim+d] *
86+
FEInterface::shape(fe_type, elem, i, refspace_nodes[n]);
8987

9088
}// void hierarchic_vec_nodal_soln
9189

@@ -95,71 +93,31 @@ void hierarchic_vec_nodal_soln(const Elem * elem,
9593
// Do full-specialization for every dimension, instead
9694
// of explicit instantiation at the end of this file.
9795
// This could be macro-ified so that it fits on one line...
98-
template <>
99-
void FE<0,HIERARCHIC_VEC>::nodal_soln(const Elem * elem,
100-
const Order order,
101-
const std::vector<Number> & elem_soln,
102-
std::vector<Number> & nodal_soln,
103-
const bool add_p_level)
104-
{ FE<0,HIERARCHIC>::nodal_soln(elem, order, elem_soln, nodal_soln, add_p_level); }
105-
106-
template <>
107-
void FE<1,HIERARCHIC_VEC>::nodal_soln(const Elem * elem,
108-
const Order order,
109-
const std::vector<Number> & elem_soln,
110-
std::vector<Number> & nodal_soln,
111-
const bool add_p_level)
112-
{ FE<1,HIERARCHIC>::nodal_soln(elem, order, elem_soln, nodal_soln, add_p_level); }
96+
LIBMESH_FE_NODAL_SOLN_DIM(HIERARCHIC_VEC, (FE<0, HIERARCHIC>::nodal_soln), 0)
97+
LIBMESH_FE_NODAL_SOLN_DIM(HIERARCHIC_VEC, (FE<1, HIERARCHIC>::nodal_soln), 1)
11398

11499
template <>
115100
void FE<2,HIERARCHIC_VEC>::nodal_soln(const Elem * elem,
116101
const Order order,
117102
const std::vector<Number> & elem_soln,
118103
std::vector<Number> & nodal_soln,
119104
const bool add_p_level)
120-
{ hierarchic_vec_nodal_soln(elem, order, elem_soln, 2 /*dimension*/, nodal_soln, add_p_level); }
105+
{ hierarchic_vec_nodal_soln(elem, order, elem_soln, 2 /*dim*/, nodal_soln, add_p_level); }
121106

122107
template <>
123108
void FE<3,HIERARCHIC_VEC>::nodal_soln(const Elem * elem,
124109
const Order order,
125110
const std::vector<Number> & elem_soln,
126111
std::vector<Number> & nodal_soln,
127112
const bool add_p_level)
128-
{ hierarchic_vec_nodal_soln(elem, order, elem_soln, 3 /*dimension*/, nodal_soln, add_p_level); }
113+
{ hierarchic_vec_nodal_soln(elem, order, elem_soln, 3 /*dim*/, nodal_soln, add_p_level); }
129114

130115
LIBMESH_FE_SIDE_NODAL_SOLN(HIERARCHIC_VEC)
131116

132-
template <>
133-
void FE<0,L2_HIERARCHIC_VEC>::nodal_soln(const Elem * elem,
134-
const Order order,
135-
const std::vector<Number> & elem_soln,
136-
std::vector<Number> & nodal_soln,
137-
const bool add_p_level)
138-
{ FE<0,HIERARCHIC_VEC>::nodal_soln(elem, order, elem_soln, nodal_soln, add_p_level); }
139-
140-
template <>
141-
void FE<1,L2_HIERARCHIC_VEC>::nodal_soln(const Elem * elem,
142-
const Order order,
143-
const std::vector<Number> & elem_soln,
144-
std::vector<Number> & nodal_soln,
145-
const bool add_p_level)
146-
{ FE<1,HIERARCHIC_VEC>::nodal_soln(elem, order, elem_soln, nodal_soln, add_p_level); }
147-
148-
template <>
149-
void FE<2,L2_HIERARCHIC_VEC>::nodal_soln(const Elem * elem,
150-
const Order order,
151-
const std::vector<Number> & elem_soln,
152-
std::vector<Number> & nodal_soln,
153-
const bool add_p_level)
154-
{ FE<2,HIERARCHIC_VEC>::nodal_soln(elem, order, elem_soln, nodal_soln, add_p_level); }
155-
156-
template <>
157-
void FE<3,L2_HIERARCHIC_VEC>::nodal_soln(const Elem * elem,
158-
const Order order,
159-
const std::vector<Number> & elem_soln,
160-
std::vector<Number> & nodal_soln,
161-
const bool add_p_level)
162-
{ FE<3,HIERARCHIC_VEC>::nodal_soln(elem, order, elem_soln, nodal_soln, add_p_level); }
117+
LIBMESH_FE_NODAL_SOLN_DIM(L2_HIERARCHIC_VEC, (FE<0, HIERARCHIC_VEC>::nodal_soln), 0)
118+
LIBMESH_FE_NODAL_SOLN_DIM(L2_HIERARCHIC_VEC, (FE<1, HIERARCHIC_VEC>::nodal_soln), 1)
119+
LIBMESH_FE_NODAL_SOLN_DIM(L2_HIERARCHIC_VEC, (FE<2, HIERARCHIC_VEC>::nodal_soln), 2)
120+
LIBMESH_FE_NODAL_SOLN_DIM(L2_HIERARCHIC_VEC, (FE<3, HIERARCHIC_VEC>::nodal_soln), 3)
163121

164122
LIBMESH_FE_SIDE_NODAL_SOLN(L2_HIERARCHIC_VEC)
165123

src/fe/fe_l2_hierarchic.C

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,7 @@ void l2_hierarchic_nodal_soln(const Elem * elem,
5757
{
5858
libmesh_assert_equal_to (elem_soln.size(), 1);
5959

60-
const Number val = elem_soln[0];
61-
62-
for (unsigned int n=0; n<n_nodes; n++)
63-
nodal_soln[n] = val;
60+
std::fill(nodal_soln.begin(), nodal_soln.end(), elem_soln[0]);
6461

6562
return;
6663
}
@@ -76,19 +73,16 @@ void l2_hierarchic_nodal_soln(const Elem * elem,
7673
std::vector<Point> refspace_nodes;
7774
FEBase::get_refspace_nodes(elem_type,refspace_nodes);
7875
libmesh_assert_equal_to (refspace_nodes.size(), n_nodes);
76+
libmesh_assert_equal_to (elem_soln.size(), n_sf);
7977

80-
for (unsigned int n=0; n<n_nodes; n++)
81-
{
82-
libmesh_assert_equal_to (elem_soln.size(), n_sf);
78+
// Zero before summation
79+
std::fill(nodal_soln.begin(), nodal_soln.end(), 0);
8380

84-
// Zero before summation
85-
nodal_soln[n] = 0;
86-
87-
// u_i = Sum (alpha_i phi_i)
88-
for (unsigned int i=0; i<n_sf; i++)
89-
nodal_soln[n] += elem_soln[i] *
90-
FEInterface::shape(fe_type, elem, i, refspace_nodes[n]);
91-
}
81+
for (unsigned int n=0; n<n_nodes; n++)
82+
// u_i = Sum (alpha_i phi_i)
83+
for (unsigned int i=0; i<n_sf; i++)
84+
nodal_soln[n] += elem_soln[i] *
85+
FEInterface::shape(fe_type, elem, i, refspace_nodes[n]);
9286

9387
return;
9488
}

src/fe/fe_lagrange_vec.C

Lines changed: 8 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -633,71 +633,31 @@ void lagrange_vec_nodal_soln(const Elem * elem,
633633
// Do full-specialization for every dimension, instead
634634
// of explicit instantiation at the end of this file.
635635
// This could be macro-ified so that it fits on one line...
636-
template <>
637-
void FE<0,LAGRANGE_VEC>::nodal_soln(const Elem * elem,
638-
const Order order,
639-
const std::vector<Number> & elem_soln,
640-
std::vector<Number> & nodal_soln,
641-
const bool add_p_level)
642-
{ FE<0,LAGRANGE>::nodal_soln(elem, order, elem_soln, nodal_soln, add_p_level); }
643-
644-
template <>
645-
void FE<1,LAGRANGE_VEC>::nodal_soln(const Elem * elem,
646-
const Order order,
647-
const std::vector<Number> & elem_soln,
648-
std::vector<Number> & nodal_soln,
649-
const bool add_p_level)
650-
{ FE<1,LAGRANGE>::nodal_soln(elem, order, elem_soln, nodal_soln, add_p_level); }
636+
LIBMESH_FE_NODAL_SOLN_DIM(LAGRANGE_VEC, (FE<0, LAGRANGE>::nodal_soln), 0)
637+
LIBMESH_FE_NODAL_SOLN_DIM(LAGRANGE_VEC, (FE<1, LAGRANGE>::nodal_soln), 1)
651638

652639
template <>
653640
void FE<2,LAGRANGE_VEC>::nodal_soln(const Elem * elem,
654641
const Order order,
655642
const std::vector<Number> & elem_soln,
656643
std::vector<Number> & nodal_soln,
657644
const bool add_p_level)
658-
{ lagrange_vec_nodal_soln(elem, order, elem_soln, 2 /*dimension*/, nodal_soln, add_p_level); }
645+
{ lagrange_vec_nodal_soln(elem, order, elem_soln, 2 /*dim*/, nodal_soln, add_p_level); }
659646

660647
template <>
661648
void FE<3,LAGRANGE_VEC>::nodal_soln(const Elem * elem,
662649
const Order order,
663650
const std::vector<Number> & elem_soln,
664651
std::vector<Number> & nodal_soln,
665652
const bool add_p_level)
666-
{ lagrange_vec_nodal_soln(elem, order, elem_soln, 3 /*dimension*/, nodal_soln, add_p_level); }
653+
{ lagrange_vec_nodal_soln(elem, order, elem_soln, 3 /*dim*/, nodal_soln, add_p_level); }
667654

668655
LIBMESH_FE_SIDE_NODAL_SOLN(LAGRANGE_VEC)
669656

670-
template <>
671-
void FE<0,L2_LAGRANGE_VEC>::nodal_soln(const Elem * elem,
672-
const Order order,
673-
const std::vector<Number> & elem_soln,
674-
std::vector<Number> & nodal_soln,
675-
const bool add_p_level)
676-
{ FE<0,LAGRANGE_VEC>::nodal_soln(elem, order, elem_soln, nodal_soln, add_p_level); }
677-
678-
template <>
679-
void FE<1,L2_LAGRANGE_VEC>::nodal_soln(const Elem * elem,
680-
const Order order,
681-
const std::vector<Number> & elem_soln,
682-
std::vector<Number> & nodal_soln,
683-
const bool add_p_level)
684-
{ FE<1,LAGRANGE_VEC>::nodal_soln(elem, order, elem_soln, nodal_soln, add_p_level); }
685-
686-
template <>
687-
void FE<2,L2_LAGRANGE_VEC>::nodal_soln(const Elem * elem,
688-
const Order order,
689-
const std::vector<Number> & elem_soln,
690-
std::vector<Number> & nodal_soln,
691-
const bool add_p_level)
692-
{ FE<2,LAGRANGE_VEC>::nodal_soln(elem, order, elem_soln, nodal_soln, add_p_level); }
693-
694-
template <>
695-
void FE<3,L2_LAGRANGE_VEC>::nodal_soln(const Elem * elem,
696-
const Order order,
697-
const std::vector<Number> & elem_soln,
698-
std::vector<Number> & nodal_soln,
699-
const bool add_p_level)
700-
{ FE<3,LAGRANGE_VEC>::nodal_soln(elem, order, elem_soln, nodal_soln, add_p_level); }
657+
LIBMESH_FE_NODAL_SOLN_DIM(L2_LAGRANGE_VEC, (FE<0, LAGRANGE_VEC>::nodal_soln), 0)
658+
LIBMESH_FE_NODAL_SOLN_DIM(L2_LAGRANGE_VEC, (FE<1, LAGRANGE_VEC>::nodal_soln), 1)
659+
LIBMESH_FE_NODAL_SOLN_DIM(L2_LAGRANGE_VEC, (FE<2, LAGRANGE_VEC>::nodal_soln), 2)
660+
LIBMESH_FE_NODAL_SOLN_DIM(L2_LAGRANGE_VEC, (FE<3, LAGRANGE_VEC>::nodal_soln), 3)
701661

702662
LIBMESH_FE_SIDE_NODAL_SOLN(L2_LAGRANGE_VEC)
703663

0 commit comments

Comments
 (0)