29#ifndef OOMPH_MULTI_DOMAIN_TEMPLATE_HEADER
30#define OOMPH_MULTI_DOMAIN_TEMPLATE_HEADER
34#include <oomph-lib-config.h>
58 template<
class ELEMENT>
59 class FaceElementAsGeomObject;
61 template<
class ELEMENT>
62 class CompareBoundaryCoordinate;
78 template<
class BULK_ELEMENT,
unsigned DIM>
92 std::ostringstream error_message;
93 error_message <<
"Sizes of vector of boundary ids in bulk mesh ("
95 <<
") and vector of pointers\n"
97 <<
" doesn't match.\n";
147 for (
unsigned i = 0;
i <
DIM;
i++)
151 for (
unsigned i = 0;
i <
DIM - 1;
i++)
213 template<
class BULK_ELEMENT,
unsigned DIM>
250 template<
class ELEMENT_0,
class ELEMENT_1>
286 template<
class EXT_ELEMENT>
289 Mesh*
const& mesh_pt,
303 error_stream <<
"The elements within the two interacting meshes have a\n"
304 <<
"dimension not equal to 1, 2 or 3.\n"
305 <<
"The multi-domain method will not work in this case.\n"
306 <<
"The dimension is: " <<
Dim <<
"\n";
342 template<
class EXT_ELEMENT,
class FACE_ELEMENT_GEOM_OBJECT>
345 Mesh*
const& mesh_pt,
360 error_stream <<
"The elements within the two interacting meshes have a\n"
361 <<
"dimension not equal to 1 or 2.\n"
362 <<
"The multi-domain method will not work in this case.\n"
363 <<
"The dimension is: " <<
Dim <<
"\n";
406 template<
class EXT_ELEMENT,
class FACE_ELEMENT_GEOM_OBJECT>
423 <<
"mesh_pt [ " <<
n_mesh <<
" ] don't match.\n";
452 <<
"while mesh 0 has Dim=" <<
old_dim << std::endl;
462 error_stream <<
"The elements within the two interacting meshes have a\n"
463 <<
"dimension not equal to 1 or 2.\n"
464 <<
"The multi-domain method will not work in this case.\n"
465 <<
"The dimension is: " <<
Dim <<
"\n";
491 template<
class EXT_ELEMENT,
class GEOM_OBJECT>
494 Mesh*
const& mesh_pt,
530 template<
class EXT_ELEMENT,
class GEOM_OBJECT>
547 <<
"mesh_pt [ " <<
n_mesh <<
" ] don't match.\n";
575 if (mesh_pt[
i_mesh]->nelement() != 0)
585 "Multi-domain setup does not work with spectral elements.",
595 "Multi-domain setup does not work with hp-refineable elements.",
654 <<
"Sorry I currently can't deal with non-bulk external elements\n"
655 <<
"in multi-domain setup for multiple meshes.\n"
656 <<
"The functionality should be easy to implement now that you\n"
657 <<
"have a test case. If you're not willinig to do this, call\n"
658 <<
"the multi-domain setup mesh-by-mesh instead (though this can\n"
659 <<
"be costly in parallel because of global comms. \n";
687 error_stream <<
"Lagrangian dimensions of elements don't match \n "
704 oomph_info <<
"CPU for creation of MeshAsGeomObjects and bin structure: "
736 mesh_pt[
i_mesh]->element_pt(
e));
748 el_pt->initialise_external_element_storage();
773 <<
"CPU for setup of lookup schemes for located elements/coords: "
799 ->last_sample_point_to_actually_lookup_during_locate_zeta() =
801 ->initial_last_sample_point_to_actually_lookup_during_locate_zeta();
803 ->first_sample_point_to_actually_lookup_during_locate_zeta() = 0;
806 bin_array_pt->total_number_of_sample_points_computed_recursively();
861 ->last_sample_point_to_actually_lookup_during_locate_zeta() =
863 ->initial_last_sample_point_to_actually_lookup_during_locate_zeta();
865 ->first_sample_point_to_actually_lookup_during_locate_zeta() = 0;
868 bin_array_pt->total_number_of_sample_points_computed_recursively();
962 oomph_info <<
"CPU for local location of zeta coordinate [spiral level "
1104 oomph_info <<
"BREAK N-1: CPU for entrire spiral [spiral level "
1116 oomph_info <<
"Ring-based search continued until iteration "
1119 oomph_info <<
"Total, av, max, min CPU for send/recv of remaining "
1120 "zeta coordinates: "
1124 oomph_info <<
"Total, av, max, min CPU for location of missing zeta "
1129 oomph_info <<
"Total, av, max, min CPU for send/recv of new element "
1134 oomph_info <<
"Total, av, max, min CPU for local creation of "
1135 "external halo objects: "
1206 oomph_info <<
"BREAK N: CPU for entrire spiral [spiral level "
1230 ->first_sample_point_to_actually_lookup_during_locate_zeta() =
1232 ->last_sample_point_to_actually_lookup_during_locate_zeta();
1234 ->last_sample_point_to_actually_lookup_during_locate_zeta() *=
1236 ->multiplier_for_max_sample_point_to_actually_lookup_during_locate_zeta();
1250#ifdef OOMPH_HAS_CGAL
1258 ->first_sample_point_to_actually_lookup_during_locate_zeta() =
1260 ->last_sample_point_to_actually_lookup_during_locate_zeta();
1262 ->last_sample_point_to_actually_lookup_during_locate_zeta() *=
1264 ->multiplier_for_max_sample_point_to_actually_lookup_during_locate_zeta();
1277 ->first_sample_point_to_actually_lookup_during_locate_zeta() <=
1303#ifdef OOMPH_HAS_CGAL
1312 ->first_sample_point_to_actually_lookup_during_locate_zeta() <=
1335 <<
"Multi_domain_functions::locate_zeta_for_local_coordinates()"
1346 <<
"\n\n\nThis is most likely to arise because the two meshes\n"
1347 <<
"that are to be matched don't overlap perfectly or\n"
1348 <<
"because the elements are distorted and too small a \n"
1349 <<
"number of sampling points has been used when setting\n"
1350 <<
"up the bin structure.\n\n"
1351 <<
"You should try to increase the value of \n"
1352 <<
"the number of sample points defined in \n\n"
1354 "SamplePointContainerParameters::Default_nsample_points_generated_"
1356 <<
"\n\n from its current value of "
1357 << SamplePointContainerParameters::
1358 Default_nsample_points_generated_per_element
1361 <<
"NOTE: You can suppress this error and \"accept failure\""
1362 <<
" by setting the public boolean \n\n"
1364 "Multi_domain_functions::Accept_failed_locate_zeta_in_setup_multi_"
1365 "domain_interaction\n\n"
1366 <<
" to true. In this case, the pointers to external elements\n"
1367 <<
" that couldn't be located will remain null\n";
1391 unsigned nel = mesh_pt[
i_mesh]->nelement();
1392 for (
unsigned e = 0;
e <
nel;
e++)
1403 for (
unsigned e = 0;
e <
nel;
e++)
1423 "missing_coords%s.dat",
1427 error_stream <<
"Number of unlocated elements " <<
n << std::endl;
1428 for (
unsigned e = 0;
e <
n;
e++)
1434 <<
"Why are we searching there?" << std::endl;
1446 mesh_pt[
i_mesh]->element_pt(
e));
1457 for (
unsigned i = 0;
i <
n_dim;
i++)
1471 <<
"Mesh and external mesh documented in missing_coords_mesh*.dat\n"
1472 <<
"and missing_coords_ext_mesh*.dat, respectively. Missing \n"
1473 <<
"coordinates in missing_coords*.dat\n";
1482 <<
" external elements in \n"
1483 <<
"Multi_domain_functions::aux_setup_multi_domain_interaction(...)\n"
1484 <<
"but this deemed to be acceptable because \n"
1485 <<
"Multi_domain_functions::Accept_failed_locate_zeta_in_setup_multi_"
1486 "domain_interaction\n"
1497 <<
"Total CPU for location and creation of all external elements: "
1518 oomph_info <<
"-------------------------------------------" << std::endl;
1519 oomph_info <<
"- Cumulative percentage of locate success -" << std::endl;
1520 oomph_info <<
"--- Spiral -- Found local -- Found else ---" << std::endl;
1535 oomph_info <<
"-------------------------------------------" << std::endl;
1546 oomph_info <<
"ASSESSMENT OF NEED FOR PARALLEL SEARCH: \n";
1547 oomph_info <<
"=======================================\n";
1551 oomph_info <<
"- Ring-based parallel search did successfully locate "
1561 <<
"- Ring-based parallel search did NOT locate zetas on proc"
1567 <<
"- No ring-based parallel search was performed on proc"
1585 oomph_info <<
"- Ring-based, parallel search did succesfully\n";
1586 oomph_info <<
" locate zetas on at least one other proc, so it\n";
1595 <<
"- Ring-based, parallel search did NOT locate zetas\n";
1596 oomph_info <<
" on ANY other procs, i.e it was useless.\n";
1598 <<
" --> We should really have done more local search\n";
1600 <<
" by reducing number of bins, or doing more spirals\n";
1601 oomph_info <<
" in one go before initiating parallel search.\n";
1606 oomph_info <<
"- No ring-based, parallel search was performed\n";
1614 oomph_info <<
"------------------------------------------" << std::endl;
1616 <<
" elements, and " << std::endl
1618 <<
" external halo elements, "
1620 <<
" external haloed elements" << std::endl;
1623 oomph_info <<
"------------------------------------------" << std::endl;
1625 <<
" nodes, and " << std::endl
1627 <<
" external halo nodes, "
1629 <<
" external haloed nodes" << std::endl;
1630 oomph_info <<
"------------------------------------------" << std::endl;
1640 oomph_info <<
"----------------------------------------" << std::endl;
1643 <<
" root halo elements, and "
1645 <<
" root haloed elements" << std::endl
1648 <<
" external halo elements, and "
1650 <<
" external haloed elements." << std::endl;
1652 oomph_info <<
"----------------------------------------" << std::endl;
1659 <<
" external halo nodes, and "
1661 <<
" external haloed nodes." << std::endl;
1663 oomph_info <<
"-----------------------------------------" << std::endl
1673 oomph_info <<
"CPU for (one way) aux_setup_multi_domain_interaction: "
1686 template<
class EXT_ELEMENT>
1695 int my_rank = comm_pt->my_rank();
1725 mesh_pt[
i_mesh]->element_pt(
e));
1783 ->ncont_interpolated_values();
1787#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
1790 <<
" Using macro element node update "
1802#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
1804 <<
" Number of macro element "
1835 <<
"in a case with non-QElements\n"
1836 <<
"has not yet been implemented.\n";
1862#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
1865 <<
" Index of existing external halo element "
1882 "External halo element is not a FiniteElement\n",
1933 template<
class EXT_ELEMENT>
1968 template<
class EXT_ELEMENT>
1981#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
1983 <<
" Boolean to indicate that continuously interpolated "
1985 <<
i_cont <<
" is hanging "
1991#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
1993 <<
" Number of master nodes "
2014 double master_weight =
2036 template<
class EXT_ELEMENT>
2047#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2050 <<
" Boolean to trigger construction of new external halo master node "
2061#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2063 <<
" index of existing external halo master node "
2077 template<
class EXT_ELEMENT>
2087#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2089 <<
" ndim for external halo master node "
2094#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2096 <<
" nposition type for external halo master node "
2102#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2104 <<
" nvalue for external halo master node "
2117#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2119 <<
" nlagrdim for external halo master solid node "
2124#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2126 <<
" nlagrtype for external halo master solid node "
2140#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2142 <<
" Boolean: need timestepper "
2148#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2150 <<
" Index minus one of timestepper "
2171#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2173 <<
" Boolean for algebraic boundary node "
2182 if (time_stepper_pt != 0)
2194#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2196 <<
" Number of boundaries the algebraic master node is on: "
2202 for (
unsigned i = 0;
i <
nb;
i++)
2205#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2207 <<
" Algebraic master node is on boundary "
2218#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2220 <<
"Number of additional values created by face element "
2221 <<
"for master node "
2237 throw OomphLibError(
"Failed to cast new node to boundary node\n",
2243 ->index_of_first_value_assigned_by_face_element_pt() == 0)
2246 ->index_of_first_value_assigned_by_face_element_pt() =
2247 new std::map<unsigned, unsigned>;
2252 std::map<unsigned, unsigned>*
map_pt =
2254 ->index_of_first_value_assigned_by_face_element_pt();
2261#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2264 <<
" Key of map entry for master node"
2271#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2274 <<
" Value of map entry for master node"
2289 if (time_stepper_pt != 0)
2308#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2310 <<
" algebraic node update id for master node "
2321#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2323 <<
" algebraic node number of ref values for master node "
2342#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2344 <<
" algebraic node number of geom objects for master node "
2358#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2360 <<
" algebraic node: " <<
i_geom <<
"-th out of "
2389#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2391 <<
" Boolean for master algebraic node is boundary node "
2398 if (time_stepper_pt != 0)
2411#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2414 <<
" Number of boundaries the macro element master node is on: "
2420 for (
unsigned i = 0;
i <
nb;
i++)
2423#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2425 <<
" Macro element master node is on boundary "
2435#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2437 <<
" Number of additional values created by face element "
2438 <<
"for macro element master node "
2454 throw OomphLibError(
"Failed to cast new node to boundary node\n",
2460 ->index_of_first_value_assigned_by_face_element_pt() == 0)
2463 ->index_of_first_value_assigned_by_face_element_pt() =
2464 new std::map<unsigned, unsigned>;
2469 std::map<unsigned, unsigned>*
map_pt =
2471 ->index_of_first_value_assigned_by_face_element_pt();
2478#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2481 <<
" Key of map entry for macro element master node"
2488#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2491 <<
" Value of map entry for macro element master node"
2506 if (time_stepper_pt != 0)
2523#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2525 <<
" Bool: need new external halo element "
2547 ->ncont_interpolated_values();
2553#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2555 <<
" Bool: we have a macro element mesh "
2566#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2568 <<
" Number of macro element "
2595 error_stream <<
"You are using a MacroElement node update\n"
2596 <<
"in a case with non-QElements. This has not\n"
2597 <<
"yet been implemented.\n";
2620#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2622 <<
" Number of already existing external halo element "
2639 geom_object_vector_pt =
macro_mesh_pt->geom_object_vector_pt();
2667 geom_object_vector_pt);
2674#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2676 <<
" Bool master is a boundary (solid) node "
2683 if (time_stepper_pt != 0)
2700#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2702 <<
" Number of boundaries the solid master node is on: "
2708 for (
unsigned i = 0;
i <
nb;
i++)
2711#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2713 <<
" Solid master node is on boundary "
2723#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2725 <<
" Number of additional values created by face element "
2726 <<
"for solid master node "
2742 throw OomphLibError(
"Failed to cast new node to boundary node\n",
2748 ->index_of_first_value_assigned_by_face_element_pt() == 0)
2751 ->index_of_first_value_assigned_by_face_element_pt() =
2752 new std::map<unsigned, unsigned>;
2757 std::map<unsigned, unsigned>*
map_pt =
2759 ->index_of_first_value_assigned_by_face_element_pt();
2766#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2769 <<
" Key of map entry for solid master node"
2776#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2779 <<
" Value of map entry for solid master node"
2794 if (time_stepper_pt != 0)
2830#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2832 <<
" Bool node is on boundary "
2842 if (time_stepper_pt != 0)
2854#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2856 <<
" Number of boundaries the master node is on: "
2862 for (
unsigned i = 0;
i <
nb;
i++)
2865#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2867 <<
" Master node is on boundary "
2878#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2880 <<
" Number of additional values created by face element "
2881 <<
"for master node "
2897 throw OomphLibError(
"Failed to cast new node to boundary node\n",
2903 ->index_of_first_value_assigned_by_face_element_pt() == 0)
2906 ->index_of_first_value_assigned_by_face_element_pt() =
2907 new std::map<unsigned, unsigned>;
2912 std::map<unsigned, unsigned>*
map_pt =
2914 ->index_of_first_value_assigned_by_face_element_pt();
2921#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2924 <<
" Key of map entry for master node"
2931#ifdef ANNOTATE_MULTI_DOMAIN_COMMUNICATION
2934 <<
" Value of map entry for master node"
2949 if (time_stepper_pt != 0)
Base class for all bin arrays.
CGAL-based SamplePointContainer.
NonRefineableBinArray class.
RefineableBinArray class.
Algebraic meshes contain AlgebraicElements and AlgebraicNodes. They implement the node update functio...
Algebraic nodes are nodes with an algebraic positional update function.
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...
MacroElementNodeUpdate nodes are nodes with a positional update function, based on their element's Ma...
This class provides a GeomObject representation of a given finite element mesh. The Lagrangian coordi...
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....
p-refineable version of RefineableElement
////////////////////////////////////////////////////////////////// //////////////////////////////////...
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.
Base class for Qelements.
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)....
TAdvectionDiffusionReactionElement<NREAGENT,DIM,NNODE_1D> elements are isoparametric triangular DIM-d...
void output(std::ostream &outfile)
Output function: x,y,u or x,y,z,u.
Base class for time-stepping schemes. Timestepper provides an approximation of the temporal derivativ...
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
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
@ UseCGALSamplePointContainer
@ UseNonRefineableBinArray
OomphInfo oomph_info
Single (global) instantiation of the OomphInfo object – this is used throughout the library as a "rep...