26 #ifndef OOMPH_REFINEABLE_MESH_HEADER
27 #define OOMPH_REFINEABLE_MESH_HEADER
131 outfile << std::endl;
132 outfile <<
"Targets for mesh adaptation: " << std::endl;
133 outfile <<
"---------------------------- " << std::endl;
137 <<
" elements need unrefinement." << std::endl;
138 outfile << std::endl;
258 std::ostringstream err_stream;
259 err_stream <<
"p_adapt() called in base class RefineableMeshBase."
261 <<
"This needs to be implemented in the derived class."
284 std::ostringstream err_stream;
286 <<
"p_refine_uniformly() called in base class RefineableMeshBase."
288 <<
"This needs to be implemented in the derived class." << std::endl;
312 std::ostringstream err_stream;
314 <<
"p_unrefine_uniformly() called in base class RefineableMeshBase."
316 <<
"This needs to be implemented in the derived class." << std::endl;
469 outfile << std::endl;
470 outfile <<
"Targets for mesh adaptation: " << std::endl;
471 outfile <<
"---------------------------- " << std::endl;
481 <<
" elements need unrefinement." << std::endl;
482 outfile << std::endl;
606 virtual void refine(std::ifstream& restart_file);
636 const bool& report_stats)
640 bool backup = Resize_halo_nodes_not_required;
641 Resize_halo_nodes_not_required =
false;
642 Mesh::classify_halo_and_haloed_nodes(
doc_info, report_stats);
643 Resize_halo_nodes_not_required = backup;
645 double t_start = 0.0;
654 synchronise_nonhanging_nodes();
657 unsigned local_ncont_interpolated_values = 0;
663 local_ncont_interpolated_values =
664 dynamic_cast<RefineableElement*
>(
element_pt(0))
665 ->ncont_interpolated_values();
667 unsigned ncont_interpolated_values = 0;
668 MPI_Allreduce(&local_ncont_interpolated_values,
669 &ncont_interpolated_values,
673 Comm_pt->mpi_comm());
676 synchronise_hanging_nodes(ncont_interpolated_values);
683 <<
"TreeBasedRefineableMeshBase::synchronise_hanging_nodes() "
684 <<
"incl. time for initial allreduce in "
685 <<
"TreeBasedRefineableMeshBase::classify_halo_and_haloed_nodes(): "
686 << t_end - t_start << std::endl;
691 if (!Resize_halo_nodes_not_required)
699 void classify_halo_and_haloed_nodes(
const bool& report_stats =
false)
703 classify_halo_and_haloed_nodes(
doc_info, report_stats);
712 void synchronise_hanging_nodes(
const unsigned& ncont_interpolated_values);
720 virtual void additional_synchronise_hanging_nodes(
721 const unsigned& ncont_interpolated_values) = 0;
727 void synchronise_nonhanging_nodes();
775 struct HangHelperStruct
777 unsigned Sending_processor;
778 unsigned Shared_node_id_on_sending_processor;
779 unsigned Shared_node_proc;
782 unsigned Master_node_index;
807 template<
class ELEMENT>
820 for (
unsigned long e = 0;
e < n_tree;
e++)
823 &Tree::split_if_required<ELEMENT>);
834 Mesh* mesh_pt =
this;
839 for (
unsigned long e = 0;
e < n_tree;
e++)
842 &Tree::p_refine_if_required<ELEMENT>, mesh_pt);
855 void additional_synchronise_hanging_nodes(
856 const unsigned& ncont_interpolated_values);
905 outfile << std::endl;
906 outfile <<
"Targets for mesh adaptation: " << std::endl;
907 outfile <<
"---------------------------- " << std::endl;
915 <<
" elements need unrefinement." << std::endl;
916 outfile << std::endl;
925 double max_edge_ratio = 0.0;
926 unsigned count_unrefined = 0;
927 unsigned count_refined = 0;
931 for (
unsigned e = 0;
e < nel;
e++)
937 double volume = el_pt->
size();
942 for (
unsigned n = 0;
n < 4; ++
n)
944 for (
unsigned i = 0;
i < 3; ++
i)
953 for (
unsigned i = 0;
i < 3; ++
i)
955 A(0,
i) = vertex[1][
i] - vertex[0][
i];
956 A(1,
i) = vertex[2][
i] - vertex[0][
i];
957 A(2,
i) = vertex[3][
i] - vertex[0][
i];
962 for (
unsigned i = 0;
i < 3; ++
i)
965 for (
unsigned k = 0;
k < 3; ++
k)
977 double circum_radius =
978 sqrt(rhs[0] * rhs[0] + rhs[1] * rhs[1] + rhs[2] * rhs[2]);
982 double min_length = DBL_MAX;
987 for (
unsigned i = 0;
i < 3; ++
i)
992 sqrt(edge[0] * edge[0] + edge[1] * edge[1] + edge[2] * edge[2]);
993 if (length < min_length)
1001 double local_max_edge_ratio = circum_radius / min_length;
1002 if (local_max_edge_ratio > max_edge_ratio)
1004 max_edge_ratio = local_max_edge_ratio;
1042 return max_edge_ratio;
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Array< double, 1, 3 > e(1./3., 0.5, 2.)
Matrix< SCALARA, Dynamic, Dynamic, opt_A > A
Definition: bench_gemm.cpp:47
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
Definition: matrices.h:1271
Definition: oomph_utilities.h:499
void disable_doc()
Disable documentation.
Definition: oomph_utilities.h:542
std::string directory() const
Output directory.
Definition: oomph_utilities.h:524
Base class for spatial error estimators.
Definition: error_estimator.h:40
Definition: elements.h:1313
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
Definition: elements.h:2175
double size() const
Definition: elements.cc:4290
Vector< Node * > Node_pt
Vector of pointers to nodes.
Definition: mesh.h:183
FiniteElement * finite_element_pt(const unsigned &e) const
Definition: mesh.h:473
const Vector< GeneralisedElement * > & element_pt() const
Return reference to the Vector of elements.
Definition: mesh.h:460
unsigned long nelement() const
Return number of elements in the mesh.
Definition: mesh.h:590
double & x(const unsigned &i)
Return the i-th nodal coordinate.
Definition: nodes.h:1060
Definition: oomph_definitions.h:222
Definition: refineable_mesh.h:48
virtual void p_adapt(const Vector< double > &elemental_error)
Definition: refineable_mesh.h:254
bool P_adapt_flag
Flag that requests p-adaptation.
Definition: refineable_mesh.h:347
unsigned Nrefined
Stats: Number of elements that were refined.
Definition: refineable_mesh.h:338
void enable_p_adaptation()
Enable adaptation.
Definition: refineable_mesh.h:201
unsigned nunrefined()
Access fct for number of elements that were unrefined.
Definition: refineable_mesh.h:107
unsigned & max_keep_unrefined()
Definition: refineable_mesh.h:123
DocInfo doc_info()
Access fct for DocInfo.
Definition: refineable_mesh.h:243
RefineableMeshBase()
Definition: refineable_mesh.h:57
bool Adapt_flag
Flag that requests adaptation.
Definition: refineable_mesh.h:344
void operator=(const RefineableMeshBase &)=delete
Broken assignment operator.
void enable_adaptation()
Enable adaptation.
Definition: refineable_mesh.h:189
DocInfo * Doc_info_pt
Pointer to DocInfo.
Definition: refineable_mesh.h:353
ErrorEstimator * spatial_error_estimator_pt() const
Access to spatial error estimator (const version.
Definition: refineable_mesh.h:149
virtual void p_refine_uniformly(DocInfo &doc_info)
p-refine mesh uniformly and doc process
Definition: refineable_mesh.h:280
unsigned Max_keep_unrefined
Definition: refineable_mesh.h:359
virtual unsigned unrefine_uniformly()=0
double & min_error()
Definition: refineable_mesh.h:170
unsigned Nunrefined
Stats: Number of elements that were unrefined.
Definition: refineable_mesh.h:341
virtual void p_refine_uniformly()
p-refine mesh uniformly
Definition: refineable_mesh.h:294
void p_unrefine_uniformly(DocInfo &doc_info)
p-unrefine mesh uniformly
Definition: refineable_mesh.h:308
bool Additional_synchronisation_of_hanging_nodes_not_required
Flag that disables additional synchronisation of hanging nodes.
Definition: refineable_mesh.h:350
DocInfo *& doc_info_pt()
Access fct for pointer to DocInfo.
Definition: refineable_mesh.h:183
void disable_p_adaptation()
Disable adaptation.
Definition: refineable_mesh.h:207
void disable_adaptation()
Disable adaptation.
Definition: refineable_mesh.h:195
bool adapt_flag()
Definition: refineable_mesh.h:50
void enable_additional_synchronisation_of_hanging_nodes()
Enable additional synchronisation of hanging nodes.
Definition: refineable_mesh.h:213
bool is_additional_synchronisation_of_hanging_nodes_disabled() const
Return whether additional synchronisation is enabled.
Definition: refineable_mesh.h:237
double & max_error()
Definition: refineable_mesh.h:177
bool is_adaptation_enabled() const
Return whether the mesh is to be adapted.
Definition: refineable_mesh.h:225
ErrorEstimator * Spatial_error_estimator_pt
Pointer to spatial error estimator.
Definition: refineable_mesh.h:323
bool is_p_adaptation_enabled() const
Return whether the mesh is to be adapted.
Definition: refineable_mesh.h:231
virtual void doc_adaptivity_targets(std::ostream &outfile)
Doc the targets for mesh adaptation.
Definition: refineable_mesh.h:129
double Max_error
Max. actual error.
Definition: refineable_mesh.h:335
virtual void refine_uniformly()
Refine mesh uniformly.
Definition: refineable_mesh.h:271
double Min_error
Min.actual error.
Definition: refineable_mesh.h:332
virtual void adapt(const Vector< double > &elemental_error)=0
unsigned nrefined()
Access fct for number of elements that were refined.
Definition: refineable_mesh.h:101
RefineableMeshBase(const RefineableMeshBase &dummy)=delete
Broken copy constructor.
double Min_permitted_error
Min. error (i.e. (try to) merge elements if their error is smaller)
Definition: refineable_mesh.h:329
virtual ~RefineableMeshBase()
Empty Destructor:
Definition: refineable_mesh.h:98
double & min_permitted_error()
Definition: refineable_mesh.h:156
unsigned Nrefinement_overruled
Definition: refineable_mesh.h:363
void disable_additional_synchronisation_of_hanging_nodes()
Disable additional synchronisation of hanging nodes.
Definition: refineable_mesh.h:219
double & max_permitted_error()
Definition: refineable_mesh.h:163
unsigned & nrefinement_overruled()
Definition: refineable_mesh.h:114
double Max_permitted_error
Max. error (i.e. split elements if their error is larger)
Definition: refineable_mesh.h:326
ErrorEstimator *& spatial_error_estimator_pt()
Access to spatial error estimator.
Definition: refineable_mesh.h:143
virtual void refine_uniformly(DocInfo &doc_info)=0
Refine mesh uniformly and doc process.
Base class for refineable tet meshes.
Definition: refineable_mesh.h:881
void doc_adaptivity_targets(std::ostream &outfile)
Doc the targets for mesh adaptation.
Definition: refineable_mesh.h:903
double compute_volume_target(const Vector< double > &elem_error, Vector< double > &target_volume)
Definition: refineable_mesh.h:922
double & max_element_size()
Max element size allowed during adaptation.
Definition: refineable_mesh.h:884
double & min_element_size()
Min element size allowed during adaptation.
Definition: refineable_mesh.h:890
double Max_element_size
Max permitted element size.
Definition: refineable_mesh.h:1046
double Min_element_size
Min permitted element size.
Definition: refineable_mesh.h:1049
double Max_permitted_edge_ratio
Max edge ratio before remesh gets triggered.
Definition: refineable_mesh.h:1052
double & max_permitted_edge_ratio()
Min edge ratio before remesh gets triggered.
Definition: refineable_mesh.h:896
Base class for tree-based refineable meshes.
Definition: refineable_mesh.h:376
virtual void get_elements_at_refinement_level(unsigned &refinement_level, Vector< RefineableElement * > &level_elements)
Definition: refineable_mesh.cc:113
void refine_base_mesh(Vector< Vector< unsigned >> &to_be_refined)
Refine base mesh according to specified refinement pattern.
Definition: refineable_mesh.cc:137
virtual void refine_selected_elements(const Vector< unsigned > &elements_to_be_refined)
Definition: refineable_mesh.cc:1816
unsigned & max_refinement_level()
Access fct for max. permissible refinement level (relative to base mesh)
Definition: refineable_mesh.h:486
unsigned Uniform_refinement_level_when_pruned
Level to which the mesh was uniformly refined when it was pruned.
Definition: refineable_mesh.h:753
unsigned uniform_refinement_level_when_pruned() const
Definition: refineable_mesh.h:618
virtual void dump_refinement(std::ostream &outfile)
Dump refinement pattern to allow for rebuild.
Definition: refineable_mesh.cc:218
unsigned Max_p_refinement_level
Max. permissible p-refinement level (relative to base mesh)
Definition: refineable_mesh.h:762
TreeForest * forest_pt()
Return pointer to the Forest represenation of the mesh.
Definition: refineable_mesh.h:460
unsigned & min_p_refinement_level()
Definition: refineable_mesh.h:506
virtual void read_refinement(std::ifstream &restart_file, Vector< Vector< unsigned >> &to_be_refined)
Read refinement pattern to allow for rebuild.
Definition: refineable_mesh.cc:251
unsigned unrefine_uniformly()
Definition: refineable_mesh.cc:2150
virtual void refine(std::ifstream &restart_file)
Refine mesh according to refinement pattern in restart file.
Definition: refineable_mesh.cc:201
virtual void adapt_mesh()
Definition: refineable_mesh.h:517
virtual void refine_base_mesh_as_in_reference_mesh(TreeBasedRefineableMeshBase *const &ref_mesh_pt)
Refine to same degree as the reference mesh.
Definition: refineable_mesh.cc:1885
void complete_hanging_nodes_recursively(Node *&nod_pt, Vector< Node * > &master_nodes, Vector< double > &hang_weights, const int &ival)
Auxiliary routine for recursive hanging node completion.
Definition: refineable_mesh.cc:2214
virtual void refine_as_in_reference_mesh(TreeBasedRefineableMeshBase *const &ref_mesh_pt)
Definition: refineable_mesh.cc:1947
unsigned & uniform_refinement_level_when_pruned()
Level to which the mesh was uniformly refined when it was pruned.
Definition: refineable_mesh.h:625
void operator=(const TreeBasedRefineableMeshBase &)=delete
Broken assignment operator.
void p_refine_selected_elements(const Vector< unsigned > &elements_to_be_refined)
p-refine mesh by refining the elements identified by their numbers.
Definition: refineable_mesh.cc:5264
virtual void split_elements_if_required()=0
void doc_adaptivity_targets(std::ostream &outfile)
Doc the targets for mesh adaptation.
Definition: refineable_mesh.h:467
TreeBasedRefineableMeshBase(const TreeBasedRefineableMeshBase &dummy)=delete
Broken copy constructor.
void refine_uniformly()
Refine mesh uniformly.
Definition: refineable_mesh.h:434
void p_unrefine_uniformly(DocInfo &doc_info)
p-unrefine mesh uniformly
Definition: refineable_mesh.cc:5240
virtual void get_refinement_levels(unsigned &min_refinement_level, unsigned &max_refinement_level)
Get max/min refinement levels in mesh.
Definition: refineable_mesh.cc:830
unsigned & max_p_refinement_level()
Definition: refineable_mesh.h:499
virtual void p_refine_elements_if_required()=0
void complete_hanging_nodes(const int &ncont_interpolated_values)
Complete the hanging node scheme recursively.
Definition: refineable_mesh.cc:2271
virtual void setup_tree_forest()=0
Set up the tree forest associated with the Mesh (if any)
TreeBasedRefineableMeshBase()
Constructor.
Definition: refineable_mesh.h:379
TreeForest * Forest_pt
Forest representation of the mesh.
Definition: refineable_mesh.h:768
virtual ~TreeBasedRefineableMeshBase()
Empty Destructor:
Definition: refineable_mesh.h:412
unsigned Min_p_refinement_level
Min. permissible p-refinement level (relative to base mesh)
Definition: refineable_mesh.h:765
void adapt(const Vector< double > &elemental_error)
Definition: refineable_mesh.cc:307
unsigned Max_refinement_level
Max. permissible refinement level (relative to base mesh)
Definition: refineable_mesh.h:756
void p_adapt(const Vector< double > &elemental_error)
Definition: refineable_mesh.cc:3951
void p_adapt_mesh()
Definition: refineable_mesh.h:533
virtual void get_refinement_pattern(Vector< Vector< unsigned >> &to_be_refined)
Definition: refineable_mesh.cc:50
virtual bool refine_base_mesh_as_in_reference_mesh_minus_one(TreeBasedRefineableMeshBase *const &ref_mesh_pt)
Definition: refineable_mesh.cc:1907
void p_refine_uniformly()
p-refine mesh uniformly
Definition: refineable_mesh.h:443
unsigned & min_refinement_level()
Access fct for min. permissible refinement level (relative to base mesh)
Definition: refineable_mesh.h:492
unsigned Min_refinement_level
Min. permissible refinement level (relative to base mesh)
Definition: refineable_mesh.h:759
Definition: refineable_mesh.h:809
virtual ~TreeBasedRefineableMesh()
Empty virtual destructor.
Definition: refineable_mesh.h:868
TreeBasedRefineableMesh(const TreeBasedRefineableMesh &dummy)=delete
Broken copy constructor.
void split_elements_if_required()
Definition: refineable_mesh.h:814
TreeBasedRefineableMesh()
Constructor, call the constructor of the base class.
Definition: refineable_mesh.h:862
void p_refine_elements_if_required()
Definition: refineable_mesh.h:830
unsigned ntree()
Number of trees in forest.
Definition: tree.h:460
TreeRoot * tree_pt(const unsigned &i) const
Return pointer to i-th tree in forest.
Definition: tree.h:466
void traverse_leaves(Tree::VoidMemberFctPt member_function)
Definition: tree.cc:207
#define min(a, b)
Definition: datatypes.h:22
#define max(a, b)
Definition: datatypes.h:23
static constexpr lastp1_t end
Definition: IndexedViewHelper.h:79
char char char int int * k
Definition: level2_impl.h:374
double Weight
NOTE: WE IMPOSE EITHER THESE ...
Definition: heated_linear_solid_contact_with_gravity.cc:2838
void start(const unsigned &i)
(Re-)start i-th timer
Definition: oomph_utilities.cc:243
bool Doc_comprehensive_timings
Definition: oomph_definitions.cc:49
double timer()
returns the time in seconds after some point in past
Definition: oomph_utilities.cc:1295
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86