43template<
typename Type>
47 Eigen::SparseMatrix<double>
A;
54template <
typename T,
int dim>
59 std::string message =
"The extension \"" + type +
60 "\" was not implemented. Check the list of possible extensions.";
61 M_Assert(type ==
"python" || type ==
"matlab"
62 || type ==
"eigen", message.c_str()
70 OFstream str(folder +
"/" + Name +
"_mat" + est);
71 str << Name <<
"=np.array([";
73 for (
int i = 0;
i < matrix.rows();
i++)
75 for (
int j = 0; j < matrix.cols(); j++)
79 str <<
"[" << setprecision(10) << matrix(
i, j);
83 str <<
"," << setprecision(10) << matrix(
i, j);
87 if (
i != (matrix.rows() - 1))
99 OFstream str(folder +
"/" + Name +
"_mat" + est);
102 for (
int i = 0;
i < matrix.rows();
i++)
104 for (
int j = 0; j < matrix.cols(); j++)
106 str <<
" " << setprecision(10) << matrix(
i, j);
109 if (
i != (matrix.rows() - 1))
120 const static Eigen::IOFormat CSVFormat(6,
false,
", ",
"\n");
123 ofs.open (folder +
"/" + Name +
"_mat.txt");
125 for (
int i = 0;
i < matrix.rows();
i++)
127 for (
int j = 0; j < matrix.cols(); j++)
135 ofs <<
" " << matrix(
i, j);
139 if (
i != (matrix.rows() - 1))
150 -1 > & matrix, word Name, word type,
154 -1 > & matrix, word Name, word type,
158 -1 > & matrix, word Name, word type,
162 1 > & matrix, word Name, word type,
166 1 > & matrix, word Name, word type,
170 1 > & matrix, word Name, word type,
174 word type, word folder)
176 std::string message =
"The extension \"" + type +
177 "\" was not implemented. Check the list of possible extensions.";
178 M_Assert(type ==
"python" || type ==
"matlab"
179 || type ==
"eigen", message.c_str()
185 if (type ==
"python")
188 OFstream str(folder +
"/" + Name +
"_mat" + est);
189 str << Name <<
"=np.zeros([" << matrix.size() <<
"," << matrix[0].rows() <<
190 "," << matrix[0].cols() <<
"])\n";
192 for (
int i = 0;
i < matrix.size();
i++)
194 str << Name <<
"[" <<
i <<
",:,:]=np.array([";
196 for (
int j = 0; j < matrix[0].rows(); j++)
198 for (
int k = 0; k < matrix[0].cols(); k++)
202 str <<
"[" << setprecision(10) << matrix[
i](j, k);
206 str <<
"," << setprecision(10) << matrix[
i](j, k);
210 if (j != (matrix[0].rows() - 1))
216 str <<
"]])\n" << endl;
220 else if (type ==
"matlab")
223 OFstream str(folder +
"/" + Name +
"_mat" + est);
225 for (
int i = 0;
i < matrix.size();
i++)
227 str << Name <<
"(" <<
i + 1 <<
",:,:)=[";
229 for (
int j = 0; j < matrix[0].rows(); j++)
231 for (
int k = 0; k < matrix[0].cols(); k++)
233 str <<
" " << setprecision(10) << matrix[
i](j, k);
236 if (j != (matrix[0].rows() - 1))
245 else if (type ==
"eigen")
247 for (
int i = 0;
i < matrix.size();
i++)
249 word Namei = Name + name(
i);
256 word Name, word type,
259 Eigen::MatrixXd matrix = vector;
265 word type, word folder)
267 std::string message =
"The extension \"" + type +
268 "\" was not implemented. Check the list of possible extensions.";
269 M_Assert(type ==
"python" || type ==
"matlab"
270 || type ==
"eigen", message.c_str()
276 if (type ==
"python")
279 OFstream str(folder +
"/" + Name +
"_mat" + est);
280 str << Name <<
"=np.zeros([" << tensor.dimension(0) <<
"," <<
287 for (
int i = 0;
i < tensor.dimension(0);
i++)
289 str << Name <<
"[" <<
i <<
",:,:]=np.array([";
314 str <<
"]])\n" << endl;
318 else if (type ==
"matlab")
321 OFstream str(folder +
"/" + Name +
"_mat" + est);
323 for (
int i = 0;
i < tensor.dimension(0);
i++)
325 str << Name <<
"(" <<
i + 1 <<
",:,:)=[";
347 else if (type ==
"eigen")
349 for (
int i = 0;
i < tensor.dimension(0);
i++)
352 word Namei = Name + name(
i);
362 word type, word folder);
366 word type, word folder);
370 word type, word folder);
376 struct dirent* entry;
377 dirp = opendir(folder.c_str());
378 List <Eigen::MatrixXd> result;
380 while ((entry = readdir(dirp)) != NULL)
382 if (entry->d_type == DT_REG)
390 for (
int j = 0; j < file_count ; j++)
392 word matname = folder +
"/" + mat_name + name(j) +
"_mat.txt";
402 int cols = 0, rows = 0;
405 std::ifstream infile;
406 infile.open(filename.c_str());
407 std::string message =
"The matrix file \"" + filename +
408 "\" does not exist. Check the existence of the file or the way it is named.";
409 M_Assert(infile.good() != 0, message.c_str()
412 while (! infile.eof())
415 getline(infile, line);
417 std::stringstream stream(line);
419 while (! stream.eof())
421 stream >> buff[cols * rows + temp_cols++];
440 Eigen::MatrixXd result(rows, cols);
442 for (
int i = 0;
i < rows;
i++)
444 for (
int j = 0; j < cols; j++)
446 result(
i, j) = buff[ cols *
i + j ];
453template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
455 const GeometricField<Type, PatchField, GeoMesh>& field,
459 if (!Pstream::parRun())
461 fileName rootpath(
".");
462 Foam::Time runTime2(Foam::Time::controlDictName, rootpath, casename);
464 if (index >= runTime2.times().size() - 2)
467 <<
"Error: Index " << index <<
" is out of range. "
468 <<
"Maximum available index is " << runTime2.times().size() - 3
472 return GeometricField<Type, PatchField, GeoMesh>
477 casename +
"/" + runTime2.times()[index + 2].name(),
486 word timename(field.mesh().time().rootPath() +
"/" +
487 field.mesh().time().caseName());
488 timename = timename.substr(0, timename.find_last_of(
"\\/"));
489 timename = timename +
"/" + casename +
"/" +
"processor" + name(Pstream::myProcNo());
491 "processor" + name(Pstream::myProcNo()));
493 if (index >= last_s - 1)
496 <<
"Error: Index " << index <<
" is out of range. "
497 <<
"Maximum available index is " << last_s - 2
501 return GeometricField<Type, PatchField, GeoMesh>
506 timename +
"/" + name(index + 1),
515template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
517 PtrList<GeometricField<Type, PatchField, GeoMesh >> & Lfield, word Name,
518 fileName casename,
int first_snap,
int n_snap)
522 if (!Pstream::parRun())
524 Info <<
"######### Reading the Data for " << Name <<
" #########" << endl;
525 fileName rootpath(
".");
527 Foam::Time runTime2(Foam::Time::controlDictName, rootpath, casename);
528 if (first_snap >= runTime2.times().size())
530 Info <<
"Error the index of the first snapshot must be smaller than the number of snapshots"
537 last_s = runTime2.times().size();
541 last_s = min(runTime2.times().size(), n_snap + 2);
543 for (
int i = 2 + first_snap;
i < last_s + first_snap;
i++)
545 GeometricField<Type, PatchField, GeoMesh> tmp_field(
549 casename +
"/" + runTime2.times()[
i].name(),
555 Lfield.append(tmp_field.clone());
558 std::cout << std::endl;
562 Info <<
"######### Reading the Data for " << Name <<
" #########" <<
564 word timename(
mesh.time().rootPath() +
"/" +
565 mesh.time().caseName() );
566 timename = timename.substr(0, timename.find_last_of(
"\\/"));
567 timename = timename +
"/" + casename +
"/" +
"processor" + name(Pstream::myProcNo());
569 "processor" + name(Pstream::myProcNo()) +
"/");
571 if (first_snap > last_s)
573 Info <<
"Error the index of the first snapshot must be smaller than the number of snapshots"
583 last_s = min(last_s, n_snap + 2);
586 for (
int i = 1 + first_snap;
i < last_s + first_snap;
i++)
588 GeometricField<Type, PatchField, GeoMesh> tmp_field(
592 timename +
"/" + name(
i),
598 Lfield.append(tmp_field.clone());
606template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
608 PtrList<GeometricField<Type, PatchField, GeoMesh >> & Lfield,
609 GeometricField<Type, PatchField, GeoMesh>& field,
610 fileName casename,
int first_snap,
int n_snap)
612 if (!Pstream::parRun())
614 Info <<
"######### Reading the Data for " << field.name() <<
" #########" <<
616 fileName rootpath(
".");
617 Foam::Time runTime2(Foam::Time::controlDictName, rootpath, casename);
620 if (first_snap >= runTime2.times().size())
622 Info <<
"Error the index of the first snapshot must be smaller than the number of snapshots"
629 last_s = runTime2.times().size();
633 last_s = min(runTime2.times().size(), n_snap + 2);
636 for (
int i = 2 + first_snap;
i < last_s + first_snap;
i++)
638 GeometricField<Type, PatchField, GeoMesh> tmp_field(
642 casename +
"/" + runTime2.times()[
i].name(),
648 Lfield.append(tmp_field.clone());
652 std::cout << std::endl;
656 Info <<
"######### Reading the Data for " << field.name() <<
" #########" <<
658 word timename(field.mesh().time().rootPath() +
"/" +
659 field.mesh().time().caseName() );
660 timename = timename.substr(0, timename.find_last_of(
"\\/"));
661 timename = timename +
"/" + casename +
"/" +
"processor" + name(Pstream::myProcNo());
663 "processor" + name(Pstream::myProcNo()) +
"/");
665 if (first_snap > last_s)
667 Info <<
"Error the index of the first snapshot must be smaller than the number of snapshots"
677 last_s = min(last_s, n_snap + 2);
680 for (
int i = 1 + first_snap;
i < last_s + first_snap;
i++)
682 GeometricField<Type, PatchField, GeoMesh> tmp_field(
686 timename +
"/" + name(
i),
692 Lfield.append(tmp_field.clone());
700template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
702 PtrList<GeometricField<Type, PatchField, GeoMesh >> & Lfield,
703 GeometricField<Type, PatchField, GeoMesh>& field, fileName casename)
707 "No parameter dependent solutions stored into Offline folder");
711 read_fields(Lfield, field, casename +
"/" + name(par));
716template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
718 PtrList<GeometricField<Type, PatchField, GeoMesh >> & Lfield,
719 GeometricField<Type, PatchField, GeoMesh>& field,
724 "No parameter dependent solutions stored into Offline folder");
725 std::cout <<
"######### Reading the Data for " << field.name() <<
" #########"
737 GeometricField<Type, PatchField, GeoMesh> tmpField(
741 casename +
"/" + name(par) +
"/" + name(last - 1),
747 Lfield.append(tmpField.clone());
752template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
754 PtrList<GeometricField<Type, PatchField, GeoMesh >> & Lfield,
755 const GeometricField<Type, PatchField, GeoMesh>& field,
756 const fileName casename)
758 if (!Pstream::parRun())
760 Info <<
"######### Reading the Data for " << field.name() <<
" #########" <<
762 fileName rootpath(
".");
763 Foam::Time runTime2(Foam::Time::controlDictName, rootpath, casename);
764 int last_s (runTime2.times().size());
765#if defined(OFVER) && (OFVER >= 2212)
771 casename +
"/" + runTime2.times()[last_s - 1].name(),
779 autoPtr<GeometricField<Type, PatchField, GeoMesh >>::New
784 casename +
"/" + runTime2.times()[last_s - 1].name(),
790 Lfield.append(std::move(tfld));
792 std::cout << std::endl;
797 Info <<
"######### Reading the Data for " << field.name() <<
" #########" <<
799 word timename(field.mesh().time().rootPath() +
"/" +
800 field.mesh().time().caseName() );
801 timename = timename.substr(0, timename.find_last_of(
"\\/"));
802 timename = timename +
"/" + casename +
"/" +
"processor" + name(Pstream::myProcNo());
804 "processor" + name(Pstream::myProcNo()));
805#if defined(OFVER) && (OFVER >= 2212)
811 timename +
"/" + name(last_s - 1),
819 autoPtr<GeometricField<Type, PatchField, GeoMesh >>::New
824 timename +
"/" + name(last_s - 1),
830 Lfield.append(std::move(tfld));
836template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
838 PtrList<GeometricField<Type, PatchField, GeoMesh >> & Lfield,
839 const GeometricField<Type, PatchField, GeoMesh>& field,
840 const fileName casename)
844 "No parameter dependent solutions stored into Offline folder");
855 int number_of_files = 0;
857 in.open(folder +
"/" + MatrixName + name(0) + ext,
858 std::ios::in | std::ios::binary);
859 Info << folder +
"/" + MatrixName + name(0) + ext << endl;
865 in.open(folder +
"/" + MatrixName + name(number_of_files) + ext,
866 std::ios::in | std::ios::binary);
870 return number_of_files;
873template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
875 PtrList<GeometricField<Type, PatchField, GeoMesh >> & field,
876 word folder, word fieldname)
879 Info <<
"######### Exporting the Data for " << fieldname <<
" #########" <<
881 for (
int j = 0; j < field.size() ; j++)
887 std::cout << std::endl;
891 PtrList<GeometricField<scalar, fvPatchField, volMesh >>& field,
892 word folder, word fieldname);
894 PtrList<GeometricField<scalar, fvsPatchField, surfaceMesh >> & field,
895 word folder, word fieldname);
897 PtrList<GeometricField<vector, fvPatchField, volMesh >>& field,
898 word folder, word fieldname);
900 PtrList<GeometricField<tensor, fvPatchField, volMesh >> & field,
901 word folder, word fieldname);
903template<
class Type,
template<
class>
class PatchField,
class GeoMesh >
905 fileName subfolder, fileName folder,
908 if (!Pstream::parRun())
910 mkDir(folder +
"/" + subfolder);
912 GeometricField<Type, PatchField, GeoMesh> act(fieldName, s);
913 fileName fieldname = folder +
"/" + subfolder +
"/" + fieldName;
914 OFstream os(fieldname);
920 mkDir(folder +
"/processor" + name(Pstream::myProcNo()) +
"/" + subfolder);
922 GeometricField<Type, PatchField, GeoMesh> act(fieldName, s);
923 fileName fieldname = folder +
"/processor" + name(Pstream::myProcNo()) +
"/" +
924 subfolder +
"/" + fieldName;
925 std::cout << fieldname << std::endl;
926 OFstream os(fieldname);
933 GeometricField<scalar, fvPatchField, volMesh>& s,
934 fileName subfolder, fileName folder,
937 GeometricField<vector, fvPatchField, volMesh>& s,
938 fileName subfolder, fileName folder,
941 GeometricField<tensor, fvPatchField, volMesh>& s,
942 fileName subfolder, fileName folder,
945 GeometricField<scalar, fvsPatchField, surfaceMesh>& s,
946 fileName subfolder, fileName folder,
949template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
951 fileName subfolder, fileName folder)
953 if (!Pstream::parRun())
955 mkDir(folder +
"/" + subfolder);
957 fileName fieldname = folder +
"/" + subfolder +
"/" + s.name();
958 OFstream os(fieldname);
964 mkDir(folder +
"/processor" + name(Pstream::myProcNo()) +
"/" + subfolder);
966 fileName fieldname = folder +
"/processor" + name(Pstream::myProcNo()) +
"/" +
967 subfolder +
"/" + s.name();
968 OFstream os(fieldname);
975 GeometricField<scalar, fvPatchField, volMesh>& s,
976 fileName subfolder, fileName folder);
978 GeometricField<vector, fvPatchField, volMesh>& s,
979 fileName subfolder, fileName folder);
981 GeometricField<tensor, fvPatchField, volMesh>& s,
982 fileName subfolder, fileName folder);
984 GeometricField<scalar, fvsPatchField, surfaceMesh>& s,
985 fileName subfolder, fileName folder);
988 GeometricField<scalar, pointPatchField, pointMesh>& s,
989 fileName subfolder, fileName folder);
991 GeometricField<vector, pointPatchField, pointMesh>& s,
992 fileName subfolder, fileName folder);
994 GeometricField<tensor, pointPatchField, pointMesh>& s,
995 fileName subfolder, fileName folder);
1000 if (!Pstream::parRun())
1002 mkDir(folder +
"/" + subfolder);
1004 fileName fieldname = folder +
"/" + subfolder +
"/" +
"points";
1005 OFstream os(fieldname);
1006 os <<
"FoamFile \n { \n version 2.0; \n format ascii; \n class vectorField; \n location ""1 / polyMesh""; \n object points; \n }"
1008 os << points << endl;
1012 mkDir(folder +
"/processor" + name(Pstream::myProcNo()) +
"/" + subfolder);
1014 fileName fieldname = folder +
"/processor" + name(Pstream::myProcNo()) +
"/" +
1015 subfolder +
"/" +
"points";
1016 OFstream os(fieldname);
1017 os <<
"FoamFile \n { \n version 2.0; \n format ascii; \n class vectorField; \n location ""1 / polyMesh""; \n object points; \n }"
1019 os << points << endl;
1025 int val =
static_cast<int>(percentage * 100);
1026 int lpad =
static_cast<int> (percentage *
PBWIDTH);
1029 if (Pstream::master())
1031 printf (
"\r%3d%% [%.*s%*s]", val, lpad,
PBSTR, rpad,
"");
1037void save(
const List<Eigen::SparseMatrix<T >> & MatrixList, word folder,
1041 for (
int i = 0;
i < MatrixList.size();
i++)
1043 word fileName = folder +
"/" + MatrixName + name(
i) +
".npz";
1049void load(List<Eigen::SparseMatrix<T >> & MatrixList, word folder,
1052 int number_of_files =
numberOfFiles(folder, MatrixName,
".npz");
1053 std::cout <<
"Reading the Matrix " + folder +
"/" + MatrixName << std::endl;
1055 "Check if the file you are trying to read exists" );
1056 MatrixList.resize(0);
1057 Eigen::SparseMatrix<T>
A;
1059 for (
int i = 0;
i < number_of_files;
i++)
1061 cnpy::load(
A, folder +
"/" + MatrixName + name(
i) +
".npz");
1062 MatrixList.append(
A);
1068 fileName casename,
int first_snap,
int n_snap);
1071 fileName casename,
int first_snap,
int n_snap);
1074 fileName casename,
int first_snap,
int n_snap);
1077 fileName casename,
int first_snap,
int n_snap);
1080 fileName casename,
int first_snap,
int n_snap);
1082 volScalarField& field, fileName casename,
int first_snap,
int n_snap);
1084 volVectorField& field, fileName casename,
int first_snap,
int n_snap);
1086 volTensorField& field, fileName casename,
int first_snap,
int n_snap);
1088 surfaceScalarField& field, fileName casename,
int first_snap,
int n_snap);
1090 surfaceVectorField& field, fileName casename,
int first_snap,
int n_snap);
1092 volScalarField& field, fileName casename);
1094 volVectorField& field, fileName casename);
1096 volTensorField& field, fileName casename);
1098 Lfield, surfaceScalarField& field, fileName casename);
1100 Lfield, surfaceVectorField& field, fileName casename);
1102 volScalarField& field, fileName casename);
1104 volVectorField& field, fileName casename);
1106 volTensorField& field, fileName casename);
1108 Lfield, surfaceScalarField& field, fileName casename);
1110 Lfield, surfaceVectorField& field, fileName casename);
1113 const volScalarField& field,
const fileName casename);
1115 const volVectorField& field,
const fileName casename);
1117 const volTensorField& field,
const fileName casename);
1119 const surfaceScalarField& field,
const fileName casename);
1121 const surfaceVectorField& field,
const fileName casename);
1123 const volScalarField& field,
const fileName casename);
1125 const volVectorField& field,
const fileName casename);
1127 const volTensorField& field,
const fileName casename);
1129 Lfield,
const surfaceScalarField& field,
const fileName casename);
1131 Lfield,
const surfaceVectorField& field,
const fileName casename);
1137 word fieldname = folder +
"/" + filename;
1138 OFstream os(fieldname);
1140 for (
int i = 0;
i < list.size();
i++)
1142 os << list[
i] << endl;
1153template void save(
const List<Eigen::SparseMatrix<double >> & MatrixList,
1154 word folder, word MatrixName);
1156template void load(List<Eigen::SparseMatrix<double >>& MatrixList, word folder,
1160template GeometricField<scalar, fvPatchField, volMesh>
1162 const GeometricField<scalar, fvPatchField, volMesh>&,
1166template GeometricField<vector, fvPatchField, volMesh>
1168 const GeometricField<vector, fvPatchField, volMesh>&,
1172template GeometricField<tensor, fvPatchField, volMesh>
1174 const GeometricField<tensor, fvPatchField, volMesh>&,
1178template GeometricField<scalar, fvsPatchField, surfaceMesh>
1180 const GeometricField<scalar, fvsPatchField, surfaceMesh>&,
1184template GeometricField<vector, fvsPatchField, surfaceMesh>
1186 const GeometricField<vector, fvsPatchField, surfaceMesh>&,