2
/*******************************************************
4
* Copyright (c) 2003-2010 by University of Queensland
5
* Earth Systems Science Computational Center (ESSCC)
6
* http://www.uq.edu.au/esscc
8
* Primary Business: Queensland, Australia
9
* Licensed under the Open Software License version 3.0
10
* http://www.opensource.org/licenses/osl-3.0.php
12
*******************************************************/
14
#ifndef INC_DUDLEY_NODEFILE
15
#define INC_DUDLEY_NODEFILE
20
#include "NodeMapping.h"
21
#include "escript/DataC.h"
22
#include "paso/Distribution.h"
23
#include "paso/Coupler.h"
25
struct Dudley_NodeFile {
26
Esys_MPIInfo *MPIInfo; /* MPI information */
28
dim_t numNodes; /* number of nodes */
29
dim_t numDim; /* spatial dimension */
30
index_t *Id; /* Id[i] is the id number of node i. It need to be unique. */
31
index_t *Tag; /* Tag[i] is the tag of node i. */
32
index_t *tagsInUse; /* array of tags which are actually used */
33
dim_t numTagsInUse; /* number of tags used */
35
index_t *globalDegreesOfFreedom; /* globalDegreesOfFreedom[i] is the global degree of freedom assigned to node i */
36
/* this index is used to consider periodic boundary conditions by assigning */
37
/* the same degreesOfFreedom to the same node */
38
double *Coordinates; /* Coordinates[INDEX2(k,i,numDim)] is the k-th coordinate of the */
40
index_t *globalReducedDOFIndex; /* assigns each local node a global unique Id in a dens labeling of reduced DOF */
41
/* value <0 indicates that the DOF is not used */
42
index_t *globalReducedNodesIndex; /* assigns each local node a global unique Id in a dens labeling */
43
/* value <0 indicates that the DOF is not used */
44
index_t *globalNodesIndex; /* assigns each local reduced node a global unique Id in a dens labeling */
46
Dudley_NodeMapping *nodesMapping;
47
Dudley_NodeMapping *reducedNodesMapping;
48
Dudley_NodeMapping *degreesOfFreedomMapping;
49
Dudley_NodeMapping *reducedDegreesOfFreedomMapping;
51
Paso_Distribution *nodesDistribution;
52
Paso_Distribution *reducedNodesDistribution;
53
Paso_Distribution *degreesOfFreedomDistribution;
54
Paso_Distribution *reducedDegreesOfFreedomDistribution;
56
Paso_Connector *degreesOfFreedomConnector;
57
Paso_Connector *reducedDegreesOfFreedomConnector;
59
/* these a the packed versions of Id */
60
index_t *reducedNodesId;
61
index_t *degreesOfFreedomId;
62
index_t *reducedDegreesOfFreedomId;
64
int status; /* the status counts the updates done on the node coordinates */
65
/* the value of status is increased by when the node coordinates are updated. */
69
typedef struct Dudley_NodeFile Dudley_NodeFile;
72
Dudley_NodeFile *Dudley_NodeFile_alloc(dim_t, Esys_MPIInfo * MPIInfo);
73
index_t Dudley_NodeFile_getFirstReducedNode(Dudley_NodeFile * in);
74
index_t Dudley_NodeFile_getLastReducedNode(Dudley_NodeFile * in);
75
dim_t Dudley_NodeFile_getGlobalNumReducedNodes(Dudley_NodeFile * in);
76
index_t *Dudley_NodeFile_borrowGlobalReducedNodesIndex(Dudley_NodeFile * in);
77
index_t Dudley_NodeFile_maxGlobalNodeIDIndex(Dudley_NodeFile * in);
78
index_t Dudley_NodeFile_maxGlobalReducedNodeIDIndex(Dudley_NodeFile * in);
79
index_t Dudley_NodeFile_GlobalDegreeOfFreedomIndex(Dudley_NodeFile * in);
80
index_t Dudley_NodeFile_GlobalReducedDegreeOfFreedomIndex(Dudley_NodeFile * in);
82
index_t Dudley_NodeFile_getFirstNode(Dudley_NodeFile * in);
83
index_t Dudley_NodeFile_getLastNode(Dudley_NodeFile * in);
84
dim_t Dudley_NodeFile_getGlobalNumNodes(Dudley_NodeFile * in);
85
index_t *Dudley_NodeFile_borrowGlobalNodesIndex(Dudley_NodeFile * in);
87
/* returns the number of target */
88
dim_t Dudley_NodeFile_getNumReducedNodes(Dudley_NodeFile * in);
89
dim_t Dudley_NodeFile_getNumDegreesOfFreedom(Dudley_NodeFile * in);
90
dim_t Dudley_NodeFile_getNumNodes(Dudley_NodeFile * in);
91
dim_t Dudley_NodeFile_getNumReducedDegreesOfFreedom(Dudley_NodeFile * in);
93
/* returns the mapping from local nodes to a target */
94
index_t *Dudley_NodeFile_borrowTargetReducedNodes(Dudley_NodeFile * in);
95
index_t *Dudley_NodeFile_borrowTargetDegreesOfFreedom(Dudley_NodeFile * in);
96
index_t *Dudley_NodeFile_borrowTargetNodes(Dudley_NodeFile * in);
97
index_t *Dudley_NodeFile_borrowTargetReducedDegreesOfFreedom(Dudley_NodeFile * in);
98
/* returns the mapping from target to the local nodes */
99
index_t *Dudley_NodeFile_borrowReducedNodesTarget(Dudley_NodeFile * in);
100
index_t *Dudley_NodeFile_borrowDegreesOfFreedomTarget(Dudley_NodeFile * in);
101
index_t *Dudley_NodeFile_borrowNodesTarget(Dudley_NodeFile * in);
102
index_t *Dudley_NodeFile_borrowReducedDegreesOfFreedomTarget(Dudley_NodeFile * in);
104
void Dudley_NodeFile_allocTable(Dudley_NodeFile *, dim_t);
105
void Dudley_NodeFile_free(Dudley_NodeFile *);
106
void Dudley_NodeFile_freeTable(Dudley_NodeFile *);
107
void Dudley_NodeFile_setIdGlobalRange(index_t *, index_t *, Dudley_NodeFile *);
108
void Dudley_NodeFile_setIdRange(index_t *, index_t *, Dudley_NodeFile *);
109
void Dudley_NodeFile_setDOFGlobalRange(index_t *, index_t *, Dudley_NodeFile *);
110
void Dudley_NodeFile_setDOFRange(index_t *, index_t *, Dudley_NodeFile *);
112
void Dudley_NodeFile_setGlobalDOFRange(index_t *, index_t *, Dudley_NodeFile *);
113
void Dudley_NodeFile_setGlobalIdRange(index_t *, index_t *, Dudley_NodeFile *);
114
index_t Dudley_NodeFile_maxGlobalDegreeOfFreedomIndex(Dudley_NodeFile *);
115
index_t Dudley_NodeFile_maxGlobalReducedDegreeOfFreedomIndex(Dudley_NodeFile *);
117
void Dudley_NodeFile_setReducedDOFRange(index_t *, index_t *, Dudley_NodeFile *);
118
dim_t Dudley_NodeFile_createDenseDOFLabeling(Dudley_NodeFile *);
119
dim_t Dudley_NodeFile_createDenseNodeLabeling(Dudley_NodeFile * in, index_t * node_distribution,
120
const index_t * dof_distribution);
121
dim_t Dudley_NodeFile_createDenseReducedNodeLabeling(Dudley_NodeFile * in, index_t * reducedNodeMask);
122
dim_t Dudley_NodeFile_createDenseReducedDOFLabeling(Dudley_NodeFile * in, index_t * reducedNodeMask);
123
void Dudley_NodeFile_assignMPIRankToDOFs(Dudley_NodeFile * in, Esys_MPI_rank * mpiRankOfDOF, index_t * distribution);
124
void Dudley_NodeFile_gather(index_t *, Dudley_NodeFile *, Dudley_NodeFile *);
125
void Dudley_NodeFile_gather_global(index_t *, Dudley_NodeFile *, Dudley_NodeFile *);
126
void Dudley_NodeFile_gatherEntries(dim_t, index_t *, index_t, index_t, index_t *, index_t *, index_t *, index_t *,
127
index_t *, index_t *, dim_t numDim, double *, double *);
128
void Dudley_NodeFile_copyTable(dim_t, Dudley_NodeFile *, dim_t, dim_t, Dudley_NodeFile *);
129
void Dudley_NodeFile_scatter(index_t *, Dudley_NodeFile *, Dudley_NodeFile *);
130
void Dudley_NodeFile_scatterEntries(dim_t, index_t *, index_t, index_t, index_t *, index_t *, index_t *, index_t *,
131
index_t *, index_t *, dim_t numDim, double *, double *);
132
void Dudley_NodeFile_copyTable(dim_t, Dudley_NodeFile *, dim_t, dim_t, Dudley_NodeFile *);
133
void Dudley_NodeFile_setGlobalReducedDegreeOfFreedomRange(index_t * min_id, index_t * max_id, Dudley_NodeFile * in);
134
void Dudley_NodeFile_setGlobalNodeIDIndexRange(index_t * min_id, index_t * max_id, Dudley_NodeFile * in);
135
void Dudley_NodeFile_setGlobalReducedNodeIDIndexRange(index_t * min_id, index_t * max_id, Dudley_NodeFile * in);
137
/* ===================== */
138
void Dudley_NodeFile_setCoordinates(Dudley_NodeFile *, escriptDataC *);
139
void Dudley_NodeFile_setTags(Dudley_NodeFile *, const int, escriptDataC *);
140
void Dudley_NodeFile_setTagsInUse(Dudley_NodeFile * in);