[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
flow_constraints.cpp
1 #include "optimization/flow_constraints.hpp"
2 #include "mesh/meshmover_linear_elasticity.hpp"
3 
4 #include "rol_to_dealii_vector.hpp"
5 
6 #include "ode_solver/ode_solver_factory.h"
7 
8 #include <Epetra_RowMatrixTransposer.h>
9 
10 #include "Ifpack.h"
11 
12 #include "global_counter.hpp"
13 
14 namespace PHiLiP {
15 
16 template<int dim>
18 ::FlowConstraints(std::shared_ptr<DGBase<dim,double>> &_dg,
19  std::shared_ptr<BaseParameterization<dim>> _design_parameterization,
20  std::shared_ptr<dealii::TrilinosWrappers::SparseMatrix> precomputed_dXvdXp)
21  : mpi_rank(dealii::Utilities::MPI::this_mpi_process(MPI_COMM_WORLD))
22  , i_print(mpi_rank==0)
23  , dg(_dg)
24  , design_parameterization(_design_parameterization)
25  , jacobian_prec(nullptr)
26  , adjoint_jacobian_prec(nullptr)
27 {
28  flow_CFL_ = 0.0;
29 
30  Assert(dg->high_order_grid == design_parameterization->high_order_grid,
31  dealii::ExcMessage("DG and DesignParameterization do not point to the same high order grid."));
32 
33  design_parameterization->initialize_design_variables(design_var);
34  const unsigned int n_design_variables = design_parameterization->get_number_of_design_variables();
35 
36  if (precomputed_dXvdXp) {
37  if (precomputed_dXvdXp->m() == dg->high_order_grid->volume_nodes.size() && precomputed_dXvdXp->n() == n_design_variables) {
38  dXvdXp.copy_from(*precomputed_dXvdXp);
39  }
40  } else {
41  design_parameterization->compute_dXv_dXp(dXvdXp);
42  }
43 
44  dealii::ParameterHandler parameter_handler;
46  this->linear_solver_param.parse_parameters (parameter_handler);
47  this->linear_solver_param.max_iterations = 1000;
48  this->linear_solver_param.restart_number = 200;
49  this->linear_solver_param.linear_residual = 1e-17;
50  //this->linear_solver_param.ilut_fill = 1.0;//2; 50
51  this->linear_solver_param.ilut_fill = 50;
52  this->linear_solver_param.ilut_drop = 1e-8;
53  //this->linear_solver_param.ilut_atol = 1e-3;
54  //this->linear_solver_param.ilut_rtol = 1.0+1e-2;
55  this->linear_solver_param.ilut_atol = 1e-5;
56  this->linear_solver_param.ilut_rtol = 1.0+1e-2;
57  this->linear_solver_param.linear_solver_output = Parameters::OutputEnum::verbose;
58  this->linear_solver_param.linear_solver_type = Parameters::LinearSolverParam::LinearSolverEnum::gmres;
59  //this->linear_solver_param.linear_solver_type = Parameters::LinearSolverParam::LinearSolverEnum::direct;
60 }
61 
62 
63 template<int dim>
65 {
66  destroy_JacobianPreconditioner_1();
67  destroy_AdjointJacobianPreconditioner_1();
68 }
69 
70 template<int dim>
72 ::update_1( const ROL::Vector<double>& des_var_sim, bool flag, int iter )
73 {
74  (void) flag; (void) iter;
75  dg->solution = ROL_vector_to_dealii_vector_reference(des_var_sim);
76  dg->solution.update_ghost_values();
77 }
78 
79 template<int dim>
81 ::update_2( const ROL::Vector<double>& des_var_ctl, bool flag, int iter )
82 {
83  (void) flag; (void) iter;
84  design_var = ROL_vector_to_dealii_vector_reference(des_var_ctl);
85  bool mesh_updated = design_parameterization->update_mesh_from_design_variables(dXvdXp, design_var);
86  if(mesh_updated)
87  {
88  dg->output_results_vtk(iupdate);
89  design_parameterization->output_design_variables(iupdate);
90  iupdate++;
91  }
92 }
93 
94 template<int dim>
97  ROL::Vector<double>& constraint_values,
98  ROL::Vector<double>& des_var_sim,
99  const ROL::Vector<double>& des_var_ctl,
100  double& tol
101  )
102 {
103 
104  update_2(des_var_ctl);
105 
106  dg->output_results_vtk(i_out++);
107  design_parameterization->output_design_variables(i_out);
108  std::shared_ptr<ODE::ODESolverBase<dim, double>> ode_solver_1 = ODE::ODESolverFactory<dim, double>::create_ODESolver(dg);
109  ode_solver_1->steady_state();
110 
111  dg->assemble_residual();
112  tol = dg->get_residual_l2norm();
113  auto &constraint = ROL_vector_to_dealii_vector_reference(constraint_values);
114  constraint = dg->right_hand_side;
115  auto &des_var_sim_v = ROL_vector_to_dealii_vector_reference(des_var_sim);
116  des_var_sim_v = dg->solution;
117 }
118 
119 template<int dim>
122  ROL::Vector<double>& constraint_values,
123  const ROL::Vector<double>& des_var_sim,
124  const ROL::Vector<double>& des_var_ctl,
125  double &/*tol*/
126  )
127 {
128 
129  update_1(des_var_sim);
130  update_2(des_var_ctl);
131 
132  dg->assemble_residual();
133  auto &constraint = ROL_vector_to_dealii_vector_reference(constraint_values);
134  constraint = dg->right_hand_side;
135 }
136 
137 template<int dim>
140  ROL::Vector<double>& output_vector,
141  const ROL::Vector<double>& input_vector,
142  const ROL::Vector<double>& des_var_sim,
143  const ROL::Vector<double>& des_var_ctl,
144  double& /*tol*/
145  )
146 {
147 
148  update_1(des_var_sim);
149  update_2(des_var_ctl);
150 
151  const bool compute_dRdW=true; const bool compute_dRdX=false; const bool compute_d2R=false;
152  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R, flow_CFL_);
153 
154  const auto &input_vector_v = ROL_vector_to_dealii_vector_reference(input_vector);
155  auto &output_vector_v = ROL_vector_to_dealii_vector_reference(output_vector);
156  this->dg->system_matrix.vmult(output_vector_v, input_vector_v);
157 
158  n_vmult += 1;
159  dRdW_mult += 1;
160 
161 }
162 
163 template<int dim>
166  ROL::Vector<double>& output_vector,
167  const ROL::Vector<double>& input_vector,
168  const ROL::Vector<double>& des_var_sim,
169  const ROL::Vector<double>& des_var_ctl,
170  double& /*tol*/ )
171 {
172 
173  update_1(des_var_sim);
174  update_2(des_var_ctl);
175 
176  const bool compute_dRdW=true; const bool compute_dRdX=false; const bool compute_d2R=false;
177  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R, flow_CFL_);
178 
179  if(i_print) std::cout << __PRETTY_FUNCTION__ << std::endl;
180  //solve_linear_2 (
181  // this->dg->system_matrix,
182  // input_vector_v,
183  // output_vector_v,
184  // this->linear_solver_param);
185  // try {
186  // solve_linear_2 (
187  // this->dg->system_matrix,
188  // input_vector_v,
189  // output_vector_v,
190  // this->linear_solver_param);
191  // } catch (...) {
192  // if(i_print) std::cout << "Failed to solve linear system in " << __PRETTY_FUNCTION__ << std::endl;
193  // output_vector.setScalar(1.0);
194  // }
195 
196  // Input vector is copied into temporary non-const vector.
197  auto input_vector_v = ROL_vector_to_dealii_vector_reference(input_vector);
198  auto &output_vector_v = ROL_vector_to_dealii_vector_reference(output_vector);
199 
200  //std::cout << std::setprecision(std::numeric_limits<long double>::digits10 + 1);
201  //std::cout << "System matrix flow_CFL_" << flow_CFL_ << std::endl;
202  //MPI_Barrier(MPI_COMM_WORLD);
203  //dg->system_matrix.print(std::cout);
204 
205  solve_linear (dg->system_matrix, input_vector_v, output_vector_v, this->linear_solver_param);
206  //solve_linear_2 ( this->dg->system_matrix, input_vector_v, output_vector_v, this->linear_solver_param);
207  //try {
208  // solve_linear (dg->system_matrix, input_vector_v, output_vector_v, this->linear_solver_param);
209  //} catch (...) {
210  // if(i_print) std::cout << "Failed to solve linear system in " << __PRETTY_FUNCTION__ << std::endl;
211  // output_vector.setScalar(1.0);
212  //}
213 }
214 template<int dim>
217 {
218  delete jacobian_prec;
219  jacobian_prec = nullptr;
220 }
221 template<int dim>
224 {
225  delete adjoint_jacobian_prec;
226  adjoint_jacobian_prec = nullptr;
227 }
228 
229 template<int dim>
232  const ROL::Vector<double>& des_var_sim,
233  const ROL::Vector<double>& des_var_ctl)
234 {
235  update_1(des_var_sim);
236  update_2(des_var_ctl);
237 
238  const bool compute_dRdW=true; const bool compute_dRdX=false; const bool compute_d2R=false;
239  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R, flow_CFL_);
240 
241  Epetra_CrsMatrix * jacobian = const_cast<Epetra_CrsMatrix *>(&(dg->system_matrix.trilinos_matrix()));
242 
243  destroy_JacobianPreconditioner_1();
244  Ifpack Factory;
245 
246  Teuchos::ParameterList List;
247 
248  const std::string PrecType = "ILUT";
249  List.set("fact: ilut level-of-fill", 50.0);
250  List.set("fact: absolute threshold", 1e-3);
251  List.set("fact: relative threshold", 1.01);//1.0+1e-2);
252  List.set("fact: drop tolerance", 0.0);//1e-12);
253 
254  //const std::string PrecType = "ILU";
255  //List.set("fact: level-of-fill", 0);
256 
257  List.set("schwarz: reordering type", "rcm");
258  const int OverlapLevel = 1; // one row of overlap among the processes
259  jacobian_prec = Factory.Create(PrecType, jacobian, OverlapLevel);
260  assert (jacobian_prec != 0);
261 
262 
263 
264 
265  IFPACK_CHK_ERR(jacobian_prec->SetParameters(List));
266  IFPACK_CHK_ERR(jacobian_prec->Initialize());
267  IFPACK_CHK_ERR(jacobian_prec->Compute());
268 
269  return 0;
270 
271 }
272 
273 template<int dim>
276  const ROL::Vector<double>& des_var_sim,
277  const ROL::Vector<double>& des_var_ctl)
278 {
279  update_1(des_var_sim);
280  update_2(des_var_ctl);
281 
282  const bool compute_dRdW=true; const bool compute_dRdX=false; const bool compute_d2R=false;
283  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R, flow_CFL_);
284 
285  Epetra_CrsMatrix * adjoint_jacobian = const_cast<Epetra_CrsMatrix *>(&(dg->system_matrix_transpose.trilinos_matrix()));
286 
287  destroy_AdjointJacobianPreconditioner_1();
288  Ifpack Factory;
289 
290  Teuchos::ParameterList List;
291 
292  const std::string PrecType = "ILUT";
293  List.set("fact: ilut level-of-fill", 50.0);
294  List.set("fact: absolute threshold", 1e-3);
295  List.set("fact: relative threshold", 1.01);//1.0+1e-2);
296  List.set("fact: drop tolerance", 0.0);//1e-12);
297 
298  //const std::string PrecType = "ILU";
299  //List.set("fact: level-of-fill", 0);
300 
301  List.set("schwarz: reordering type", "rcm");
302  const int OverlapLevel = 1; // one row of overlap among the processes
303  adjoint_jacobian_prec = Factory.Create(PrecType, adjoint_jacobian, OverlapLevel);
304  assert (adjoint_jacobian_prec != 0);
305 
306  IFPACK_CHK_ERR(adjoint_jacobian_prec->SetParameters(List));
307  IFPACK_CHK_ERR(adjoint_jacobian_prec->Initialize());
308  IFPACK_CHK_ERR(adjoint_jacobian_prec->Compute());
309 
310  return 0;
311 
312 }
313 
314 template<int dim>
317  ROL::Vector<double>& output_vector,
318  const ROL::Vector<double>& input_vector,
319  const ROL::Vector<double>& des_var_sim,
320  const ROL::Vector<double>& des_var_ctl,
321  double& /*tol*/ )
322 {
323  (void) des_var_sim; // Preconditioner should be built.
324  (void) des_var_ctl; // Preconditioner should be built.
325  if(i_print) std::cout << __PRETTY_FUNCTION__ << std::endl;
326 
327  // Input vector is copied into temporary non-const vector.
328  auto input_vector_v = ROL_vector_to_dealii_vector_reference(input_vector);
329  auto &output_vector_v = ROL_vector_to_dealii_vector_reference(output_vector);
330 
331  Epetra_Vector input_trilinos(View,
332  dg->system_matrix.trilinos_matrix().DomainMap(),
333  input_vector_v.begin());
334  Epetra_Vector output_trilinos(View,
335  dg->system_matrix.trilinos_matrix().RangeMap(),
336  output_vector_v.begin());
337  jacobian_prec->ApplyInverse (input_trilinos, output_trilinos);
338 
339  //n_vmult += 2;
340  //dRdW_mult += 2;
341  n_vmult += 6;
342  dRdW_mult += 6;
343 
344 }
345 
346 template<int dim>
349  ROL::Vector<double>& output_vector,
350  const ROL::Vector<double>& input_vector,
351  const ROL::Vector<double>& des_var_sim,
352  const ROL::Vector<double>& des_var_ctl,
353  double& /*tol*/ )
354 {
355  (void) des_var_sim; // Preconditioner should be built.
356  (void) des_var_ctl; // Preconditioner should be built.
357  if(i_print) std::cout << __PRETTY_FUNCTION__ << std::endl;
358 
359  // Input vector is copied into temporary non-const vector.
360  auto input_vector_v = ROL_vector_to_dealii_vector_reference(input_vector);
361  auto &output_vector_v = ROL_vector_to_dealii_vector_reference(output_vector);
362 
363  Epetra_Vector input_trilinos(View,
364  dg->system_matrix_transpose.trilinos_matrix().DomainMap(),
365  input_vector_v.begin());
366  Epetra_Vector output_trilinos(View,
367  dg->system_matrix_transpose.trilinos_matrix().RangeMap(),
368  output_vector_v.begin());
369  adjoint_jacobian_prec->ApplyInverse (input_trilinos, output_trilinos);
370 
371  //n_vmult += 2;
372  //dRdW_mult += 2;
373  n_vmult += 6;
374  dRdW_mult += 6;
375 }
376 
377 template<int dim>
379 ::applyInverseAdjointJacobian_1( ROL::Vector<double>& output_vector,
380 const ROL::Vector<double>& input_vector,
381 const ROL::Vector<double>& des_var_sim,
382 const ROL::Vector<double>& des_var_ctl,
383 double& /*tol*/ )
384 {
385 
386  if(i_print) std::cout << __PRETTY_FUNCTION__ << std::endl;
387  update_1(des_var_sim);
388  update_2(des_var_ctl);
389 
390  const bool compute_dRdW=true; const bool compute_dRdX=false; const bool compute_d2R=false;
391  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R, flow_CFL_);
392 
393  // Input vector is copied into temporary non-const vector.
394  auto input_vector_v = ROL_vector_to_dealii_vector_reference(input_vector);
395  auto &output_vector_v = ROL_vector_to_dealii_vector_reference(output_vector);
396 
397  solve_linear (dg->system_matrix_transpose, input_vector_v, output_vector_v, this->linear_solver_param);
398 
399 }
400 
401 template<int dim>
403 ::applyJacobian_2( ROL::Vector<double>& output_vector,
404 const ROL::Vector<double>& input_vector,
405 const ROL::Vector<double>& des_var_sim,
406 const ROL::Vector<double>& des_var_ctl,
407 double& /*tol*/ )
408 {
409 
410  if(i_print) std::cout << __PRETTY_FUNCTION__ << std::endl;
411  update_1(des_var_sim);
412  update_2(des_var_ctl);
413 
414  const auto &input_vector_v = ROL_vector_to_dealii_vector_reference(input_vector);
415 
416  //auto dXvsdXp_input = dg->high_order_grid->volume_nodes;
417  //{
418  // dealii::TrilinosWrappers::SparseMatrix dXvsdXp;
419  // ffd.get_dXvsdXp (dg->high_order_grid, ffd_design_variables_indices_dim, dXvsdXp);
420  // dXvsdXp.vmult(dXvsdXp_input,input_vector_v);
421  //}
422 
423  //auto dXvdXp_input = dg->high_order_grid->volume_nodes;
424  //{
425  // dealii::LinearAlgebra::distributed::Vector<double> dummy_vector(dg->high_order_grid->surface_nodes);
426  // MeshMover::LinearElasticity<dim, double, dealii::LinearAlgebra::distributed::Vector<double>, dealii::DoFHandler<dim>>
427  // meshmover(*(dg->high_order_grid->triangulation),
428  // dg->high_order_grid->initial_mapping_fe_field,
429  // dg->high_order_grid->dof_handler_grid,
430  // dg->high_order_grid->surface_to_volume_indices,
431  // dummy_vector);
432 
433  // meshmover.apply_dXvdXvs(dXvsdXp_input, dXvdXp_input);
434  //}
435 
436  auto dXvdXp_input = dg->high_order_grid->volume_nodes;
437  dXvdXp.vmult(dXvdXp_input, input_vector_v);
438 
439  auto &output_vector_v = ROL_vector_to_dealii_vector_reference(output_vector);
440 
441  {
442  const bool compute_dRdW=false; const bool compute_dRdX=true; const bool compute_d2R=false;
443  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R, flow_CFL_);
444  dg->dRdXv.vmult(output_vector_v, dXvdXp_input);
445  }
446 
447  n_vmult += 7;
448  dRdX_mult += 1;
449 }
450 
451 template<int dim>
453 ::applyAdjointJacobian_1( ROL::Vector<double>& output_vector,
454 const ROL::Vector<double>& input_vector,
455 const ROL::Vector<double>& des_var_sim,
456 const ROL::Vector<double>& des_var_ctl,
457 double& /*tol*/ )
458 {
459 
460  if(i_print) std::cout << __PRETTY_FUNCTION__ << std::endl;
461  update_1(des_var_sim);
462  update_2(des_var_ctl);
463 
464  const bool compute_dRdW=true; const bool compute_dRdX=false; const bool compute_d2R=false;
465  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R, flow_CFL_);
466 
467  const auto &input_vector_v = ROL_vector_to_dealii_vector_reference(input_vector);
468  auto &output_vector_v = ROL_vector_to_dealii_vector_reference(output_vector);
469  this->dg->system_matrix.Tvmult(output_vector_v, input_vector_v);
470 
471  n_vmult += 1;
472  dRdW_mult += 1;
473 }
474 
475 template<int dim>
477 ::applyAdjointJacobian_2( ROL::Vector<double>& output_vector,
478 const ROL::Vector<double>& input_vector,
479 const ROL::Vector<double>& des_var_sim,
480 const ROL::Vector<double>& des_var_ctl,
481 double& /*tol*/ )
482 {
483 
484  if(i_print) std::cout << __PRETTY_FUNCTION__ << std::endl;
485  update_1(des_var_sim);
486  update_2(des_var_ctl);
487 
488 
489  const auto &input_vector_v = ROL_vector_to_dealii_vector_reference(input_vector);
490 
491  auto input_dRdXv = dg->high_order_grid->volume_nodes;
492  {
493  const bool compute_dRdW=false; const bool compute_dRdX=true; const bool compute_d2R=false;
494  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R, flow_CFL_);
495  dg->dRdXv.Tvmult(input_dRdXv, input_vector_v);
496  }
497 
498  // auto input_dRdXv_dXvdXvs = dg->high_order_grid->volume_nodes;
499  // {
500  // dealii::LinearAlgebra::distributed::Vector<double> dummy_vector(dg->high_order_grid->surface_nodes);
501  // MeshMover::LinearElasticity<dim, double, dealii::LinearAlgebra::distributed::Vector<double>, dealii::DoFHandler<dim>>
502  // meshmover(*(dg->high_order_grid->triangulation),
503  // dg->high_order_grid->initial_mapping_fe_field,
504  // dg->high_order_grid->dof_handler_grid,
505  // dg->high_order_grid->surface_to_volume_indices,
506  // dummy_vector);
507  // meshmover.apply_dXvdXvs_transpose(input_dRdXv, input_dRdXv_dXvdXvs);
508  // }
509 
510  // auto &output_vector_v = ROL_vector_to_dealii_vector_reference(output_vector);
511  // {
512  // dealii::TrilinosWrappers::SparseMatrix dXvsdXp;
513  // ffd.get_dXvsdXp (dg->high_order_grid, ffd_design_variables_indices_dim, dXvsdXp);
514  // dXvsdXp.Tvmult(output_vector_v, input_dRdXv_dXvdXvs);
515  // }
516 
517  auto &output_vector_v = ROL_vector_to_dealii_vector_reference(output_vector);
518  dXvdXp.Tvmult(output_vector_v, input_dRdXv);
519 
520  n_vmult += 7;
521  dRdX_mult += 1;
522 }
523 
524 template<int dim>
526 ::applyAdjointHessian_11 ( ROL::Vector<double> &output_vector,
527  const ROL::Vector<double> &dual,
528  const ROL::Vector<double> &input_vector,
529  const ROL::Vector<double> &des_var_sim,
530  const ROL::Vector<double> &des_var_ctl,
531  double &tol)
532 {
533  // ROL_vector_to_dealii_vector_reference(output_vector) *= 0.0;
534  // return;
535 
536  if(i_print) std::cout << __PRETTY_FUNCTION__ << std::endl;
537  (void) tol;
538  dg->set_dual(ROL_vector_to_dealii_vector_reference(dual));
539  dg->dual.update_ghost_values();
540  update_1(des_var_sim);
541  update_2(des_var_ctl);
542 
543  const bool compute_dRdW=false; const bool compute_dRdX=false; const bool compute_d2R=true;
544  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R, flow_CFL_);
545  dg->d2RdWdW.vmult(ROL_vector_to_dealii_vector_reference(output_vector), ROL_vector_to_dealii_vector_reference(input_vector));
546 
547  n_vmult += 6;
548  d2R_mult += 1;
549 }
550 
551 template<int dim>
553 ::applyAdjointHessian_12 ( ROL::Vector<double> &output_vector,
554  const ROL::Vector<double> &dual,
555  const ROL::Vector<double> &input_vector,
556  const ROL::Vector<double> &des_var_sim,
557  const ROL::Vector<double> &des_var_ctl,
558  double &tol)
559 {
560  // ROL_vector_to_dealii_vector_reference(output_vector) *= 0.0;
561  // return;
562 
563  if(i_print) std::cout << __PRETTY_FUNCTION__ << std::endl;
564  (void) tol;
565  update_1(des_var_sim);
566  update_2(des_var_ctl);
567 
568  dg->set_dual(ROL_vector_to_dealii_vector_reference(dual));
569  dg->dual.update_ghost_values();
570 
571  const auto &input_vector_v = ROL_vector_to_dealii_vector_reference(input_vector);
572 
573  auto input_d2RdWdX = dg->high_order_grid->volume_nodes;
574  {
575  const bool compute_dRdW=false; const bool compute_dRdX=false; const bool compute_d2R=true;
576  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R, flow_CFL_);
577  dg->d2RdWdX.Tvmult(input_d2RdWdX, input_vector_v);
578  }
579 
580  // auto input_d2RdWdX_dXvdXvs = dg->high_order_grid->volume_nodes;
581  // {
582  // dealii::LinearAlgebra::distributed::Vector<double> dummy_vector(dg->high_order_grid->surface_nodes);
583  // MeshMover::LinearElasticity<dim, double, dealii::LinearAlgebra::distributed::Vector<double>, dealii::DoFHandler<dim>>
584  // meshmover(*(dg->high_order_grid->triangulation),
585  // dg->high_order_grid->initial_mapping_fe_field,
586  // dg->high_order_grid->dof_handler_grid,
587  // dg->high_order_grid->surface_to_volume_indices,
588  // dummy_vector);
589  // meshmover.apply_dXvdXvs_transpose(input_d2RdWdX, input_d2RdWdX_dXvdXvs);
590  // }
591 
592  // auto &output_vector_v = ROL_vector_to_dealii_vector_reference(output_vector);
593  // {
594  // dealii::TrilinosWrappers::SparseMatrix dXvsdXp;
595  // ffd.get_dXvsdXp (dg->high_order_grid, ffd_design_variables_indices_dim, dXvsdXp);
596  // dXvsdXp.Tvmult(output_vector_v, input_d2RdWdX_dXvdXvs);
597  // }
598 
599  auto &output_vector_v = ROL_vector_to_dealii_vector_reference(output_vector);
600  dXvdXp.Tvmult(output_vector_v, input_d2RdWdX);
601 
602  n_vmult += 7;
603  d2R_mult += 1;
604 }
605 
606 template<int dim>
609  ROL::Vector<double> &output_vector,
610  const ROL::Vector<double> &dual,
611  const ROL::Vector<double> &input_vector,
612  const ROL::Vector<double> &des_var_sim,
613  const ROL::Vector<double> &des_var_ctl,
614  double &tol
615  )
616 {
617  // ROL_vector_to_dealii_vector_reference(output_vector) *= 0.0;
618  // return;
619 
620  if(i_print) std::cout << __PRETTY_FUNCTION__ << std::endl;
621  (void) tol;
622  update_1(des_var_sim);
623  update_2(des_var_ctl);
624 
625  dg->set_dual(ROL_vector_to_dealii_vector_reference(dual));
626  dg->dual.update_ghost_values();
627 
628  const auto &input_vector_v = ROL_vector_to_dealii_vector_reference(input_vector);
629 
630  // auto dXvsdXp_input = dg->high_order_grid->volume_nodes;
631  // {
632  // dealii::TrilinosWrappers::SparseMatrix dXvsdXp;
633  // ffd.get_dXvsdXp (dg->high_order_grid, ffd_design_variables_indices_dim, dXvsdXp);
634  // dXvsdXp.vmult(dXvsdXp_input,input_vector_v);
635  // }
636 
637  // auto dXvdXp_input = dg->high_order_grid->volume_nodes;
638  // {
639  // dealii::LinearAlgebra::distributed::Vector<double> dummy_vector(dg->high_order_grid->surface_nodes);
640  // MeshMover::LinearElasticity<dim, double, dealii::LinearAlgebra::distributed::Vector<double>, dealii::DoFHandler<dim>>
641  // meshmover(*(dg->high_order_grid->triangulation),
642  // dg->high_order_grid->initial_mapping_fe_field,
643  // dg->high_order_grid->dof_handler_grid,
644  // dg->high_order_grid->surface_to_volume_indices,
645  // dummy_vector);
646 
647  // meshmover.apply_dXvdXvs(dXvsdXp_input, dXvdXp_input);
648  // }
649 
650  auto dXvdXp_input = dg->high_order_grid->volume_nodes;
651  dXvdXp.vmult(dXvdXp_input, input_vector_v);
652 
653  auto &output_vector_v = ROL_vector_to_dealii_vector_reference(output_vector);
654  {
655  const bool compute_dRdW=false; const bool compute_dRdX=false; const bool compute_d2R=true;
656  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R, flow_CFL_);
657  dg->d2RdWdX.vmult(output_vector_v, dXvdXp_input);
658  }
659 
660  n_vmult += 7;
661  d2R_mult += 1;
662 }
663 
664 
665 template<int dim>
668  ROL::Vector<double> &output_vector,
669  const ROL::Vector<double> &dual,
670  const ROL::Vector<double> &input_vector,
671  const ROL::Vector<double> &des_var_sim,
672  const ROL::Vector<double> &des_var_ctl,
673  double &tol
674  )
675 {
676  // ROL_vector_to_dealii_vector_reference(output_vector) *= 0.0;
677  // return;
678 
679  if(i_print) std::cout << __PRETTY_FUNCTION__ << std::endl;
680  (void) tol;
681 
682  update_1(des_var_sim);
683  update_2(des_var_ctl);
684 
685  dg->set_dual(ROL_vector_to_dealii_vector_reference(dual));
686  dg->dual.update_ghost_values();
687 
688  const auto &input_vector_v = ROL_vector_to_dealii_vector_reference(input_vector);
689 
690  // auto dXvsdXp_input = dg->high_order_grid->volume_nodes;
691  // {
692  // dealii::TrilinosWrappers::SparseMatrix dXvsdXp;
693  // ffd.get_dXvsdXp (dg->high_order_grid, ffd_design_variables_indices_dim, dXvsdXp);
694  // dXvsdXp.vmult(dXvsdXp_input,input_vector_v);
695  // }
696 
697  // auto dXvdXp_input = dg->high_order_grid->volume_nodes;
698  // {
699  // dealii::LinearAlgebra::distributed::Vector<double> dummy_vector(dg->high_order_grid->surface_nodes);
700  // MeshMover::LinearElasticity<dim, double, dealii::LinearAlgebra::distributed::Vector<double>, dealii::DoFHandler<dim>>
701  // meshmover(*(dg->high_order_grid->triangulation),
702  // dg->high_order_grid->initial_mapping_fe_field,
703  // dg->high_order_grid->dof_handler_grid,
704  // dg->high_order_grid->surface_to_volume_indices,
705  // dummy_vector);
706 
707  // meshmover.apply_dXvdXvs(dXvsdXp_input, dXvdXp_input);
708  // }
709 
710  auto dXvdXp_input = dg->high_order_grid->volume_nodes;
711  dXvdXp.vmult(dXvdXp_input, input_vector_v);
712 
713  auto d2RdXdX_dXvdXp_input = dg->high_order_grid->volume_nodes;
714  {
715  const bool compute_dRdW=false; const bool compute_dRdX=false; const bool compute_d2R=true;
716  dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R, flow_CFL_);
717  dg->d2RdXdX.vmult(d2RdXdX_dXvdXp_input, dXvdXp_input);
718  }
719 
720  //auto dXvdXvsT_d2RdXdX_dXvdXp_input = dg->high_order_grid->volume_nodes;
721  //{
722  // dealii::LinearAlgebra::distributed::Vector<double> dummy_vector(dg->high_order_grid->surface_nodes);
723  // MeshMover::LinearElasticity<dim, double, dealii::LinearAlgebra::distributed::Vector<double>, dealii::DoFHandler<dim>>
724  // meshmover(*(dg->high_order_grid->triangulation),
725  // dg->high_order_grid->initial_mapping_fe_field,
726  // dg->high_order_grid->dof_handler_grid,
727  // dg->high_order_grid->surface_to_volume_indices,
728  // dummy_vector);
729  // meshmover.apply_dXvdXvs_transpose(d2RdXdX_dXvdXp_input, dXvdXvsT_d2RdXdX_dXvdXp_input);
730  //}
731 
732  //auto &output_vector_v = ROL_vector_to_dealii_vector_reference(output_vector);
733  //{
734  // dealii::TrilinosWrappers::SparseMatrix dXvsdXp;
735  // ffd.get_dXvsdXp (dg->high_order_grid, ffd_design_variables_indices_dim, dXvsdXp);
736  // dXvsdXp.Tvmult(output_vector_v, dXvdXvsT_d2RdXdX_dXvdXp_input);
737  //}
738 
739  auto &output_vector_v = ROL_vector_to_dealii_vector_reference(output_vector);
740  dXvdXp.Tvmult(output_vector_v, d2RdXdX_dXvdXp_input);
741 
742  n_vmult += 8;
743  d2R_mult += 1;
744 }
745 
746 // template<int dim>
747 // void FlowConstraints<dim>
748 // ::applyPreconditioner(ROL::Vector<double> &pv,
749 // const ROL::Vector<double> &v,
750 // const ROL::Vector<double> &x,
751 // const ROL::Vector<double> &g,
752 // double &tol)
753 // {
754 // Constraint<double>::applyPreconditioner(pv, v, x, g, tol);
755 // // try {
756 // // const Vector_SimOpt<double> &xs = dynamic_cast<const Vector_SimOpt<double>&>(x);
757 // // Ptr<Vector<double>> ijv = (xs.get_1())->clone();
758 //
759 // // applyInverseJacobian_1_preconditioner(*ijv, v, *(xs.get_1()), *(xs.get_2()), tol);
760 // // const Vector_SimOpt<double> &gs = dynamic_cast<const Vector_SimOpt<double>&>(g);
761 // // Ptr<Vector<double>> ijv_dual = (gs.get_1())->clone();
762 // // ijv_dual->set(ijv->dual());
763 // // applyInverseAdjointJacobian_1_preconditioner(pv, *ijv_dual, *(xs.get_1()), *(xs.get_2()), tol);
764 // // }
765 // // catch (const std::logic_error &e) {
766 // // Constraint<double>::applyPreconditioner(pv, v, x, g, tol);
767 // // return;
768 // // }
769 // }
770 
771 // virtual void applyPreconditioner(Vector<Real> &pv,
772 // const Vector<Real> &v,
773 // const Vector<Real> &x,
774 // const Vector<Real> &g,
775 // Real &tol)
776 // {
777 // update(x);
778 //
779 // const bool compute_dRdW=true; const bool compute_dRdX=false; const bool compute_d2R=false;
780 // dg->assemble_residual(compute_dRdW, compute_dRdX, compute_d2R);
781 //
782 // AztecOO solver;
783 // solver.SetAztecOption(AZ_output, (param.linear_solver_output ? AZ_all : AZ_none));
784 // solver.SetAztecOption(AZ_solver, AZ_gmres);
785 // solver.SetAztecOption(AZ_kspace, param.restart_number);
786 //
787 // solver.SetAztecOption(AZ_precond, AZ_dom_decomp);
788 // solver.SetAztecOption(AZ_subdomain_solve, AZ_ilut);
789 // solver.SetAztecOption(AZ_overlap, 0);
790 // solver.SetAztecOption(AZ_reorder, 1); // RCM re-ordering
791 //
792 // const double
793 // ilut_drop = param.ilut_drop,
794 // ilut_rtol = param.ilut_rtol,//0.0,//1.1,
795 // ilut_atol = param.ilut_atol,//0.0,//1e-9,
796 // linear_residual = param.linear_residual;//1e-4;
797 // const int ilut_fill = param.ilut_fill,//1,
798 //
799 // solver.SetAztecParam(AZ_drop, ilut_drop);
800 // solver.SetAztecParam(AZ_ilut_fill, ilut_fill);
801 // solver.SetAztecParam(AZ_athresh, ilut_atol);
802 // solver.SetAztecParam(AZ_rthresh, ilut_rtol);
803 // solver.SetUserMatrix(const_cast<Epetra_CrsMatrix *>(&(dg->system_matrix.trilinos_matrix())));
804 //
805 // double condition_number_estimate;
806 // const int precond_error = solver.ConstructPreconditioner (condition_number_estimate);
807 // const Epetra_Operator* preconditionner = solver.GetPrecOperator();
808 //
809 //
810 // Epetra_Vector pv_epetra(View,
811 // dg->system_matrix.trilinos_matrix().DomainMap(),
812 // ROL_vector_to_dealii_vector_reference(pv).begin());
813 // Epetra_Vector v_epetra(View,
814 // dg->system_matrix.trilinos_matrix().RangeMap(),
815 // ROL_vector_to_dealii_vector_reference(v).begin());
816 //
817 // preconditionner.applyInverse(
818 //
819 //
820 // pv.set(v.dual());
821 // }
822 
823 // std::vector<double> solveAugmentedSystem(
824 // ROL::Vector<double> &v1,
825 // ROL::Vector<double> &v2,
826 // const ROL::Vector<double> &b1,
827 // const ROL::Vector<double> &b2,
828 // const ROL::Vector<double> &x,
829 // double & tol) override
830 // {
831 // ROL::Vector_SimOpt<double> &v1_simctl
832 // = dynamic_cast<Vector_SimOpt<double>&>(
833 // dynamic_cast<Vector<double>&> (v1));
834 // const ROL::Vector_SimOpt<double> &b1_simctl
835 // = dynamic_cast<const Vector_SimOpt<double>&>(
836 // dynamic_cast<const Vector<double>&>(b));
837 // const ROL::Vector<double> &v1_sim = *(v1_simctl.get_1());
838 // const ROL::Vector<double> &v1_ctl = *(v1_simctl.get_2());
839 // const ROL::Vector<double> &b1_sim = *(b1_simctl.get_1());
840 // const ROL::Vector<double> &b1_ctl = *(b1_simctl.get_2());
841 // }
842 
843 template class FlowConstraints<PHILIP_DIM>;
844 
845 } // PHiLiP namespace
void applyAdjointJacobian_1(ROL::Vector< double > &output_vector, const ROL::Vector< double > &input_vector, const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl, double &) override
Applies the Jacobian of the Constraints w. r. t. the simulation variables onto a vector.
void update_1(const ROL::Vector< double > &des_var_sim, bool flag=true, int iter=-1)
Update the simulation variables.
void applyAdjointJacobian_2(ROL::Vector< double > &output_vector, const ROL::Vector< double > &input_vector, const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl, double &) override
Applies the Jacobian of the Constraints w. r. t. the control variables onto a vector.
static void declare_parameters(dealii::ParameterHandler &prm)
Declares the possible variables and sets the defaults.
void applyAdjointHessian_12(ROL::Vector< double > &output_vector, const ROL::Vector< double > &dual, const ROL::Vector< double > &input_vector, const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl, double &tol) override
Applies the adjoint of the Hessian of the constraints w. r. t. the simulation variables onto a vector...
std::pair< unsigned int, double > solve_linear(const dealii::TrilinosWrappers::SparseMatrix &system_matrix, dealii::LinearAlgebra::distributed::Vector< double > &right_hand_side, dealii::LinearAlgebra::distributed::Vector< double > &solution, const Parameters::LinearSolverParam &param)
void applyInverseAdjointJacobianPreconditioner_1(ROL::Vector< double > &output_vector, const ROL::Vector< double > &input_vector, const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl, double &)
Applies the inverse Adjoint Jacobian preconditioner.
void destroy_JacobianPreconditioner_1()
Frees Jacobian preconditioner from memory;.
void destroy_AdjointJacobianPreconditioner_1()
Frees adjoint Jacobian preconditioner from memory;.
Files for the baseline physics.
Definition: ADTypes.hpp:10
void applyJacobian_2(ROL::Vector< double > &output_vector, const ROL::Vector< double > &input_vector, const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl, double &) override
Applies the Jacobian of the Constraints w. r. t. the control variables onto a vector.
void applyInverseJacobian_1(ROL::Vector< double > &output_vector, const ROL::Vector< double > &input_vector, const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl, double &) override
Applies the inverse Jacobian of the Constraints w. r. t. the simulation variables onto a vector...
void applyAdjointHessian_11(ROL::Vector< double > &output_vector, const ROL::Vector< double > &dual, const ROL::Vector< double > &input_vector, const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl, double &tol) override
Applies the adjoint of the Hessian of the constraints w. r. t. the simulation variables onto a vector...
void applyJacobian_1(ROL::Vector< double > &output_vector, const ROL::Vector< double > &input_vector, const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl, double &) override
Applies the Jacobian of the Constraints w. r. t. the simulation variables onto a vector.
void value(ROL::Vector< double > &constraint_values, const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl, double &) override
Returns the current constraint residual given a set of control and simulation variables.
void solve(ROL::Vector< double > &constraint_values, ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl, double &) override
Solve the Simulation Constraint and returns the constraints values.
Abstract class for design parameterization. Objective function and the constraints take this class&#39;s ...
Use DGBase as a Simulation Constraint ROL::Constraint_SimOpt.
int construct_AdjointJacobianPreconditioner_1(const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl)
Constructs the Adjoint Jacobian preconditioner.
void applyInverseAdjointJacobian_1(ROL::Vector< double > &output_vector, const ROL::Vector< double > &input_vector, const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl, double &) override
Applies the adjoint Jacobian of the Constraints w. r. t. the simulation variables onto a vector...
void applyInverseJacobianPreconditioner_1(ROL::Vector< double > &output_vector, const ROL::Vector< double > &input_vector, const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl, double &)
Applies the inverse Jacobian preconditioner.
void applyAdjointHessian_22(ROL::Vector< double > &output_vector, const ROL::Vector< double > &dual, const ROL::Vector< double > &input_vector, const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl, double &tol) override
Applies the adjoint of the Hessian of the constraints w. r. t. the simulation variables onto a vector...
void update_2(const ROL::Vector< double > &des_var_ctl, bool flag=true, int iter=-1)
Update the control variables.
FlowConstraints(std::shared_ptr< DGBase< dim, double >> &_dg, std::shared_ptr< BaseParameterization< dim >> _design_parameterization, std::shared_ptr< dealii::TrilinosWrappers::SparseMatrix > precomputed_dXvdXp=nullptr)
Constructor.
void applyAdjointHessian_21(ROL::Vector< double > &output_vector, const ROL::Vector< double > &dual, const ROL::Vector< double > &input_vector, const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl, double &tol) override
Applies the adjoint of the Hessian of the constraints w. r. t. the simulation variables onto a vector...
DGBase is independent of the number of state variables.
Definition: dg_base.hpp:82
static std::shared_ptr< ODESolverBase< dim, real, MeshType > > create_ODESolver(std::shared_ptr< DGBase< dim, real, MeshType > > dg_input)
Creates either implicit or explicit ODE solver based on parameter value(no POD basis given) ...
const dealii::LinearAlgebra::distributed::Vector< double > & ROL_vector_to_dealii_vector_reference(const ROL::Vector< double > &x)
Access the read-write deali.II Vector stored within the ROL::Vector.
int construct_JacobianPreconditioner_1(const ROL::Vector< double > &des_var_sim, const ROL::Vector< double > &des_var_ctl)
Constructs the Jacobian preconditioner.