34#include "turbulentTransportModel.H"
44Eigen::MatrixXd
rand(label rows, label cols,
double min,
47 std::srand(
static_cast<long unsigned int>
48 (std::chrono::high_resolution_clock::now().time_since_epoch().count()));
49 Eigen::MatrixXd matr = Eigen::MatrixXd::Random(rows, cols);
50 matr = (matr.array() + 1) / 2;
51 matr = matr.array() * (max - min);
52 matr = matr.array() + min;
56Eigen::MatrixXd
rand(label rows, Eigen::MatrixXd minMax)
58 std::srand(
static_cast<long unsigned int>
59 (std::chrono::high_resolution_clock::now().time_since_epoch().count()));
60 label cols = minMax.rows();
61 Eigen::MatrixXd matr = Eigen::MatrixXd::Random(rows, cols);
62 matr = (matr.array() + 1) / 2;
64 for (label
i = 0;
i < cols;
i++)
66 matr.col(
i) = matr.col(
i).array() * (minMax(
i, 1) - minMax(
i, 0));
67 matr.col(
i) = matr.col(
i).array() + (minMax(
i, 0));
78 if (abs(round(ratio) - ratio) < std::sqrt(SMALL))
95 para->mesh.lookupObject<incompressible::turbulenceModel>(
"turbulenceProperties");
97 if (tur.type() ==
"Stokes" || tur.type() ==
"Maxwell"
98 || tur.type() ==
"laminarModel")
113 List<T> a = ListListOps::combine<List<T >> (doubleList,
114 accessOp<List<T >> ());
116 inplaceUniqueSort(a);
119 uniqueOrder(a, order);
120 List<T> b(order.size());
122 for (label
i = 0;
i < order.size(); ++
i)
126 a.resize(order.size());
140 Eigen::JacobiSVD<Eigen::MatrixXd> svd_holder(origin,
141 Eigen::ComputeThinU | Eigen::ComputeThinV);
143 Eigen::MatrixXd
U = svd_holder.matrixU();
144 Eigen::MatrixXd V = svd_holder.matrixV();
145 Eigen::MatrixXd
D = svd_holder.singularValues();
147 Eigen::MatrixXd
S(V.cols(),
U.cols());
150 for (
unsigned int i = 0;
i <
D.size(); ++
i)
154 S(
i,
i) = 1 /
D(
i, 0);
162 return V *
S *
U.transpose();
167 const word inversionMethod)
169 Info <<
"Inversion method : " << inversionMethod << endl;
171 if (inversionMethod ==
"pinv_eigen_based")
175 else if (inversionMethod ==
"direct")
177 return matrixToInvert.inverse();
179 else if (inversionMethod ==
"fullPivLu")
181 return matrixToInvert.fullPivLu().inverse();
183 else if (inversionMethod ==
"partialPivLu")
185 return matrixToInvert.partialPivLu().inverse();
187 else if (inversionMethod ==
"householderQr")
189 return matrixToInvert.householderQr().solve(Eigen::MatrixXd::Identity(
190 matrixToInvert.rows(), matrixToInvert.cols()));
192 else if (inversionMethod ==
"colPivHouseholderQr")
194 return matrixToInvert.colPivHouseholderQr().inverse();
196 else if (inversionMethod ==
"fullPivHouseholderQr")
198 return matrixToInvert.fullPivHouseholderQr().inverse();
200 else if (inversionMethod ==
"completeOrthogonalDecomposition")
202 return matrixToInvert.completeOrthogonalDecomposition().pseudoInverse();
204 else if (inversionMethod ==
"jacobiSvd")
206 return matrixToInvert.jacobiSvd(Eigen::ComputeThinU |
207 Eigen::ComputeThinV).solve(Eigen::MatrixXd::Identity(matrixToInvert.rows(),
208 matrixToInvert.cols()));
210 else if (inversionMethod ==
"llt")
212 return matrixToInvert.llt().solve(Eigen::MatrixXd::Identity(
213 matrixToInvert.rows(), matrixToInvert.cols()));
215 else if (inversionMethod ==
"ldlt")
217 Eigen::LLT<Eigen::MatrixXd> lltOfA(matrixToInvert);
218 return lltOfA.solve(Eigen::MatrixXd::Identity(matrixToInvert.rows(),
219 matrixToInvert.cols()));
221 else if (inversionMethod ==
"bdcSvd")
223 return matrixToInvert.bdcSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(
224 Eigen::MatrixXd::Identity(matrixToInvert.rows(), matrixToInvert.cols()));
228 Info <<
"Unkwown inversion method, solving with : completeOrthogonalDecomposition"
230 return matrixToInvert.completeOrthogonalDecomposition().pseudoInverse();
Header file of the ITHACAstream class, it contains the implementation of several methods for input ou...
Header file of the ITHACAutilities namespace.
Class for the definition of some general parameters, the parameters must be defined from the file ITH...
static ITHACAparameters * getInstance()
Gets an instance of ITHACAparameters, to be used if the instance is already existing.
Namespace to implement some useful assign operation of OF fields.
bool isInteger(double ratio)
This function checks if ratio is an integer.
Eigen::MatrixXd invertMatrix(Eigen::MatrixXd &matrixToInvert, const word inversionMethod)
Invert a matrix given the method name in the ITHACAdict.
Eigen::MatrixXd pinv_eigen_based(Eigen::MatrixXd &origin, const float er)
Using the Eigen library, using the SVD decomposition method to solve the matrix pseudo-inverse,...
Eigen::MatrixXd rand(label rows, label cols, double min, double max)
Generates random matrix with random values in an interval.
bool isTurbulent()
This function checks if the case is turbulent.
List< T > combineList(List< List< T > > &doubleList)
Combine a list of list into a single list with unique elements.
volScalarField S(IOobject("S", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::AUTO_WRITE), T.mesh(), dimensionedScalar("zero", dimensionSet(0, 0, -1, 1, 0, 0, 0), 0))