[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
free_form_deformation.h
1 #ifndef __FREE_FORM_DEFORMATION__
2 #define __FREE_FORM_DEFORMATION__
3 
4 #include "high_order_grid.h"
5 
6 namespace PHiLiP {
7 
9 template<int dim>
11 {
12 public:
15  const dealii::Point<dim> &_origin,
16  const std::array<dealii::Tensor<1,dim,double>,dim> _parallepiped_vectors,
17  const std::array<unsigned int,dim> &_ndim_control);
18 
21  const dealii::Point<dim> &_origin,
22  const std::array<double,dim> &rectangle_lengths,
23  const std::array<unsigned int,dim> &_ndim_control);
24 
27  template<typename real>
28  dealii::Point<dim,real> new_point_location
29  (const dealii::Point<dim,double> &initial_point,
30  const std::vector<dealii::Point<dim,real>> &control_pts) const;
31 
34  dealii::Point<dim,double> new_point_location (const dealii::Point<dim,double> &initial_point) const;
35 
38  dealii::LinearAlgebra::distributed::Vector<double>
39  get_surface_displacement (const HighOrderGrid<dim,double> &high_order_grid) const;
40 
42  void deform_mesh (HighOrderGrid<dim,double> &high_order_grid) const;
43 
46  dealii::Point<dim,double> dXdXp (const dealii::Point<dim,double> &initial_point, const unsigned int ctl_index, const unsigned int ctl_axis) const;
47 
52  void get_dXvsdXp (
53  const HighOrderGrid<dim,double> &high_order_grid,
54  const std::vector< std::pair< unsigned int, unsigned int > > &ffd_design_variables_indices_dim,
55  dealii::TrilinosWrappers::SparseMatrix &dXvsdXp
56  ) const;
57 
62  std::vector<dealii::LinearAlgebra::distributed::Vector<double>>
63  get_dXvsdXp (const HighOrderGrid<dim,double> &high_order_grid,
64  const std::vector< std::pair< unsigned int, unsigned int > > &ffd_design_variables_indices_dim
65  ) const;
66 
71  std::vector<dealii::LinearAlgebra::distributed::Vector<double>>
72  get_dXvsdXp_FD (const HighOrderGrid<dim,double> &high_order_grid,
73  const std::vector< std::pair< unsigned int, unsigned int > > &ffd_design_variables_indices_dim,
74  const double eps
75  );
76 
80  void
81  get_dXvdXp (const HighOrderGrid<dim,double> &high_order_grid,
82  const std::vector< std::pair< unsigned int, unsigned int > > ffd_design_variables_indices_dim,
83  dealii::TrilinosWrappers::SparseMatrix &dXvdXp
84  ) const;
88  void
89  get_dXvdXp_FD (HighOrderGrid<dim,double> &high_order_grid,
90  const std::vector< std::pair< unsigned int, unsigned int > > ffd_design_variables_indices_dim,
91  dealii::TrilinosWrappers::SparseMatrix &dXvdXp_FD,
92  const double eps
93  );
94 
97  template<typename real>
98  dealii::Tensor<1,dim,real> get_displacement (
99  const dealii::Point<dim,double> &initial_point,
100  const std::vector<dealii::Point<dim,real>> &control_pts) const;
101 
104  template<typename real>
105  std::vector<dealii::Tensor<1,dim,real>> get_displacement (
106  const std::vector<dealii::Point<dim,double>> &initial_point,
107  const std::vector<dealii::Point<dim,real>> &control_pts) const;
108 
111  template<typename real>
112  dealii::Point<dim,real> evaluate_ffd (
113  const dealii::Point<dim,double> &s_t_u_point,
114  const std::vector<dealii::Point<dim,real>> &control_pts) const;
115 
117  std::vector<dealii::Point<dim>> control_pts;
118 
120 
122  std::array<unsigned int,dim> global_to_grid ( const unsigned int global_ictl ) const;
123 
125 
127  unsigned int grid_to_global ( const std::array<unsigned int,dim> &ijk_index ) const;
128 
130  void move_ctl_dx ( const unsigned i, const dealii::Tensor<1,dim,double> );
131 
133  void move_ctl_dx ( const std::array<unsigned int,dim> ijk, const dealii::Tensor<1,dim,double> );
134 
137  const std::vector< std::pair< unsigned int, unsigned int > > &ffd_design_variables_indices_dim,
138  dealii::LinearAlgebra::distributed::Vector<double> &vector_to_copy_into) const;
141  const std::vector< std::pair< unsigned int, unsigned int > > &ffd_design_variables_indices_dim,
142  const dealii::LinearAlgebra::distributed::Vector<double> &vector_to_copy_from);
143 
145  void output_ffd_vtu(const unsigned int cycle) const;
146 
147 protected:
148 
150 
152  dealii::Point<dim,double> get_local_coordinates (const dealii::Point<dim,double> p) const;
153 
155  const dealii::Point<dim> origin;
157 
160  const std::array<dealii::Tensor<1,dim,double>,dim> parallepiped_vectors;
161 
163  const std::array<unsigned int, dim> ndim_control_pts;
164 public:
166  const unsigned int n_control_pts;
167 private:
168 
170  std::array<dealii::Tensor<1,dim,double>,dim> get_rectangular_parallepiped_vectors (const std::array<double,dim> &rectangle_lengths) const;
171 
173  unsigned int compute_total_ctl_pts() const;
174 
176  dealii::ConditionalOStream pcout;
177 
179  void init_msg() const;
180 };
181 
182 } // namespace PHiLiP
183 
184 #endif
void get_design_variables(const std::vector< std::pair< unsigned int, unsigned int > > &ffd_design_variables_indices_dim, dealii::LinearAlgebra::distributed::Vector< double > &vector_to_copy_into) const
Copies the desired control points from FreeFormDeformation object into vector_to_copy_into.
void get_dXvdXp(const HighOrderGrid< dim, double > &high_order_grid, const std::vector< std::pair< unsigned int, unsigned int > > ffd_design_variables_indices_dim, dealii::TrilinosWrappers::SparseMatrix &dXvdXp) const
const std::array< dealii::Tensor< 1, dim, double >, dim > parallepiped_vectors
Parallepiped vectors.
std::vector< dealii::Point< dim > > control_pts
Control points of the FFD box used to deform the geometry.
void deform_mesh(HighOrderGrid< dim, double > &high_order_grid) const
Deform HighOrderGrid using its initial volume_nodes to retrieve the deformed set of volume_nodes...
void init_msg() const
Initial message.
dealii::Point< dim, double > dXdXp(const dealii::Point< dim, double > &initial_point, const unsigned int ctl_index, const unsigned int ctl_axis) const
const dealii::Point< dim > origin
Parallepiped origin.
void move_ctl_dx(const unsigned i, const dealii::Tensor< 1, dim, double >)
Move control point with global index i.
Files for the baseline physics.
Definition: ADTypes.hpp:10
std::array< unsigned int, dim > global_to_grid(const unsigned int global_ictl) const
Given a control points&#39; global index return its ijk coordinate.
Free form deformation class from Sederberg 1986.
dealii::Point< dim, double > get_local_coordinates(const dealii::Point< dim, double > p) const
Returns the local coordinates s-t-u within the FFD box.
std::vector< dealii::LinearAlgebra::distributed::Vector< double > > get_dXvsdXp_FD(const HighOrderGrid< dim, double > &high_order_grid, const std::vector< std::pair< unsigned int, unsigned int > > &ffd_design_variables_indices_dim, const double eps)
dealii::Point< dim, real > new_point_location(const dealii::Point< dim, double > &initial_point, const std::vector< dealii::Point< dim, real >> &control_pts) const
dealii::LinearAlgebra::distributed::Vector< double > get_surface_displacement(const HighOrderGrid< dim, double > &high_order_grid) const
void get_dXvsdXp(const HighOrderGrid< dim, double > &high_order_grid, const std::vector< std::pair< unsigned int, unsigned int > > &ffd_design_variables_indices_dim, dealii::TrilinosWrappers::SparseMatrix &dXvsdXp) const
FreeFormDeformation(const dealii::Point< dim > &_origin, const std::array< dealii::Tensor< 1, dim, double >, dim > _parallepiped_vectors, const std::array< unsigned int, dim > &_ndim_control)
Constructor for an oblique parallepiped.
dealii::ConditionalOStream pcout
Outputs if MPI rank is 0.
void output_ffd_vtu(const unsigned int cycle) const
Output a .vtu file of the FFD box to visualize.
unsigned int compute_total_ctl_pts() const
Used by constructor to evaluate total number of control points.
void get_dXvdXp_FD(HighOrderGrid< dim, double > &high_order_grid, const std::vector< std::pair< unsigned int, unsigned int > > ffd_design_variables_indices_dim, dealii::TrilinosWrappers::SparseMatrix &dXvdXp_FD, const double eps)
dealii::Tensor< 1, dim, real > get_displacement(const dealii::Point< dim, double > &initial_point, const std::vector< dealii::Point< dim, real >> &control_pts) const
const unsigned int n_control_pts
Total number of control points.
const std::array< unsigned int, dim > ndim_control_pts
Number of control points in each direction.
unsigned int grid_to_global(const std::array< unsigned int, dim > &ijk_index) const
Given a control points&#39; ijk coordinate return its global indexing.
void set_design_variables(const std::vector< std::pair< unsigned int, unsigned int > > &ffd_design_variables_indices_dim, const dealii::LinearAlgebra::distributed::Vector< double > &vector_to_copy_from)
Copies the desired control points from vector_to_copy_from into FreeFormDeformation object...
std::array< dealii::Tensor< 1, dim, double >, dim > get_rectangular_parallepiped_vectors(const std::array< double, dim > &rectangle_lengths) const
Returns rectangular vector box given the box lengths.
dealii::Point< dim, real > evaluate_ffd(const dealii::Point< dim, double > &s_t_u_point, const std::vector< dealii::Point< dim, real >> &control_pts) const