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 PtrList<GeometricField<Type, PatchField, GeoMesh>>& Lfield, word Name,
456 fileName casename,
int first_snap,
int n_snap)
461 if (!Pstream::parRun())
463 Info <<
"######### Reading the Data for " << Name <<
" #########" << endl;
464 fileName rootpath(
".");
466 Foam::Time runTime2(Foam::Time::controlDictName, rootpath, casename);
468 if (first_snap >= runTime2.times().size())
470 Info <<
"Error the index of the first snapshot must be smaller than the number of snapshots"
477 last_s = runTime2.times().size();
481 last_s = min(runTime2.times().size(), n_snap + 2);
484 for (
int i = 2 + first_snap;
i < last_s + first_snap;
i++)
486 GeometricField<Type, PatchField, GeoMesh> tmp_field(
490 casename + runTime2.times()[
i].name(),
496 Lfield.append(tmp_field.clone());
500 std::cout << std::endl;
504 Info <<
"######### Reading the Data for " << Name <<
" #########" <<
506 word timename(
mesh.time().rootPath() +
"/" +
507 mesh.time().caseName() );
508 timename = timename.substr(0, timename.find_last_of(
"\\/"));
509 timename = timename +
"/" + casename +
"processor" + name(Pstream::myProcNo());
511 "processor" + name(Pstream::myProcNo()) +
"/");
513 if (first_snap > last_s)
515 Info <<
"Error the index of the first snapshot must be smaller than the number of snapshots"
525 last_s = min(last_s, n_snap + 2);
528 for (
int i = 1 + first_snap;
i < last_s + first_snap;
i++)
530 GeometricField<Type, PatchField, GeoMesh> tmp_field(
534 timename +
"/" + name(
i),
540 Lfield.append(tmp_field.clone());
548template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
550 PtrList<GeometricField<Type, PatchField, GeoMesh>>& Lfield,
551 GeometricField<Type, PatchField, GeoMesh>& field,
552 fileName casename,
int first_snap,
int n_snap)
554 if (!Pstream::parRun())
556 Info <<
"######### Reading the Data for " << field.name() <<
" #########" <<
558 fileName rootpath(
".");
559 Foam::Time runTime2(Foam::Time::controlDictName, rootpath, casename);
562 if (first_snap >= runTime2.times().size())
564 Info <<
"Error the index of the first snapshot must be smaller than the number of snapshots"
571 last_s = runTime2.times().size();
575 last_s = min(runTime2.times().size(), n_snap + 2);
578 for (
int i = 2 + first_snap;
i < last_s + first_snap;
i++)
580 GeometricField<Type, PatchField, GeoMesh> tmp_field(
584 casename + runTime2.times()[
i].name(),
590 Lfield.append(tmp_field.clone());
594 std::cout << std::endl;
598 Info <<
"######### Reading the Data for " << field.name() <<
" #########" <<
600 word timename(field.mesh().time().rootPath() +
"/" +
601 field.mesh().time().caseName() );
602 timename = timename.substr(0, timename.find_last_of(
"\\/"));
603 timename = timename +
"/" + casename +
"processor" + name(Pstream::myProcNo());
605 "processor" + name(Pstream::myProcNo()) +
"/");
607 if (first_snap > last_s)
609 Info <<
"Error the index of the first snapshot must be smaller than the number of snapshots"
619 last_s = min(last_s, n_snap + 2);
622 for (
int i = 1 + first_snap;
i < last_s + first_snap;
i++)
624 GeometricField<Type, PatchField, GeoMesh> tmp_field(
628 timename +
"/" + name(
i),
634 Lfield.append(tmp_field.clone());
642template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
644 PtrList<GeometricField<Type, PatchField, GeoMesh>>& Lfield,
645 GeometricField<Type, PatchField, GeoMesh>& field, fileName casename)
649 "No parameter dependent solutions stored into Offline folder");
653 read_fields(Lfield, field, casename + name(par) +
"/");
658template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
660 PtrList<GeometricField<Type, PatchField, GeoMesh>>& Lfield,
661 GeometricField<Type, PatchField, GeoMesh>& field,
666 "No parameter dependent solutions stored into Offline folder");
667 std::cout <<
"######### Reading the Data for " << field.name() <<
" #########"
679 GeometricField<Type, PatchField, GeoMesh> tmpField(
683 casename + name(par) +
"/" + name(last - 1),
689 Lfield.append(tmpField.clone());
696 int number_of_files = 0;
698 in.open(folder +
"/" + MatrixName + name(0) + ext,
699 std::ios::in | std::ios::binary);
700 Info << folder +
"/" + MatrixName + name(0) + ext << endl;
706 in.open(folder +
"/" + MatrixName + name(number_of_files) + ext,
707 std::ios::in | std::ios::binary);
711 return number_of_files;
714template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
716 PtrList<GeometricField<Type, PatchField, GeoMesh>>& field,
717 word folder, word fieldname)
720 Info <<
"######### Exporting the Data for " << fieldname <<
" #########" <<
723 for (
int j = 0; j < field.size() ; j++)
729 std::cout << std::endl;
733 PtrList<GeometricField<scalar, fvPatchField, volMesh>>& field,
734 word folder, word fieldname);
736 PtrList<GeometricField<scalar, fvsPatchField, surfaceMesh>>& field,
737 word folder, word fieldname);
739 PtrList<GeometricField<vector, fvPatchField, volMesh>>& field,
740 word folder, word fieldname);
742 PtrList<GeometricField<tensor, fvPatchField, volMesh>>& field,
743 word folder, word fieldname);
745template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
747 fileName subfolder, fileName folder,
750 if (!Pstream::parRun())
752 mkDir(folder +
"/" + subfolder);
754 GeometricField<Type, PatchField, GeoMesh> act(fieldName, s);
755 fileName fieldname = folder +
"/" + subfolder +
"/" + fieldName;
756 OFstream os(fieldname);
762 mkDir(folder +
"/processor" + name(Pstream::myProcNo()) +
"/" + subfolder);
764 GeometricField<Type, PatchField, GeoMesh> act(fieldName, s);
765 fileName fieldname = folder +
"/processor" + name(Pstream::myProcNo()) +
"/" +
766 subfolder +
"/" + fieldName;
767 std::cout << fieldname << std::endl;
768 OFstream os(fieldname);
775 GeometricField<scalar, fvPatchField, volMesh>& s,
776 fileName subfolder, fileName folder,
779 GeometricField<vector, fvPatchField, volMesh>& s,
780 fileName subfolder, fileName folder,
783 GeometricField<tensor, fvPatchField, volMesh>& s,
784 fileName subfolder, fileName folder,
787 GeometricField<scalar, fvsPatchField, surfaceMesh>& s,
788 fileName subfolder, fileName folder,
791template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
793 fileName subfolder, fileName folder)
795 if (!Pstream::parRun())
797 mkDir(folder +
"/" + subfolder);
799 fileName fieldname = folder +
"/" + subfolder +
"/" + s.name();
800 OFstream os(fieldname);
806 mkDir(folder +
"/processor" + name(Pstream::myProcNo()) +
"/" + subfolder);
808 fileName fieldname = folder +
"/processor" + name(Pstream::myProcNo()) +
"/" +
809 subfolder +
"/" + s.name();
810 OFstream os(fieldname);
817 GeometricField<scalar, fvPatchField, volMesh>& s,
818 fileName subfolder, fileName folder);
820 GeometricField<vector, fvPatchField, volMesh>& s,
821 fileName subfolder, fileName folder);
823 GeometricField<tensor, fvPatchField, volMesh>& s,
824 fileName subfolder, fileName folder);
826 GeometricField<scalar, fvsPatchField, surfaceMesh>& s,
827 fileName subfolder, fileName folder);
830 GeometricField<scalar, pointPatchField, pointMesh>& s,
831 fileName subfolder, fileName folder);
833 GeometricField<vector, pointPatchField, pointMesh>& s,
834 fileName subfolder, fileName folder);
836 GeometricField<tensor, pointPatchField, pointMesh>& s,
837 fileName subfolder, fileName folder);
842 if (!Pstream::parRun())
844 mkDir(folder +
"/" + subfolder);
846 fileName fieldname = folder +
"/" + subfolder +
"/" +
"points";
847 OFstream os(fieldname);
848 os <<
"FoamFile \n { \n version 2.0; \n format ascii; \n class vectorField; \n location ""1 / polyMesh""; \n object points; \n }"
850 os << points << endl;
854 mkDir(folder +
"/processor" + name(Pstream::myProcNo()) +
"/" + subfolder);
856 fileName fieldname = folder +
"/processor" + name(Pstream::myProcNo()) +
"/" +
857 subfolder +
"/" +
"points";
858 OFstream os(fieldname);
859 os <<
"FoamFile \n { \n version 2.0; \n format ascii; \n class vectorField; \n location ""1 / polyMesh""; \n object points; \n }"
861 os << points << endl;
867 int val =
static_cast<int>(percentage * 100);
868 int lpad =
static_cast<int> (percentage *
PBWIDTH);
871 if (Pstream::master())
873 printf (
"\r%3d%% [%.*s%*s]", val, lpad,
PBSTR, rpad,
"");
879void save(
const List<Eigen::SparseMatrix<T>>& MatrixList, word folder,
884 for (
int i = 0;
i < MatrixList.size();
i++)
886 word fileName = folder +
"/" + MatrixName + name(
i) +
".npz";
892void load(List<Eigen::SparseMatrix<T>>& MatrixList, word folder,
895 int number_of_files =
numberOfFiles(folder, MatrixName,
".npz");
896 std::cout <<
"Reading the Matrix " + folder +
"/" + MatrixName << std::endl;
898 "Check if the file you are trying to read exists" );
899 MatrixList.resize(0);
900 Eigen::SparseMatrix<T>
A;
902 for (
int i = 0;
i < number_of_files;
i++)
904 cnpy::load(
A, folder +
"/" + MatrixName + name(
i) +
".npz");
905 MatrixList.append(
A);
911 fileName casename,
int first_snap,
int n_snap);
914 fileName casename,
int first_snap,
int n_snap);
917 fileName casename,
int first_snap,
int n_snap);
920 fileName casename,
int first_snap,
int n_snap);
923 fileName casename,
int first_snap,
int n_snap);
925 volScalarField& field, fileName casename,
int first_snap,
int n_snap);
927 volVectorField& field, fileName casename,
int first_snap,
int n_snap);
929 volTensorField& field, fileName casename,
int first_snap,
int n_snap);
931 surfaceScalarField& field, fileName casename,
int first_snap,
int n_snap);
933 surfaceVectorField& field, fileName casename,
int first_snap,
int n_snap);
935 volScalarField& field, fileName casename);
937 volVectorField& field, fileName casename);
939 volTensorField& field, fileName casename);
941 Lfield, surfaceScalarField& field, fileName casename);
943 Lfield, surfaceVectorField& field, fileName casename);
945 volScalarField& field, fileName casename);
947 volVectorField& field, fileName casename);
949 volTensorField& field, fileName casename);
951 Lfield, surfaceScalarField& field, fileName casename);
953 Lfield, surfaceVectorField& field, fileName casename);
959 word fieldname = folder + filename;
960 OFstream os(fieldname);
962 for (
int i = 0;
i < list.size();
i++)
964 os << list[
i] << endl;
975template void save(
const List<Eigen::SparseMatrix<double>>& MatrixList,
976 word folder, word MatrixName);
978template void load(List<Eigen::SparseMatrix<double>>& MatrixList, word folder,