88 double dotProduct = Vector1[0] * Vector2[0] + Vector1[1] * Vector2[1] +
89 Vector1[2] * Vector2[2];
90 double lengthVector1Sq =
91 (Vector1[0] * Vector1[0] + Vector1[1] * Vector1[1] +
92 Vector1[2] * Vector1[2]);
93 double lengthVector2Sq =
94 (Vector2[0] * Vector2[0] + Vector2[1] * Vector2[1] +
95 Vector2[2] * Vector2[2]);
97 double angle = dotProduct / sqrt(lengthVector1Sq * lengthVector2Sq);
106 double dotProduct = Vector1[0] * Vector2[0] + Vector1[1] * Vector2[1] +
107 Vector1[2] * Vector2[2];
108 double lengthVector1Sq =
109 (Vector1[0] * Vector1[0] + Vector1[1] * Vector1[1] +
110 Vector1[2] * Vector1[2]);
111 double lengthVector2Sq =
112 (Vector2[0] * Vector2[0] + Vector2[1] * Vector2[1] +
113 Vector2[2] * Vector2[2]);
115 double angle = dotProduct / sqrt(lengthVector1Sq * lengthVector2Sq);
123 dealii::Triangulation<3, 3> &triangulation,
124 std::vector<std::vector<double>> &latticeVectors,
125 const MPI_Comm &mpiCommParent,
128 dealii::ConditionalOStream pcout(
130 (dealii::Utilities::MPI::this_mpi_process(mpiCommParent) == 0));
131 std::vector<std::vector<double>> periodicFaceNormals;
132 std::vector<dealii::Tensor<1, 3>> offsetVectors;
145 pcout <<
"Periodic Face Normals 1: " << periodicFaceNormals[0][0]
146 <<
" " << periodicFaceNormals[0][1] <<
" "
147 << periodicFaceNormals[0][2] << std::endl;
148 pcout <<
"Periodic Face Normals 2: " << periodicFaceNormals[1][0]
149 <<
" " << periodicFaceNormals[1][1] <<
" "
150 << periodicFaceNormals[1][2] << std::endl;
151 pcout <<
"Periodic Face Normals 3: " << periodicFaceNormals[2][0]
152 <<
" " << periodicFaceNormals[2][1] <<
" "
153 << periodicFaceNormals[2][2] << std::endl;
156 dealii::QGauss<2> quadratureFace_formula(2);
157 dealii::FESystem<3> FE(dealii::FE_Q<3>(dealii::QGaussLobatto<1>(2)), 1);
158 dealii::FEFaceValues<3> feFace_values(FE,
159 quadratureFace_formula,
160 dealii::update_normal_vectors);
162 typename dealii::Triangulation<3, 3>::active_cell_iterator cell, endc;
169 cell = triangulation.begin_active(), endc = triangulation.end();
170 const std::array<dftfe::Int, 3> periodic = {dftParams.
periodicX,
173 for (; cell != endc; ++cell)
175 for (
dftfe::uInt f = 0; f < dealii::GeometryInfo<3>::faces_per_cell;
178 const dealii::Point<3> face_center = cell->face(f)->center();
179 if (cell->face(f)->at_boundary())
181 feFace_values.reinit(cell, f);
182 dealii::Tensor<1, 3> faceNormalVector =
183 feFace_values.normal_vector(0);
196 if (periodic[d] == 1)
199 periodicFaceNormals[d]) -
201 cell->face(f)->set_boundary_id(i);
204 periodicFaceNormals[d]) +
206 cell->face(f)->set_boundary_id(i + 1);
214 std::vector<dftfe::Int> periodicDirectionVector;
218 if (periodic[d] == 1)
220 periodicDirectionVector.push_back(d);
225 std::vector<dealii::GridTools::PeriodicFacePair<
226 typename dealii::Triangulation<3, 3>::cell_iterator>>
229 i < std::accumulate(periodic.begin(), periodic.end(), 0);
232 dealii::GridTools::collect_periodic_faces(
236 periodicDirectionVector[i],
238 offsetVectors[periodicDirectionVector[i]]);
243 triangulation.add_periodicity(periodicity_vector);
246 pcout <<
"Periodic Facepairs size: " << periodicity_vector.size()