Skip to content

Commit c0f0497

Browse files
authored
Merge pull request ITHACA-FV#640 from npicchiarelli/foam2eigentest
TESTS: added unitTest for foam2eigen
2 parents 6ae9da0 + ef4f073 commit c0f0497

3 files changed

Lines changed: 139 additions & 74 deletions

File tree

src/ITHACA_CORE/Foam2Eigen/Foam2Eigen.C

Lines changed: 19 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ Eigen::VectorXd Foam2Eigen::field2Eigen(const
191191
field.size(), 1);
192192
return out;
193193
}
194-
// To be modified with map
194+
195195
template <template <class> class PatchField, class GeoMesh>
196196
List<Eigen::VectorXd> Foam2Eigen::field2EigenBC(
197197
GeometricField<tensor, PatchField, GeoMesh>& field)
@@ -202,24 +202,17 @@ List<Eigen::VectorXd> Foam2Eigen::field2EigenBC(
202202

203203
for (label i = 0; i < size; i++)
204204
{
205-
label sizei = field.boundaryField()[i].size();
206-
Out[i].resize(sizei * 9);
207-
208-
for (label k = 0; k < sizei; k++)
209-
{
210-
for (label j = 0; j < 9; j++)
211-
{
212-
Out[i](k * 9 + j) = field.boundaryField()[i][k][j];
213-
}
214-
}
205+
Out[i] = Eigen::Map<Eigen::VectorXd>(const_cast<double*>(&
206+
(field.boundaryField()[i][0][0])),
207+
field.boundaryField()[i].size() * 9);
215208
}
216209

217210
return Out;
218211
}
219212

220213
template List<Eigen::VectorXd> Foam2Eigen::field2EigenBC(
221214
volTensorField& field);
222-
// To be modified with map
215+
223216
template <template <class> class PatchField, class GeoMesh>
224217
List<Eigen::VectorXd> Foam2Eigen::field2EigenBC(
225218
GeometricField<vector, PatchField, GeoMesh>& field)
@@ -234,32 +227,19 @@ List<Eigen::VectorXd> Foam2Eigen::field2EigenBC(
234227
{
235228
for (label i = 0; i < size; i++ )
236229
{
237-
label sizei = field.boundaryField()[i].size();
238-
Out[i].resize(sizei * 3);
239-
240-
for (label k = 0; k < sizei ; k++)
241-
{
242-
for (label j = 0; j < 3; j++)
243-
{
244-
Out[i](k * 3 + j) = field.boundaryField()[i][k][j];
245-
}
246-
}
230+
Out[i] = Eigen::Map<Eigen::VectorXd>(const_cast<double*>(&
231+
(field.boundaryField()[i][0][0])),
232+
field.boundaryField()[i].size() * 3);
247233
}
248234
}
249235
else if constexpr(std::is_same<pointMesh, GeoMesh>::value)
250236
{
251-
for (label i = 0; i < size; i++ )
237+
for (label i = 0; i < size;
238+
i++ ) //field.boundaryField()[i].patchInternalField()()[k][j];
252239
{
253-
label sizei = field.boundaryField()[i].size();
254-
Out[i].resize(sizei * 3);
255-
256-
for (label k = 0; k < sizei ; k++)
257-
{
258-
for (label j = 0; j < 3; j++)
259-
{
260-
Out[i](k * 3 + j) = field.boundaryField()[i].patchInternalField()()[k][j];
261-
}
262-
}
240+
Out[i] = Eigen::Map<Eigen::VectorXd>(const_cast<double*>(&
241+
(field.boundaryField()[i].patchInternalField()()[0][0])),
242+
field.boundaryField()[i].patchInternalField()().size() * 3);
263243
}
264244
}
265245

@@ -269,7 +249,6 @@ List<Eigen::VectorXd> Foam2Eigen::field2EigenBC(
269249
template List<Eigen::VectorXd> Foam2Eigen::field2EigenBC(
270250
volVectorField& field);
271251

272-
// To be modified with map
273252
template <template <class> class PatchField, class GeoMesh>
274253
List<Eigen::VectorXd> Foam2Eigen::field2EigenBC(
275254
GeometricField<scalar, PatchField, GeoMesh>& field)
@@ -280,13 +259,8 @@ List<Eigen::VectorXd> Foam2Eigen::field2EigenBC(
280259

281260
for (label i = 0; i < size; i++)
282261
{
283-
label sizei = field.boundaryField()[i].size();
284-
Out[i].resize(sizei);
285-
286-
for (label k = 0; k < sizei; k++)
287-
{
288-
Out[i](k) = field.boundaryField()[i][k];
289-
}
262+
Out[i] = Eigen::Map<Eigen::VectorXd>(const_cast<double*>(&
263+
(field.boundaryField()[i][0])), field.boundaryField()[i].size());
290264
}
291265

292266
return Out;
@@ -622,13 +596,13 @@ Field<scalar> Foam2Eigen::Eigen2field(
622596

623597
return field;
624598
}
625-
// This needs to be changed with MAP and changing the order of assignment
599+
626600
template <>
627601
Field<vector> Foam2Eigen::Eigen2field(
628602
Field<vector>& field, Eigen::MatrixXd& matrix, bool correctBC)
629603
{
630604
label sizeBC = field.size();
631-
M_Assert(matrix.cols() == 3,
605+
M_Assert(matrix.cols() == 1,
632606
"The number of columns of the Input members is not correct, it should be 1");
633607

634608
if (matrix.rows() == 1)
@@ -654,13 +628,13 @@ Field<vector> Foam2Eigen::Eigen2field(
654628

655629
return field;
656630
}
657-
// This needs to be changed with MAP and changing the order of assignment
631+
658632
template <>
659633
Field<tensor> Foam2Eigen::Eigen2field(
660634
Field<tensor>& field, Eigen::MatrixXd& matrix, bool correctBC)
661635
{
662636
label sizeBC = field.size();
663-
M_Assert(matrix.cols() == 9,
637+
M_Assert(matrix.cols() == 1,
664638
"The number of columns of the Input members is not correct, it should be 1");
665639

666640
if (matrix.rows() == 1)

unitTests/Foam2Eigen/Foam2EigenTest.C

Lines changed: 119 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ Description
6767
#include "pisoControl.H"
6868
#include "Foam2Eigen.H"
6969

70+
7071
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
7172

7273
int main(int argc, char *argv[])
@@ -107,42 +108,132 @@ Foam::fvMesh& mesh = meshPtr();
107108

108109
#include "createFields.H"
109110

110-
Info << p << endl;
111-
112-
Eigen::MatrixXd p_eigen;
111+
////////// SCALAR FIELD TEST //////////
112+
113+
Eigen::VectorXd p_eigen;
113114
p_eigen = Foam2Eigen::field2Eigen(p);
114-
std::cerr << p_eigen << std::endl;
115-
p.ref()[0] = 1;
116-
Info << p << endl;
117-
Foam2Eigen::Eigen2field(p, p_eigen);
115+
116+
Info << "\nOriginal p:\n" << endl;
118117
Info << p << endl;
119-
Info << U << endl;
120-
Eigen::VectorXd U_eigen = Foam2Eigen::field2Eigen(U);
121-
std::cerr << U_eigen << std::endl;
122-
U.ref()[0] = vector::zero;
123-
Info << U << endl;
124-
U = Foam2Eigen::Eigen2field(U, U_eigen,0);
125-
Info << U << endl;
126-
// Info << R << endl;
127118

119+
Info << "\nFirst two elements of p, by reference:\n" << endl;
120+
std::cerr << *(&p.ref()[0]) << std::endl;
121+
std::cerr << *(&p.ref()[0]+1) << std::endl;
122+
123+
Info << "\nFirst two elements of p_eigen:\n" << endl;
124+
std::cerr << p_eigen(0) << std::endl;
125+
std::cerr << p_eigen(1) << std::endl;
126+
127+
// Change p_eigen
128+
p_eigen(0) = 0.0;
129+
p = Foam2Eigen::Eigen2field(p, p_eigen, false);
130+
131+
Info << "\nConverting back to field, after setting R_eigen(9) = 0.0 (First row, first column, second element):\n" << endl;
132+
Info << *(&p.ref()) << endl;
128133

129-
// Info << *(&U.ref()[0][0]) << endl;
130-
// Info << *(&U.ref()[0][0]+1) << endl;
131-
// Info << *(&U.ref()[0][0]+2) << endl;
132-
// exit(0);
133-
134+
// uncomment lines below to test error handling for wrong size
135+
// Info << "\nConverting back to field with a resized p (3×3). Eigen2Field should throw an error:\n" << endl;
136+
// Eigen::MatrixXd p_eigen_r = Eigen::Map<Eigen::MatrixXd>((p_eigen.data()),3,3);
137+
// Foam2Eigen::Eigen2field(pp, p_eigen_r, false);
134138

135-
136-
// Info << R[0] << endl;
139+
// Testing for BCs
140+
List<Eigen::VectorXd> p_bc = Foam2Eigen::field2EigenBC(p);
141+
Info << "\np_bc (Eigen Map):\n" << endl;
142+
Info << p_bc << endl;
143+
// exit(0);
137144

138-
145+
////////// VECTOR FIELD TEST //////////
139146

140-
// Info << U << endl;
141-
// Info << *(&U.ref()[0][0]) << endl;
142-
// Info << *(&U.ref()[0][0]+1) << endl;
143-
// Info << *(&U.ref()[0][0]+2) << endl;
147+
Info << "\nOriginal U:\n" << endl;
148+
Info << U << endl;
149+
Eigen::VectorXd U_eigen;
150+
U_eigen = Foam2Eigen::field2Eigen(U);
151+
152+
std::cerr << "\nFirst 4 elements of U, by reference:\n" << std::endl;
153+
Info << *(&U.ref()[0][0]) << endl;
154+
Info << *(&U.ref()[0][0]+1) << endl;
155+
Info << *(&U.ref()[0][0]+2) << endl;
156+
Info << *(&U.ref()[0][0]+3) << endl;
157+
158+
std::cerr << "\nFirst 4 elements of U_eigen:\n" << std::endl;
159+
std::cerr << U_eigen(0) << std::endl;
160+
std::cerr << U_eigen(1) << std::endl;
161+
std::cerr << U_eigen(2) << std::endl;
162+
std::cerr << U_eigen(3) << std::endl;
163+
164+
// Change U_eigen
165+
U_eigen(3) = 0.0;
166+
U = Foam2Eigen::Eigen2field(U, U_eigen, false);
167+
std::cerr << "\nConverting back to field:, after setting U_eigen(3) = 0.0 (second row, first column)\n" << std::endl;
168+
Info << U << endl;
144169

145-
Info<< "End\n" << endl;
170+
// uncomment lines below to test error handling for wrong size
171+
// Info << "\nConverting back to field with a resized U (9×3). Eigen2Field should throw an error:\n" << endl;
172+
// Eigen::MatrixXd U_eigen_r = Eigen::Map<Eigen::MatrixXd>((U_eigen.data()),3 ,9);
173+
// U_eigen_r.transposeInPlace();
174+
// std::cerr << U_eigen_r << std::endl;
175+
// volVectorField UU(U);
176+
// Foam2Eigen::Eigen2field(UU, U_eigen_r, false);
177+
178+
// Testing for BCs
179+
List<Eigen::VectorXd> U_bc;
180+
U_bc = Foam2Eigen::field2EigenBC(U);
181+
Info << "\nU_bc (Eigen Map):\n" << endl;
182+
Info << U_bc << endl;
183+
// exit(0);
184+
185+
////////// TENSOR FIELD TEST //////////
186+
187+
Eigen::VectorXd R_eigen;
188+
R_eigen = Foam2Eigen::field2Eigen(R);
189+
190+
Info << "\nOriginal R\n" << endl;
191+
Info << *(&R.ref()) << endl;
192+
Info << *(R.ref().data()) << endl;
193+
194+
Info << "\nFirst row of first element:\n" << endl;
195+
Info << *(&R.ref()[0][0]) << endl;
196+
Info << *(&R.ref()[0][0]+1) << endl;
197+
Info << *(&R.ref()[0][0]+2) << endl;
198+
199+
Info << "\nSecond row of first element:\n" << endl;
200+
Info << *(&R.ref()[0][0]+3) << endl;
201+
Info << "\nFirst row of second element:\n" << endl;
202+
Info << *(&R.ref()[0][0]+9) << endl;
203+
204+
Info << "\nR_eigen\n" << endl;
205+
Info << "\nFirst three elements:\n" << endl;
206+
Info << R_eigen(0) << endl;
207+
Info << R_eigen(1) << endl;
208+
Info << R_eigen(2) << endl;
209+
Info << "\n4th element:\n" << endl;
210+
Info << R_eigen(3) << endl;
211+
Info << "\n9th element:\n" << endl;
212+
Info << R_eigen(9) << endl;
213+
214+
// Change R_eigen
215+
R_eigen(9) = 0.0;
216+
std::cerr << "\nConverting back to field, after setting R_eigen(9) = 0.0 (First row, first column, second element):\n" << std::endl;
217+
R = Foam2Eigen::Eigen2field(R, R_eigen, false);
218+
Info << R << endl;
219+
// exit(0);
220+
221+
// uncomment lines below to test error handling for wrong size
222+
// Eigen::MatrixXd R_eigen_r = Eigen::Map<Eigen::MatrixXd>((R_eigen.data()),9 ,9);
223+
// R_eigen_r.transposeInPlace();
224+
// Info << "\nResized R_eigen:\n" << endl;
225+
// std::cerr << R_eigen_r << std::endl;
226+
// volTensorField RR(R);
227+
// Info << "\nConverting back to field with a resized U (9×9). Eigen2Field should throw an error:\n" << endl;
228+
// Foam2Eigen::Eigen2field(RR, R_eigen_r, false);
229+
230+
// Testing for BCs
231+
List<Eigen::VectorXd> R_bc;
232+
R_bc = Foam2Eigen::field2EigenBC(R);
233+
Info << "\nR_bc (Eigen Map):\n" << endl;
234+
Info << R_bc << endl;
235+
236+
Info << "End\n" << endl;
146237

147238
return 0;
148239
}

unitTests/Foam2Eigen/Make/files

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
Foam2EigenTest.C
22

3-
EXE = Foam2EigenTest
3+
EXE = Foam2EigenTest.exe

0 commit comments

Comments
 (0)