70 std::vector<dealii::Tensor<1, 3>> &offsetVectors)
73 std::vector<std::vector<double>> unitVectorsXYZ;
74 unitVectorsXYZ.resize(3);
78 unitVectorsXYZ[i].resize(3, 0.0);
79 unitVectorsXYZ[i][i] = 0.0;
84 offsetVectors.resize(3);
90 offsetVectors[i][j] = unitVectorsXYZ[i][j] - latticeVectors[i][j];
99 double dotProduct = Vector1[0] * Vector2[0] + Vector1[1] * Vector2[1] +
100 Vector1[2] * Vector2[2];
101 double lengthVector1Sq =
102 (Vector1[0] * Vector1[0] + Vector1[1] * Vector1[1] +
103 Vector1[2] * Vector1[2]);
104 double lengthVector2Sq =
105 (Vector2[0] * Vector2[0] + Vector2[1] * Vector2[1] +
106 Vector2[2] * Vector2[2]);
108 double angle = dotProduct / sqrt(lengthVector1Sq * lengthVector2Sq);
117 double dotProduct = Vector1[0] * Vector2[0] + Vector1[1] * Vector2[1] +
118 Vector1[2] * Vector2[2];
119 double lengthVector1Sq =
120 (Vector1[0] * Vector1[0] + Vector1[1] * Vector1[1] +
121 Vector1[2] * Vector1[2]);
122 double lengthVector2Sq =
123 (Vector2[0] * Vector2[0] + Vector2[1] * Vector2[1] +
124 Vector2[2] * Vector2[2]);
126 double angle = dotProduct / sqrt(lengthVector1Sq * lengthVector2Sq);
134 dealii::Triangulation<3, 3> &triangulation,
135 std::vector<std::vector<double>> &latticeVectors,
136 const MPI_Comm &mpiCommParent,
139 dealii::ConditionalOStream pcout(
141 (dealii::Utilities::MPI::this_mpi_process(mpiCommParent) == 0));
142 std::vector<std::vector<double>> periodicFaceNormals;
143 std::vector<dealii::Tensor<1, 3>> offsetVectors;
156 pcout <<
"Periodic Face Normals 1: " << periodicFaceNormals[0][0]
157 <<
" " << periodicFaceNormals[0][1] <<
" "
158 << periodicFaceNormals[0][2] << std::endl;
159 pcout <<
"Periodic Face Normals 2: " << periodicFaceNormals[1][0]
160 <<
" " << periodicFaceNormals[1][1] <<
" "
161 << periodicFaceNormals[1][2] << std::endl;
162 pcout <<
"Periodic Face Normals 3: " << periodicFaceNormals[2][0]
163 <<
" " << periodicFaceNormals[2][1] <<
" "
164 << periodicFaceNormals[2][2] << std::endl;
167 dealii::QGauss<2> quadratureFace_formula(2);
168 dealii::FESystem<3> FE(dealii::FE_Q<3>(dealii::QGaussLobatto<1>(2)), 1);
169 dealii::FEFaceValues<3> feFace_values(FE,
170 quadratureFace_formula,
171 dealii::update_normal_vectors);
173 typename dealii::Triangulation<3, 3>::active_cell_iterator cell, endc;
180 cell = triangulation.begin_active(), endc = triangulation.end();
181 const std::array<dftfe::Int, 3> periodic = {dftParams.
periodicX,
184 for (; cell != endc; ++cell)
186 for (
dftfe::uInt f = 0; f < dealii::GeometryInfo<3>::faces_per_cell;
189 const dealii::Point<3> face_center = cell->face(f)->center();
190 if (cell->face(f)->at_boundary())
192 feFace_values.reinit(cell, f);
193 dealii::Tensor<1, 3> faceNormalVector =
194 feFace_values.normal_vector(0);
207 if (periodic[d] == 1)
210 periodicFaceNormals[d]) -
212 cell->face(f)->set_boundary_id(i);
215 periodicFaceNormals[d]) +
217 cell->face(f)->set_boundary_id(i + 1);
225 std::vector<dftfe::Int> periodicDirectionVector;
229 if (periodic[d] == 1)
231 periodicDirectionVector.push_back(d);
236 std::vector<dealii::GridTools::PeriodicFacePair<
237 typename dealii::Triangulation<3, 3>::cell_iterator>>
240 i < std::accumulate(periodic.begin(), periodic.end(), 0);
243 dealii::GridTools::collect_periodic_faces(
247 periodicDirectionVector[i],
249 offsetVectors[periodicDirectionVector[i]]);
254 triangulation.add_periodicity(periodicity_vector);
257 pcout <<
"Periodic Facepairs size: " << periodicity_vector.size()