39template <
template <
class>
class PatchField,
class GeoMesh>
41 GeometricField<tensor, PatchField, GeoMesh>& field)
44 out.resize(label(field.size() * 9));
46 for (label l = 0; l < field.size(); l++)
48 for (label j = 0; j < 9; j++)
50 out(j * field.size() + l) = field[l][j];
58 volTensorField& field);
60template <
template <
class>
class PatchField,
class GeoMesh>
62 GeometricField<vector, PatchField, GeoMesh>& field)
65 out.resize(label(field.size() * 3));
67 for (label l = 0; l < field.size(); l++)
69 for (label j = 0; j < 3; j++)
71 out(j * field.size() + l) = field[l][j];
79 volVectorField& field);
81template <
template <
class>
class PatchField,
class GeoMesh>
83 GeometricField<scalar, PatchField, GeoMesh>& field)
86 out.resize(label(field.size()));
88 for (label l = 0; l < field.size(); l++)
96template <
template <
class>
class PatchField,
class GeoMesh>
98 GeometricField<scalar, PatchField, GeoMesh>& field)
100 Eigen::Map<Eigen::MatrixXd> output(field.ref().data(), field.size(), 1);
101 return std::move(output);
105 volScalarField& field);
108 volScalarField& field);
110 surfaceScalarField& field);
116 out.resize(label(field.size()));
118 for (label l = 0; l < field.size(); l++)
130 out.resize(label(field.size() * 3));
132 for (label l = 0; l < field.size(); l++)
134 for (label j = 0; j < 3; j++)
136 out(j * field.size() + l) = field[l][j];
147 out.resize(label(field.size() * 9));
149 for (label l = 0; l < field.size(); l++)
151 for (label j = 0; j < 9; j++)
153 out(j * field.size() + l) = field[l][j];
162 DimensionedField<scalar, Foam::volMesh>& field)
165 out.resize(label(field.size()));
167 for (label l = 0; l < field.size(); l++)
175template <
template <
class>
class PatchField,
class GeoMesh>
177 GeometricField<tensor, PatchField, GeoMesh>& field)
179 List<Eigen::VectorXd> Out;
180 label size = field.boundaryField().size();
183 for (label
i = 0;
i < size;
i++)
185 label sizei = field.boundaryField()[
i].size();
186 Out[
i].resize(sizei * 9);
188 for (label k = 0; k < sizei; k++)
190 for (label j = 0; j < 9; j++)
192 Out[
i](k + j * sizei) = field.boundaryField()[
i][k][j];
201 volTensorField& field);
203template <
template <
class>
class PatchField,
class GeoMesh>
205 GeometricField<vector, PatchField, GeoMesh>& field)
207 List<Eigen::VectorXd> Out;
208 label size = field.boundaryField().size();
211 for (label
i = 0;
i < size;
i++)
213 label sizei = field.boundaryField()[
i].size();
214 Out[
i].resize(sizei * 3);
216 for (label k = 0; k < sizei; k++)
218 for (label j = 0; j < 3; j++)
220 Out[
i](k + j * sizei) = field.boundaryField()[
i][k][j];
229 volVectorField& field);
232template <
template <
class>
class PatchField,
class GeoMesh>
234 GeometricField<scalar, PatchField, GeoMesh>& field)
236 List<Eigen::VectorXd> Out;
237 label size = field.boundaryField().size();
240 for (label
i = 0;
i < size;
i++)
242 label sizei = field.boundaryField()[
i].size();
243 Out[
i].resize(sizei);
245 for (label k = 0; k < sizei; k++)
247 Out[
i](k) = field.boundaryField()[
i][k];
254 volScalarField& field);
256template <
template <
class>
class PatchField,
class GeoMesh>
258 PtrList<GeometricField<scalar, PatchField, GeoMesh>>&
264 "The Number of requested fields cannot be bigger than the number of requested entries.");
275 List<Eigen::MatrixXd> Out;
276 label NBound = fields[0].boundaryField().size();
279 for (label
i = 0;
i < NBound;
i++)
281 label sizei = fields[0].boundaryField()[
i].size();
282 Out[
i].resize(sizei, Nf);
285 for (label k = 0; k < Nf; k++)
287 List<Eigen::VectorXd> temp;
290 for (label
i = 0;
i < NBound;
i++)
292 Out[
i].col(k) = temp[
i];
300 PtrList<volScalarField>& fields, label Nfields);
302 PtrList<surfaceScalarField>& fields, label Nfields);
305template <
template <
class>
class PatchField,
class GeoMesh>
307 PtrList<GeometricField<vector, PatchField, GeoMesh>>&
313 "The Number of requested fields cannot be bigger than the number of requested entries.");
324 List<Eigen::MatrixXd> Out;
325 label NBound = fields[0].boundaryField().size();
328 for (label
i = 0;
i < NBound;
i++)
330 label sizei = fields[0].boundaryField()[
i].size();
331 Out[
i].resize(sizei * 3, Nf);
334 for (label k = 0; k < Nf; k++)
336 List<Eigen::VectorXd> temp;
339 for (label
i = 0;
i < NBound;
i++)
341 Out[
i].col(k) = temp[
i];
349 PtrList<volVectorField>& fields, label Nfields);
352template <
template <
class>
class PatchField,
class GeoMesh>
354 PtrList<GeometricField<tensor, PatchField, GeoMesh>>&
360 "The Number of requested fields cannot be bigger than the number of requested entries.");
371 List<Eigen::MatrixXd> Out;
372 label NBound = fields[0].boundaryField().size();
375 for (label
i = 0;
i < NBound;
i++)
377 label sizei = fields[0].boundaryField()[
i].size();
378 Out[
i].resize(sizei * 9, Nf);
381 for (label k = 0; k < Nf; k++)
383 List<Eigen::VectorXd> temp;
386 for (label
i = 0;
i < NBound;
i++)
388 Out[
i].col(k) = temp[
i];
396 PtrList<volTensorField>& fields, label Nfields);
398template <
template <
class>
class PatchField,
class GeoMesh>
400 GeometricField<tensor, PatchField, GeoMesh>& field_in,
401 Eigen::VectorXd& eigen_vector,
bool correctBC)
403 GeometricField<tensor, PatchField, GeoMesh> field_out(field_in);
405 for (
auto i = 0;
i < field_out.size();
i++)
407 for (label j = 0; j < 9; j++)
409 field_out.ref()[
i][j] = eigen_vector(
i + field_out.size() * j);
415 field_out.correctBoundaryConditions();
422 volTensorField& field_in, Eigen::VectorXd& eigen_vector,
bool correctBC);
424template <
template <
class>
class PatchField,
class GeoMesh>
426 GeometricField<vector, PatchField, GeoMesh>& field_in,
427 Eigen::VectorXd& eigen_vector, List<Eigen::VectorXd>& eigen_vector_boundary)
429 GeometricField<vector, PatchField, GeoMesh> field_out(field_in);
431 for (
auto i = 0;
i < field_out.size();
i++)
433 field_out.ref()[
i][0] = eigen_vector(
i);
434 field_out.ref()[
i][1] = eigen_vector(
i + field_out.size());
435 field_out.ref()[
i][2] = eigen_vector(
i + field_out.size() * 2);
438 for(
unsigned int id = 0;
id < field_out.boundaryField().size();
id++)
440 unsigned int idBSize = field_out.boundaryField()[id].size();
441 for (
unsigned int ith_bcell = 0; ith_bcell < idBSize; ith_bcell++)
451 volVectorField& field_in, Eigen::VectorXd& eigen_vector, List<Eigen::VectorXd>& eigen_vector_boundary);
453template<
template<
class>
class PatchField,
class GeoMesh>
455 GeometricField<scalar, PatchField, GeoMesh>& field_in,
456 Eigen::VectorXd& eigen_vector, List<Eigen::VectorXd>& eigen_vector_boundary)
458 GeometricField<scalar, PatchField, GeoMesh> field_out(field_in);
460 for (
auto i = 0;
i < field_out.size();
i++)
462 field_out.ref()[
i] = eigen_vector(
i);
465 for(
unsigned int id = 0;
id < field_out.boundaryField().size();
id++)
467 for (
unsigned int ith_bcell = 0; ith_bcell < field_out.boundaryField()[
id].size(); ith_bcell++)
477 volScalarField& field_in, Eigen::VectorXd& eigen_vector, List<Eigen::VectorXd>& eigen_vector_boundary);
479template<
template<
class>
class PatchField,
class GeoMesh>
481 GeometricField<vector, PatchField, GeoMesh>& field_in,
482 Eigen::VectorXd& eigen_vector,
bool correctBC)
484 GeometricField<vector, PatchField, GeoMesh> field_out(field_in);
486 for (
auto i = 0;
i < field_out.size();
i++)
488 for (label j = 0; j < 3; j++)
490 field_out.ref()[
i][j] = eigen_vector(
i + field_out.size() * j);
496 field_out.correctBoundaryConditions();
503 volVectorField& field_in, Eigen::VectorXd& eigen_vector,
bool correctBC);
505template <
template <
class>
class PatchField,
class GeoMesh>
507 GeometricField<scalar, PatchField, GeoMesh>& field_in,
508 Eigen::VectorXd& eigen_vector,
bool correctBC)
510 GeometricField<scalar, PatchField, GeoMesh> field_out(field_in);
512 for (
auto i = 0;
i < field_out.size();
i++)
514 field_out.ref()[
i] = eigen_vector(
i);
521 surfaceScalarField& field_in,
522 Eigen::VectorXd& eigen_vector,
527 volScalarField& field_in, Eigen::VectorXd& eigen_vector,
bool correctBC)
529 GeometricField<scalar, fvPatchField, volMesh> field_out(field_in);
531 for (
auto i = 0;
i < field_out.size();
i++)
533 field_out.ref()[
i] = eigen_vector(
i);
538 field_out.correctBoundaryConditions();
546 Field<scalar>& field, Eigen::MatrixXd& matrix,
bool correctBC)
548 label sizeBC = field.size();
550 "The number of columns of the Input members is not correct, it should be 1");
552 if (matrix.rows() == 1)
554 Eigen::MatrixXd new_matrix = matrix.replicate(sizeBC, 1);
555 matrix.conservativeResize(sizeBC, 1);
559 std::string message =
"The input Eigen::MatrixXd has size " + name(
561 ". It should have the same size of the Field, i.e. " +
563 M_Assert(matrix.rows() == sizeBC, message.c_str());
565 for (
auto i = 0;
i < sizeBC;
i++)
567 field[
i] = matrix(
i, 0);
575 Field<vector>& field, Eigen::MatrixXd& matrix,
bool correctBC)
577 label sizeBC = field.size();
579 "The number of columns of the Input members is not correct, it should be 1");
581 if (matrix.rows() == 1)
583 Eigen::MatrixXd new_matrix = matrix.replicate(sizeBC, 1);
584 matrix.conservativeResize(sizeBC, 3);
588 std::string message =
"The input Eigen::MatrixXd has size " + name(
590 ". It should have the same size of the Field, i.e. " +
592 M_Assert(matrix.rows() == sizeBC, message.c_str());
594 for (
auto i = 0;
i < sizeBC;
i++)
596 for (label j = 0; j < 3; j++)
598 field[
i][j] = matrix(
i, j);
607 Field<tensor>& field, Eigen::MatrixXd& matrix,
bool correctBC)
609 label sizeBC = field.size();
611 "The number of columns of the Input members is not correct, it should be 1");
613 if (matrix.rows() == 1)
615 Eigen::MatrixXd new_matrix = matrix.replicate(sizeBC, 1);
616 matrix.conservativeResize(sizeBC, 9);
620 std::string message =
"The input Eigen::MatrixXd has size " + name(
622 ". It should have the same size of the Field, i.e. " +
624 M_Assert(matrix.rows() == sizeBC, message.c_str());
626 for (
auto i = 0;
i < sizeBC;
i++)
628 for (label j = 0; j < 9; j++)
630 field[
i][j] = matrix(
i, j);
637template <
class Type,
template <
class>
class PatchField,
class GeoMesh>
639 PtrList<GeometricField<Type, PatchField, GeoMesh>>& fields,
644 "The Number of requested fields cannot be bigger than the number of requested entries.");
657 out.resize(nrows, Nf);
659 for (label k = 0; k < Nf; k++)
667template Eigen::MatrixXd
668Foam2Eigen::PtrList2Eigen<scalar, fvPatchField, volMesh>(PtrList<volScalarField>&
674template Eigen::MatrixXd
675Foam2Eigen::PtrList2Eigen<vector, fvPatchField, volMesh>(PtrList<volVectorField>&
678template Eigen::MatrixXd
679Foam2Eigen::PtrList2Eigen<tensor, fvPatchField, volMesh>(PtrList<volTensorField>&
688 label sizeA = foam_matrix.diag().size();
689 A.setZero(sizeA, sizeA);
692 for (
auto i = 0;
i < sizeA;
i++)
694 A(
i,
i) = foam_matrix.diag()[
i];
695 b(
i, 0) = foam_matrix.source()[
i];
698 const lduAddressing& addr = foam_matrix.lduAddr();
699 const labelList& lowerAddr = addr.lowerAddr();
700 const labelList& upperAddr = addr.upperAddr();
703 A(lowerAddr[
i], upperAddr[
i]) = foam_matrix.upper()[
i];
704 A(upperAddr[
i], lowerAddr[
i]) = foam_matrix.lower()[
i];
706 forAll(foam_matrix.psi().boundaryField(), I)
708 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
711 label w = ptch.faceCells()[J];
712 const double intern = foam_matrix.internalCoeffs()[I][J];
714 b(w, 0) += foam_matrix.boundaryCoeffs()[I][J];
724 label sizeA = foam_matrix.diag().size();
725 A.resize(sizeA * 3, sizeA * 3);
728 for (
auto i = 0;
i < sizeA;
i++)
730 A(
i,
i) = foam_matrix.diag()[
i];
731 A(sizeA +
i, sizeA +
i) = foam_matrix.diag()[
i];
732 A(2 * sizeA +
i, 2 * sizeA +
i) = foam_matrix.diag()[
i];
733 b(
i) = foam_matrix.source()[
i][0];
734 b(sizeA +
i) = foam_matrix.source()[
i][1];
735 b(2 * sizeA +
i) = foam_matrix.source()[
i][2];
738 const lduAddressing& addr = foam_matrix.lduAddr();
739 const labelList& lowerAddr = addr.lowerAddr();
740 const labelList& upperAddr = addr.upperAddr();
743 A(lowerAddr[
i], upperAddr[
i]) = foam_matrix.upper()[
i];
744 A(lowerAddr[
i] + sizeA, upperAddr[
i] + sizeA) = foam_matrix.upper()[
i];
745 A(lowerAddr[
i] + sizeA * 2, upperAddr[
i] + sizeA * 2) = foam_matrix.upper()[
i];
746 A(upperAddr[
i], lowerAddr[
i]) = foam_matrix.lower()[
i];
747 A(upperAddr[
i] + sizeA, lowerAddr[
i] + sizeA) = foam_matrix.lower()[
i];
748 A(upperAddr[
i] + sizeA * 2, lowerAddr[
i] + sizeA * 2) = foam_matrix.lower()[
i];
750 forAll(foam_matrix.psi().boundaryField(), I)
752 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
755 label w = ptch.faceCells()[J];
756 A(w, w) += foam_matrix.internalCoeffs()[I][J][0];
757 A(w + sizeA, w + sizeA) += foam_matrix.internalCoeffs()[I][J][1];
758 A(w + sizeA * 2, w + sizeA * 2) += foam_matrix.internalCoeffs()[I][J][2];
759 b(w) += foam_matrix.boundaryCoeffs()[I][J][0];
760 b(w + sizeA) += foam_matrix.boundaryCoeffs()[I][J][1];
761 b(w + sizeA * 2) += foam_matrix.boundaryCoeffs()[I][J][2];
768 Eigen::SparseMatrix<double>&
A, Eigen::VectorXd& b)
770 label sizeA = foam_matrix.diag().size();
771 label nel = foam_matrix.diag().size() + foam_matrix.upper().size() +
772 foam_matrix.lower().size();
773 A.resize(sizeA, sizeA);
776 typedef Eigen::Triplet<double> Trip;
777 std::vector<Trip> tripletList;
778 tripletList.reserve(nel);
780 for (
auto i = 0;
i < sizeA;
i++)
782 tripletList.push_back(Trip(
i,
i, foam_matrix.diag()[
i]));
783 b(
i, 0) = foam_matrix.source()[
i];
786 const lduAddressing& addr = foam_matrix.lduAddr();
787 const labelList& lowerAddr = addr.lowerAddr();
788 const labelList& upperAddr = addr.upperAddr();
791 tripletList.push_back(Trip(lowerAddr[
i], upperAddr[
i], foam_matrix.upper()[
i]));
792 tripletList.push_back(Trip(upperAddr[
i], lowerAddr[
i], foam_matrix.lower()[
i]));
794 forAll(foam_matrix.psi().boundaryField(), I)
796 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
799 label w = ptch.faceCells()[J];
800 tripletList.push_back(Trip(w, w, foam_matrix.internalCoeffs()[I][J]));
801 b(w, 0) += foam_matrix.boundaryCoeffs()[I][J];
804 A.setFromTriplets(tripletList.begin(), tripletList.end());
809 Eigen::SparseMatrix<double>&
A, Eigen::VectorXd& b)
811 label sizeA = foam_matrix.diag().size();
812 label nel = foam_matrix.diag().size() + foam_matrix.upper().size() +
813 foam_matrix.lower().size();
814 A.resize(sizeA * 3, sizeA * 3);
817 typedef Eigen::Triplet<double> Trip;
818 std::vector<Trip> tripletList;
819 tripletList.reserve(nel * 3);
821 for (
auto i = 0;
i < sizeA;
i++)
823 tripletList.push_back(Trip(
i,
i, foam_matrix.diag()[
i]));
824 tripletList.push_back(Trip(sizeA +
i, sizeA +
i, foam_matrix.diag()[
i]));
825 tripletList.push_back(Trip(2 * sizeA +
i, 2 * sizeA +
i,
826 foam_matrix.diag()[
i]));
827 b(
i) = foam_matrix.source()[
i][0];
828 b(sizeA +
i) = foam_matrix.source()[
i][1];
829 b(2 * sizeA +
i) = foam_matrix.source()[
i][2];
832 const lduAddressing& addr = foam_matrix.lduAddr();
833 const labelList& lowerAddr = addr.lowerAddr();
834 const labelList& upperAddr = addr.upperAddr();
837 tripletList.push_back(Trip(lowerAddr[
i], upperAddr[
i], foam_matrix.upper()[
i]));
838 tripletList.push_back(Trip(lowerAddr[
i] + sizeA, upperAddr[
i] + sizeA,
839 foam_matrix.upper()[
i]));
840 tripletList.push_back(Trip(lowerAddr[
i] + sizeA * 2, upperAddr[
i] + sizeA * 2,
841 foam_matrix.upper()[
i]));
842 tripletList.push_back(Trip(upperAddr[
i], lowerAddr[
i], foam_matrix.lower()[
i]));
843 tripletList.push_back(Trip(upperAddr[
i] + sizeA, lowerAddr[
i] + sizeA,
844 foam_matrix.lower()[
i]));
845 tripletList.push_back(Trip(upperAddr[
i] + sizeA * 2, lowerAddr[
i] + sizeA * 2,
846 foam_matrix.lower()[
i]));
848 forAll(foam_matrix.psi().boundaryField(), I)
850 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
853 label w = ptch.faceCells()[J];
854 tripletList.push_back(Trip(w, w, foam_matrix.internalCoeffs()[I][J][0]));
855 tripletList.push_back(Trip(w + sizeA, w + sizeA,
856 foam_matrix.internalCoeffs()[I][J][1]));
857 tripletList.push_back(Trip(w + sizeA * 2, w + sizeA * 2,
858 foam_matrix.internalCoeffs()[I][J][2]));
859 b(w) += foam_matrix.boundaryCoeffs()[I][J][0];
860 b(w + sizeA) += foam_matrix.boundaryCoeffs()[I][J][1];
861 b(w + sizeA * 2) += foam_matrix.boundaryCoeffs()[I][J][2];
864 A.setFromTriplets(tripletList.begin(), tripletList.end());
871 label sizeA = foam_matrix.diag().size();
872 A.setZero(sizeA, sizeA);
874 for (
auto i = 0;
i < sizeA;
i++)
876 A(
i,
i) = foam_matrix.diag()[
i];
879 const lduAddressing& addr = foam_matrix.lduAddr();
880 const labelList& lowerAddr = addr.lowerAddr();
881 const labelList& upperAddr = addr.upperAddr();
884 A(lowerAddr[
i], upperAddr[
i]) = foam_matrix.upper()[
i];
885 A(upperAddr[
i], lowerAddr[
i]) = foam_matrix.lower()[
i];
887 forAll(foam_matrix.psi().boundaryField(), I)
889 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
892 label w = ptch.faceCells()[J];
893 A(w, w) += foam_matrix.internalCoeffs()[I][J];
900 Eigen::SparseMatrix<double>&
A)
902 label sizeA = foam_matrix.diag().size();
903 label nel = foam_matrix.diag().size() + foam_matrix.upper().size() +
904 foam_matrix.lower().size();
905 A.resize(sizeA, sizeA);
907 typedef Eigen::Triplet<double> Trip;
908 std::vector<Trip> tripletList;
909 tripletList.reserve(nel);
911 for (
auto i = 0;
i < sizeA;
i++)
913 tripletList.push_back(Trip(
i,
i, foam_matrix.diag()[
i]));
916 const lduAddressing& addr = foam_matrix.lduAddr();
917 const labelList& lowerAddr = addr.lowerAddr();
918 const labelList& upperAddr = addr.upperAddr();
921 tripletList.push_back(Trip(lowerAddr[
i], upperAddr[
i], foam_matrix.upper()[
i]));
922 tripletList.push_back(Trip(upperAddr[
i], lowerAddr[
i], foam_matrix.lower()[
i]));
924 forAll(foam_matrix.psi().boundaryField(), I)
926 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
929 label w = ptch.faceCells()[J];
930 tripletList.push_back(Trip(w, w, foam_matrix.internalCoeffs()[I][J]));
933 A.setFromTriplets(tripletList.begin(), tripletList.end());
940 label sizeA = foam_matrix.diag().size();
941 A.resize(sizeA * 3, sizeA * 3);
943 for (
auto i = 0;
i < sizeA;
i++)
945 A(
i,
i) = foam_matrix.diag()[
i];
946 A(sizeA +
i, sizeA +
i) = foam_matrix.diag()[
i];
947 A(2 * sizeA +
i, 2 * sizeA +
i) = foam_matrix.diag()[
i];
950 const lduAddressing& addr = foam_matrix.lduAddr();
951 const labelList& lowerAddr = addr.lowerAddr();
952 const labelList& upperAddr = addr.upperAddr();
955 A(lowerAddr[
i], upperAddr[
i]) = foam_matrix.upper()[
i];
956 A(lowerAddr[
i] + sizeA, upperAddr[
i] + sizeA) = foam_matrix.upper()[
i];
957 A(lowerAddr[
i] + sizeA * 2, upperAddr[
i] + sizeA * 2) = foam_matrix.upper()[
i];
958 A(upperAddr[
i], lowerAddr[
i]) = foam_matrix.lower()[
i];
959 A(upperAddr[
i] + sizeA, lowerAddr[
i] + sizeA) = foam_matrix.lower()[
i];
960 A(upperAddr[
i] + sizeA * 2, lowerAddr[
i] + sizeA * 2) = foam_matrix.lower()[
i];
962 forAll(foam_matrix.psi().boundaryField(), I)
964 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
967 label w = ptch.faceCells()[J];
968 A(w, w) += foam_matrix.internalCoeffs()[I][J][0];
969 A(w + sizeA, w + sizeA) += foam_matrix.internalCoeffs()[I][J][1];
970 A(w + sizeA * 2, w + sizeA * 2) += foam_matrix.internalCoeffs()[I][J][2];
978 Eigen::SparseMatrix<double>&
A)
980 label sizeA = foam_matrix.diag().size();
981 label nel = foam_matrix.diag().size() + foam_matrix.upper().size() +
982 foam_matrix.lower().size();
983 A.resize(sizeA * 3, sizeA * 3);
985 typedef Eigen::Triplet<double> Trip;
986 std::vector<Trip> tripletList;
987 tripletList.reserve(nel * 3);
989 for (
auto i = 0;
i < sizeA;
i++)
991 tripletList.push_back(Trip(
i,
i, foam_matrix.diag()[
i]));
992 tripletList.push_back(Trip(sizeA +
i, sizeA +
i, foam_matrix.diag()[
i]));
993 tripletList.push_back(Trip(2 * sizeA +
i, 2 * sizeA +
i,
994 foam_matrix.diag()[
i]));
997 const lduAddressing& addr = foam_matrix.lduAddr();
998 const labelList& lowerAddr = addr.lowerAddr();
999 const labelList& upperAddr = addr.upperAddr();
1002 tripletList.push_back(Trip(lowerAddr[
i], upperAddr[
i], foam_matrix.upper()[
i]));
1003 tripletList.push_back(Trip(lowerAddr[
i] + sizeA, upperAddr[
i] + sizeA,
1004 foam_matrix.upper()[
i]));
1005 tripletList.push_back(Trip(lowerAddr[
i] + sizeA * 2, upperAddr[
i] + sizeA * 2,
1006 foam_matrix.upper()[
i]));
1007 tripletList.push_back(Trip(upperAddr[
i], lowerAddr[
i], foam_matrix.lower()[
i]));
1008 tripletList.push_back(Trip(upperAddr[
i] + sizeA, lowerAddr[
i] + sizeA,
1009 foam_matrix.lower()[
i]));
1010 tripletList.push_back(Trip(upperAddr[
i] + sizeA * 2, lowerAddr[
i] + sizeA * 2,
1011 foam_matrix.lower()[
i]));
1013 forAll(foam_matrix.psi().boundaryField(), I)
1015 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
1018 label w = ptch.faceCells()[J];
1019 tripletList.push_back(Trip(w, w, foam_matrix.internalCoeffs()[I][J][0]));
1020 tripletList.push_back(Trip(w + sizeA, w + sizeA,
1021 foam_matrix.internalCoeffs()[I][J][1]));
1022 tripletList.push_back(Trip(w + sizeA * 2, w + sizeA * 2,
1023 foam_matrix.internalCoeffs()[I][J][2]));
1026 A.setFromTriplets(tripletList.begin(), tripletList.end());
1033 label sizeA = foam_matrix.diag().size();
1036 for (
auto i = 0;
i < sizeA;
i++)
1038 b(
i, 0) = foam_matrix.source()[
i];
1041 forAll(foam_matrix.psi().boundaryField(), I)
1043 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
1046 label w = ptch.faceCells()[J];
1047 b(w, 0) += foam_matrix.boundaryCoeffs()[I][J];
1056 label sizeA = foam_matrix.diag().size();
1057 b.resize(sizeA * 3);
1059 for (
auto i = 0;
i < sizeA;
i++)
1061 b(
i) = foam_matrix.source()[
i][0];
1062 b(sizeA +
i) = foam_matrix.source()[
i][1];
1063 b(2 * sizeA +
i) = foam_matrix.source()[
i][2];
1066 forAll(foam_matrix.psi().boundaryField(), I)
1068 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
1071 label w = ptch.faceCells()[J];
1072 b(w) += foam_matrix.boundaryCoeffs()[I][J][0];
1073 b(w + sizeA) += foam_matrix.boundaryCoeffs()[I][J][1];
1074 b(w + sizeA * 2) += foam_matrix.boundaryCoeffs()[I][J][2];
1079template <
class Type,
template <
class>
class PatchField,
class GeoMesh>
1081 GeometricField<Type, PatchField, GeoMesh>& field,
1082 PtrList<GeometricField<Type, PatchField, GeoMesh>>& modes,
1089 Eigen::MatrixXd VolumesN(Volumes.rows(), 1);
1092 if (Volumes.rows() != Eig_Modes.rows())
1094 VolumesN.resize(Eig_Modes.rows(), 1);
1095 VolumesN.col(0).segment(0, Volumes.rows()) = Volumes;
1096 VolumesN.col(0).segment(Volumes.rows() + 1, Volumes.rows() * 2) = Volumes;
1097 VolumesN.col(0).segment(Volumes.rows() * 2 + 1, Volumes.rows() * 3) = Volumes;
1100 fr = Eig_Modes.transpose() * (f.cwiseProduct(VolumesN));
1104template <
class Type,
template <
class>
class PatchField,
class GeoMesh>
1106 fvMatrix<Type>& matrix,
1107 PtrList<GeometricField<Type, PatchField, GeoMesh>>& modes, label Nmodes)
1109 Eigen::SparseMatrix<double>
A;
1116 Eigen::MatrixXd VolumesN(Volumes.rows(), Nmodes);
1118 if (Volumes.rows() != Eig_Modes.rows())
1120 VolumesN.resize(Eig_Modes.rows(), Nmodes);
1123 if (Volumes.rows() == Eig_Modes.rows())
1125 for (
auto i = 0;
i < Nmodes;
i++)
1127 VolumesN.col(
i) = Volumes;
1132 for (
auto i = 0;
i < Nmodes;
i++)
1134 VolumesN.col(
i).segment(0, Volumes.rows()) = Volumes;
1135 VolumesN.col(
i).segment(Volumes.rows() + 1, Volumes.rows() * 2) = Volumes;
1136 VolumesN.col(
i).segment(Volumes.rows() * 2 + 1, Volumes.rows() * 3) = Volumes;
1140 Ar = Eig_Modes.transpose() *
A * Eig_Modes;
1141 br = Eig_Modes.transpose() * b;
1142 std::tuple<Eigen::MatrixXd, Eigen::VectorXd> tupla;
1143 tupla = std::make_tuple(Ar, br);
1147template <
class Type,
template <
class>
class PatchField,
class GeoMesh>
1149 PtrList<GeometricField<Type, PatchField, GeoMesh>>& modes, label Nmodes)
1154 Eigen::MatrixXd VolumesN(Volumes.rows(), Nmodes);
1156 if (Volumes.rows() != Eig_Modes.rows())
1158 VolumesN.resize(Eig_Modes.rows(), Nmodes);
1161 if (Volumes.rows() == Eig_Modes.rows())
1163 for (
auto i = 0;
i < Nmodes;
i++)
1165 VolumesN.col(
i) = Volumes;
1170 for (
auto i = 0;
i < Nmodes;
i++)
1172 VolumesN.col(
i).segment(0, Volumes.rows()) = Volumes;
1173 VolumesN.col(
i).segment(Volumes.rows() + 1, Volumes.rows() * 2) = Volumes;
1174 VolumesN.col(
i).segment(Volumes.rows() * 2 + 1, Volumes.rows() * 3) = Volumes;
1178 Mr = Eig_Modes.transpose() * (Eig_Modes.cwiseProduct(VolumesN));
1182template <
class Type>
1183std::tuple<List<Eigen::SparseMatrix<double>>, List<Eigen::VectorXd>>
1186 List<Eigen::SparseMatrix<double>> SM_list;
1187 List<Eigen::VectorXd> V_list;
1188 label LSize = MatrixList.size();
1189 SM_list.resize(LSize);
1190 V_list.resize(LSize);
1191 Eigen::SparseMatrix<double>
A;
1194 for (label j = 0; j < LSize; j++)
1201 std::tuple<List<Eigen::SparseMatrix<double>>, List<Eigen::VectorXd>> tupla;
1202 tupla = std::make_tuple(SM_list, V_list);
1206template std::tuple<List<Eigen::SparseMatrix<double>>, List<Eigen::VectorXd>>
1208template std::tuple<List<Eigen::SparseMatrix<double>>, List<Eigen::VectorXd>>
1211template <
class type_matrix>
1212Eigen::Matrix<type_matrix, Eigen::Dynamic, Eigen::Dynamic>
1215 Eigen::Matrix<type_matrix, Eigen::Dynamic, Eigen::Dynamic> matrix(list.size(),
1218 for (label
i = 0;
i < matrix.rows();
i++)
1220 matrix(
i, 0) = list[
i];
1226template Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic>
1228template Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
1231template <
class type_matrix>
1233 Eigen::Matrix<type_matrix, Eigen::Dynamic, Eigen::Dynamic> matrix)
1235 if (matrix.cols() == 1)
1237 List<type_matrix> list(matrix.rows());
1239 for (label
i = 0;
i < matrix.rows();
i++)
1241 list[
i] = matrix(
i, 0);
1248 Info <<
"Foam2Eigen::EigenMatrix2List only accepts matrices with 1 column, exiting"
1255 Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic> matrix);
1257 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix);
1262 Eigen::MatrixXd out;
1263 out.resize(label(field.size() * 3), 1);
1265 for (label l = 0; l < field.size(); l++)
1267 for (label j = 0; j < 3; j++)
1269 out(j * field.size() + l, 0) = field[l][j];
1279 Eigen::MatrixXd out;
1280 out.resize(label(field.size()), 1);
1282 for (label l = 0; l < field.size(); l++)
1284 out(l, 0) = field[l];
forAll(example_CG.gList, solutionI)
Header file of the Foam2Eigen class.
#define M_Assert(Expr, Msg)
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 Eigen::VectorXd field2Eigen(GeometricField< tensor, PatchField, GeoMesh > &field)
Convert a vector OpenFOAM field into an Eigen Vector.
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 Eigen::Map< Eigen::MatrixXd > field2EigenMap(GeometricField< scalar, PatchField, GeoMesh > &field)
Convert a scalar OpenFOAM field into an Eigen Vector.
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 void fvMatrix2EigenV(fvMatrix< type_foam_matrix > &foam_matrix, type_B &b)
Convert a ldu OpenFOAM matrix into a source vector b.
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 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.