70 std::vector<dealii::Tensor<1, 3>> &offsetVectors)
73 std::vector<std::vector<double>> unitVectorsXYZ;
74 unitVectorsXYZ.resize(3);
76 for (
int i = 0; i < 3; ++i)
78 unitVectorsXYZ[i].resize(3, 0.0);
79 unitVectorsXYZ[i][i] = 0.0;
84 offsetVectors.resize(3);
86 for (
int i = 0; i < 3; ++i)
88 for (
int j = 0; j < 3; ++j)
90 offsetVectors[i][j] = unitVectorsXYZ[i][j] - latticeVectors[i][j];
97 std::vector<double> & Vector2)
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);
133 dealii::Triangulation<3, 3> & triangulation,
134 std::vector<std::vector<double>> &latticeVectors,
135 const MPI_Comm & mpiCommParent,
138 dealii::ConditionalOStream pcout(
140 (dealii::Utilities::MPI::this_mpi_process(mpiCommParent) == 0));
141 std::vector<std::vector<double>> periodicFaceNormals;
142 std::vector<dealii::Tensor<1, 3>> offsetVectors;
155 pcout <<
"Periodic Face Normals 1: " << periodicFaceNormals[0][0]
156 <<
" " << periodicFaceNormals[0][1] <<
" "
157 << periodicFaceNormals[0][2] << std::endl;
158 pcout <<
"Periodic Face Normals 2: " << periodicFaceNormals[1][0]
159 <<
" " << periodicFaceNormals[1][1] <<
" "
160 << periodicFaceNormals[1][2] << std::endl;
161 pcout <<
"Periodic Face Normals 3: " << periodicFaceNormals[2][0]
162 <<
" " << periodicFaceNormals[2][1] <<
" "
163 << periodicFaceNormals[2][2] << std::endl;
166 dealii::QGauss<2> quadratureFace_formula(2);
167 dealii::FESystem<3> FE(dealii::FE_Q<3>(dealii::QGaussLobatto<1>(2)), 1);
168 dealii::FEFaceValues<3> feFace_values(FE,
169 quadratureFace_formula,
170 dealii::update_normal_vectors);
172 typename dealii::Triangulation<3, 3>::active_cell_iterator cell, endc;
179 cell = triangulation.begin_active(), endc = triangulation.end();
180 const std::array<int, 3> periodic = {dftParams.
periodicX,
183 for (; cell != endc; ++cell)
185 for (
unsigned int f = 0; f < dealii::GeometryInfo<3>::faces_per_cell;
188 const dealii::Point<3> face_center = cell->face(f)->center();
189 if (cell->face(f)->at_boundary())
191 feFace_values.reinit(cell, f);
192 dealii::Tensor<1, 3> faceNormalVector =
193 feFace_values.normal_vector(0);
204 for (
unsigned int d = 0; d < 3; ++d)
206 if (periodic[d] == 1)
209 periodicFaceNormals[d]) -
211 cell->face(f)->set_boundary_id(i);
214 periodicFaceNormals[d]) +
216 cell->face(f)->set_boundary_id(i + 1);
224 std::vector<int> periodicDirectionVector;
226 for (
unsigned int d = 0; d < 3; ++d)
228 if (periodic[d] == 1)
230 periodicDirectionVector.push_back(d);
235 std::vector<dealii::GridTools::PeriodicFacePair<
236 typename dealii::Triangulation<3, 3>::cell_iterator>>
238 for (
int i = 0; i < std::accumulate(periodic.begin(), periodic.end(), 0);
241 dealii::GridTools::collect_periodic_faces(
245 periodicDirectionVector[i],
247 offsetVectors[periodicDirectionVector[i]]);
252 triangulation.add_periodicity(periodicity_vector);
255 pcout <<
"Periodic Facepairs size: " << periodicity_vector.size()