12#ifndef MFEM_FACE_MAP_UTILS_HPP
13#define MFEM_FACE_MAP_UTILS_HPP
29std::pair<int,int> GetFaceNormal3D(
const int face_id);
45void FillFaceMap(
const int n_face_dofs_per_component,
46 const std::vector<int> &offsets,
47 const std::vector<int> &strides,
48 const std::vector<int> &n_dofs_per_dim,
49 Array<int> &face_map);
52void GetTensorFaceMap(
const int dim,
const int order,
const int face_id,
53 Array<int> &face_map);
59inline int ToLexOrdering2D(
const int face_id,
const int size1d,
const int i)
61 if (face_id==2 || face_id==3)
76inline int PermuteFace2D(
const int face_id,
const int orientation,
77 const int size1d,
const int index)
81 if (face_id == 2 || face_id == 3)
83 new_index = size1d-1-
index;
92 new_index = size1d-1-new_index;
101inline int PermuteFace2D(
const int face_id1,
const int face_id2,
102 const int orientation,
const int size1d,
105 const int new_index = PermuteFace2D(face_id1, orientation, size1d,
index);
106 return ToLexOrdering2D(face_id2, size1d, new_index);
113inline int ToLexOrdering3D(
const int face_id,
const int size1d,
const int i,
116 if (face_id==2 || face_id==1 || face_id==5)
120 else if (face_id==3 || face_id==4)
122 return (size1d-1-i) + j*size1d;
126 return i + (size1d-1-j)*size1d;
134inline int PermuteFace3D(
const int face_id,
const int orientation,
135 const int size1d,
const int index)
137 int i=0, j=0, new_i=0, new_j=0;
141 if (face_id==3 || face_id==4)
162 new_j = (size1d-1-i);
165 new_i = (size1d-1-i);
169 new_i = (size1d-1-i);
170 new_j = (size1d-1-j);
173 new_i = (size1d-1-j);
174 new_j = (size1d-1-i);
177 new_i = (size1d-1-j);
182 new_j = (size1d-1-j);
185 return new_i + new_j*size1d;
195inline int PermuteFace3D(
const int face_id1,
const int face_id2,
196 const int orientation,
197 const int size1d,
const int index)
199 const int new_index = PermuteFace3D(face_id1, orientation, size1d,
index);
200 const int new_i = new_index%size1d;
201 const int new_j = new_index/size1d;
202 return ToLexOrdering3D(face_id2, size1d, new_i, new_j);
211inline void FaceIdxToVolIdx2D(
const int qi,
const int nq,
const int face_id0,
212 const int face_id1,
const int side,
int &i,
int &j)
217 const int orientation = side;
219 const int face_id = (side == 0) ? face_id0 : face_id1;
220 const int edge_idx = (side == 0) ? qi : PermuteFace2D(face_id0, face_id1,
221 orientation, nq, qi);
223 const int level = (face_id == 0 || face_id == 3) ? 0 : (nq-1);
224 const bool x_axis = (face_id == 0 || face_id == 2);
226 i = x_axis ? edge_idx : level;
227 j = x_axis ? level : edge_idx;
236inline void FaceIdxToVolIdx3D(
const int index,
const int size1d,
237 const int face_id0,
const int face_id1,
238 const int side,
const int orientation,
239 int& i,
int& j,
int& k)
241 MFEM_VERIFY_KERNEL(face_id1 >= 0 || side == 0,
242 "Accessing second side but face_id1 is not valid.");
244 const int face_id = (side == 0) ? face_id0 : face_id1;
245 const int fidx = (side == 0) ?
index
246 : PermuteFace3D(face_id0, face_id1, orientation, size1d,
index);
248 const bool xy_plane = (face_id == 0 || face_id == 5);
249 const bool yz_plane = (face_id == 2 || face_id == 4);
251 const int level = (face_id == 0 || face_id == 1 || face_id == 4)
254 const int _i = fidx % size1d;
255 const int _j = fidx / size1d;
257 k = xy_plane ? level : _j;
258 j = yz_plane ? _i : xy_plane ? _j : level;
259 i = yz_plane ? level : _i;
int index(int i, int j, int nx, int ny)