20 #ifndef included_ParametricDMDc_h
21 #define included_ParametricDMDc_h
23 #include "manifold_interp/MatrixInterpolator.h"
24 #include "linalg/Matrix.h"
25 #include "linalg/Vector.h"
57 std::vector<Vector*>& parameter_points,
58 std::vector<T*>& dmdcs,
59 std::vector<Matrix*> controls,
60 Matrix*& controls_interpolated,
62 std::string rbf =
"G",
63 std::string interp_method =
"LS",
64 double closest_rbf_val = 0.9,
65 bool reorthogonalize_W =
false)
67 CAROM_VERIFY(parameter_points.size() == dmdcs.size());
68 CAROM_VERIFY(dmdcs.size() > 1);
69 for (
int i = 0; i < dmdcs.size() - 1; i++)
71 CAROM_VERIFY(dmdcs[i]->d_dt == dmdcs[i + 1]->d_dt);
72 CAROM_VERIFY(dmdcs[i]->d_k == dmdcs[i + 1]->d_k);
74 CAROM_VERIFY(closest_rbf_val >= 0.0 && closest_rbf_val <= 1.0);
77 MPI_Initialized(&mpi_init);
79 MPI_Init(
nullptr,
nullptr);
82 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
84 std::vector<CAROM::Matrix*> bases;
85 std::vector<CAROM::Matrix*> A_tildes;
86 std::vector<CAROM::Matrix*> B_tildes;
87 for (
int i = 0; i < dmdcs.size(); i++)
89 bases.push_back(dmdcs[i]->d_basis);
90 A_tildes.push_back(dmdcs[i]->d_A_tilde);
91 B_tildes.push_back(dmdcs[i]->d_B_tilde);
100 rotation_matrices, bases, ref_point,
"B", rbf, interp_method, closest_rbf_val);
105 rotation_matrices, A_tildes, ref_point,
"R", rbf, interp_method,
110 rotation_matrices, B_tildes, ref_point,
"R", rbf, interp_method,
115 rotation_matrices, controls, ref_point,
"R", rbf, interp_method,
118 controls_interpolated = control_interpolator.
interpolate(desired_point);
122 std::vector<std::complex<double>> eigs = eigenpair.
eigs;
128 parametric_dmdc =
new T(eigs, phi_real, phi_imaginary, B_tilde,
129 dmdcs[0]->d_k,dmdcs[0]->d_dt,
130 dmdcs[0]->d_t_offset, dmdcs[0]->d_state_offset, W);
136 for (
auto m : rotation_matrices)
165 std::vector<Vector*>& parameter_points,
166 std::vector<std::string>& dmdc_paths,
167 std::vector<Matrix*> controls,
168 Matrix*& controls_interpolated,
170 std::string rbf =
"G",
171 std::string interp_method =
"LS",
172 double closest_rbf_val = 0.9,
173 bool reorthogonalize_W =
false)
175 std::vector<T*> dmdcs;
176 for (
int i = 0; i < dmdc_paths.size(); i++)
178 T* dmdc =
new T(dmdc_paths[i]);
179 dmdcs.push_back(dmdc);
183 controls_interpolated,
185 rbf, interp_method, closest_rbf_val,
188 for (
int i = 0; i < dmdcs.size(); i++)
Matrix * mult(const Matrix &other) const
Multiplies this Matrix with other and returns the product, reference version.
Matrix * interpolate(Vector *point, bool orthogonalize=false)
Obtain the interpolated reduced matrix of the unsampled parameter point.
void getParametricDMDc(T *¶metric_dmdc, std::vector< Vector * > ¶meter_points, std::vector< T * > &dmdcs, std::vector< Matrix * > controls, Matrix *&controls_interpolated, Vector *desired_point, std::string rbf="G", std::string interp_method="LS", double closest_rbf_val=0.9, bool reorthogonalize_W=false)
Constructor.
struct ComplexEigenPair NonSymmetricRightEigenSolve(Matrix *A)
Computes the eigenvectors/eigenvalues of an NxN real nonsymmetric matrix.
int getClosestPoint(std::vector< Vector * > &points, Vector *test_point)
Get closest point to a test point among a group of points.
std::vector< Matrix * > obtainRotationMatrices(std::vector< Vector * > parameter_points, std::vector< Matrix * > bases, int ref_point)
Obtain the rotation matrices for all the parameter points using the basis of the reference point.
Matrix * ev_real
The real component of the eigenvectors in matrix form.
std::vector< std::complex< double > > eigs
The corresponding complex eigenvalues.
Matrix * ev_imaginary
The imaginary component of the eigenvectors in matrix form.