escript  Revision_Unversioneddirectory
dudley/src/Mesh.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2016 by The University of Queensland
5 * http://www.uq.edu.au
6 *
7 * Primary Business: Queensland, Australia
8 * Licensed under the Apache License, version 2.0
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12 * Development 2012-2013 by School of Earth Sciences
13 * Development from 2014 by Centre for Geoscience Computing (GeoComp)
14 *
15 *****************************************************************************/
16 
17 #ifndef INC_DUDLEY_MESH
18 #define INC_DUDLEY_MESH
19 
20 /************************************************************************************/
21 
22 /* Dudley: Mesh */
23 
24 /* A mesh is built from nodes and elements which are describing the
25  domain, the surface and point sources. (the latter are needed to
26  establish links with other codes, in particular to particle
27  codes). The nodes are stored a Dudley_NodeFile and elements in a
28  Dudley_ElementFile. A Dudley_NodeFile and three Dudley_ElementFile
29  containing the elements describing the domain, surface and point
30  sources respectively. Notice that the surface elements do not
31  necessaryly cover the entire surface of the domain. */
32 
33 /* The element type is fixed by the reference element, see
34  ReferenceElement.h. The numbering of the nodes starts with 0. */
35 
36 /* Important: it is assumed that every node is appearing in at least
37  one element or surface element and that any node used in an
38  element, surface element or as a point is specified in the
39  Dudley_Node, see also Dudley_resolveNodeIds. */
40 
41 /* In some cases it is useful to refer to a mesh entirly built from
42  order 1 (=linear) elements. The linear version of the mesh can be
43  accessed by referning to the first few nodes of each element
44  (thanks to the way the nodes are ordered). As the numbering of
45  these nodes is not continuous a relabeling vectors are introduced
46  in the Dudley_NodeFile. This feature is not fully implemented
47  yet. */
48 
49 /* allnodes and elements are tagged. the tag allows to group nodes and
50  elements. A typical application is to mark surface elements on a
51  certain portion of the domain with the same tag. All these surface
52  elements can then assigned the same value eg. for the pressure. */
53 
54 /* Thespacial dimension is determined by the type of elements
55  used. The spacial dimension should be accessed by the function
56  Dudley_Mesh_getDim. Notice that the element type also determines
57  the type of surface elements to be used. */
58 
59 /************************************************************************************/
60 
61 #include "Dudley.h"
62 #include "NodeFile.h"
63 #include "ElementFile.h"
64 #include "TagMap.h"
65 #include "Util.h"
66 #include "paso/SystemMatrixPattern.h"
67 #include "escript/DataC.h"
68 
69 #ifdef ESYS_MPI
70 #include "esysUtils/Esys_MPI.h"
71 #endif
72 
73 /************************************************************************************/
74 
75 /* this struct holds a mesh: */
76 
77 struct Dudley_Mesh {
78  char *Name; /* the name of the mesh */
79  dim_t reference_counter; /* counts the number of references to the mesh; */
84  Dudley_NodeFile *Nodes; /* the table of the nodes */
85  Dudley_ElementFile *Elements; /* the table of the elements */
86  Dudley_ElementFile *FaceElements; /* the table of the face elements */
87  Dudley_ElementFile *Points; /* the table of points (treated as elements of dimension 0) */
88  Dudley_TagMap *TagMap; /* the tag map mapping names to tag keys */
89 
90  /* pointer to the sparse matrix pattern */
91 
97 };
98 
99 typedef struct Dudley_Mesh Dudley_Mesh;
100 
101 /* these structures are used for matching surfaces elements: */
102 
105  double x[MAX_numDim];
106 };
108 
109 /************************************************************************************/
110 
111 /* interfaces: */
112 Dudley_Mesh *Dudley_Mesh_alloc(char *name, dim_t numDim, esysUtils::JMPI& mpi_info);
116 
117 void Dudley_Mesh_addTagMap(Dudley_Mesh * mesh_p, const char *name, index_t tag_key);
118 index_t Dudley_Mesh_getTag(Dudley_Mesh * mesh_p, const char *name);
119 bool Dudley_Mesh_isValidTagName(Dudley_Mesh * mesh_p, const char *name);
120 void Dudley_Mesh_distributeByRankOfDOF(Dudley_Mesh * in, dim_t * distribution);
121 paso::SystemMatrixPattern_ptr Dudley_getPattern(Dudley_Mesh * mesh, bool reduce_row_order, bool reduce_col_order);
122 paso::SystemMatrixPattern_ptr Dudley_makePattern(Dudley_Mesh * mesh, bool reduce_row_order, bool reduce_col_order);
123 void Dudley_Mesh_write(Dudley_Mesh *, char *);
124 void Dudley_Mesh_dump(Dudley_Mesh * in, char *fname);
125 void Dudley_PrintMesh_Info(Dudley_Mesh *, bool);
126 Dudley_Mesh *Dudley_Mesh_load(char *fname);
128 Dudley_Mesh *Dudley_Mesh_readGmsh(char *, index_t, index_t, index_t, bool, bool);
130 
134 void Dudley_Mesh_setPoints(Dudley_Mesh * self, Dudley_ElementFile * elements);
135 
136 void Dudley_Mesh_optimizeDOFDistribution(Dudley_Mesh * in, dim_t * distribution);
137 void Dudley_Mesh_prepare(Dudley_Mesh * in, bool optimize);
138 void Dudley_Mesh_createColoring(Dudley_Mesh * in, index_t * node_localDOF_map);
141 void Dudley_Mesh_createMappings(Dudley_Mesh * in, index_t * dof_distribution, index_t * node_distribution);
142 void Dudley_Mesh_createNodeFileMappings(Dudley_Mesh * in, dim_t numReducedNodes, index_t * indexReducedNodes,
143  index_t * dof_first_component, index_t * nodes_first_component);
144 void Dudley_Mesh_markDOFsConnectedToRange(index_t * mask, index_t offset, index_t marker, index_t firstDOF,
145  index_t lastDOF, Dudley_Mesh * in, bool useLinear);
146 
148 
150 
151 void Dudley_Mesh_relableElementNodes(int *, int, Dudley_Mesh *);
152 void Dudley_Mesh_markNodes(int *, int, Dudley_Mesh *, bool);
153 
154 void Dudley_Mesh_glueFaces(Dudley_Mesh * self, double safety_factor, double tolerance, bool);
155 void Dudley_Mesh_joinFaces(Dudley_Mesh * self, double safety_factor, double tolerance, bool);
156 
157 int Dudley_Mesh_findMatchingFaces_compar(const void *, const void *);
158 void Dudley_Mesh_findMatchingFaces(Dudley_NodeFile *, Dudley_ElementFile *, double, double, int *, int *, int *, int *);
159 void Dudley_Mesh_print(Dudley_Mesh * in);
165 
166 #endif /* #ifndef INC_DUDLEY_MESH */
Dudley_Mesh * Dudley_Mesh_readGmsh(char *, index_t, index_t, index_t, bool, bool)
Definition: dudley/src/Mesh_readGmsh.cpp:37
Dudley_Mesh * Dudley_Mesh_alloc(char *name, dim_t numDim, esysUtils::JMPI &mpi_info)
Definition: dudley/src/Mesh.cpp:32
void Dudley_Mesh_setCoordinates(Dudley_Mesh *, const escript::Data *)
Definition: Mesh_setCoordinates.cpp:30
void Dudley_Mesh_markNodes(int *, int, Dudley_Mesh *, bool)
Definition: Mesh_markNodes.cpp:32
void Dudley_Mesh_setFaceElements(Dudley_Mesh *self, Dudley_ElementFile *elements)
Definition: dudley/src/Mesh.cpp:128
void Dudley_Mesh_write(Dudley_Mesh *, char *)
Definition: dudley/src/Mesh_write.cpp:32
void Dudley_Mesh_createNodeFileMappings(Dudley_Mesh *in, dim_t numReducedNodes, index_t *indexReducedNodes, index_t *dof_first_component, index_t *nodes_first_component)
Definition: Mesh_createNodeFileMappings.cpp:352
void Dudley_Mesh_setPoints(Dudley_Mesh *self, Dudley_ElementFile *elements)
Definition: dudley/src/Mesh.cpp:134
dim_t Dudley_Mesh_getDim(Dudley_Mesh *)
Definition: dudley/src/Mesh.cpp:117
void Dudley_Mesh_optimizeDOFDistribution(Dudley_Mesh *in, dim_t *distribution)
Definition: dudley/src/Mesh_optimizeDOFDistribution.cpp:76
void Dudley_Mesh_setOrders(Dudley_Mesh *in)
Definition: dudley/src/Mesh.cpp:156
esysUtils::JMPI MPIInfo
Definition: dudley/src/Mesh.h:96
void Dudley_Mesh_resolveNodeIds(Dudley_Mesh *)
Definition: Mesh_resolveNodeIds.cpp:37
Dudley_ElementFile * FaceElements
Definition: dudley/src/Mesh.h:86
char * Name
Definition: dudley/src/Mesh.h:78
void Dudley_Mesh_glueFaces(Dudley_Mesh *self, double safety_factor, double tolerance, bool)
Dudley_ElementFile * Points
Definition: dudley/src/Mesh.h:87
void Dudley_Mesh_markDOFsConnectedToRange(index_t *mask, index_t offset, index_t marker, index_t firstDOF, index_t lastDOF, Dudley_Mesh *in, bool useLinear)
Definition: Mesh_markNodes.cpp:39
Dudley_NodeFile * Nodes
Definition: dudley/src/Mesh.h:84
dim_t reference_counter
Definition: dudley/src/Mesh.h:79
boost::shared_ptr< SystemMatrixPattern > SystemMatrixPattern_ptr
Definition: SystemMatrixPattern.h:38
void Dudley_Mesh_print(Dudley_Mesh *in)
Definition: Mesh_print.cpp:32
dim_t Dudley_Mesh_FindMinDegreeNode(paso::SystemMatrixPattern_ptr pattern_p, index_t *available, index_t indicator)
void Dudley_Mesh_optimizeElementOrdering(Dudley_Mesh *in)
Definition: Mesh_prepare.cpp:142
index_t refId
Definition: dudley/src/Mesh.h:104
void Dudley_Mesh_free(Dudley_Mesh *)
Definition: dudley/src/Mesh.cpp:95
int Dudley_Mesh_getStatus(Dudley_Mesh *in)
Definition: dudley/src/Mesh.cpp:140
void Dudley_Mesh_relableElementNodes(int *, int, Dudley_Mesh *)
Definition: Mesh_relableElementNodes.cpp:34
Definition: dudley/src/Mesh.h:77
void Dudley_Mesh_prepare(Dudley_Mesh *in, bool optimize)
Definition: Mesh_prepare.cpp:30
int Dudley_Mesh_findMatchingFaces_compar(const void *, const void *)
Definition: dudley/src/Mesh_findMatchingFaces.cpp:37
paso::SystemMatrixPattern_ptr FullReducedPattern
Definition: dudley/src/Mesh.h:93
Definition: dudley/src/Mesh.h:103
Dudley_Mesh * Dudley_Mesh_merge(dim_t, Dudley_Mesh **)
Data represents a collection of datapoints.
Definition: Data.h:68
Dudley_ElementFile * Elements
Definition: dudley/src/Mesh.h:85
paso::SystemMatrixPattern_ptr ReducedFullPattern
Definition: dudley/src/Mesh.h:94
void Dudley_Mesh_setTagsInUse(Dudley_Mesh *in)
Definition: Mesh_prepare.cpp:154
Dudley_Mesh * Dudley_Mesh_read(char *, index_t, index_t, bool)
Definition: dudley/src/Mesh_read.cpp:31
void Dudley_Mesh_setElements(Dudley_Mesh *self, Dudley_ElementFile *elements)
Definition: dudley/src/Mesh.cpp:122
void Dudley_Mesh_distributeByRankOfDOF(Dudley_Mesh *in, dim_t *distribution)
Definition: Mesh_distributeByRankOfDOF.cpp:31
int index_t
Definition: types.h:24
index_t Dudley_Mesh_getTag(Dudley_Mesh *mesh_p, const char *name)
Definition: Mesh_tagmaps.cpp:35
void Dudley_PrintMesh_Info(Dudley_Mesh *, bool)
Definition: dudley/src/Mesh_write.cpp:148
dim_t approximationOrder
Definition: dudley/src/Mesh.h:80
void Dudley_Mesh_optimizeDOFLabeling(Dudley_Mesh *, dim_t *)
Definition: Mesh_optimizeDOFLabeling.cpp:33
Dudley_Mesh * Dudley_Mesh_reference(Dudley_Mesh *)
Definition: dudley/src/Mesh.cpp:86
dim_t reducedApproximationOrder
Definition: dudley/src/Mesh.h:81
Definition: dudley/src/NodeFile.h:28
void Dudley_Mesh_createColoring(Dudley_Mesh *in, index_t *node_localDOF_map)
Definition: Mesh_prepare.cpp:129
index_t dim_t
Definition: types.h:27
void Dudley_Mesh_addTagMap(Dudley_Mesh *mesh_p, const char *name, index_t tag_key)
Definition: Mesh_tagmaps.cpp:30
bool Dudley_Mesh_isValidTagName(Dudley_Mesh *mesh_p, const char *name)
Definition: Mesh_tagmaps.cpp:40
index_t Dudley_Mesh_getDegree(paso::SystemMatrixPattern_ptr pattern_p, index_t *label)
Definition: TagMap.h:28
paso::SystemMatrixPattern_ptr Dudley_makePattern(Dudley_Mesh *mesh, bool reduce_row_order, bool reduce_col_order)
Definition: dudley/src/Mesh_getPattern.cpp:93
dim_t integrationOrder
Definition: dudley/src/Mesh.h:82
void Dudley_Mesh_joinFaces(Dudley_Mesh *self, double safety_factor, double tolerance, bool)
void Dudley_Mesh_optimizeNodeLabeling(Dudley_Mesh *mesh_p)
dim_t reducedIntegrationOrder
Definition: dudley/src/Mesh.h:83
boost::shared_ptr< JMPI_ > JMPI
Definition: Esys_MPI.h:79
Dudley_TagMap * TagMap
Definition: dudley/src/Mesh.h:88
Dudley_Mesh * Dudley_Mesh_load(char *fname)
paso::SystemMatrixPattern_ptr Dudley_getPattern(Dudley_Mesh *mesh, bool reduce_row_order, bool reduce_col_order)
Definition: dudley/src/Mesh_getPattern.cpp:34
void Dudley_Mesh_dump(Dudley_Mesh *in, char *fname)
void Dudley_Mesh_findMatchingFaces(Dudley_NodeFile *, Dudley_ElementFile *, double, double, int *, int *, int *, int *)
Definition: dudley/src/Mesh_findMatchingFaces.cpp:70
paso::SystemMatrixPattern_ptr FullFullPattern
Definition: dudley/src/Mesh.h:92
#define MAX_numDim
Definition: dudley/src/NodeFile.h:20
Definition: dudley/src/ElementFile.h:40
paso::SystemMatrixPattern_ptr ReducedReducedPattern
Definition: dudley/src/Mesh.h:95
void Dudley_Mesh_createMappings(Dudley_Mesh *in, index_t *dof_distribution, index_t *node_distribution)
Definition: Mesh_createNodeFileMappings.cpp:326