29#ifndef OOMPH_MULTI_DOMAIN_CC
30#define OOMPH_MULTI_DOMAIN_CC
34#include <oomph-lib-config.h>
71 template<
class BULK_ELEMENT,
unsigned DIM>
85 std::ostringstream error_message;
86 error_message <<
"Sizes of vector of boundary ids in bulk mesh ("
88 <<
") and vector of pointers\n"
90 <<
" doesn't match.\n";
140 for (
unsigned i = 0;
i <
DIM;
i++)
144 for (
unsigned i = 0;
i <
DIM - 1;
i++)
206 template<
class BULK_ELEMENT,
unsigned DIM>
243 template<
class ELEMENT_0,
class ELEMENT_1>
279 template<
class EXT_ELEMENT>
282 Mesh*
const& mesh_pt,
296 error_stream <<
"The elements within the two interacting meshes have a\n"
297 <<
"dimension not equal to 1, 2 or 3.\n"
298 <<
"The multi-domain method will not work in this case.\n"
299 <<
"The dimension is: " <<
Dim <<
"\n";
335 template<
class EXT_ELEMENT,
class FACE_ELEMENT_GEOM_OBJECT>
338 Mesh*
const& mesh_pt,
353 error_stream <<
"The elements within the two interacting meshes have a\n"
354 <<
"dimension not equal to 1 or 2.\n"
355 <<
"The multi-domain method will not work in this case.\n"
356 <<
"The dimension is: " <<
Dim <<
"\n";
399 template<
class EXT_ELEMENT,
class FACE_ELEMENT_GEOM_OBJECT>
416 <<
"mesh_pt [ " <<
n_mesh <<
" ] don't match.\n";
445 <<
"while mesh 0 has Dim=" <<
old_dim << std::endl;
455 error_stream <<
"The elements within the two interacting meshes have a\n"
456 <<
"dimension not equal to 1 or 2.\n"
457 <<
"The multi-domain method will not work in this case.\n"
458 <<
"The dimension is: " <<
Dim <<
"\n";
484 template<
class EXT_ELEMENT,
class GEOM_OBJECT>
487 Mesh*
const& mesh_pt,
523 template<
class EXT_ELEMENT,
class GEOM_OBJECT>
540 <<
"mesh_pt [ " <<
n_mesh <<
" ] don't match.\n";
568 if (mesh_pt[
i_mesh]->nelement() != 0)
578 "Multi-domain setup does not work with spectral elements.",
588 "Multi-domain setup does not work with hp-refineable elements.",
647 <<
"Sorry I currently can't deal with non-bulk external elements\n"
648 <<
"in multi-domain setup for multiple meshes.\n"
649 <<
"The functionality should be easy to implement now that you\n"
650 <<
"have a test case. If you're not willinig to do this, call\n"
651 <<
"the multi-domain setup mesh-by-mesh instead (though this can\n"
652 <<
"be costly in parallel because of global comms. \n";
680 error_stream <<
"Lagrangian dimensions of elements don't match \n "
697 oomph_info <<
"CPU for creation of MeshAsGeomObjects and bin structure: "
729 mesh_pt[
i_mesh]->element_pt(
e));
741 el_pt->initialise_external_element_storage();
766 <<
"CPU for setup of lookup schemes for located elements/coords: "
792 ->last_sample_point_to_actually_lookup_during_locate_zeta() =
794 ->initial_last_sample_point_to_actually_lookup_during_locate_zeta();
796 ->first_sample_point_to_actually_lookup_during_locate_zeta() = 0;
799 bin_array_pt->total_number_of_sample_points_computed_recursively();
854 ->last_sample_point_to_actually_lookup_during_locate_zeta() =
856 ->initial_last_sample_point_to_actually_lookup_during_locate_zeta();
858 ->first_sample_point_to_actually_lookup_during_locate_zeta() = 0;
861 bin_array_pt->total_number_of_sample_points_computed_recursively();
955 oomph_info <<
"CPU for local location of zeta coordinate [spiral level "
1097 oomph_info <<
"BREAK N-1: CPU for entrire spiral [spiral level "
1109 oomph_info <<
"Ring-based search continued until iteration "
1112 oomph_info <<
"Total, av, max, min CPU for send/recv of remaining "
1113 "zeta coordinates: "
1117 oomph_info <<
"Total, av, max, min CPU for location of missing zeta "
1122 oomph_info <<
"Total, av, max, min CPU for send/recv of new element "
1127 oomph_info <<
"Total, av, max, min CPU for local creation of "
1128 "external halo objects: "
1199 oomph_info <<
"BREAK N: CPU for entrire spiral [spiral level "
1223 ->first_sample_point_to_actually_lookup_during_locate_zeta() =
1225 ->last_sample_point_to_actually_lookup_during_locate_zeta();
1227 ->last_sample_point_to_actually_lookup_during_locate_zeta() *=
1229 ->multiplier_for_max_sample_point_to_actually_lookup_during_locate_zeta();
1243#ifdef OOMPH_HAS_CGAL
1251 ->first_sample_point_to_actually_lookup_during_locate_zeta() =
1253 ->last_sample_point_to_actually_lookup_during_locate_zeta();
1255 ->last_sample_point_to_actually_lookup_during_locate_zeta() *=
1257 ->multiplier_for_max_sample_point_to_actually_lookup_during_locate_zeta();
1270 ->first_sample_point_to_actually_lookup_during_locate_zeta() <=
1296#ifdef OOMPH_HAS_CGAL
1305 ->first_sample_point_to_actually_lookup_during_locate_zeta() <=
1328 <<
"Multi_domain_functions::locate_zeta_for_local_coordinates()"
1339 <<
"\n\n\nThis is most likely to arise because the two meshes\n"
1340 <<
"that are to be matched don't overlap perfectly or\n"
1341 <<
"because the elements are distorted and too small a \n"
1342 <<
"number of sampling points has been used when setting\n"
1343 <<
"up the bin structure.\n\n"
1344 <<
"You should try to increase the value of \n"
1345 <<
"the number of sample points defined in \n\n"
1347 "SamplePointContainerParameters::Default_nsample_points_generated_"
1349 <<
"\n\n from its current value of "
1350 << SamplePointContainerParameters::
1351 Default_nsample_points_generated_per_element
1354 <<
"NOTE: You can suppress this error and \"accept failure\""
1355 <<
" by setting the public boolean \n\n"
1357 "Multi_domain_functions::Accept_failed_locate_zeta_in_setup_multi_"
1358 "domain_interaction\n\n"
1359 <<
" to true. In this case, the pointers to external elements\n"
1360 <<
" that couldn't be located will remain null\n";
1384 unsigned nel = mesh_pt[
i_mesh]->nelement();
1385 for (
unsigned e = 0;
e <
nel;
e++)
1396 for (
unsigned e = 0;
e <
nel;
e++)
1417 error_stream <<
"Number of unlocated elements " <<
n << std::endl;
1418 for (
unsigned e = 0;
e <
n;
e++)
1424 <<
"Why are we searching there?" << std::endl;
1436 mesh_pt[
i_mesh]->element_pt(
e));
1447 for (
unsigned i = 0;
i <
n_dim;
i++)
1461 <<
"Mesh and external mesh documented in missing_coords_mesh*.dat\n"
1462 <<
"and missing_coords_ext_mesh*.dat, respectively. Missing \n"
1463 <<
"coordinates in missing_coords*.dat\n";
1472 <<
" external elements in \n"
1473 <<
"Multi_domain_functions::aux_setup_multi_domain_interaction(...)\n"
1474 <<
"but this deemed to be acceptable because \n"
1475 <<
"Multi_domain_functions::Accept_failed_locate_zeta_in_setup_multi_"
1476 "domain_interaction\n"
1487 <<
"Total CPU for location and creation of all external elements: "
1508 oomph_info <<
"-------------------------------------------" << std::endl;
1509 oomph_info <<
"- Cumulative percentage of locate success -" << std::endl;
1510 oomph_info <<
"--- Spiral -- Found local -- Found else ---" << std::endl;
1525 oomph_info <<
"-------------------------------------------" << std::endl;
1536 oomph_info <<
"ASSESSMENT OF NEED FOR PARALLEL SEARCH: \n";
1537 oomph_info <<
"=======================================\n";
1541 oomph_info <<
"- Ring-based parallel search did successfully locate "
1551 <<
"- Ring-based parallel search did NOT locate zetas on proc"
1557 <<
"- No ring-based parallel search was performed on proc"
1575 oomph_info <<
"- Ring-based, parallel search did succesfully\n";
1576 oomph_info <<
" locate zetas on at least one other proc, so it\n";
1585 <<
"- Ring-based, parallel search did NOT locate zetas\n";
1586 oomph_info <<
" on ANY other procs, i.e it was useless.\n";
1588 <<
" --> We should really have done more local search\n";
1590 <<
" by reducing number of bins, or doing more spirals\n";
1591 oomph_info <<
" in one go before initiating parallel search.\n";
1596 oomph_info <<
"- No ring-based, parallel search was performed\n";
1604 oomph_info <<
"------------------------------------------" << std::endl;
1606 <<
" elements, and " << std::endl
1608 <<
" external halo elements, "
1610 <<
" external haloed elements" << std::endl;
1613 oomph_info <<
"------------------------------------------" << std::endl;
1615 <<
" nodes, and " << std::endl
1617 <<
" external halo nodes, "
1619 <<
" external haloed nodes" << std::endl;
1620 oomph_info <<
"------------------------------------------" << std::endl;
1630 oomph_info <<
"----------------------------------------" << std::endl;
1633 <<
" root halo elements, and "
1635 <<
" root haloed elements" << std::endl
1638 <<
" external halo elements, and "
1640 <<
" external haloed elements." << std::endl;
1642 oomph_info <<
"----------------------------------------" << std::endl;
1649 <<
" external halo nodes, and "
1651 <<
" external haloed nodes." << std::endl;
1653 oomph_info <<
"-----------------------------------------" << std::endl
1663 oomph_info <<
"CPU for (one way) aux_setup_multi_domain_interaction: "
1676 template<
class EXT_ELEMENT>
1685 int my_rank = comm_pt->my_rank();
1715 mesh_pt[
i_mesh]->element_pt(
e));
1773 ->ncont_interpolated_values();
1777#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
1780 <<
" Using macro element node update "
1792#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
1794 <<
" Number of macro element "
1825 <<
"in a case with non-QElements\n"
1826 <<
"has not yet been implemented.\n";
1852#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
1855 <<
" Index of existing external halo element "
1872 "External halo element is not a FiniteElement\n",
1923 template<
class EXT_ELEMENT>
1958 template<
class EXT_ELEMENT>
1971#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
1973 <<
" Boolean to indicate that continuously interpolated "
1975 <<
i_cont <<
" is hanging "
1981#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
1983 <<
" Number of master nodes "
2004 double master_weight =
2026 template<
class EXT_ELEMENT>
2037#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2040 <<
" Boolean to trigger construction of new external halo master node "
2051#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2053 <<
" index of existing external halo master node "
2067 template<
class EXT_ELEMENT>
2077#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2079 <<
" ndim for external halo master node "
2084#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2086 <<
" nposition type for external halo master node "
2092#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2094 <<
" nvalue for external halo master node "
2107#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2109 <<
" nlagrdim for external halo master solid node "
2114#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2116 <<
" nlagrtype for external halo master solid node "
2130#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2132 <<
" Boolean: need timestepper "
2138#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2140 <<
" Index minus one of timestepper "
2161#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2163 <<
" Boolean for algebraic boundary node "
2172 if (time_stepper_pt != 0)
2184#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2186 <<
" Number of boundaries the algebraic master node is on: "
2192 for (
unsigned i = 0;
i <
nb;
i++)
2195#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2197 <<
" Algebraic master node is on boundary "
2208#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2210 <<
"Number of additional values created by face element "
2211 <<
"for master node "
2227 throw OomphLibError(
"Failed to cast new node to boundary node\n",
2233 ->index_of_first_value_assigned_by_face_element_pt() == 0)
2236 ->index_of_first_value_assigned_by_face_element_pt() =
2237 new std::map<unsigned, unsigned>;
2242 std::map<unsigned, unsigned>*
map_pt =
2244 ->index_of_first_value_assigned_by_face_element_pt();
2251#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2254 <<
" Key of map entry for master node"
2261#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2264 <<
" Value of map entry for master node"
2279 if (time_stepper_pt != 0)
2298#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2300 <<
" algebraic node update id for master node "
2311#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2313 <<
" algebraic node number of ref values for master node "
2332#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2334 <<
" algebraic node number of geom objects for master node "
2348#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2350 <<
" algebraic node: " <<
i_geom <<
"-th out of "
2379#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2381 <<
" Boolean for master algebraic node is boundary node "
2388 if (time_stepper_pt != 0)
2401#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2404 <<
" Number of boundaries the macro element master node is on: "
2410 for (
unsigned i = 0;
i <
nb;
i++)
2413#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2415 <<
" Macro element master node is on boundary "
2425#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2427 <<
" Number of additional values created by face element "
2428 <<
"for macro element master node "
2444 throw OomphLibError(
"Failed to cast new node to boundary node\n",
2450 ->index_of_first_value_assigned_by_face_element_pt() == 0)
2453 ->index_of_first_value_assigned_by_face_element_pt() =
2454 new std::map<unsigned, unsigned>;
2459 std::map<unsigned, unsigned>*
map_pt =
2461 ->index_of_first_value_assigned_by_face_element_pt();
2468#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2471 <<
" Key of map entry for macro element master node"
2478#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2481 <<
" Value of map entry for macro element master node"
2496 if (time_stepper_pt != 0)
2513#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2515 <<
" Bool: need new external halo element "
2537 ->ncont_interpolated_values();
2543#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2545 <<
" Bool: we have a macro element mesh "
2556#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2558 <<
" Number of macro element "
2585 error_stream <<
"You are using a MacroElement node update\n"
2586 <<
"in a case with non-QElements. This has not\n"
2587 <<
"yet been implemented.\n";
2610#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2612 <<
" Number of already existing external halo element "
2629 geom_object_vector_pt =
macro_mesh_pt->geom_object_vector_pt();
2657 geom_object_vector_pt);
2664#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2666 <<
" Bool master is a boundary (solid) node "
2673 if (time_stepper_pt != 0)
2690#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2692 <<
" Number of boundaries the solid master node is on: "
2698 for (
unsigned i = 0;
i <
nb;
i++)
2701#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2703 <<
" Solid master node is on boundary "
2713#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2715 <<
" Number of additional values created by face element "
2716 <<
"for solid master node "
2732 throw OomphLibError(
"Failed to cast new node to boundary node\n",
2738 ->index_of_first_value_assigned_by_face_element_pt() == 0)
2741 ->index_of_first_value_assigned_by_face_element_pt() =
2742 new std::map<unsigned, unsigned>;
2747 std::map<unsigned, unsigned>*
map_pt =
2749 ->index_of_first_value_assigned_by_face_element_pt();
2756#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2759 <<
" Key of map entry for solid master node"
2766#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2769 <<
" Value of map entry for solid master node"
2784 if (time_stepper_pt != 0)
2820#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2822 <<
" Bool node is on boundary "
2832 if (time_stepper_pt != 0)
2844#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2846 <<
" Number of boundaries the master node is on: "
2852 for (
unsigned i = 0;
i <
nb;
i++)
2855#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2857 <<
" Master node is on boundary "
2868#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2870 <<
" Number of additional values created by face element "
2871 <<
"for master node "
2887 throw OomphLibError(
"Failed to cast new node to boundary node\n",
2893 ->index_of_first_value_assigned_by_face_element_pt() == 0)
2896 ->index_of_first_value_assigned_by_face_element_pt() =
2897 new std::map<unsigned, unsigned>;
2902 std::map<unsigned, unsigned>*
map_pt =
2904 ->index_of_first_value_assigned_by_face_element_pt();
2911#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2914 <<
" Key of map entry for master node"
2921#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2924 <<
" Value of map entry for master node"
2939 if (time_stepper_pt != 0)
///////////////////////////////////////////////////////////////////// ///////////////////////////////...
///////////////////////////////////////////////////////////////////// ///////////////////////////////...
///////////////////////////////////////////////////////////////////////////// ///////////////////////...
///////////////////////////////////////////////////////////////////// ///////////////////////////////...
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
A class that contains the information required by Nodes that are located on Mesh boundaries....
This is a base class for all elements that require external sources (e.g. FSI, multi-domain problems ...
A general Finite Element class.
virtual void set_macro_elem_pt(MacroElement *macro_elem_pt)
Set pointer to macro element – can be overloaded in derived elements to perform additional tasks.
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
virtual void local_coordinate_of_node(const unsigned &j, Vector< double > &s) const
Get local coordinates of node j in the element; vector sets its own size (broken virtual)
virtual std::string tecplot_zone_string(const unsigned &nplot) const
Return string for tecplot zone header (when plotting nplot points in each "coordinate direction")
void interpolated_zeta(const Vector< double > &s, Vector< double > &zeta) const
Calculate the interpolated value of zeta, the intrinsic coordinate of the element when viewed as a co...
double size() const
Calculate the size of the element (length, area, volume,...) in Eulerian computational coordinates....
virtual double interpolated_x(const Vector< double > &s, const unsigned &i) const
Return FE interpolated coordinate x[i] at local coordinate s.
unsigned dim() const
Return the spatial dimension of the element, i.e. the number of local coordinates required to paramet...
unsigned nnode() const
Return the number of nodes.
virtual void get_s_plot(const unsigned &i, const unsigned &nplot, Vector< double > &s, const bool &shifted_to_interior=false) const
Get cector of local coordinates of plot point i (when plotting nplot points in each "coordinate direc...
virtual unsigned nplot_points(const unsigned &nplot) const
Return total number of plot points (when plotting nplot points in each "coordinate direction")
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
virtual void write_tecplot_zone_footer(std::ostream &outfile, const unsigned &nplot) const
Add tecplot zone "footer" to output stream (when plotting nplot points in each "coordinate direction"...
A Generalised Element class.
bool is_halo() const
Is this element a halo?
unsigned ndim() const
Access function to # of Eulerian coordinates.
unsigned nlagrangian() const
Access function to # of Lagrangian coordinates.
Class that contains data for hanging nodes.
virtual double knot(const unsigned &i, const unsigned &j) const =0
Return local coordinate s[j] of i-th integration point.
virtual unsigned nweight() const =0
Return the number of integration points of the scheme.
MacroElementNodeUpdateMeshes contain MacroElementNodeUpdateNodes which have their own node update fun...
////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////// ///////////////////////////////...
Nodes are derived from Data, but, in addition, have a definite (Eulerian) position in a space of a gi...
unsigned ndim() const
Return (Eulerian) spatial dimension of the node.
An oomph-lib wrapper to the MPI_Comm communicator object. Just contains an MPI_Comm object (which is ...
An OomphLibError object which should be thrown when an run-time error is encountered....
/////////////////////////////////////////////////////////////////// /////////////////////////////////...
////////////////////////////////////////////////////////////////// //////////////////////////////////...
OomphCommunicator * communicator_pt()
access function to the oomph-lib communicator
bool problem_has_been_distributed()
Access to Problem_has_been_distributed flag.
TimeStepper *& time_stepper_pt()
Access function for the pointer to the first (presumably only) timestepper.
/////////////////////////////////////////////////////////////////// /////////////////////////////////...
RefineableElements are FiniteElements that may be subdivided into children to provide a better local ...
A Class for nodes that deform elastically (i.e. position is an unknown in the problem)....
//////////////////////////////////////////////////////////////////////
void output(std::ostream &outfile)
Output function: x,y,u or x,y,z,u.
////////////////////////////////////////////////////////////////////// //////////////////////////////...
unsigned ntstorage() const
Return the number of doubles required to represent history (one for steady)
Vector< int > Proc_id_plus_one_of_external_element
Proc_id_plus_one_of_external_element[i] contains the processor id (plus one) of the processor on whic...
Vector< double > Flat_packed_located_coordinates
Vector of flat-packed local coordinates for zeta tuples that have been located.
void send_and_receive_located_info(int &iproc, Mesh *const &external_mesh_pt, Problem *problem_pt)
Send location information from current process; Received location information from (current process +...
unsigned Counter_for_flat_packed_unsigneds
Counter used when processing vector of flat-packed unsigneds – this is really "private" data,...
Vector< Vector< unsigned > > External_element_located
Lookup scheme for whether a local element's integration point has had an external element assigned to...
unsigned Dim
Dimension of zeta tuples (set by get_dim_helper) – needed because we store the scalar coordinates in ...
Vector< double > Flat_packed_doubles
Vector of flat-packed doubles to be communicated with other processors.
void send_and_receive_missing_zetas(Problem *problem_pt)
Send the zeta coordinates from the current process to the next process; receive from the previous pro...
void setup_bulk_elements_adjacent_to_face_mesh(Problem *problem_pt, Vector< unsigned > &boundary_in_bulk_mesh, Mesh *const &bulk_mesh_pt, Vector< Mesh * > &face_mesh_pt, const unsigned &interaction=0)
Identify the FaceElements (stored in the mesh pointed to by face_mesh_pt) that are adjacent to the bu...
void clean_up()
Helper function that clears all the information used during the external storage creation.
void setup_multi_domain_interactions(Problem *problem_pt, Mesh *const &first_mesh_pt, Mesh *const &second_mesh_pt, const unsigned &first_interaction=0, const unsigned &second_interaction=0)
Set up the two-way multi-domain interactions for the problem pointed to by problem_pt....
Vector< unsigned > Flat_packed_unsigneds
Vector of flat-packed unsigneds to be communicated with other processors – this is really "private" d...
void add_external_halo_node_to_storage(Node *&new_nod_pt, Mesh *const &external_mesh_pt, unsigned &loc_p, unsigned &node_index, FiniteElement *const &new_el_pt, int &n_cont_inter_values, Problem *problem_pt)
Helper function to add external halo nodes, including any masters, based on information received from...
void get_dim_helper(Problem *problem_pt, Mesh *const &mesh_pt, Mesh *const &external_mesh_pt)
Helper function that computes the dimension of the elements within each of the specified meshes (and ...
std::ofstream Doc_boundary_coordinate_file
Output file to document the boundary coordinate along the mesh boundary of the bulk mesh during call ...
Vector< double > Flat_packed_zetas_not_found_locally
Vector of flat-packed zeta coordinates for which the external element could not be found during curre...
void recursively_add_masters_of_external_halo_node_to_storage(Node *&new_nod_pt, Mesh *const &external_mesh_pt, unsigned &loc_p, unsigned &node_index, FiniteElement *const &new_el_pt, int &n_cont_inter_values, Problem *problem_pt)
Recursively add masters of external halo nodes (and their masters, etc) based on information received...
void locate_zeta_for_local_coordinates(const Vector< Mesh * > &mesh_pt, Mesh *const &external_mesh_pt, Vector< MeshAsGeomObject * > &mesh_geom_obj_pt, const unsigned &interaction_index)
locate zeta for current set of "local" coordinates vector-based version
void construct_new_external_halo_master_node_helper(Node *&new_master_nod_pt, Node *&nod_pt, unsigned &loc_p, Mesh *const &external_mesh_pt, Problem *problem_pt)
Helper function which constructs a new external halo master node with the information sent from the h...
void create_external_halo_elements(int &iproc, const Vector< Mesh * > &mesh_pt, Mesh *const &external_mesh_pt, Problem *problem_pt, const unsigned &interaction_index)
Create external (halo) elements on the loop process based on the information received from each locat...
void add_external_halo_master_node_helper(Node *&new_master_nod_pt, Node *&new_nod_pt, Mesh *const &external_mesh_pt, unsigned &loc_p, int &n_cont_inter_values, Problem *problem_pt)
Helper function to add external halo node that is a master.
bool Use_bulk_element_as_external
Boolean to indicate when to use the bulk element as the external element. Defaults to false,...
void setup_multi_domain_interaction(Problem *problem_pt, Mesh *const &mesh_pt, Mesh *const &external_mesh_pt, const unsigned &interaction_index=0)
Function to set up the one-way multi-domain interaction for problems where the meshes pointed to by m...
void aux_setup_multi_domain_interaction(Problem *problem_pt, Mesh *const &mesh_pt, Mesh *const &external_mesh_pt, const unsigned &interaction_index, Mesh *const &external_face_mesh_pt=0)
Auxiliary helper function.
Vector< unsigned > Located_element_status
Vector to indicate (to another processor) whether a located element (that will have to represented as...
unsigned Counter_for_flat_packed_doubles
Counter used when processing vector of flat-packed doubles – this is really "private" data,...
void locate_zeta_for_missing_coordinates(int &iproc, Mesh *const &external_mesh_pt, Problem *problem_pt, Vector< MeshAsGeomObject * > &mesh_geom_obj_pt)
Locate zeta for current set of missing coordinates; vector-based version.
bool Accept_failed_locate_zeta_in_setup_multi_domain_interaction
Boolean to indicate that failure in setup multi domain functions is acceptable; defaults to false....
double timer()
returns the time in seconds after some point in past
//////////////////////////////////////////////////////////////////// ////////////////////////////////...
@ UseCGALSamplePointContainer
@ UseNonRefineableBinArray
OomphInfo oomph_info
Single (global) instantiation of the OomphInfo object – this is used throughout the library as a "rep...