@@ -36,6 +36,27 @@ License
36
36
// * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * * //
37
37
38
38
// * * * * * * * * * * * * * * * 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
+
39
60
template < template < class > class PatchField , class GeoMesh >
40
61
Eigen ::VectorXd Foam2Eigen ::field2Eigen (
41
62
GeometricField < vector , PatchField , GeoMesh > & field )
@@ -45,9 +66,10 @@ Eigen::VectorXd Foam2Eigen::field2Eigen(
45
66
46
67
for (label l = 0 ; l < field .size (); l ++ )
47
68
{
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
+ }
51
73
}
52
74
53
75
return out ;
@@ -109,9 +131,27 @@ Eigen::VectorXd Foam2Eigen::field2Eigen(const Field<vector>& field)
109
131
110
132
for (label l = 0 ; l < field .size (); l ++ )
111
133
{
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
+ }
115
155
}
116
156
117
157
return out ;
@@ -132,6 +172,34 @@ Eigen::VectorXd Foam2Eigen::field2Eigen(const
132
172
return out ;
133
173
}
134
174
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
+
135
203
template < template < class > class PatchField , class GeoMesh >
136
204
List < Eigen ::VectorXd > Foam2Eigen ::field2EigenBC (
137
205
GeometricField < vector , PatchField , GeoMesh > & field )
@@ -147,9 +215,10 @@ List<Eigen::VectorXd> Foam2Eigen::field2EigenBC(
147
215
148
216
for (label k = 0 ; k < sizei ; k ++ )
149
217
{
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
+ }
153
222
}
154
223
}
155
224
@@ -279,6 +348,79 @@ List<Eigen::MatrixXd> Foam2Eigen::PtrList2EigenBC(
279
348
template List < Eigen ::MatrixXd > Foam2Eigen ::PtrList2EigenBC (
280
349
PtrList < volVectorField > & fields , label Nfields );
281
350
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
+
282
424
template < template < class > class PatchField , class GeoMesh >
283
425
GeometricField < vector , PatchField , GeoMesh > Foam2Eigen ::Eigen2field (
284
426
GeometricField < vector , PatchField , GeoMesh > & field_in ,
@@ -288,9 +430,10 @@ GeometricField<vector, PatchField, GeoMesh> Foam2Eigen::Eigen2field(
288
430
289
431
for (auto i = 0 ; i < field_out .size (); i ++ )
290
432
{
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
+ }
294
437
}
295
438
296
439
if (correctBC )
@@ -395,9 +538,42 @@ Field<vector> Foam2Eigen::Eigen2field(
395
538
396
539
for (auto i = 0 ; i < sizeBC ; i ++ )
397
540
{
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
+ }
401
577
}
402
578
403
579
return field ;
@@ -444,6 +620,10 @@ template Eigen::MatrixXd
444
620
Foam2Eigen ::PtrList2Eigen < vector , fvPatchField , volMesh > (PtrList < volVectorField > &
445
621
fields ,
446
622
label Nfields );
623
+ template Eigen ::MatrixXd
624
+ Foam2Eigen ::PtrList2Eigen < tensor , fvPatchField , volMesh > (PtrList < volTensorField > &
625
+ fields ,
626
+ label Nfields );
447
627
448
628
template < >
449
629
void Foam2Eigen ::fvMatrix2Eigen (fvMatrix < scalar > foam_matrix ,
@@ -1029,9 +1209,10 @@ Eigen::MatrixXd Foam2Eigen::field2Eigen(const List<vector>& field)
1029
1209
1030
1210
for (label l = 0 ; l < field .size (); l ++ )
1031
1211
{
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
+ }
1035
1216
}
1036
1217
1037
1218
return out ;
0 commit comments