6 #include <deal.II/base/tensor.h> 7 #include <deal.II/base/symmetric_tensor.h> 8 #include <deal.II/lac/vector.h> 9 #include <deal.II/base/geometry_info.h> 10 #include <deal.II/hp/dof_handler.h> 14 namespace GridRefinement {
22 template <
int dim,
typename real>
32 virtual real&
scale() = 0;
47 const std::array<real,dim>& ratio) = 0;
58 const unsigned int j) = 0;
66 const std::array<dealii::Tensor<1,dim,real>,dim>& unit_axis) = 0;
69 virtual std::array<dealii::Tensor<1,dim,real>,dim>
get_unit_axis() = 0;
73 const unsigned int j) = 0;
80 const std::array<dealii::Tensor<1,dim,real>,dim>& axis) = 0;
83 virtual std::array<dealii::Tensor<1,dim,real>,dim>
get_axis() = 0;
86 virtual dealii::Tensor<1,dim,real>
get_axis(
87 const unsigned int j) = 0;
93 virtual dealii::Tensor<2,dim,real>
get_metric() = 0;
101 using VertexList = std::array<dealii::Tensor<1,dim,real>, dealii::GeometryInfo<dim>::vertices_per_cell>;
103 using ChordList = std::array<dealii::Tensor<1,dim,real>, dim>;
122 template <
typename DoFCellAccessorType>
124 const DoFCellAccessorType& cell)
128 for(
unsigned int vertex = 0; vertex < dealii::GeometryInfo<dim>::vertices_per_cell; ++vertex)
129 vertices[vertex] = cell->vertex(vertex);
139 const std::array<real,dim>& derivative_value,
140 const std::array<dealii::Tensor<1,dim,real>,dim>& derivative_direction,
141 const unsigned int order) = 0;
149 const real anisotropic_ratio_min,
150 const real anisotropic_ratio_max) = 0;
160 template <
int dim,
typename real>
168 real&
scale()
override;
172 const real val)
override;
183 const std::array<real,dim>& ratio)
override;
194 const unsigned int j)
override;
202 const std::array<dealii::Tensor<1,dim,real>,dim>& unit_axis)
override;
205 std::array<dealii::Tensor<1,dim,real>,dim>
get_unit_axis()
override;
209 const unsigned int j)
override;
216 const std::array<dealii::Tensor<1,dim,real>,dim>& axis)
override;
219 std::array<dealii::Tensor<1,dim,real>,dim>
get_axis()
override;
222 dealii::Tensor<1,dim,real>
get_axis(
223 const unsigned int j)
override;
229 dealii::Tensor<2,dim,real>
get_metric()
override;
250 const std::array<real,dim>& derivative_value,
251 const std::array<dealii::Tensor<1,dim,real>,dim>& derivative_direction,
252 const unsigned int order)
override;
260 const real anisotropic_ratio_min,
261 const real anisotropic_ratio_max);
270 os <<
"Isotropic element with properties:" << std::endl
271 <<
'\t' <<
"m_scale = " << element.
m_scale << std::endl;
286 template <
int dim,
typename real>
300 real&
scale()
override;
304 const real val)
override;
315 const std::array<real,dim>& ratio)
override;
326 const unsigned int j)
override;
330 const std::array<dealii::Tensor<1,dim,real>,dim>& unit_axis)
override;
333 std::array<dealii::Tensor<1,dim,real>,dim>
get_unit_axis()
override;
337 const unsigned int j)
override;
341 const std::array<dealii::Tensor<1,dim,real>,dim>& axis)
override;
344 std::array<dealii::Tensor<1,dim,real>,dim>
get_axis()
override;
347 dealii::Tensor<1,dim,real>
get_axis(
348 const unsigned int j)
override;
351 dealii::Tensor<2,dim,real>
get_metric()
override;
370 const std::array<real,dim>& derivative_value,
371 const std::array<dealii::Tensor<1,dim,real>,dim>& derivative_direction,
372 const unsigned int order)
override;
380 const real anisotropic_ratio_min,
381 const real anisotropic_ratio_max);
390 os <<
"Anisotropic element with properties:" << std::endl
391 <<
'\t' <<
"m_scale = " << element.
m_scale << std::endl
394 for(
unsigned int i = 1; i < dim; ++i)
397 os <<
"}" << std::endl
398 <<
'\t' <<
"m_unit_axis = {" << element.
m_unit_axis[0];
400 for(
unsigned int i = 1; i < dim; ++i)
403 os <<
"}" << std::endl;
417 void correct_element();
423 void correct_unit_axis();
428 void correct_anisotropic_ratio();
431 void sort_anisotropic_ratio();
451 template <
int dim,
typename real>
456 virtual ~
Field() =
default;
460 const unsigned int size) = 0;
463 virtual unsigned int size()
const = 0;
467 const unsigned int index) = 0;
471 const unsigned int index,
476 const unsigned int index)
const = 0;
479 void set_scale_vector_dealii(
480 const dealii::Vector<real>& vec);
483 void set_scale_vector(
484 const std::vector<real>& vec);
487 dealii::Vector<real> get_scale_vector_dealii()
const;
490 std::vector<real> get_scale_vector()
const;
494 const unsigned int index,
495 const std::array<real,dim>& ratio) = 0;
499 const unsigned int index) = 0;
503 const unsigned int index,
504 const unsigned int j) = 0;
507 dealii::Vector<real> get_max_anisotropic_ratio_vector_dealii();
511 const unsigned int index,
512 const std::array<dealii::Tensor<1,dim,real>,dim>& unit_axis) = 0;
515 virtual std::array<dealii::Tensor<1,dim,real>,dim>
get_unit_axis(
516 const unsigned int index) = 0;
520 const unsigned int index,
521 const unsigned int j) = 0;
525 const unsigned int index,
526 const std::array<dealii::Tensor<1,dim,real>,dim>& axis) = 0;
529 virtual std::array<dealii::Tensor<1,dim,real>,dim>
get_axis(
530 const unsigned int index) = 0;
533 virtual dealii::Tensor<1,dim,real>
get_axis(
534 const unsigned int index,
535 const unsigned int j) = 0;
538 void set_axis_vector(
539 const std::vector<std::array<dealii::Tensor<1,dim,real>,dim>>& vec);
542 std::vector<std::array<dealii::Tensor<1,dim,real>,dim>> get_axis_vector();
545 std::vector<dealii::Tensor<1,dim,real>> get_axis_vector(
546 const unsigned int j);
549 virtual dealii::Tensor<2,dim,real>
get_metric(
550 const unsigned int index) = 0;
553 std::vector<dealii::Tensor<2,dim,real>> get_metric_vector();
557 const unsigned int index) = 0;
560 std::vector<dealii::Tensor<2,dim,real>> get_inverse_metric_vector();
563 dealii::SymmetricTensor<2,dim,real> get_quadratic_metric(
564 const unsigned int index);
567 std::vector<dealii::SymmetricTensor<2,dim,real>> get_quadratic_metric_vector();
570 dealii::SymmetricTensor<2,dim,real> get_inverse_quadratic_metric(
571 const unsigned int index);
574 std::vector<dealii::SymmetricTensor<2,dim,real>> get_inverse_quadratic_metric_vector();
588 const dealii::DoFHandler<dim>& dof_handler,
589 const std::vector<std::array<real,dim>>& derivative_value,
590 const std::vector<std::array<dealii::Tensor<1,dim,real>,dim>>& derivative_direction,
591 const int relative_order) = 0;
595 const real anisotropic_ratio_min,
596 const real anisotropic_ratio_max) = 0;
599 virtual std::ostream& serialize(
600 std::ostream& os)
const = 0;
618 template <
int dim,
typename real,
typename ElementType>
625 const unsigned int size);
628 unsigned int size()
const;
632 const unsigned int index)
override;
636 const unsigned int index,
637 const real val)
override;
641 const unsigned int index)
const override;
645 const unsigned int index,
646 const std::array<real,dim>& ratio)
override;
650 const unsigned int index)
override;
654 const unsigned int index,
655 const unsigned int j)
override;
659 const unsigned int index,
660 const std::array<dealii::Tensor<1,dim,real>,dim>& unit_axis)
override;
664 const unsigned int index)
override;
668 const unsigned int index,
669 const unsigned int j)
override;
673 const unsigned int index,
674 const std::array<dealii::Tensor<1,dim,real>,dim>& axis)
override;
677 std::array<dealii::Tensor<1,dim,real>,dim>
get_axis(
678 const unsigned int index)
override;
681 dealii::Tensor<1,dim,real>
get_axis(
682 const unsigned int index,
683 const unsigned int j)
override;
687 const unsigned int index)
override;
691 const unsigned int index)
override;
697 reinit(dof_handler.get_triangulation().n_active_cells());
699 for(
auto cell = dof_handler.begin_active(); cell != dof_handler.end(); ++cell)
700 if(cell->is_locally_owned())
701 field[cell->active_cell_index()].set_cell(cell);
709 const dealii::DoFHandler<dim>& dof_handler,
710 const std::vector<std::array<real,dim>>& derivative_value,
711 const std::vector<std::array<dealii::Tensor<1,dim,real>,dim>>& derivative_direction,
712 const int relative_order)
override;
716 const real anisotropic_ratio_min,
717 const real anisotropic_ratio_max)
override;
720 std::ostream& serialize(
721 std::ostream& os)
const override;
731 template <
int dim,
typename real>
738 template <
int dim,
typename real>
virtual void set_cell_internal(const VertexList &vertices)=0
Set element to match geometry of input vertex set.
virtual void apply_anisotropic_limit(const real anisotropic_ratio_min, const real anisotropic_ratio_max)=0
Limits the anisotropic ratios to a given bandwidth.
std::array< real, dim > m_anisotropic_ratio
Anisotropic axis ratios (relative to element scale)
virtual std::array< dealii::Tensor< 1, dim, real >, dim > get_unit_axis()=0
Get unit axis directions as an array.
friend std::ostream & operator<<(std::ostream &os, const ElementIsotropic< dim, real > &element)
Write properties of element to ostream.
virtual void set_axis(const std::array< dealii::Tensor< 1, dim, real >, dim > &axis)=0
Set the scaled local frame axes based on vector set (length and direction)
virtual std::array< dealii::Tensor< 1, dim, real >, dim > get_axis()=0
Get the array of axes of the local frame field .
Files for the baseline physics.
Anisotropic element class.
std::array< dealii::Tensor< 1, dim, real >, dim > m_unit_axis
axis unit vector directions
virtual ~Element()=default
Destructor.
std::array< dealii::Tensor< 1, dim, real >, dim > ChordList
Type alias for array of chord veectors (face center to face center) in Deal.II ordering.
virtual void set_unit_axis(const std::array< dealii::Tensor< 1, dim, real >, dim > &unit_axis)=0
Set the unit axes of the element.
void set_cell(const DoFCellAccessorType &cell)
Set the Element based on the input cell (from current mesh)
virtual void set_scale(const real val)=0
Set the scale for the element.
virtual dealii::Tensor< 2, dim, real > get_metric()=0
Get metric matrix at point describing mapping from reference element.
dealii::DoFHandler< dim > DoFHandlerType
Associated DofHandler type.
ChordList get_chord_list(const VertexList &vertices)
Get the chord list from an input set of vertices.
std::array< dealii::Tensor< 1, dim, real >, dealii::GeometryInfo< dim >::vertices_per_cell > VertexList
Type alias for array of vertex coordinates for element.
std::vector< ElementType > field
Internal vector storage of element data for each index.
virtual real get_scale() const =0
Get the scale for the element.
virtual real & scale()=0
Reference for element size.
virtual dealii::Tensor< 2, dim, real > get_inverse_metric()=0
. Get inverse metric matrix for the reference element
Internal Field element class.
virtual void set_anisotropy(const std::array< real, dim > &derivative_value, const std::array< dealii::Tensor< 1, dim, real >, dim > &derivative_direction, const unsigned int order)=0
Set anisotropy from reconstructed directional derivatives.
virtual std::array< real, dim > get_anisotropic_ratio()=0
Get the anisotropic ratio of each reference axis as an array.
virtual std::ostream & serialize(std::ostream &os) const =0
Performs internal call for writing the field description to an ostream.
real m_scale
element size based on
friend std::ostream & operator<<(std::ostream &os, const ElementAnisotropic< dim, real > &element)
Write properties of element to ostream.
virtual void set_anisotropic_ratio(const std::array< real, dim > &ratio)=0
Set the anisotropic ratio for each reference axis.
friend std::ostream & operator<<(std::ostream &os, const Field< dim, real > &field)
Performs output to ostream using internal serialization.