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);
104template <
template <
class>
class PatchField,
class GeoMesh>
106 GeometricField<scalar, PatchField, GeoMesh>& field,
int BC_index)
108 Eigen::Map<Eigen::MatrixXd> output(field.boundaryFieldRef()[BC_index].data(),
109 field.boundaryField()[BC_index].size(), 1);
110 return std::move(output);
114 volScalarField& field);
117 volScalarField& field,
int BC_index);
120 volScalarField& field);
122 surfaceScalarField& field);
128 out.resize(label(field.size()));
130 for (label l = 0; l < field.size(); l++)
142 out.resize(label(field.size() * 3));
144 for (label l = 0; l < field.size(); l++)
146 for (label j = 0; j < 3; j++)
148 out(j * field.size() + l) = field[l][j];
159 out.resize(label(field.size() * 9));
161 for (label l = 0; l < field.size(); l++)
163 for (label j = 0; j < 9; j++)
165 out(j * field.size() + l) = field[l][j];
174 DimensionedField<scalar, Foam::volMesh>& field)
177 out.resize(label(field.size()));
179 for (label l = 0; l < field.size(); l++)
187template <
template <
class>
class PatchField,
class GeoMesh>
189 GeometricField<tensor, PatchField, GeoMesh>& field)
191 List<Eigen::VectorXd> Out;
192 label size = field.boundaryField().size();
195 for (label
i = 0;
i < size;
i++)
197 label sizei = field.boundaryField()[
i].size();
198 Out[
i].resize(sizei * 9);
200 for (label k = 0; k < sizei; k++)
202 for (label j = 0; j < 9; j++)
204 Out[
i](k + j * sizei) = field.boundaryField()[
i][k][j];
213 volTensorField& field);
215template <
template <
class>
class PatchField,
class GeoMesh>
217 GeometricField<vector, PatchField, GeoMesh>& field)
219 List<Eigen::VectorXd> Out;
220 label size = field.boundaryField().size();
223 for (label
i = 0;
i < size;
i++)
225 label sizei = field.boundaryField()[
i].size();
226 Out[
i].resize(sizei * 3);
228 for (label k = 0; k < sizei; k++)
230 for (label j = 0; j < 3; j++)
232 Out[
i](k + j * sizei) = field.boundaryField()[
i][k][j];
241 volVectorField& field);
244template <
template <
class>
class PatchField,
class GeoMesh>
246 GeometricField<scalar, PatchField, GeoMesh>& field)
248 List<Eigen::VectorXd> Out;
249 label size = field.boundaryField().size();
252 for (label
i = 0;
i < size;
i++)
254 label sizei = field.boundaryField()[
i].size();
255 Out[
i].resize(sizei);
257 for (label k = 0; k < sizei; k++)
259 Out[
i](k) = field.boundaryField()[
i][k];
267 volScalarField& field);
269template <
template <
class>
class PatchField,
class GeoMesh>
271 PtrList<GeometricField<scalar, PatchField, GeoMesh >> &
277 "The Number of requested fields cannot be bigger than the number of requested entries.");
287 List<Eigen::MatrixXd> Out;
288 label NBound = fields[0].boundaryField().size();
291 for (label
i = 0;
i < NBound;
i++)
293 label sizei = fields[0].boundaryField()[
i].size();
294 Out[
i].resize(sizei, Nf);
296 for (label k = 0; k < Nf; k++)
298 List<Eigen::VectorXd> temp;
301 for (label
i = 0;
i < NBound;
i++)
303 Out[
i].col(k) = temp[
i];
310 PtrList<volScalarField>& fields, label Nfields);
312 PtrList<surfaceScalarField>& fields, label Nfields);
315template <
template <
class>
class PatchField,
class GeoMesh>
317 PtrList<GeometricField<vector, PatchField, GeoMesh >> &
323 "The Number of requested fields cannot be bigger than the number of requested entries.");
333 List<Eigen::MatrixXd> Out;
334 label NBound = fields[0].boundaryField().size();
337 for (label
i = 0;
i < NBound;
i++)
339 label sizei = fields[0].boundaryField()[
i].size();
340 Out[
i].resize(sizei * 3, Nf);
342 for (label k = 0; k < Nf; k++)
344 List<Eigen::VectorXd> temp;
347 for (label
i = 0;
i < NBound;
i++)
349 Out[
i].col(k) = temp[
i];
356 PtrList<volVectorField>& fields, label Nfields);
359template <
template <
class>
class PatchField,
class GeoMesh>
361 PtrList<GeometricField<tensor, PatchField, GeoMesh >> &
367 "The Number of requested fields cannot be bigger than the number of requested entries.");
377 List<Eigen::MatrixXd> Out;
378 label NBound = fields[0].boundaryField().size();
381 for (label
i = 0;
i < NBound;
i++)
383 label sizei = fields[0].boundaryField()[
i].size();
384 Out[
i].resize(sizei * 9, Nf);
386 for (label k = 0; k < Nf; k++)
388 List<Eigen::VectorXd> temp;
391 for (label
i = 0;
i < NBound;
i++)
393 Out[
i].col(k) = temp[
i];
400 PtrList<volTensorField>& fields, label Nfields);
402template <
template <
class>
class PatchField,
class GeoMesh>
404 GeometricField<tensor, PatchField, GeoMesh>& field_in,
405 Eigen::VectorXd& eigen_vector,
bool correctBC)
407 GeometricField<tensor, PatchField, GeoMesh> field_out(field_in);
409 for (
auto i = 0;
i < field_out.size();
i++)
411 for (label j = 0; j < 9; j++)
413 field_out.ref()[
i][j] = eigen_vector(
i + field_out.size() * j);
419 field_out.correctBoundaryConditions();
426 volTensorField& field_in, Eigen::VectorXd& eigen_vector,
bool correctBC);
428template <
template <
class>
class PatchField,
class GeoMesh>
430 GeometricField<vector, PatchField, GeoMesh>& field_in,
431 Eigen::VectorXd& eigen_vector, List<Eigen::VectorXd>& eigen_vector_boundary)
433 GeometricField<vector, PatchField, GeoMesh> field_out(field_in);
435 for (
auto i = 0;
i < field_out.size();
i++)
437 field_out.ref()[
i][0] = eigen_vector(
i);
438 field_out.ref()[
i][1] = eigen_vector(
i + field_out.size());
439 field_out.ref()[
i][2] = eigen_vector(
i + field_out.size() * 2);
442 for (
unsigned int id = 0;
id < field_out.boundaryField().size();
id++)
444 unsigned int idBSize = field_out.boundaryField()[id].size();
446 for (
unsigned int ith_bcell = 0; ith_bcell < idBSize; ith_bcell++)
456 volVectorField& field_in, Eigen::VectorXd& eigen_vector,
457 List<Eigen::VectorXd>& eigen_vector_boundary);
459template<
template<
class>
class PatchField,
class GeoMesh>
461 GeometricField<scalar, PatchField, GeoMesh>& field_in,
462 Eigen::VectorXd& eigen_vector, List<Eigen::VectorXd>& eigen_vector_boundary)
464 GeometricField<scalar, PatchField, GeoMesh> field_out(field_in);
466 for (
auto i = 0;
i < field_out.size();
i++)
468 field_out.ref()[
i] = eigen_vector(
i);
471 for (
unsigned int id = 0;
id < field_out.boundaryField().size();
id++)
473 for (
unsigned int ith_bcell = 0;
474 ith_bcell < field_out.boundaryField()[
id].size(); ith_bcell++)
484 volScalarField& field_in, Eigen::VectorXd& eigen_vector,
485 List<Eigen::VectorXd>& eigen_vector_boundary);
487template<
template<
class>
class PatchField,
class GeoMesh>
489 GeometricField<vector, PatchField, GeoMesh>& field_in,
490 Eigen::VectorXd& eigen_vector,
bool correctBC)
492 GeometricField<vector, PatchField, GeoMesh> field_out(field_in);
494 for (
auto i = 0;
i < field_out.size();
i++)
496 for (label j = 0; j < 3; j++)
498 field_out.ref()[
i][j] = eigen_vector(
i + field_out.size() * j);
504 field_out.correctBoundaryConditions();
511 volVectorField& field_in, Eigen::VectorXd& eigen_vector,
bool correctBC);
513template <
template <
class>
class PatchField,
class GeoMesh>
515 GeometricField<scalar, PatchField, GeoMesh>& field_in,
516 Eigen::VectorXd& eigen_vector,
bool correctBC)
518 GeometricField<scalar, PatchField, GeoMesh> field_out(field_in);
520 for (
auto i = 0;
i < field_out.size();
i++)
522 field_out.ref()[
i] = eigen_vector(
i);
529 surfaceScalarField& field_in,
530 Eigen::VectorXd& eigen_vector,
535 volScalarField& field_in, Eigen::VectorXd& eigen_vector,
bool correctBC)
537 GeometricField<scalar, fvPatchField, volMesh> field_out(field_in);
539 for (
auto i = 0;
i < field_out.size();
i++)
541 field_out.ref()[
i] = eigen_vector(
i);
546 field_out.correctBoundaryConditions();
554 Field<scalar>& field, Eigen::MatrixXd& matrix,
bool correctBC)
556 label sizeBC = field.size();
558 "The number of columns of the Input members is not correct, it should be 1");
560 if (matrix.rows() == 1)
562 Eigen::MatrixXd new_matrix = matrix.replicate(sizeBC, 1);
563 matrix.conservativeResize(sizeBC, 1);
567 std::string message =
"The input Eigen::MatrixXd has size " + name(
569 ". It should have the same size of the Field, i.e. " +
571 M_Assert(matrix.rows() == sizeBC, message.c_str());
573 for (
auto i = 0;
i < sizeBC;
i++)
575 field[
i] = matrix(
i, 0);
583 Field<vector>& field, Eigen::MatrixXd& matrix,
bool correctBC)
585 label sizeBC = field.size();
587 "The number of columns of the Input members is not correct, it should be 1");
589 if (matrix.rows() == 1)
591 Eigen::MatrixXd new_matrix = matrix.replicate(sizeBC, 1);
592 matrix.conservativeResize(sizeBC, 3);
596 std::string message =
"The input Eigen::MatrixXd has size " + name(
598 ". It should have the same size of the Field, i.e. " +
600 M_Assert(matrix.rows() == sizeBC, message.c_str());
602 for (
auto i = 0;
i < sizeBC;
i++)
604 for (label j = 0; j < 3; j++)
606 field[
i][j] = matrix(
i, j);
615 Field<tensor>& field, Eigen::MatrixXd& matrix,
bool correctBC)
617 label sizeBC = field.size();
619 "The number of columns of the Input members is not correct, it should be 1");
621 if (matrix.rows() == 1)
623 Eigen::MatrixXd new_matrix = matrix.replicate(sizeBC, 1);
624 matrix.conservativeResize(sizeBC, 9);
628 std::string message =
"The input Eigen::MatrixXd has size " + name(
630 ". It should have the same size of the Field, i.e. " +
632 M_Assert(matrix.rows() == sizeBC, message.c_str());
634 for (
auto i = 0;
i < sizeBC;
i++)
636 for (label j = 0; j < 9; j++)
638 field[
i][j] = matrix(
i, j);
645template <
class Type,
template <
class>
class PatchField,
class GeoMesh>
647 PtrList<GeometricField<Type, PatchField, GeoMesh >> & fields,
652 "The Number of requested fields cannot be bigger than the number of requested entries.");
664 out.resize(nrows, Nf);
665 for (label k = 0; k < Nf; k++)
673template Eigen::MatrixXd
675(PtrList<volScalarField>&
681template Eigen::MatrixXd
683(PtrList<volVectorField>&
686template Eigen::MatrixXd
688(PtrList<volTensorField>&
697 label sizeA = foam_matrix.diag().size();
698 A.setZero(sizeA, sizeA);
701 for (
auto i = 0;
i < sizeA;
i++)
703 A(
i,
i) = foam_matrix.diag()[
i];
704 b(
i, 0) = foam_matrix.source()[
i];
707 const lduAddressing& addr = foam_matrix.lduAddr();
708 const labelList& lowerAddr = addr.lowerAddr();
709 const labelList& upperAddr = addr.upperAddr();
712 A(lowerAddr[
i], upperAddr[
i]) = foam_matrix.upper()[
i];
713 A(upperAddr[
i], lowerAddr[
i]) = foam_matrix.lower()[
i];
716 forAll(foam_matrix.psi().boundaryField(), I)
718 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
721 label w = ptch.faceCells()[J];
722 const double intern = foam_matrix.internalCoeffs()[I][J];
724 b(w, 0) += foam_matrix.boundaryCoeffs()[I][J];
734 label sizeA = foam_matrix.diag().size();
735 A.resize(sizeA * 3, sizeA * 3);
738 for (
auto i = 0;
i < sizeA;
i++)
740 A(
i,
i) = foam_matrix.diag()[
i];
741 A(sizeA +
i, sizeA +
i) = foam_matrix.diag()[
i];
742 A(2 * sizeA +
i, 2 * sizeA +
i) = foam_matrix.diag()[
i];
743 b(
i) = foam_matrix.source()[
i][0];
744 b(sizeA +
i) = foam_matrix.source()[
i][1];
745 b(2 * sizeA +
i) = foam_matrix.source()[
i][2];
748 const lduAddressing& addr = foam_matrix.lduAddr();
749 const labelList& lowerAddr = addr.lowerAddr();
750 const labelList& upperAddr = addr.upperAddr();
753 A(lowerAddr[
i], upperAddr[
i]) = foam_matrix.upper()[
i];
754 A(lowerAddr[
i] + sizeA, upperAddr[
i] + sizeA) = foam_matrix.upper()[
i];
755 A(lowerAddr[
i] + sizeA * 2, upperAddr[
i] + sizeA * 2) = foam_matrix.upper()[
i];
756 A(upperAddr[
i], lowerAddr[
i]) = foam_matrix.lower()[
i];
757 A(upperAddr[
i] + sizeA, lowerAddr[
i] + sizeA) = foam_matrix.lower()[
i];
758 A(upperAddr[
i] + sizeA * 2, lowerAddr[
i] + sizeA * 2) = foam_matrix.lower()[
i];
761 forAll(foam_matrix.psi().boundaryField(), I)
763 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
766 label w = ptch.faceCells()[J];
767 A(w, w) += foam_matrix.internalCoeffs()[I][J][0];
768 A(w + sizeA, w + sizeA) += foam_matrix.internalCoeffs()[I][J][1];
769 A(w + sizeA * 2, w + sizeA * 2) += foam_matrix.internalCoeffs()[I][J][2];
770 b(w) += foam_matrix.boundaryCoeffs()[I][J][0];
771 b(w + sizeA) += foam_matrix.boundaryCoeffs()[I][J][1];
772 b(w + sizeA * 2) += foam_matrix.boundaryCoeffs()[I][J][2];
779 Eigen::SparseMatrix<double>&
A, Eigen::VectorXd& b)
781 label sizeA = foam_matrix.diag().size();
782 label nel = foam_matrix.diag().size() + foam_matrix.upper().size() +
783 foam_matrix.lower().size();
784 A.resize(sizeA, sizeA);
787 typedef Eigen::Triplet<double> Trip;
788 std::vector<Trip> tripletList;
789 tripletList.reserve(nel);
791 for (
auto i = 0;
i < sizeA;
i++)
793 tripletList.push_back(Trip(
i,
i, foam_matrix.diag()[
i]));
794 b(
i, 0) = foam_matrix.source()[
i];
797 const lduAddressing& addr = foam_matrix.lduAddr();
798 const labelList& lowerAddr = addr.lowerAddr();
799 const labelList& upperAddr = addr.upperAddr();
802 tripletList.push_back(Trip(lowerAddr[
i], upperAddr[
i], foam_matrix.upper()[
i]));
803 tripletList.push_back(Trip(upperAddr[
i], lowerAddr[
i], foam_matrix.lower()[
i]));
806 forAll(foam_matrix.psi().boundaryField(), I)
808 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
811 label w = ptch.faceCells()[J];
812 tripletList.push_back(Trip(w, w, foam_matrix.internalCoeffs()[I][J]));
813 b(w, 0) += foam_matrix.boundaryCoeffs()[I][J];
817 A.setFromTriplets(tripletList.begin(), tripletList.end());
822 Eigen::SparseMatrix<double>&
A, Eigen::VectorXd& b)
824 label sizeA = foam_matrix.diag().size();
825 label nel = foam_matrix.diag().size() + foam_matrix.upper().size() +
826 foam_matrix.lower().size();
827 A.resize(sizeA * 3, sizeA * 3);
830 typedef Eigen::Triplet<double> Trip;
831 std::vector<Trip> tripletList;
832 tripletList.reserve(nel * 3);
834 for (
auto i = 0;
i < sizeA;
i++)
836 tripletList.push_back(Trip(
i,
i, foam_matrix.diag()[
i]));
837 tripletList.push_back(Trip(sizeA +
i, sizeA +
i, foam_matrix.diag()[
i]));
838 tripletList.push_back(Trip(2 * sizeA +
i, 2 * sizeA +
i,
839 foam_matrix.diag()[
i]));
840 b(
i) = foam_matrix.source()[
i][0];
841 b(sizeA +
i) = foam_matrix.source()[
i][1];
842 b(2 * sizeA +
i) = foam_matrix.source()[
i][2];
845 const lduAddressing& addr = foam_matrix.lduAddr();
846 const labelList& lowerAddr = addr.lowerAddr();
847 const labelList& upperAddr = addr.upperAddr();
850 tripletList.push_back(Trip(lowerAddr[
i], upperAddr[
i], foam_matrix.upper()[
i]));
851 tripletList.push_back(Trip(lowerAddr[
i] + sizeA, upperAddr[
i] + sizeA,
852 foam_matrix.upper()[
i]));
853 tripletList.push_back(Trip(lowerAddr[
i] + sizeA * 2, upperAddr[
i] + sizeA * 2,
854 foam_matrix.upper()[
i]));
855 tripletList.push_back(Trip(upperAddr[
i], lowerAddr[
i], foam_matrix.lower()[
i]));
856 tripletList.push_back(Trip(upperAddr[
i] + sizeA, lowerAddr[
i] + sizeA,
857 foam_matrix.lower()[
i]));
858 tripletList.push_back(Trip(upperAddr[
i] + sizeA * 2, lowerAddr[
i] + sizeA * 2,
859 foam_matrix.lower()[
i]));
862 forAll(foam_matrix.psi().boundaryField(), I)
864 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
867 label w = ptch.faceCells()[J];
868 tripletList.push_back(Trip(w, w, foam_matrix.internalCoeffs()[I][J][0]));
869 tripletList.push_back(Trip(w + sizeA, w + sizeA,
870 foam_matrix.internalCoeffs()[I][J][1]));
871 tripletList.push_back(Trip(w + sizeA * 2, w + sizeA * 2,
872 foam_matrix.internalCoeffs()[I][J][2]));
873 b(w) += foam_matrix.boundaryCoeffs()[I][J][0];
874 b(w + sizeA) += foam_matrix.boundaryCoeffs()[I][J][1];
875 b(w + sizeA * 2) += foam_matrix.boundaryCoeffs()[I][J][2];
879 A.setFromTriplets(tripletList.begin(), tripletList.end());
886 label sizeA = foam_matrix.diag().size();
887 A.setZero(sizeA, sizeA);
889 for (
auto i = 0;
i < sizeA;
i++)
891 A(
i,
i) = foam_matrix.diag()[
i];
894 const lduAddressing& addr = foam_matrix.lduAddr();
895 const labelList& lowerAddr = addr.lowerAddr();
896 const labelList& upperAddr = addr.upperAddr();
899 A(lowerAddr[
i], upperAddr[
i]) = foam_matrix.upper()[
i];
900 A(upperAddr[
i], lowerAddr[
i]) = foam_matrix.lower()[
i];
903 forAll(foam_matrix.psi().boundaryField(), I)
905 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
908 label w = ptch.faceCells()[J];
909 A(w, w) += foam_matrix.internalCoeffs()[I][J];
916 Eigen::SparseMatrix<double>&
A)
918 label sizeA = foam_matrix.diag().size();
919 label nel = foam_matrix.diag().size() + foam_matrix.upper().size() +
920 foam_matrix.lower().size();
921 A.resize(sizeA, sizeA);
923 typedef Eigen::Triplet<double> Trip;
924 std::vector<Trip> tripletList;
925 tripletList.reserve(nel);
927 for (
auto i = 0;
i < sizeA;
i++)
929 tripletList.push_back(Trip(
i,
i, foam_matrix.diag()[
i]));
932 const lduAddressing& addr = foam_matrix.lduAddr();
933 const labelList& lowerAddr = addr.lowerAddr();
934 const labelList& upperAddr = addr.upperAddr();
937 tripletList.push_back(Trip(lowerAddr[
i], upperAddr[
i], foam_matrix.upper()[
i]));
938 tripletList.push_back(Trip(upperAddr[
i], lowerAddr[
i], foam_matrix.lower()[
i]));
941 forAll(foam_matrix.psi().boundaryField(), I)
943 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
946 label w = ptch.faceCells()[J];
947 tripletList.push_back(Trip(w, w, foam_matrix.internalCoeffs()[I][J]));
951 A.setFromTriplets(tripletList.begin(), tripletList.end());
958 label sizeA = foam_matrix.diag().size();
959 A.resize(sizeA * 3, sizeA * 3);
961 for (
auto i = 0;
i < sizeA;
i++)
963 A(
i,
i) = foam_matrix.diag()[
i];
964 A(sizeA +
i, sizeA +
i) = foam_matrix.diag()[
i];
965 A(2 * sizeA +
i, 2 * sizeA +
i) = foam_matrix.diag()[
i];
968 const lduAddressing& addr = foam_matrix.lduAddr();
969 const labelList& lowerAddr = addr.lowerAddr();
970 const labelList& upperAddr = addr.upperAddr();
973 A(lowerAddr[
i], upperAddr[
i]) = foam_matrix.upper()[
i];
974 A(lowerAddr[
i] + sizeA, upperAddr[
i] + sizeA) = foam_matrix.upper()[
i];
975 A(lowerAddr[
i] + sizeA * 2, upperAddr[
i] + sizeA * 2) = foam_matrix.upper()[
i];
976 A(upperAddr[
i], lowerAddr[
i]) = foam_matrix.lower()[
i];
977 A(upperAddr[
i] + sizeA, lowerAddr[
i] + sizeA) = foam_matrix.lower()[
i];
978 A(upperAddr[
i] + sizeA * 2, lowerAddr[
i] + sizeA * 2) = foam_matrix.lower()[
i];
981 forAll(foam_matrix.psi().boundaryField(), I)
983 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
986 label w = ptch.faceCells()[J];
987 A(w, w) += foam_matrix.internalCoeffs()[I][J][0];
988 A(w + sizeA, w + sizeA) += foam_matrix.internalCoeffs()[I][J][1];
989 A(w + sizeA * 2, w + sizeA * 2) += foam_matrix.internalCoeffs()[I][J][2];
997 Eigen::SparseMatrix<double>&
A)
999 label sizeA = foam_matrix.diag().size();
1000 label nel = foam_matrix.diag().size() + foam_matrix.upper().size() +
1001 foam_matrix.lower().size();
1002 A.resize(sizeA * 3, sizeA * 3);
1004 typedef Eigen::Triplet<double> Trip;
1005 std::vector<Trip> tripletList;
1006 tripletList.reserve(nel * 3);
1008 for (
auto i = 0;
i < sizeA;
i++)
1010 tripletList.push_back(Trip(
i,
i, foam_matrix.diag()[
i]));
1011 tripletList.push_back(Trip(sizeA +
i, sizeA +
i, foam_matrix.diag()[
i]));
1012 tripletList.push_back(Trip(2 * sizeA +
i, 2 * sizeA +
i,
1013 foam_matrix.diag()[
i]));
1016 const lduAddressing& addr = foam_matrix.lduAddr();
1017 const labelList& lowerAddr = addr.lowerAddr();
1018 const labelList& upperAddr = addr.upperAddr();
1021 tripletList.push_back(Trip(lowerAddr[
i], upperAddr[
i], foam_matrix.upper()[
i]));
1022 tripletList.push_back(Trip(lowerAddr[
i] + sizeA, upperAddr[
i] + sizeA,
1023 foam_matrix.upper()[
i]));
1024 tripletList.push_back(Trip(lowerAddr[
i] + sizeA * 2, upperAddr[
i] + sizeA * 2,
1025 foam_matrix.upper()[
i]));
1026 tripletList.push_back(Trip(upperAddr[
i], lowerAddr[
i], foam_matrix.lower()[
i]));
1027 tripletList.push_back(Trip(upperAddr[
i] + sizeA, lowerAddr[
i] + sizeA,
1028 foam_matrix.lower()[
i]));
1029 tripletList.push_back(Trip(upperAddr[
i] + sizeA * 2, lowerAddr[
i] + sizeA * 2,
1030 foam_matrix.lower()[
i]));
1033 forAll(foam_matrix.psi().boundaryField(), I)
1035 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
1038 label w = ptch.faceCells()[J];
1039 tripletList.push_back(Trip(w, w, foam_matrix.internalCoeffs()[I][J][0]));
1040 tripletList.push_back(Trip(w + sizeA, w + sizeA,
1041 foam_matrix.internalCoeffs()[I][J][1]));
1042 tripletList.push_back(Trip(w + sizeA * 2, w + sizeA * 2,
1043 foam_matrix.internalCoeffs()[I][J][2]));
1047 A.setFromTriplets(tripletList.begin(), tripletList.end());
1054 label sizeA = foam_matrix.diag().size();
1057 for (
auto i = 0;
i < sizeA;
i++)
1059 b(
i, 0) = foam_matrix.source()[
i];
1062 forAll(foam_matrix.psi().boundaryField(), I)
1064 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
1067 label w = ptch.faceCells()[J];
1068 b(w, 0) += foam_matrix.boundaryCoeffs()[I][J];
1077 label sizeA = foam_matrix.diag().size();
1078 b.resize(sizeA * 3);
1080 for (
auto i = 0;
i < sizeA;
i++)
1082 b(
i) = foam_matrix.source()[
i][0];
1083 b(sizeA +
i) = foam_matrix.source()[
i][1];
1084 b(2 * sizeA +
i) = foam_matrix.source()[
i][2];
1087 forAll(foam_matrix.psi().boundaryField(), I)
1089 const fvPatch& ptch = foam_matrix.psi().boundaryField()[I].patch();
1092 label w = ptch.faceCells()[J];
1093 b(w) += foam_matrix.boundaryCoeffs()[I][J][0];
1094 b(w + sizeA) += foam_matrix.boundaryCoeffs()[I][J][1];
1095 b(w + sizeA * 2) += foam_matrix.boundaryCoeffs()[I][J][2];
1100template <
class Type,
template <
class>
class PatchField,
class GeoMesh>
1102 GeometricField<Type, PatchField, GeoMesh>& field,
1103 PtrList<GeometricField<Type, PatchField, GeoMesh >> & modes,
1110 Eigen::MatrixXd VolumesN(Volumes.rows(), 1);
1112 if (Volumes.rows() != Eig_Modes.rows())
1114 VolumesN.resize(Eig_Modes.rows(), 1);
1115 VolumesN.col(0).segment(0, Volumes.rows()) = Volumes;
1116 VolumesN.col(0).segment(Volumes.rows() + 1, Volumes.rows() * 2) = Volumes;
1117 VolumesN.col(0).segment(Volumes.rows() * 2 + 1, Volumes.rows() * 3) = Volumes;
1120 fr = Eig_Modes.transpose() * (f.cwiseProduct(VolumesN));
1124template <
class Type,
template <
class>
class PatchField,
class GeoMesh >
1126 fvMatrix<Type>& matrix,
1127 PtrList<GeometricField<Type, PatchField, GeoMesh >> & modes, label Nmodes)
1129 Eigen::SparseMatrix<double>
A;
1136 Eigen::MatrixXd VolumesN(Volumes.rows(), Nmodes);
1138 if (Volumes.rows() != Eig_Modes.rows())
1140 VolumesN.resize(Eig_Modes.rows(), Nmodes);
1143 if (Volumes.rows() == Eig_Modes.rows())
1145 for (
auto i = 0;
i < Nmodes;
i++)
1147 VolumesN.col(
i) = Volumes;
1152 for (
auto i = 0;
i < Nmodes;
i++)
1154 VolumesN.col(
i).segment(0, Volumes.rows()) = Volumes;
1155 VolumesN.col(
i).segment(Volumes.rows() + 1, Volumes.rows() * 2) = Volumes;
1156 VolumesN.col(
i).segment(Volumes.rows() * 2 + 1, Volumes.rows() * 3) = Volumes;
1160 Ar = Eig_Modes.transpose() *
A * Eig_Modes;
1161 br = Eig_Modes.transpose() * b;
1162 std::tuple<Eigen::MatrixXd, Eigen::VectorXd> tupla;
1163 tupla = std::make_tuple(Ar, br);
1167template <
class Type,
template <
class>
class PatchField,
class GeoMesh>
1169 PtrList<GeometricField<Type, PatchField, GeoMesh >> & modes, label Nmodes)
1174 Eigen::MatrixXd VolumesN(Volumes.rows(), Nmodes);
1175 if (Volumes.rows() != Eig_Modes.rows())
1177 VolumesN.resize(Eig_Modes.rows(), Nmodes);
1180 if (Volumes.rows() == Eig_Modes.rows())
1182 for (
auto i = 0;
i < Nmodes;
i++)
1184 VolumesN.col(
i) = Volumes;
1190 for (
auto i = 0;
i < Nmodes;
i++)
1192 VolumesN.col(
i).segment(0, Volumes.rows()) = Volumes;
1193 VolumesN.col(
i).segment(Volumes.rows() + 1, Volumes.rows() * 2) = Volumes;
1194 VolumesN.col(
i).segment(Volumes.rows() * 2 + 1, Volumes.rows() * 3) = Volumes;
1197 Mr = Eig_Modes.transpose() * (Eig_Modes.cwiseProduct(VolumesN));
1201template <
class Type>
1202std::tuple<List<Eigen::SparseMatrix<double >>, List<Eigen::VectorXd >>
1205 List<Eigen::SparseMatrix<double >> SM_list;
1206 List<Eigen::VectorXd> V_list;
1207 label LSize = MatrixList.size();
1208 SM_list.resize(LSize);
1209 V_list.resize(LSize);
1210 Eigen::SparseMatrix<double>
A;
1213 for (label j = 0; j < LSize; j++)
1219 std::tuple<List<Eigen::SparseMatrix<double >>, List<Eigen::VectorXd >> tupla;
1220 tupla = std::make_tuple(SM_list, V_list);
1224template std::tuple<List<Eigen::SparseMatrix<double >>, List<Eigen::VectorXd >>
1226template std::tuple<List<Eigen::SparseMatrix<double >>, List<Eigen::VectorXd >>
1229template <
class type_matrix>
1230Eigen::Matrix<type_matrix, Eigen::Dynamic, Eigen::Dynamic>
1233 Eigen::Matrix<type_matrix, Eigen::Dynamic, Eigen::Dynamic> matrix(list.size(),
1236 for (label
i = 0;
i < matrix.rows();
i++)
1238 matrix(
i, 0) = list[
i];
1244template Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic>
1246template Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
1249template <
class type_matrix>
1251 Eigen::Matrix<type_matrix, Eigen::Dynamic, Eigen::Dynamic> matrix)
1253 if (matrix.cols() == 1)
1255 List<type_matrix> list(matrix.rows());
1257 for (label
i = 0;
i < matrix.rows();
i++)
1259 list[
i] = matrix(
i, 0);
1266 Info <<
"Foam2Eigen::EigenMatrix2List only accepts matrices with 1 column, exiting"
1273 Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic> matrix);
1275 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix);
1280 Eigen::MatrixXd out;
1281 out.resize(label(field.size() * 3), 1);
1283 for (label l = 0; l < field.size(); l++)
1285 for (label j = 0; j < 3; j++)
1287 out(j * field.size() + l, 0) = field[l][j];
1297 Eigen::MatrixXd out;
1298 out.resize(label(field.size()), 1);
1300 for (label l = 0; l < field.size(); l++)
1302 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 Eigen::Map< Eigen::MatrixXd > field2EigenMapBC(GeometricField< scalar, PatchField, GeoMesh > &field, int BC_index)
Map a scalar OpenFOAM field boundary into an Eigen Matrix.
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.