42 volScalarField& field)
44 Eigen::MatrixXd out = Eigen::Map<Eigen::MatrixXd>(
const_cast<double*
>(&
45 (field[0])), field.size(), 1);
51 volVectorField& field)
53 Eigen::MatrixXd out = Eigen::Map<Eigen::MatrixXd>(&field.ref()[0][0],
60 volTensorField& field)
62 Eigen::MatrixXd out = Eigen::Map<Eigen::MatrixXd>(&field.ref()[0][0],
69 pointVectorField& field)
71 Eigen::MatrixXd out = Eigen::Map<Eigen::MatrixXd>(&field.ref()[0][0],
78 surfaceScalarField& field)
80 Eigen::MatrixXd out = Eigen::Map<Eigen::MatrixXd>(&field.ref()[0], field.size(),
86 volScalarField& field);
89 volTensorField& field);
92 volVectorField& field);
95 pointVectorField& field);
98 surfaceScalarField& field);
102 volScalarField& field)
104 Eigen::Map<Eigen::MatrixXd> output(field.ref().data(), field.size(), 1);
105 return std::move(output);
110 volVectorField& field)
112 Eigen::Map<Eigen::MatrixXd> output(&field.ref()[0][0], field.size() * 3, 1);
113 return std::move(output);
118 volTensorField& field)
120 Eigen::Map<Eigen::MatrixXd> output(&field.ref()[0][0], field.size() * 9, 1);
121 return std::move(output);
126 volScalarField& field,
int BC_index)
128 Eigen::Map<Eigen::MatrixXd> output(field.boundaryFieldRef()[BC_index].data(),
129 field.boundaryField()[BC_index].size(), 1);
130 return std::move(output);
135 volVectorField& field,
int BC_index)
137 Eigen::Map<Eigen::MatrixXd> output(field.boundaryFieldRef()[BC_index][0].data(),
138 field.boundaryField()[BC_index].size() * 3, 1);
139 return std::move(output);
144 volScalarField& field);
147 volVectorField& field);
150 volTensorField& field);
153 volScalarField& field,
int BC_index);
156 volVectorField& field,
int BC_index);
161 Eigen::VectorXd out = Eigen::Map<Eigen::MatrixXd>(
const_cast<double*
>(&
170 Eigen::VectorXd out = Eigen::Map<Eigen::MatrixXd>(
const_cast<double*
>(&
172 field.size() * 3, 1);
179 Eigen::VectorXd out = Eigen::Map<Eigen::MatrixXd>(
const_cast<double*
>(&
181 field.size() * 9, 1);
187 DimensionedField<scalar, Foam::volMesh>& field)
189 Eigen::VectorXd out = Eigen::Map<Eigen::MatrixXd>(
const_cast<double*
>(&
195template <
template <
class>
class PatchField,
class GeoMesh>
197 GeometricField<tensor, PatchField, GeoMesh>& field)
199 List<Eigen::VectorXd> Out;
200 label size = field.boundaryField().size();
203 for (label i = 0; i < size; i++)
205 Out[i] = Eigen::Map<Eigen::VectorXd>(
const_cast<double*
>(&
206 (field.boundaryField()[i][0][0])),
207 field.boundaryField()[i].size() * 9);
214 volTensorField& field);
216template <
template <
class>
class PatchField,
class GeoMesh>
218 GeometricField<vector, PatchField, GeoMesh>& field)
220 List<Eigen::VectorXd> Out;
221 label size = field.boundaryField().size();
223 constexpr bool check_vol = std::is_same<volMesh, GeoMesh>::value
224 || std::is_same<surfaceMesh, GeoMesh>::value;
226 if constexpr(check_vol)
228 for (label i = 0; i < size; i++ )
230 Out[i] = Eigen::Map<Eigen::VectorXd>(
const_cast<double*
>(&
231 (field.boundaryField()[i][0][0])),
232 field.boundaryField()[i].size() * 3);
235 else if constexpr(std::is_same<pointMesh, GeoMesh>::value)
237 for (label i = 0; i < size;
240 Out[i] = Eigen::Map<Eigen::VectorXd>(
const_cast<double*
>(&
241 (field.boundaryField()[i].patchInternalField()()[0][0])),
242 field.boundaryField()[i].patchInternalField()().size() * 3);
250 volVectorField& field);
252template <
template <
class>
class PatchField,
class GeoMesh>
254 GeometricField<scalar, PatchField, GeoMesh>& field)
256 List<Eigen::VectorXd> Out;
257 label size = field.boundaryField().size();
260 for (label i = 0; i < size; i++)
262 Out[i] = Eigen::Map<Eigen::VectorXd>(
const_cast<double*
>(&
263 (field.boundaryField()[i][0])), field.boundaryField()[i].size());
270 volScalarField& field);
272template <
template <
class>
class PatchField,
class GeoMesh>
274 PtrList<GeometricField<scalar, PatchField, GeoMesh >>&
279 M_Assert(Nfields <= fields.size(),
280 "The Number of requested fields cannot be bigger than the number of requested entries.");
291 List<Eigen::MatrixXd> Out;
292 label NBound = fields[0].boundaryField().size();
295 for (label i = 0; i < NBound; i++)
297 label sizei = fields[0].boundaryField()[i].size();
298 Out[i].resize(sizei, Nf);
301 for (label k = 0; k < Nf; k++)
303 List<Eigen::VectorXd> temp;
306 for (label i = 0; i < NBound; i++)
308 Out[i].col(k) = temp[i];
316 PtrList<volScalarField>& fields, label Nfields);
318 PtrList<surfaceScalarField>& fields, label Nfields);
321template <
template <
class>
class PatchField,
class GeoMesh>
323 PtrList<GeometricField<vector, PatchField, GeoMesh >>&
328 M_Assert(Nfields <= fields.size(),
329 "The Number of requested fields cannot be bigger than the number of requested entries.");
340 List<Eigen::MatrixXd> Out;
341 label NBound = fields[0].boundaryField().size();
344 for (label i = 0; i < NBound; i++)
346 label sizei = fields[0].boundaryField()[i].size();
347 Out[i].resize(sizei * 3, Nf);
350 for (label k = 0; k < Nf; k++)
352 List<Eigen::VectorXd> temp;
355 for (label i = 0; i < NBound; i++)
357 Out[i].col(k) = temp[i];
365 PtrList<volVectorField>& fields, label Nfields);
368 PtrList<pointVectorField>& fields, label Nfields);
370template <
template <
class>
class PatchField,
class GeoMesh>
372 PtrList<GeometricField<tensor, PatchField, GeoMesh >>&
377 M_Assert(Nfields <= fields.size(),
378 "The Number of requested fields cannot be bigger than the number of requested entries.");
389 List<Eigen::MatrixXd> Out;
390 label NBound = fields[0].boundaryField().size();
393 for (label i = 0; i < NBound; i++)
395 label sizei = fields[0].boundaryField()[i].size();
396 Out[i].resize(sizei * 9, Nf);
399 for (label k = 0; k < Nf; k++)
401 List<Eigen::VectorXd> temp;
404 for (label i = 0; i < NBound; i++)
406 Out[i].col(k) = temp[i];
414 PtrList<volTensorField>& fields, label Nfields);
416template <
template <
class>
class PatchField,
class GeoMesh>
418 GeometricField<tensor, PatchField, GeoMesh>& field_in,
419 Eigen::VectorXd& eigen_vector,
bool correctBC)
421 GeometricField<tensor, PatchField, GeoMesh> field_out(field_in);
423 for (
auto i = 0; i < field_out.size(); i++)
425 for (label j = 0; j < 9; j++)
427 field_out.ref()[i][j] = eigen_vector(i * 9 + j);
433 field_out.correctBoundaryConditions();
440 volTensorField& field_in, Eigen::VectorXd& eigen_vector,
bool correctBC);
442template <
template <
class>
class PatchField,
class GeoMesh>
444 GeometricField<vector, PatchField, GeoMesh>& field_in,
445 Eigen::VectorXd& eigen_vector, List<Eigen::VectorXd>& eigen_vector_boundary)
447 GeometricField<vector, PatchField, GeoMesh> field_out(field_in);
449 for (
auto i = 0; i < field_out.size(); i++)
451 for (label j = 0; j < 3; j++)
453 field_out.ref()[i][j] = eigen_vector(i * 3 + j);
457 for (
unsigned int id = 0;
id < field_out.boundaryField().size();
id++)
459 unsigned int idBSize = field_out.boundaryField()[id].size();
461 for (
unsigned int ith_bcell = 0; ith_bcell < idBSize; ith_bcell++)
471 volVectorField& field_in, Eigen::VectorXd& eigen_vector,
472 List<Eigen::VectorXd>& eigen_vector_boundary);
474template<
template<
class>
class PatchField,
class GeoMesh>
476 GeometricField<scalar, PatchField, GeoMesh>& field_in,
477 Eigen::VectorXd& eigen_vector, List<Eigen::VectorXd>& eigen_vector_boundary)
479 GeometricField<scalar, PatchField, GeoMesh> field_out(field_in);
481 for (
auto i = 0; i < field_out.size(); i++)
483 field_out.ref()[i] = eigen_vector(i);
486 for (
unsigned int id = 0;
id < field_out.boundaryField().size();
id++)
488 for (
unsigned int ith_bcell = 0;
489 ith_bcell < field_out.boundaryField()[
id].size(); ith_bcell++)
499 volScalarField& field_in, Eigen::VectorXd& eigen_vector,
500 List<Eigen::VectorXd>& eigen_vector_boundary);
504template<
template<
class>
class PatchField,
class GeoMesh>
506 GeometricField<vector, PatchField, GeoMesh>& field_in,
507 Eigen::VectorXd& eigen_vector,
bool correctBC)
509 GeometricField<vector, PatchField, GeoMesh> field_out(field_in);
511 for (
auto i = 0; i < field_out.size(); i++)
513 for (label j = 0; j < 3; j++)
515 field_out.ref()[i][j] = eigen_vector(i * 3 + j);
521 field_out.correctBoundaryConditions();
528 volVectorField& field_in, Eigen::VectorXd& eigen_vector,
bool correctBC);
530 pointVectorField& field_in, Eigen::VectorXd& eigen_vector,
bool correctBC);
532template <
template <
class>
class PatchField,
class GeoMesh>
534 GeometricField<scalar, PatchField, GeoMesh>& field_in,
535 Eigen::VectorXd& eigen_vector,
bool correctBC)
537 GeometricField<scalar, PatchField, GeoMesh> field_out(field_in);
539 for (
auto i = 0; i < field_out.size(); i++)
541 field_out.ref()[i] = eigen_vector(i);
548 surfaceScalarField& field_in,
549 Eigen::VectorXd& eigen_vector,
554 volScalarField& field_in, Eigen::VectorXd& eigen_vector,
bool correctBC)
556 GeometricField<scalar, fvPatchField, volMesh> field_out(field_in);
558 for (
auto i = 0; i < field_out.size(); i++)
560 field_out.ref()[i] = eigen_vector(i);
565 field_out.correctBoundaryConditions();
573 Field<scalar>& field, Eigen::MatrixXd& matrix,
bool correctBC)
575 label sizeBC = field.size();
576 M_Assert(matrix.cols() == 1,
577 "The number of columns of the Input members is not correct, it should be 1");
579 if (matrix.rows() == 1)
581 Eigen::MatrixXd new_matrix = matrix.replicate(sizeBC, 1);
582 matrix.conservativeResize(sizeBC, 1);
586 std::string message =
"The input Eigen::MatrixXd has size " + name(
588 ". It should have the same size of the Field, i.e. " +
590 M_Assert(matrix.rows() == sizeBC, message.c_str());
592 for (
auto i = 0; i < sizeBC; i++)
594 field[i] = matrix(i, 0);
602 Field<vector>& field, Eigen::MatrixXd& matrix,
bool correctBC)
604 label sizeBC = field.size();
605 M_Assert(matrix.cols() == 1,
606 "The number of columns of the Input members is not correct, it should be 1");
608 if (matrix.rows() == 1)
610 Eigen::MatrixXd new_matrix = matrix.replicate(sizeBC, 1);
611 matrix.conservativeResize(sizeBC, 3);
615 std::string message =
"The input Eigen::MatrixXd has size " + name(
617 ". It should have the same size of the Field, i.e. " +
619 M_Assert(matrix.rows() == sizeBC, message.c_str());
621 for (
auto i = 0; i < sizeBC; i++)
623 for (label j = 0; j < 3; j++)
625 field[i][j] = matrix(i, j);
634 Field<tensor>& field, Eigen::MatrixXd& matrix,
bool correctBC)
636 label sizeBC = field.size();
637 M_Assert(matrix.cols() == 1,
638 "The number of columns of the Input members is not correct, it should be 1");
640 if (matrix.rows() == 1)
642 Eigen::MatrixXd new_matrix = matrix.replicate(sizeBC, 1);
643 matrix.conservativeResize(sizeBC, 9);
647 std::string message =
"The input Eigen::MatrixXd has size " + name(
649 ". It should have the same size of the Field, i.e. " +
651 M_Assert(matrix.rows() == sizeBC, message.c_str());
653 for (
auto i = 0; i < sizeBC; i++)
655 for (label j = 0; j < 9; j++)
657 field[i][j] = matrix(i, j);
664template <
class Type,
template <
class>
class PatchField,
class GeoMesh>
666 PtrList<GeometricField<Type, PatchField, GeoMesh >>& fields,
670 M_Assert(Nfields <= fields.size(),
671 "The Number of requested fields cannot be bigger than the number of requested entries.");
684 out.resize(nrows, Nf);
686 for (label k = 0; k < Nf; k++)
694template Eigen::MatrixXd
696(PtrList<volScalarField>&
702template Eigen::MatrixXd
706template Eigen::MatrixXd
708(PtrList<pointVectorField>&
709 fields, label Nfields);
711template Eigen::MatrixXd
713(PtrList<volTensorField>&
723 label sizeA = foam_matrix.diag().size();
724 A.setZero(sizeA, sizeA);
727 for (
auto i = 0; i < sizeA; i++)
729 A(i, i) = foam_matrix.diag()[i];
730 b(i, 0) = foam_matrix.source()[i];
733 const lduAddressing& addr = foam_matrix.lduAddr();
734 const labelList& lowerAddr = addr.lowerAddr();
735 const labelList& upperAddr = addr.upperAddr();
738 A(lowerAddr[i], upperAddr[i]) = foam_matrix.upper()[i];
739 A(upperAddr[i], lowerAddr[i]) = foam_matrix.lower()[i];
741 forAll(foam_matrix.psi().boundaryField(), I)
743 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
746 label w = ptch.faceCells()[J];
747 const double intern = foam_matrix.internalCoeffs()[I][J];
749 b(w, 0) += foam_matrix.boundaryCoeffs()[I][J];
759 label sizeA = foam_matrix.diag().size();
760 A.resize(sizeA * 3, sizeA * 3);
763 for (
auto i = 0; i < sizeA; i++)
765 A(i, i) = foam_matrix.diag()[i];
766 A(sizeA + i, sizeA + i) = foam_matrix.diag()[i];
767 A(2 * sizeA + i, 2 * sizeA + i) = foam_matrix.diag()[i];
768 b(i) = foam_matrix.source()[i][0];
769 b(sizeA + i) = foam_matrix.source()[i][1];
770 b(2 * sizeA + i) = foam_matrix.source()[i][2];
773 const lduAddressing& addr = foam_matrix.lduAddr();
774 const labelList& lowerAddr = addr.lowerAddr();
775 const labelList& upperAddr = addr.upperAddr();
778 A(lowerAddr[i], upperAddr[i]) = foam_matrix.upper()[i];
779 A(lowerAddr[i] + sizeA, upperAddr[i] + sizeA) = foam_matrix.upper()[i];
780 A(lowerAddr[i] + sizeA * 2, upperAddr[i] + sizeA * 2) = foam_matrix.upper()[i];
781 A(upperAddr[i], lowerAddr[i]) = foam_matrix.lower()[i];
782 A(upperAddr[i] + sizeA, lowerAddr[i] + sizeA) = foam_matrix.lower()[i];
783 A(upperAddr[i] + sizeA * 2, lowerAddr[i] + sizeA * 2) = foam_matrix.lower()[i];
785 forAll(foam_matrix.psi().boundaryField(), I)
787 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
790 label w = ptch.faceCells()[J];
791 A(w, w) += foam_matrix.internalCoeffs()[I][J][0];
792 A(w + sizeA, w + sizeA) += foam_matrix.internalCoeffs()[I][J][1];
793 A(w + sizeA * 2, w + sizeA * 2) += foam_matrix.internalCoeffs()[I][J][2];
794 b(w) += foam_matrix.boundaryCoeffs()[I][J][0];
795 b(w + sizeA) += foam_matrix.boundaryCoeffs()[I][J][1];
796 b(w + sizeA * 2) += foam_matrix.boundaryCoeffs()[I][J][2];
802template <
typename SparseMatType,
typename VecType>
803void Foam2Eigen::fvMat2Eigen(fvMatrix<scalar> foam_matrix,
808 label sizeA = foam_matrix.diag().size();
809 label nel = foam_matrix.diag().size() + foam_matrix.upper().size() +
810 foam_matrix.lower().size();
811 A.resize(sizeA, sizeA);
814 typedef Eigen::Triplet<double> Trip;
815 std::vector<Trip> tripletList;
816 tripletList.reserve(nel);
818 for (label i = 0; i < sizeA; ++i)
820 tripletList.emplace_back(i, i, foam_matrix.diag()[i]);
821 b(i) = foam_matrix.source()[i];
824 const lduAddressing& addr = foam_matrix.lduAddr();
825 const labelList& lowerAddr = addr.lowerAddr();
826 const labelList& upperAddr = addr.upperAddr();
829 tripletList.emplace_back(lowerAddr[i], upperAddr[i], foam_matrix.upper()[i]);
830 tripletList.emplace_back(upperAddr[i], lowerAddr[i], foam_matrix.lower()[i]);
832 forAll(foam_matrix.psi().boundaryField(), I)
834 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
837 label w = ptch.faceCells()[J];
838 tripletList.emplace_back(w, w, foam_matrix.internalCoeffs()[I][J]);
839 b(w) += foam_matrix.boundaryCoeffs()[I][J];
842 A.setFromTriplets(tripletList.begin(), tripletList.end());
847Foam2Eigen::fvMat2Eigen<Eigen::SparseMatrix<double, Eigen::RowMajor>, Eigen::VectorXd>
849 fvMatrix<scalar> foam_matrix,
850 Eigen::SparseMatrix<double, Eigen::RowMajor>& A,
853Foam2Eigen::fvMat2Eigen<Eigen::SparseMatrix<double, Eigen::ColMajor>, Eigen::VectorXd>
855 fvMatrix<scalar> foam_matrix,
856 Eigen::SparseMatrix<double, Eigen::ColMajor>& A,
860template<
typename SparseMatType,
typename VecType>
861void Foam2Eigen::fvMat2Eigen(fvMatrix<vector> foam_matrix,
865 label sizeA = foam_matrix.diag().size();
866 label nel = foam_matrix.diag().size() + foam_matrix.upper().size() +
867 foam_matrix.lower().size();
868 A.resize(sizeA * 3, sizeA * 3);
871 typedef Eigen::Triplet<double> Trip;
872 std::vector<Trip> tripletList;
873 tripletList.reserve(nel * 3);
875 for (
auto i = 0; i < sizeA; i++)
877 tripletList.push_back(Trip(i, i, foam_matrix.diag()[i]));
878 tripletList.push_back(Trip(sizeA + i, sizeA + i, foam_matrix.diag()[i]));
879 tripletList.push_back(Trip(2 * sizeA + i, 2 * sizeA + i,
880 foam_matrix.diag()[i]));
881 b(i) = foam_matrix.source()[i][0];
882 b(sizeA + i) = foam_matrix.source()[i][1];
883 b(2 * sizeA + i) = foam_matrix.source()[i][2];
886 const lduAddressing& addr = foam_matrix.lduAddr();
887 const labelList& lowerAddr = addr.lowerAddr();
888 const labelList& upperAddr = addr.upperAddr();
891 tripletList.push_back(Trip(lowerAddr[i], upperAddr[i], foam_matrix.upper()[i]));
892 tripletList.push_back(Trip(lowerAddr[i] + sizeA, upperAddr[i] + sizeA,
893 foam_matrix.upper()[i]));
894 tripletList.push_back(Trip(lowerAddr[i] + sizeA * 2, upperAddr[i] + sizeA * 2,
895 foam_matrix.upper()[i]));
896 tripletList.push_back(Trip(upperAddr[i], lowerAddr[i], foam_matrix.lower()[i]));
897 tripletList.push_back(Trip(upperAddr[i] + sizeA, lowerAddr[i] + sizeA,
898 foam_matrix.lower()[i]));
899 tripletList.push_back(Trip(upperAddr[i] + sizeA * 2, lowerAddr[i] + sizeA * 2,
900 foam_matrix.lower()[i]));
902 forAll(foam_matrix.psi().boundaryField(), I)
904 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
907 label w = ptch.faceCells()[J];
908 tripletList.push_back(Trip(w, w, foam_matrix.internalCoeffs()[I][J][0]));
909 tripletList.push_back(Trip(w + sizeA, w + sizeA,
910 foam_matrix.internalCoeffs()[I][J][1]));
911 tripletList.push_back(Trip(w + sizeA * 2, w + sizeA * 2,
912 foam_matrix.internalCoeffs()[I][J][2]));
913 b(w) += foam_matrix.boundaryCoeffs()[I][J][0];
914 b(w + sizeA) += foam_matrix.boundaryCoeffs()[I][J][1];
915 b(w + sizeA * 2) += foam_matrix.boundaryCoeffs()[I][J][2];
918 A.setFromTriplets(tripletList.begin(), tripletList.end());
922Foam2Eigen::fvMat2Eigen<Eigen::SparseMatrix<double, Eigen::RowMajor>, Eigen::VectorXd>
924 fvMatrix<vector> foam_matrix,
925 Eigen::SparseMatrix<double, Eigen::RowMajor>& A,
929Foam2Eigen::fvMat2Eigen<Eigen::SparseMatrix<double, Eigen::ColMajor>, Eigen::VectorXd>
931 fvMatrix<vector> foam_matrix,
932 Eigen::SparseMatrix<double, Eigen::ColMajor>& A,
938 Eigen::SparseMatrix<double>& A, Eigen::VectorXd& b)
940 label sizeA = foam_matrix.diag().size();
941 label nel = foam_matrix.diag().size() + foam_matrix.upper().size() +
942 foam_matrix.lower().size();
943 A.resize(sizeA, sizeA);
946 typedef Eigen::Triplet<double> Trip;
947 std::vector<Trip> tripletList;
948 tripletList.reserve(nel);
950 for (
auto i = 0; i < sizeA; i++)
952 tripletList.push_back(Trip(i, i, foam_matrix.diag()[i]));
953 b(i, 0) = foam_matrix.source()[i];
956 const lduAddressing& addr = foam_matrix.lduAddr();
957 const labelList& lowerAddr = addr.lowerAddr();
958 const labelList& upperAddr = addr.upperAddr();
961 tripletList.push_back(Trip(lowerAddr[i], upperAddr[i], foam_matrix.upper()[i]));
962 tripletList.push_back(Trip(upperAddr[i], lowerAddr[i], foam_matrix.lower()[i]));
964 forAll(foam_matrix.psi().boundaryField(), I)
966 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
969 label w = ptch.faceCells()[J];
970 tripletList.push_back(Trip(w, w, foam_matrix.internalCoeffs()[I][J]));
971 b(w, 0) += foam_matrix.boundaryCoeffs()[I][J];
974 A.setFromTriplets(tripletList.begin(), tripletList.end());
979 Eigen::SparseMatrix<double>& A, Eigen::VectorXd& b)
981 label sizeA = foam_matrix.diag().size();
982 label nel = foam_matrix.diag().size() + foam_matrix.upper().size() +
983 foam_matrix.lower().size();
984 A.resize(sizeA * 3, sizeA * 3);
987 typedef Eigen::Triplet<double> Trip;
988 std::vector<Trip> tripletList;
989 tripletList.reserve(nel * 3);
991 for (
auto i = 0; i < sizeA; i++)
993 tripletList.push_back(Trip(i, i, foam_matrix.diag()[i]));
994 tripletList.push_back(Trip(sizeA + i, sizeA + i, foam_matrix.diag()[i]));
995 tripletList.push_back(Trip(2 * sizeA + i, 2 * sizeA + i,
996 foam_matrix.diag()[i]));
997 b(i) = foam_matrix.source()[i][0];
998 b(sizeA + i) = foam_matrix.source()[i][1];
999 b(2 * sizeA + i) = foam_matrix.source()[i][2];
1002 const lduAddressing& addr = foam_matrix.lduAddr();
1003 const labelList& lowerAddr = addr.lowerAddr();
1004 const labelList& upperAddr = addr.upperAddr();
1005 forAll(lowerAddr, i)
1007 tripletList.push_back(Trip(lowerAddr[i], upperAddr[i], foam_matrix.upper()[i]));
1008 tripletList.push_back(Trip(lowerAddr[i] + sizeA, upperAddr[i] + sizeA,
1009 foam_matrix.upper()[i]));
1010 tripletList.push_back(Trip(lowerAddr[i] + sizeA * 2, upperAddr[i] + sizeA * 2,
1011 foam_matrix.upper()[i]));
1012 tripletList.push_back(Trip(upperAddr[i], lowerAddr[i], foam_matrix.lower()[i]));
1013 tripletList.push_back(Trip(upperAddr[i] + sizeA, lowerAddr[i] + sizeA,
1014 foam_matrix.lower()[i]));
1015 tripletList.push_back(Trip(upperAddr[i] + sizeA * 2, lowerAddr[i] + sizeA * 2,
1016 foam_matrix.lower()[i]));
1018 forAll(foam_matrix.psi().boundaryField(), I)
1020 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
1023 label w = ptch.faceCells()[J];
1024 tripletList.push_back(Trip(w, w, foam_matrix.internalCoeffs()[I][J][0]));
1025 tripletList.push_back(Trip(w + sizeA, w + sizeA,
1026 foam_matrix.internalCoeffs()[I][J][1]));
1027 tripletList.push_back(Trip(w + sizeA * 2, w + sizeA * 2,
1028 foam_matrix.internalCoeffs()[I][J][2]));
1029 b(w) += foam_matrix.boundaryCoeffs()[I][J][0];
1030 b(w + sizeA) += foam_matrix.boundaryCoeffs()[I][J][1];
1031 b(w + sizeA * 2) += foam_matrix.boundaryCoeffs()[I][J][2];
1034 A.setFromTriplets(tripletList.begin(), tripletList.end());
1041 label sizeA = foam_matrix.diag().size();
1042 A.setZero(sizeA, sizeA);
1044 for (
auto i = 0; i < sizeA; i++)
1046 A(i, i) = foam_matrix.diag()[i];
1049 const lduAddressing& addr = foam_matrix.lduAddr();
1050 const labelList& lowerAddr = addr.lowerAddr();
1051 const labelList& upperAddr = addr.upperAddr();
1052 forAll(lowerAddr, i)
1054 A(lowerAddr[i], upperAddr[i]) = foam_matrix.upper()[i];
1055 A(upperAddr[i], lowerAddr[i]) = foam_matrix.lower()[i];
1057 forAll(foam_matrix.psi().boundaryField(), I)
1059 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
1062 label w = ptch.faceCells()[J];
1063 A(w, w) += foam_matrix.internalCoeffs()[I][J];
1070 Eigen::SparseMatrix<double>& A)
1072 label sizeA = foam_matrix.diag().size();
1073 label nel = foam_matrix.diag().size() + foam_matrix.upper().size() +
1074 foam_matrix.lower().size();
1075 A.resize(sizeA, sizeA);
1077 typedef Eigen::Triplet<double> Trip;
1078 std::vector<Trip> tripletList;
1079 tripletList.reserve(nel);
1081 for (
auto i = 0; i < sizeA; i++)
1083 tripletList.push_back(Trip(i, i, foam_matrix.diag()[i]));
1086 const lduAddressing& addr = foam_matrix.lduAddr();
1087 const labelList& lowerAddr = addr.lowerAddr();
1088 const labelList& upperAddr = addr.upperAddr();
1089 forAll(lowerAddr, i)
1091 tripletList.push_back(Trip(lowerAddr[i], upperAddr[i], foam_matrix.upper()[i]));
1092 tripletList.push_back(Trip(upperAddr[i], lowerAddr[i], foam_matrix.lower()[i]));
1094 forAll(foam_matrix.psi().boundaryField(), I)
1096 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
1099 label w = ptch.faceCells()[J];
1100 tripletList.push_back(Trip(w, w, foam_matrix.internalCoeffs()[I][J]));
1103 A.setFromTriplets(tripletList.begin(), tripletList.end());
1110 label sizeA = foam_matrix.diag().size();
1111 A.resize(sizeA * 3, sizeA * 3);
1113 for (
auto i = 0; i < sizeA; i++)
1115 A(i, i) = foam_matrix.diag()[i];
1116 A(sizeA + i, sizeA + i) = foam_matrix.diag()[i];
1117 A(2 * sizeA + i, 2 * sizeA + i) = foam_matrix.diag()[i];
1120 const lduAddressing& addr = foam_matrix.lduAddr();
1121 const labelList& lowerAddr = addr.lowerAddr();
1122 const labelList& upperAddr = addr.upperAddr();
1123 forAll(lowerAddr, i)
1125 A(lowerAddr[i], upperAddr[i]) = foam_matrix.upper()[i];
1126 A(lowerAddr[i] + sizeA, upperAddr[i] + sizeA) = foam_matrix.upper()[i];
1127 A(lowerAddr[i] + sizeA * 2, upperAddr[i] + sizeA * 2) = foam_matrix.upper()[i];
1128 A(upperAddr[i], lowerAddr[i]) = foam_matrix.lower()[i];
1129 A(upperAddr[i] + sizeA, lowerAddr[i] + sizeA) = foam_matrix.lower()[i];
1130 A(upperAddr[i] + sizeA * 2, lowerAddr[i] + sizeA * 2) = foam_matrix.lower()[i];
1132 forAll(foam_matrix.psi().boundaryField(), I)
1134 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
1137 label w = ptch.faceCells()[J];
1138 A(w, w) += foam_matrix.internalCoeffs()[I][J][0];
1139 A(w + sizeA, w + sizeA) += foam_matrix.internalCoeffs()[I][J][1];
1140 A(w + sizeA * 2, w + sizeA * 2) += foam_matrix.internalCoeffs()[I][J][2];
1148 Eigen::SparseMatrix<double>& A)
1150 label sizeA = foam_matrix.diag().size();
1151 label nel = foam_matrix.diag().size() + foam_matrix.upper().size() +
1152 foam_matrix.lower().size();
1153 A.resize(sizeA * 3, sizeA * 3);
1155 typedef Eigen::Triplet<double> Trip;
1156 std::vector<Trip> tripletList;
1157 tripletList.reserve(nel * 3);
1159 for (
auto i = 0; i < sizeA; i++)
1161 tripletList.push_back(Trip(i, i, foam_matrix.diag()[i]));
1162 tripletList.push_back(Trip(sizeA + i, sizeA + i, foam_matrix.diag()[i]));
1163 tripletList.push_back(Trip(2 * sizeA + i, 2 * sizeA + i,
1164 foam_matrix.diag()[i]));
1167 const lduAddressing& addr = foam_matrix.lduAddr();
1168 const labelList& lowerAddr = addr.lowerAddr();
1169 const labelList& upperAddr = addr.upperAddr();
1170 forAll(lowerAddr, i)
1172 tripletList.push_back(Trip(lowerAddr[i], upperAddr[i], foam_matrix.upper()[i]));
1173 tripletList.push_back(Trip(lowerAddr[i] + sizeA, upperAddr[i] + sizeA,
1174 foam_matrix.upper()[i]));
1175 tripletList.push_back(Trip(lowerAddr[i] + sizeA * 2, upperAddr[i] + sizeA * 2,
1176 foam_matrix.upper()[i]));
1177 tripletList.push_back(Trip(upperAddr[i], lowerAddr[i], foam_matrix.lower()[i]));
1178 tripletList.push_back(Trip(upperAddr[i] + sizeA, lowerAddr[i] + sizeA,
1179 foam_matrix.lower()[i]));
1180 tripletList.push_back(Trip(upperAddr[i] + sizeA * 2, lowerAddr[i] + sizeA * 2,
1181 foam_matrix.lower()[i]));
1183 forAll(foam_matrix.psi().boundaryField(), I)
1185 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
1188 label w = ptch.faceCells()[J];
1189 tripletList.push_back(Trip(w, w, foam_matrix.internalCoeffs()[I][J][0]));
1190 tripletList.push_back(Trip(w + sizeA, w + sizeA,
1191 foam_matrix.internalCoeffs()[I][J][1]));
1192 tripletList.push_back(Trip(w + sizeA * 2, w + sizeA * 2,
1193 foam_matrix.internalCoeffs()[I][J][2]));
1196 A.setFromTriplets(tripletList.begin(), tripletList.end());
1203 label sizeA = foam_matrix.diag().size();
1206 for (
auto i = 0; i < sizeA; i++)
1208 b(i, 0) = foam_matrix.source()[i];
1211 forAll(foam_matrix.psi().boundaryField(), I)
1213 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
1216 label w = ptch.faceCells()[J];
1217 b(w, 0) += foam_matrix.boundaryCoeffs()[I][J];
1226 label sizeA = foam_matrix.diag().size();
1227 b.resize(sizeA * 3);
1229 for (
auto i = 0; i < sizeA; i++)
1231 b(i) = foam_matrix.source()[i][0];
1232 b(sizeA + i) = foam_matrix.source()[i][1];
1233 b(2 * sizeA + i) = foam_matrix.source()[i][2];
1236 forAll(foam_matrix.psi().boundaryField(), I)
1238 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
1241 label w = ptch.faceCells()[J];
1242 b(w) += foam_matrix.boundaryCoeffs()[I][J][0];
1243 b(w + sizeA) += foam_matrix.boundaryCoeffs()[I][J][1];
1244 b(w + sizeA * 2) += foam_matrix.boundaryCoeffs()[I][J][2];
1249template <
class Type,
template <
class>
class PatchField,
class GeoMesh>
1251 GeometricField<Type, PatchField, GeoMesh>& field,
1252 PtrList<GeometricField<Type, PatchField, GeoMesh >>& modes,
1258 Eigen::VectorXd Volumes =
field2Eigen(modes[0].mesh());
1259 Eigen::MatrixXd VolumesN(Volumes.rows(), 1);
1262 if (Volumes.rows() != Eig_Modes.rows())
1264 VolumesN.resize(Eig_Modes.rows(), 1);
1265 VolumesN.col(0).segment(0, Volumes.rows()) = Volumes;
1266 VolumesN.col(0).segment(Volumes.rows() + 1, Volumes.rows() * 2) = Volumes;
1267 VolumesN.col(0).segment(Volumes.rows() * 2 + 1, Volumes.rows() * 3) = Volumes;
1270 fr = Eig_Modes.transpose() * (f.cwiseProduct(VolumesN));
1274template <
class Type,
template <
class>
class PatchField,
class GeoMesh >
1276 fvMatrix<Type>& matrix,
1277 PtrList<GeometricField<Type, PatchField, GeoMesh >>& modes, label Nmodes)
1279 Eigen::SparseMatrix<double> A;
1285 Eigen::VectorXd Volumes =
field2Eigen(modes[0].mesh());
1286 Eigen::MatrixXd VolumesN(Volumes.rows(), Nmodes);
1288 if (Volumes.rows() != Eig_Modes.rows())
1290 VolumesN.resize(Eig_Modes.rows(), Nmodes);
1293 if (Volumes.rows() == Eig_Modes.rows())
1295 for (
auto i = 0; i < Nmodes; i++)
1297 VolumesN.col(i) = Volumes;
1302 for (
auto i = 0; i < Nmodes; i++)
1304 VolumesN.col(i).segment(0, Volumes.rows()) = Volumes;
1305 VolumesN.col(i).segment(Volumes.rows() + 1, Volumes.rows() * 2) = Volumes;
1306 VolumesN.col(i).segment(Volumes.rows() * 2 + 1, Volumes.rows() * 3) = Volumes;
1310 Ar = Eig_Modes.transpose() * A * Eig_Modes;
1311 br = Eig_Modes.transpose() * b;
1312 std::tuple<Eigen::MatrixXd, Eigen::VectorXd> tupla;
1313 tupla = std::make_tuple(Ar, br);
1317template <
class Type,
template <
class>
class PatchField,
class GeoMesh>
1319 PtrList<GeometricField<Type, PatchField, GeoMesh >>& modes, label Nmodes)
1323 Eigen::VectorXd Volumes =
field2Eigen(modes[0].mesh());
1324 Eigen::MatrixXd VolumesN(Volumes.rows(), Nmodes);
1326 if (Volumes.rows() != Eig_Modes.rows())
1328 VolumesN.resize(Eig_Modes.rows(), Nmodes);
1331 if (Volumes.rows() == Eig_Modes.rows())
1333 for (
auto i = 0; i < Nmodes; i++)
1335 VolumesN.col(i) = Volumes;
1340 for (
auto i = 0; i < Nmodes; i++)
1342 VolumesN.col(i).segment(0, Volumes.rows()) = Volumes;
1343 VolumesN.col(i).segment(Volumes.rows() + 1, Volumes.rows() * 2) = Volumes;
1344 VolumesN.col(i).segment(Volumes.rows() * 2 + 1, Volumes.rows() * 3) = Volumes;
1348 Mr = Eig_Modes.transpose() * (Eig_Modes.cwiseProduct(VolumesN));
1352template <
class Type>
1353std::tuple<List<Eigen::SparseMatrix<double >>, List<Eigen::VectorXd >>
1356 List<Eigen::SparseMatrix<double >> SM_list;
1357 List<Eigen::VectorXd> V_list;
1358 label LSize = MatrixList.size();
1359 SM_list.resize(LSize);
1360 V_list.resize(LSize);
1361 Eigen::SparseMatrix<double> A;
1364 for (label j = 0; j < LSize; j++)
1371 std::tuple<List<Eigen::SparseMatrix<double >>, List<Eigen::VectorXd >> tupla;
1372 tupla = std::make_tuple(SM_list, V_list);
1376template std::tuple<List<Eigen::SparseMatrix<double >>, List<Eigen::VectorXd >>
1378template std::tuple<List<Eigen::SparseMatrix<double >>, List<Eigen::VectorXd >>
1381template <
class type_matrix>
1382Eigen::Matrix<type_matrix, Eigen::Dynamic, Eigen::Dynamic>
1385 Eigen::Matrix<type_matrix, Eigen::Dynamic, Eigen::Dynamic> matrix(list.size(),
1388 for (label i = 0; i < matrix.rows(); i++)
1390 matrix(i, 0) = list[i];
1396template Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic>
1398template Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
1401template <
class type_matrix>
1403 Eigen::Matrix<type_matrix, Eigen::Dynamic, Eigen::Dynamic> matrix)
1405 if (matrix.cols() == 1)
1407 List<type_matrix> list(matrix.rows());
1409 for (label i = 0; i < matrix.rows(); i++)
1411 list[i] = matrix(i, 0);
1418 Info <<
"Foam2Eigen::EigenMatrix2List only accepts matrices with 1 column, exiting"
1425 Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic> matrix);
1427 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix);
1432 Eigen::MatrixXd out;
1433 out.resize(label(field.size() * 3), 1);
1435 for (label l = 0; l < field.size(); l++)
1437 for (label j = 0; j < 3; j++)
1439 out(j + l * 3, 0) = field[l][j];
1449 Eigen::MatrixXd out;
1450 out.resize(label(field.size()), 1);
1452 for (label l = 0; l < field.size(); l++)
1454 out(l, 0) = field[l];
Header file of the Foam2Eigen class.
static GeometricField< scalar, PatchField, GeoMesh > Eigen2field(GeometricField< scalar, PatchField, GeoMesh > &field, Eigen::VectorXd &eigen_vector, bool correctBC=true)
Convert a vector in Eigen format into an OpenFOAM scalar GeometricField.
static List< Eigen::VectorXd > field2EigenBC(GeometricField< scalar, PatchField, GeoMesh > &field)
Convert an OpenFOAM scalar field to a List of Eigen Vectors, one for each boundary.
static std::tuple< List< Eigen::SparseMatrix< double > >, List< Eigen::VectorXd > > LFvMatrix2LSM(PtrList< fvMatrix< Type > > &MatrixList)
Convert a PtrList of OpenFOAM fvMatrix into a tuple of lists of Eigen Sparse Matrices and source vect...
static Eigen::Matrix< type_matrix, Eigen::Dynamic, Eigen::Dynamic > List2EigenMatrix(List< type_matrix > list)
Convert a Foam List into an Eigen matrix with one column.
static Eigen::VectorXd projectField(GeometricField< Type, PatchField, GeoMesh > &field, PtrList< GeometricField< Type, PatchField, GeoMesh > > &modes, label Nmodes)
Perform the projection of an OpenFOAM field onto a set of modes using the Eigen matrix multiplication...
static Eigen::MatrixXd MassMatrix(PtrList< GeometricField< Type, PatchField, GeoMesh > > &modes, label Nmodes)
Obtain the Mass Matrix from a list of reduced basis.
static List< type_matrix > EigenMatrix2List(Eigen::Matrix< type_matrix, Eigen::Dynamic, Eigen::Dynamic > matrix)
Convert an Eigen matrix with one column into a Foam List.
static Eigen::Map< Eigen::MatrixXd > field2EigenMapBC(GeometricField< Type, PatchField, GeoMesh > &field, int BC_index)
Map a scalar OpenFOAM field boundary into an Eigen Matrix.
static void fvMatrix2EigenV(fvMatrix< type_foam_matrix > &foam_matrix, type_B &b)
Convert a ldu OpenFOAM matrix into a source vector b.
static Eigen::MatrixXd field2Eigen(GeometricField< Type, PatchField, GeoMesh > &field)
Convert a vector OpenFOAM field into an Eigen Vector.
static List< Eigen::MatrixXd > PtrList2EigenBC(PtrList< GeometricField< scalar, PatchField, GeoMesh > > &fields, label Nfields=-1)
Convert an OpenFOAM scalar field to a List of Eigen Vectors, one for each boundary.
static Eigen::MatrixXd PtrList2Eigen(PtrList< GeometricField< Type, PatchField, GeoMesh > > &fields, label Nfields=-1)
Convert a PtrList of snapshots to Eigen matrix (only internal field).
static Eigen::Map< Eigen::MatrixXd > field2EigenMap(GeometricField< Type, PatchField, GeoMesh > &field)
Convert a scalar OpenFOAM field into an Eigen Vector.
static void fvMatrix2Eigen(fvMatrix< type_foam_matrix > foam_matrix, type_A &A, type_B &b)
Convert a FvMatrix OpenFOAM matrix (Linear System) into a Eigen Matrix A and a source vector b.
static std::tuple< Eigen::MatrixXd, Eigen::VectorXd > projectFvMatrix(fvMatrix< Type > &matrix, PtrList< GeometricField< Type, PatchField, GeoMesh > > &modes, label Nmodes)
Obtain the Mass Matrix from a list of reduced basis.
static void fvMatrix2EigenM(fvMatrix< type_foam_matrix > &foam_matrix, type_A &A)
Convert a ldu OpenFOAM matrix into a Eigen Matrix A.
void assignBC(GeometricField< scalar, fvPatchField, volMesh > &s, label BC_ind, double value)
Assign uniform Boundary Condition to a volScalarField.