Skip to content

Commit 0ac8186

Browse files
authored
Merge branch 'ITHACA-FV:master' into master
2 parents 63110ec + f3e60d5 commit 0ac8186

File tree

5 files changed

+411
-22
lines changed

5 files changed

+411
-22
lines changed

src/ITHACA_CORE/Foam2Eigen/Foam2Eigen.C

+199-18
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,27 @@ License
3636
// * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * * //
3737

3838
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
39+
template <template <class> class PatchField, class GeoMesh>
40+
Eigen::VectorXd Foam2Eigen::field2Eigen(
41+
GeometricField<tensor, PatchField, GeoMesh>& field)
42+
{
43+
Eigen::VectorXd out;
44+
out.resize(label(field.size() * 9));
45+
46+
for (label l = 0; l < field.size(); l++)
47+
{
48+
for (label j = 0; j < 9; j++)
49+
{
50+
out(j * field.size() + l) = field[l][j];
51+
}
52+
}
53+
54+
return out;
55+
}
56+
57+
template Eigen::VectorXd Foam2Eigen::field2Eigen(
58+
volTensorField& field);
59+
3960
template <template <class> class PatchField, class GeoMesh>
4061
Eigen::VectorXd Foam2Eigen::field2Eigen(
4162
GeometricField<vector, PatchField, GeoMesh>& field)
@@ -45,9 +66,10 @@ Eigen::VectorXd Foam2Eigen::field2Eigen(
4566

4667
for (label l = 0; l < field.size(); l++)
4768
{
48-
out(l) = field[l][0];
49-
out(field.size() + l) = field[l][1];
50-
out(2 * field.size() + l) = field[l][2];
69+
for (label j = 0; j < 3; j++)
70+
{
71+
out(j * field.size() + l) = field[l][j];
72+
}
5173
}
5274

5375
return out;
@@ -109,9 +131,27 @@ Eigen::VectorXd Foam2Eigen::field2Eigen(const Field<vector>& field)
109131

110132
for (label l = 0; l < field.size(); l++)
111133
{
112-
out(l) = field[l][0];
113-
out(field.size() + l) = field[l][1];
114-
out(2 * field.size() + l) = field[l][2];
134+
for (label j = 0; j < 3; j++)
135+
{
136+
out(j * field.size() + l) = field[l][j];
137+
}
138+
}
139+
140+
return out;
141+
}
142+
143+
template <>
144+
Eigen::VectorXd Foam2Eigen::field2Eigen(const Field<tensor>& field)
145+
{
146+
Eigen::VectorXd out;
147+
out.resize(label(field.size() * 9));
148+
149+
for (label l = 0; l < field.size(); l++)
150+
{
151+
for (label j = 0; j < 9; j++)
152+
{
153+
out(j * field.size() + l) = field[l][j];
154+
}
115155
}
116156

117157
return out;
@@ -132,6 +172,34 @@ Eigen::VectorXd Foam2Eigen::field2Eigen(const
132172
return out;
133173
}
134174

175+
template <template <class> class PatchField, class GeoMesh>
176+
List<Eigen::VectorXd> Foam2Eigen::field2EigenBC(
177+
GeometricField<tensor, PatchField, GeoMesh>& field)
178+
{
179+
List<Eigen::VectorXd> Out;
180+
label size = field.boundaryField().size();
181+
Out.resize(size);
182+
183+
for (label i = 0; i < size; i++)
184+
{
185+
label sizei = field.boundaryField()[i].size();
186+
Out[i].resize(sizei * 9);
187+
188+
for (label k = 0; k < sizei; k++)
189+
{
190+
for (label j = 0; j < 9; j++)
191+
{
192+
Out[i](k + j * sizei) = field.boundaryField()[i][k][j];
193+
}
194+
}
195+
}
196+
197+
return Out;
198+
}
199+
200+
template List<Eigen::VectorXd> Foam2Eigen::field2EigenBC(
201+
volTensorField& field);
202+
135203
template <template <class> class PatchField, class GeoMesh>
136204
List<Eigen::VectorXd> Foam2Eigen::field2EigenBC(
137205
GeometricField<vector, PatchField, GeoMesh>& field)
@@ -147,9 +215,10 @@ List<Eigen::VectorXd> Foam2Eigen::field2EigenBC(
147215

148216
for (label k = 0; k < sizei; k++)
149217
{
150-
Out[i](k) = field.boundaryField()[i][k][0];
151-
Out[i](k + sizei) = field.boundaryField()[i][k][1];
152-
Out[i](k + 2 * sizei) = field.boundaryField()[i][k][2];
218+
for (label j = 0; j < 3; j++)
219+
{
220+
Out[i](k + j * sizei) = field.boundaryField()[i][k][j];
221+
}
153222
}
154223
}
155224

@@ -279,6 +348,79 @@ List<Eigen::MatrixXd> Foam2Eigen::PtrList2EigenBC(
279348
template List<Eigen::MatrixXd> Foam2Eigen::PtrList2EigenBC(
280349
PtrList<volVectorField>& fields, label Nfields);
281350

351+
352+
template <template <class> class PatchField, class GeoMesh>
353+
List<Eigen::MatrixXd> Foam2Eigen::PtrList2EigenBC(
354+
PtrList<GeometricField<tensor, PatchField, GeoMesh>>&
355+
fields,
356+
label Nfields)
357+
{
358+
label Nf;
359+
M_Assert(Nfields <= fields.size(),
360+
"The Number of requested fields cannot be bigger than the number of requested entries.");
361+
362+
if (Nfields == -1)
363+
{
364+
Nf = fields.size();
365+
}
366+
else
367+
{
368+
Nf = Nfields;
369+
}
370+
371+
List<Eigen::MatrixXd> Out;
372+
label NBound = fields[0].boundaryField().size();
373+
Out.resize(NBound);
374+
375+
for (label i = 0; i < NBound; i++)
376+
{
377+
label sizei = fields[0].boundaryField()[i].size();
378+
Out[i].resize(sizei * 9, Nf);
379+
}
380+
381+
for (label k = 0; k < Nf; k++)
382+
{
383+
List<Eigen::VectorXd> temp;
384+
temp = field2EigenBC(fields[k]);
385+
386+
for (label i = 0; i < NBound; i++)
387+
{
388+
Out[i].col(k) = temp[i];
389+
}
390+
}
391+
392+
return Out;
393+
}
394+
395+
template List<Eigen::MatrixXd> Foam2Eigen::PtrList2EigenBC(
396+
PtrList<volTensorField>& fields, label Nfields);
397+
398+
template <template <class> class PatchField, class GeoMesh>
399+
GeometricField<tensor, PatchField, GeoMesh> Foam2Eigen::Eigen2field(
400+
GeometricField<tensor, PatchField, GeoMesh>& field_in,
401+
Eigen::VectorXd& eigen_vector, bool correctBC)
402+
{
403+
GeometricField<tensor, PatchField, GeoMesh> field_out(field_in);
404+
405+
for (auto i = 0; i < field_out.size(); i++)
406+
{
407+
for (label j = 0; j < 9; j++)
408+
{
409+
field_out.ref()[i][j] = eigen_vector(i + field_out.size() * j);
410+
}
411+
}
412+
413+
if (correctBC)
414+
{
415+
field_out.correctBoundaryConditions();
416+
}
417+
418+
return field_out;
419+
}
420+
421+
template volTensorField Foam2Eigen::Eigen2field(
422+
volTensorField& field_in, Eigen::VectorXd& eigen_vector, bool correctBC);
423+
282424
template <template <class> class PatchField, class GeoMesh>
283425
GeometricField<vector, PatchField, GeoMesh> Foam2Eigen::Eigen2field(
284426
GeometricField<vector, PatchField, GeoMesh>& field_in,
@@ -288,9 +430,10 @@ GeometricField<vector, PatchField, GeoMesh> Foam2Eigen::Eigen2field(
288430

289431
for (auto i = 0; i < field_out.size(); i++)
290432
{
291-
field_out.ref()[i][0] = eigen_vector(i);
292-
field_out.ref()[i][1] = eigen_vector(i + field_out.size());
293-
field_out.ref()[i][2] = eigen_vector(i + field_out.size() * 2);
433+
for (label j = 0; j < 3; j++)
434+
{
435+
field_out.ref()[i][j] = eigen_vector(i + field_out.size() * j);
436+
}
294437
}
295438

296439
if (correctBC)
@@ -395,9 +538,42 @@ Field<vector> Foam2Eigen::Eigen2field(
395538

396539
for (auto i = 0; i < sizeBC; i++)
397540
{
398-
field[i][0] = matrix(i, 0);
399-
field[i][1] = matrix(i, 1);
400-
field[i][2] = matrix(i, 2);
541+
for (label j = 0; j < 3; j++)
542+
{
543+
field[i][j] = matrix(i, j);
544+
}
545+
}
546+
547+
return field;
548+
}
549+
550+
template <>
551+
Field<tensor> Foam2Eigen::Eigen2field(
552+
Field<tensor>& field, Eigen::MatrixXd& matrix, bool correctBC)
553+
{
554+
label sizeBC = field.size();
555+
M_Assert(matrix.cols() == 9,
556+
"The number of columns of the Input members is not correct, it should be 1");
557+
558+
if (matrix.rows() == 1)
559+
{
560+
Eigen::MatrixXd new_matrix = matrix.replicate(sizeBC, 1);
561+
matrix.conservativeResize(sizeBC, 9);
562+
matrix = new_matrix;
563+
}
564+
565+
std::string message = "The input Eigen::MatrixXd has size " + name(
566+
matrix.rows()) +
567+
". It should have the same size of the Field, i.e. " +
568+
name(sizeBC);
569+
M_Assert(matrix.rows() == sizeBC, message.c_str());
570+
571+
for (auto i = 0; i < sizeBC; i++)
572+
{
573+
for (label j = 0; j < 9; j++)
574+
{
575+
field[i][j] = matrix(i, j);
576+
}
401577
}
402578

403579
return field;
@@ -444,6 +620,10 @@ template Eigen::MatrixXd
444620
Foam2Eigen::PtrList2Eigen<vector, fvPatchField, volMesh>(PtrList<volVectorField>&
445621
fields,
446622
label Nfields);
623+
template Eigen::MatrixXd
624+
Foam2Eigen::PtrList2Eigen<tensor, fvPatchField, volMesh>(PtrList<volTensorField>&
625+
fields,
626+
label Nfields);
447627

448628
template <>
449629
void Foam2Eigen::fvMatrix2Eigen(fvMatrix<scalar> foam_matrix,
@@ -1029,9 +1209,10 @@ Eigen::MatrixXd Foam2Eigen::field2Eigen(const List<vector>& field)
10291209

10301210
for (label l = 0; l < field.size(); l++)
10311211
{
1032-
out(l, 0) = field[l][0];
1033-
out(field.size() + l, 0) = field[l][1];
1034-
out(2 * field.size() + l, 0) = field[l][2];
1212+
for (label j = 0; j < 3; j++)
1213+
{
1214+
out(j * field.size() + l, 0) = field[l][j];
1215+
}
10351216
}
10361217

10371218
return out;

src/ITHACA_CORE/Foam2Eigen/Foam2Eigen.H

+63
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,20 @@ class Foam2Eigen
142142
PtrList<GeometricField<Type, PatchField, GeoMesh>>& fields,
143143
label Nfields = -1);
144144

145+
//----------------------------------------------------------------------
146+
/// @brief Convert a vector OpenFOAM field into an Eigen Vector
147+
///
148+
/// @param[in] field The field
149+
///
150+
/// @tparam PatchField fvPatchField or fvsPatchField.
151+
/// @tparam GeoMesh volMesh or surfaceMesh.
152+
///
153+
/// @return Dense Eigen vector
154+
///
155+
template<template<class> class PatchField, class GeoMesh>
156+
static Eigen::VectorXd field2Eigen(GeometricField<tensor, PatchField, GeoMesh>&
157+
field);
158+
145159
//----------------------------------------------------------------------
146160
/// @brief Convert a vector OpenFOAM field into an Eigen Vector
147161
///
@@ -242,6 +256,21 @@ class Foam2Eigen
242256
static List<Eigen::VectorXd> field2EigenBC(
243257
GeometricField<vector, PatchField, GeoMesh>& field);
244258

259+
//----------------------------------------------------------------------
260+
/// @brief Convert an OpenFOAM tensor field to a List of Eigen
261+
/// Vectors, one for each boundary
262+
///
263+
/// @param[in] field The field
264+
///
265+
/// @tparam PatchField fvPatchField or fvsPatchField.
266+
/// @tparam GeoMesh volMesh or surfaceMesh.
267+
///
268+
/// @return Dense Eigen vector
269+
///
270+
template<template<class> class PatchField, class GeoMesh>
271+
static List<Eigen::VectorXd> field2EigenBC(
272+
GeometricField<tensor, PatchField, GeoMesh>& field);
273+
245274

246275
//----------------------------------------------------------------------
247276
/// @brief Convert an OpenFOAM scalar field to a List of Eigen
@@ -277,6 +306,23 @@ class Foam2Eigen
277306
PtrList<GeometricField<vector, PatchField, GeoMesh>>& fields,
278307
label Nfields = -1);
279308

309+
//----------------------------------------------------------------------
310+
/// @brief Convert an OpenFOAM vector field to a List of Eigen
311+
/// Vectors, one for each boundary
312+
///
313+
/// @param[in] fields The field
314+
/// @param[in] Nfields The nfields
315+
///
316+
/// @tparam PatchField fvPatchField or fvsPatchField.
317+
/// @tparam GeoMesh volMesh or surfaceMesh.
318+
///
319+
/// @return Dense Eigen matrix
320+
///
321+
template<template<class> class PatchField, class GeoMesh>
322+
static List<Eigen::MatrixXd> PtrList2EigenBC(
323+
PtrList<GeometricField<tensor, PatchField, GeoMesh>>& fields,
324+
label Nfields = -1);
325+
280326
//----------------------------------------------------------------------
281327
/// @brief Convert a vector in Eigen format into an OpenFOAM
282328
/// scalar GeometricField
@@ -311,6 +357,23 @@ class Foam2Eigen
311357
GeometricField<vector, PatchField, GeoMesh>& field,
312358
Eigen::VectorXd& eigen_vector, bool correctBC = true);
313359

360+
//----------------------------------------------------------------------
361+
/// @brief Convert a vector in Eigen format into an OpenFOAM
362+
/// tensor GeometricField
363+
///
364+
/// @param[in/out] field OpenFOAM GeometricField
365+
/// @param[in] eigen_vector Vector in Eigen format
366+
///
367+
/// @tparam PatchField fvPatchField or fvsPatchField.
368+
/// @tparam GeoMesh volMesh or surfaceMesh.
369+
///
370+
/// @return OpenFOAM GeometricField
371+
///
372+
template<template<class> class PatchField, class GeoMesh>
373+
static GeometricField<tensor, PatchField, GeoMesh> Eigen2field(
374+
GeometricField<tensor, PatchField, GeoMesh>& field,
375+
Eigen::VectorXd& eigen_vector, bool correctBC = true);
376+
314377
//----------------------------------------------------------------------
315378
/// @brief Converts a matrix in Eigen format into an OpenFOAM
316379
/// Field

0 commit comments

Comments
 (0)