1 #include "hyper_reduction_comparison.h" 2 #include "reduced_order/pod_basis_offline.h" 3 #include "parameters/all_parameters.h" 4 #include "flow_solver/flow_solver.h" 5 #include "flow_solver/flow_solver_factory.h" 6 #include "ode_solver/ode_solver_factory.h" 7 #include "reduced_order/assemble_ECSW_residual.h" 8 #include "reduced_order/assemble_ECSW_jacobian.h" 9 #include "linear_solver/NNLS_solver.h" 10 #include "linear_solver/helper_functions.h" 11 #include "reduced_order/pod_adaptive_sampling.h" 12 #include "rom_import_helper_functions.h" 13 #include <eigen/Eigen/Dense> 20 template <
int dim,
int nstate>
22 const dealii::ParameterHandler ¶meter_handler_input)
24 , parameter_handler(parameter_handler_input)
27 template <
int dim,
int nstate>
36 template <
int dim,
int nstate>
38 bool file_found =
false;
39 Epetra_MpiComm epetra_comm(MPI_COMM_WORLD);
44 std::vector<std::filesystem::path> files_in_directory;
45 std::copy(std::filesystem::directory_iterator(path), std::filesystem::directory_iterator(), std::back_inserter(files_in_directory));
46 std::sort(files_in_directory.begin(), files_in_directory.end());
48 for (
const auto & entry : files_in_directory){
49 if(std::string(entry.filename()).std::string::find(
"weights") != std::string::npos){
50 pcout <<
"Processing " << entry << std::endl;
52 std::ifstream myfile(entry);
55 pcout <<
"Error opening file." << std::endl;
60 while(std::getline(myfile, line)){
61 std::istringstream stream(line);
63 while (getline(stream, field,
' ')) {
78 weights_eig.resize(rows);
83 while(std::getline(myfile, line)){
84 std::istringstream stream(line);
86 while (getline(stream, field,
' ')) {
92 double num_string = std::stod(field);
93 weights_eig(row) = num_string;
105 Epetra_CrsMatrix epetra_system_matrix = dg->system_matrix.trilinos_matrix();
106 const int n_quad_pts = dg->volume_quadrature_collection[dg->all_parameters->flow_solver_param.poly_degree].size();
107 const int length = epetra_system_matrix.NumMyRows()/(nstate*n_quad_pts);
108 int *local_elements =
new int[length];
110 for (
const auto &cell : dg->dof_handler.active_cell_iterators())
112 if (cell->is_locally_owned()){
113 local_elements[ctr] = cell->active_cell_index();
118 Epetra_Map ColMap(rows, length, local_elements, 0, epetra_comm);
119 ColMap.Print(std::cout);
120 Epetra_Vector weights(ColMap);
121 for(
int i = 0; i < length; i++){
122 int global_ind = local_elements[i];
123 weights[i] = weights_eig(global_ind);
126 ptr_weights = std::make_shared<Epetra_Vector>(weights);
130 template <
int dim,
int nstate>
133 pcout <<
"Starting error evaluation for ROM and HROM at one parameter location..." << std::endl;
135 Epetra_MpiComm Comm( MPI_COMM_WORLD );
147 auto ode_solver_type = Parameters::ODESolverParam::ODESolverEnum::hyper_reduced_petrov_galerkin_solver;
152 if (this->all_parameters->hyper_reduction_param.adapt_sampling_bool) {
153 parameter_sampling->run_sampling();
156 pcout <<
"Construct instance of Assembler..."<< std::endl;
157 std::shared_ptr<HyperReduction::AssembleECSWBase<dim,nstate>> constructor_NNLS_problem;
158 if (this->all_parameters->hyper_reduction_param.training_data ==
"residual")
159 constructor_NNLS_problem = std::make_shared<HyperReduction::AssembleECSWRes<dim,nstate>>(
all_parameters,
parameter_handler, flow_solver_hyper_reduced_petrov_galerkin->dg, parameter_sampling->current_pod, parameter_sampling->snapshot_parameters, ode_solver_type, Comm);
161 constructor_NNLS_problem = std::make_shared<HyperReduction::AssembleECSWJac<dim,nstate>>(
all_parameters,
parameter_handler, flow_solver_hyper_reduced_petrov_galerkin->dg, parameter_sampling->current_pod, parameter_sampling->snapshot_parameters, ode_solver_type, Comm);
163 pcout <<
"Build Problem..."<< std::endl;
164 constructor_NNLS_problem->build_problem();
168 const int rank = Comm.MyPID();
169 int rows = (constructor_NNLS_problem->A_T->trilinos_matrix()).NumGlobalCols();
170 Epetra_Map bMap(rows, (rank == 0) ? rows: 0, 0, Comm);
171 Epetra_Vector b_Epetra(bMap);
172 auto b = constructor_NNLS_problem->b;
173 unsigned int local_length = bMap.NumMyElements();
174 for(
unsigned int i = 0 ; i < local_length ; i++){
179 pcout <<
"Create NNLS problem..."<< std::endl;
180 NNLSSolver NNLS_prob(all_parameters, parameter_handler, constructor_NNLS_problem->A_T->trilinos_matrix(),
true, Comm, b_Epetra);
181 pcout <<
"Solve NNLS problem..."<< std::endl;
182 exit_con = NNLS_prob.solve();
183 pcout << exit_con << std::endl;
186 pcout <<
"ECSW Weights"<< std::endl;
192 std::string path = all_parameters->reduced_order_param.path_to_search;
198 pcout <<
"File with snapshots not found in folder" << std::endl;
201 std::shared_ptr<ProperOrthogonalDecomposition::OfflinePOD<dim>> pod_petrov_galerkin = std::make_shared<ProperOrthogonalDecomposition::OfflinePOD<dim>>(flow_solver_petrov_galerkin->dg);
202 parameter_sampling->current_pod->basis = pod_petrov_galerkin->basis;
203 parameter_sampling->current_pod->referenceState = pod_petrov_galerkin->referenceState;
204 parameter_sampling->current_pod->snapshotMatrix = pod_petrov_galerkin->snapshotMatrix;
206 bool weights_found =
getWeightsFromFile(flow_solver_hyper_reduced_petrov_galerkin->dg);
208 pcout <<
"ECSW Weights" << std::endl;
212 pcout <<
"File with weights not found in folder" << std::endl;
219 ode_solver_type = Parameters::ODESolverParam::ODESolverEnum::pod_petrov_galerkin_solver;
221 flow_solver_petrov_galerkin->ode_solver->allocate_ode_system();
225 ode_solver_type = Parameters::ODESolverParam::ODESolverEnum::hyper_reduced_petrov_galerkin_solver;
227 flow_solver_hyper_reduced_petrov_galerkin->ode_solver->allocate_ode_system();
230 pcout <<
"Implicit Solve Results"<< std::endl;
231 flow_solver_implicit->run();
232 pcout <<
"PG Solve Results"<< std::endl;
233 flow_solver_petrov_galerkin->ode_solver->steady_state();
234 pcout <<
"Hyper Reduced PG Solve Results"<< std::endl;
235 flow_solver_hyper_reduced_petrov_galerkin->ode_solver->steady_state();
238 dealii::LinearAlgebra::distributed::Vector<double> implicit_solution(flow_solver_implicit->dg->solution);
239 dealii::LinearAlgebra::distributed::Vector<double> petrov_galerkin_solution(flow_solver_petrov_galerkin->dg->solution);
240 dealii::LinearAlgebra::distributed::Vector<double> hyper_reduced_petrov_galerkin_solution(flow_solver_hyper_reduced_petrov_galerkin->dg->solution);
243 dealii::LinearAlgebra::ReadWriteVector<double> write_implicit_solution(flow_solver_implicit->dg->solution.size());
244 write_implicit_solution.import(flow_solver_implicit->dg->solution, dealii::VectorOperation::values::insert);
245 std::ofstream out_file_imp(
"implicit_solution.txt");
246 for(
unsigned int i = 0 ; i < write_implicit_solution.size() ; i++){
247 out_file_imp <<
" " << std::setprecision(17) << write_implicit_solution(i) <<
" \n";
249 out_file_imp.close();
251 dealii::LinearAlgebra::ReadWriteVector<double> write_pg_solution(flow_solver_petrov_galerkin->dg->solution.size());
252 write_pg_solution.import(flow_solver_petrov_galerkin->dg->solution, dealii::VectorOperation::values::insert);
253 std::ofstream out_file_pg(
"pg_solution.txt");
254 for(
unsigned int i = 0 ; i < write_pg_solution.size() ; i++){
255 out_file_pg <<
" " << std::setprecision(17) << write_pg_solution(i) <<
" \n";
259 dealii::LinearAlgebra::ReadWriteVector<double> write_hyp_solution(flow_solver_hyper_reduced_petrov_galerkin->dg->solution.size());
260 write_hyp_solution.import(flow_solver_hyper_reduced_petrov_galerkin->dg->solution, dealii::VectorOperation::values::insert);
261 std::ofstream out_file_hyp(
"hyp_solution.txt");
262 for(
unsigned int i = 0 ; i < write_hyp_solution.size() ; i++){
263 out_file_hyp <<
" " << std::setprecision(17) << write_hyp_solution(i) <<
" \n";
265 out_file_hyp.close();
268 double petrov_galerkin_solution_error = ((petrov_galerkin_solution-=implicit_solution).l2_norm()/implicit_solution.l2_norm());
269 double hyper_reduced_solution_error = ((hyper_reduced_petrov_galerkin_solution-=implicit_solution).l2_norm()/implicit_solution.l2_norm());
271 double petrov_galerkin_func_error = functional_petrov_galerkin->evaluate_functional(
false,
false) - functional_implicit->evaluate_functional(
false,
false);
272 double hyper_reduced_func_error = functional_hyper_reduced_petrov_galerkin->evaluate_functional(
false,
false) - functional_implicit->evaluate_functional(
false,
false);
274 pcout <<
"Petrov-Galerkin solution error: " << petrov_galerkin_solution_error << std::endl
275 <<
"Petrov-Galerkin functional error: " << petrov_galerkin_func_error << std::endl;
277 pcout <<
"Hyper-Reduced Petrov-Galerkin solution error: " << hyper_reduced_solution_error << std::endl
278 <<
"Hyper-Reduced Petrov-Galerkin functional error: " << hyper_reduced_func_error << std::endl;
280 if (std::abs(petrov_galerkin_solution_error) < 1E-6 && std::abs(petrov_galerkin_func_error) < 1E-4 && exit_con){
static std::shared_ptr< ODESolverBase< dim, real, MeshType > > create_ODESolver_manual(Parameters::ODESolverParam::ODESolverEnum ode_solver_type, std::shared_ptr< DGBase< dim, real, MeshType > > dg_input)
Creates either implicit or explicit ODE solver based on manual input (no POD basis given) ...
HyperReductionComparison(const Parameters::AllParameters *const parameters_input, const dealii::ParameterHandler ¶meter_handler_input)
Constructor.
Files for the baseline physics.
bool getWeightsFromFile(std::shared_ptr< DGBase< dim, double >> &dg) const
Read ECSW weights from the text file.
ReducedOrderModelParam reduced_order_param
Contains parameters for the Reduced-Order model.
std::string path_to_search
Path to search for snapshots or saved POD basis.
Main parameter class that contains the various other sub-parameter classes.
ODESolverParam ode_solver_param
Contains parameters for ODE solver.
static std::unique_ptr< FlowSolver< dim, nstate > > select_flow_case(const Parameters::AllParameters *const parameters_input, const dealii::ParameterHandler ¶meter_handler_input)
Factory to return the correct flow solver given input file.
const Parameters::AllParameters *const all_parameters
Pointer to all parameters.
Parameters::AllParameters reinit_params(const int max_iter) const
Reinitialize parameters.
std::shared_ptr< Epetra_Vector > ptr_weights
Ptr vector of ECSW Weights.
const dealii::ParameterHandler & parameter_handler
Dummy parameter handler because flowsolver requires it.
MatrixXd snapshot_parameters
Matrix of snapshot parameters.
static std::shared_ptr< Functional< dim, nstate, real, MeshType > > create_Functional(PHiLiP::Parameters::AllParameters const *const param, std::shared_ptr< PHiLiP::DGBase< dim, real, MeshType > > dg)
Create standard functional object from constant parameter file.
FunctionalParam functional_param
Contains parameters for functional.
dealii::ConditionalOStream pcout
ConditionalOStream.
DGBase is independent of the number of state variables.
int run_test() const override
Build three models and evaluate error measures.
unsigned int nonlinear_max_iterations
Maximum number of iterations.
Base class of all the tests.