34 const int qorder = test_order + trial_order - 1;
36 const int nquad = ir.
Size();
38 Vector pa_data(nquad * nf);
44 const int q = idx % nquad;
45 const int f = idx / nquad;
46 d_pa_data(q,
f) = d_w[q];
52 const int ndof_face = trial_face_el.
GetDof();
55 const int d1d = maps->ndof;
56 const int q1d = maps->nqpt;
58 Vector mass_emat(ndof_face*ndof_face*nf);
64 internal::EAMassAssemble1D(nf, B, pa_data, mass_emat,
false, d1d, q1d);
68 internal::EAMassAssemble2D(nf, B, pa_data, mass_emat,
false, d1d, q1d);
72 MFEM_ABORT(
"Unknown kernel.");
76 const int n_faces_per_el = 2*
dim;
79 Array<int> face_maps(ndof_face * n_faces_per_el);
80 for (
int lf_i = 0; lf_i < n_faces_per_el; ++lf_i)
84 for (
int i = 0; i < ndof_face; ++i)
86 face_maps[i + lf_i*ndof_face] = face_map[i];
105 const int ndof_vol = test_el.
GetDof();
106 const auto d_face_maps =
Reshape(face_maps.
Read(), ndof_face, n_faces_per_el);
107 const auto d_face_info =
Reshape(face_info.
Read(), 2, 2, nf);
116 d_emat = emat.
Write();
120 const auto face_mats =
Reshape(mass_emat.
Read(), ndof_face, ndof_face, nf);
121 auto el_mats =
Reshape(d_emat, ndof_vol, ndof_face, 2, nf);
123 auto permute_face = [=] MFEM_HOST_DEVICE(
int local_face_id,
int orient,
124 int size1d,
int index)
128 return internal::PermuteFace2D(local_face_id, orient, size1d,
index);
132 return internal::PermuteFace3D(local_face_id, orient, size1d,
index);
136 auto permute_face_2 = [=] MFEM_HOST_DEVICE(
int local_face_1,
int local_face_2,
137 int orient,
int size1d,
int index)
141 return internal::PermuteFace2D(local_face_1, local_face_2, orient,
146 return internal::PermuteFace3D(local_face_1, local_face_2, orient,
155 MFEM_FOREACH_THREAD(el_i, z, 2)
157 const int lf_i = d_face_info(0, el_i,
f);
158 const int orient = d_face_info(1, el_i,
f);
160 MFEM_FOREACH_THREAD(i_lex, x, ndof_face)
163 const int i_face = permute_face(lf_i, orient, d1d, i_lex);
165 const int i = d_face_maps(i_lex, lf_i);
166 MFEM_FOREACH_THREAD(j, y, ndof_face)
168 el_mats(i, j, el_i,
f) += face_mats(i_face, j,
f);
182 ndof_face, ndof_face, nc_size);
188 const int interp_index = conf.
index;
190 const int lf_0 = d_face_info(0, 0,
f);
192 for (
int el_i = 0; el_i < 2; ++el_i)
194 const int lf_i = d_face_info(0, el_i,
f);
195 const int orient = d_face_info(1, el_i,
f);
197 for (
int j = 0; j < ndof_face; j++)
199 for (
int i_lex = 0; i_lex < ndof_face; i_lex++)
209 const int i0 = permute_face_2(lf_i, lf_0, orient, d1d, i_lex);
212 for (
int k0 = 0; k0 < ndof_face; k0++)
215 const int k = permute_face(lf_0, orient, d1d, k0);
216 val += d_interp(k0, i0, interp_index)
217 * face_mats(k, j,
f);
223 const int i_face = permute_face(lf_i, orient, d1d, i_lex);
224 val = face_mats(i_face, j,
f);
227 const int i = d_face_maps(i_lex, lf_i);
228 el_mats(i, j, el_i,
f) += val;