ESYS13
Revision_
|
00001 00002 /******************************************************* 00003 * 00004 * Copyright (c) 2003-2012 by University of Queensland 00005 * Earth Systems Science Computational Center (ESSCC) 00006 * http://www.uq.edu.au/esscc 00007 * 00008 * Primary Business: Queensland, Australia 00009 * Licensed under the Open Software License version 3.0 00010 * http://www.opensource.org/licenses/osl-3.0.php 00011 * 00012 *******************************************************/ 00013 00014 #ifndef INC_DUDLEY_NODEFILE 00015 #define INC_DUDLEY_NODEFILE 00016 00017 #define MAX_numDim 3 00018 00019 #include "Dudley.h" 00020 #include "NodeMapping.h" 00021 #include "escript/DataC.h" 00022 #include "paso/Distribution.h" 00023 #include "paso/Coupler.h" 00024 00025 struct Dudley_NodeFile { 00026 Esys_MPIInfo *MPIInfo; /* MPI information */ 00027 00028 dim_t numNodes; /* number of nodes */ 00029 dim_t numDim; /* spatial dimension */ 00030 index_t *Id; /* Id[i] is the id number of node i. It need to be unique. */ 00031 index_t *Tag; /* Tag[i] is the tag of node i. */ 00032 index_t *tagsInUse; /* array of tags which are actually used */ 00033 dim_t numTagsInUse; /* number of tags used */ 00034 00035 index_t *globalDegreesOfFreedom; /* globalDegreesOfFreedom[i] is the global degree of freedom assigned to node i */ 00036 /* this index is used to consider periodic boundary conditions by assigning */ 00037 /* the same degreesOfFreedom to the same node */ 00038 double *Coordinates; /* Coordinates[INDEX2(k,i,numDim)] is the k-th coordinate of the */ 00039 /* node i. */ 00040 index_t *globalReducedDOFIndex; /* assigns each local node a global unique Id in a dens labeling of reduced DOF */ 00041 /* value <0 indicates that the DOF is not used */ 00042 index_t *globalReducedNodesIndex; /* assigns each local node a global unique Id in a dens labeling */ 00043 /* value <0 indicates that the DOF is not used */ 00044 index_t *globalNodesIndex; /* assigns each local reduced node a global unique Id in a dens labeling */ 00045 00046 Dudley_NodeMapping *nodesMapping; 00047 Dudley_NodeMapping *reducedNodesMapping; 00048 Dudley_NodeMapping *degreesOfFreedomMapping; 00049 Dudley_NodeMapping *reducedDegreesOfFreedomMapping; 00050 00051 Paso_Distribution *nodesDistribution; 00052 Paso_Distribution *reducedNodesDistribution; 00053 Paso_Distribution *degreesOfFreedomDistribution; 00054 Paso_Distribution *reducedDegreesOfFreedomDistribution; 00055 00056 Paso_Connector *degreesOfFreedomConnector; 00057 Paso_Connector *reducedDegreesOfFreedomConnector; 00058 00059 /* these a the packed versions of Id */ 00060 index_t *reducedNodesId; 00061 index_t *degreesOfFreedomId; 00062 index_t *reducedDegreesOfFreedomId; 00063 00064 int status; /* the status counts the updates done on the node coordinates */ 00065 /* the value of status is increased by when the node coordinates are updated. */ 00066 00067 }; 00068 00069 typedef struct Dudley_NodeFile Dudley_NodeFile; 00070 00071 00072 Dudley_NodeFile *Dudley_NodeFile_alloc(dim_t, Esys_MPIInfo * MPIInfo); 00073 index_t Dudley_NodeFile_getFirstReducedNode(Dudley_NodeFile * in); 00074 index_t Dudley_NodeFile_getLastReducedNode(Dudley_NodeFile * in); 00075 dim_t Dudley_NodeFile_getGlobalNumReducedNodes(Dudley_NodeFile * in); 00076 index_t *Dudley_NodeFile_borrowGlobalReducedNodesIndex(Dudley_NodeFile * in); 00077 index_t Dudley_NodeFile_maxGlobalNodeIDIndex(Dudley_NodeFile * in); 00078 index_t Dudley_NodeFile_maxGlobalReducedNodeIDIndex(Dudley_NodeFile * in); 00079 index_t Dudley_NodeFile_GlobalDegreeOfFreedomIndex(Dudley_NodeFile * in); 00080 index_t Dudley_NodeFile_GlobalReducedDegreeOfFreedomIndex(Dudley_NodeFile * in); 00081 00082 index_t Dudley_NodeFile_getFirstNode(Dudley_NodeFile * in); 00083 index_t Dudley_NodeFile_getLastNode(Dudley_NodeFile * in); 00084 dim_t Dudley_NodeFile_getGlobalNumNodes(Dudley_NodeFile * in); 00085 index_t *Dudley_NodeFile_borrowGlobalNodesIndex(Dudley_NodeFile * in); 00086 00087 /* returns the number of target */ 00088 dim_t Dudley_NodeFile_getNumReducedNodes(Dudley_NodeFile * in); 00089 dim_t Dudley_NodeFile_getNumDegreesOfFreedom(Dudley_NodeFile * in); 00090 dim_t Dudley_NodeFile_getNumNodes(Dudley_NodeFile * in); 00091 dim_t Dudley_NodeFile_getNumReducedDegreesOfFreedom(Dudley_NodeFile * in); 00092 00093 /* returns the mapping from local nodes to a target */ 00094 index_t *Dudley_NodeFile_borrowTargetReducedNodes(Dudley_NodeFile * in); 00095 index_t *Dudley_NodeFile_borrowTargetDegreesOfFreedom(Dudley_NodeFile * in); 00096 index_t *Dudley_NodeFile_borrowTargetNodes(Dudley_NodeFile * in); 00097 index_t *Dudley_NodeFile_borrowTargetReducedDegreesOfFreedom(Dudley_NodeFile * in); 00098 /* returns the mapping from target to the local nodes */ 00099 index_t *Dudley_NodeFile_borrowReducedNodesTarget(Dudley_NodeFile * in); 00100 index_t *Dudley_NodeFile_borrowDegreesOfFreedomTarget(Dudley_NodeFile * in); 00101 index_t *Dudley_NodeFile_borrowNodesTarget(Dudley_NodeFile * in); 00102 index_t *Dudley_NodeFile_borrowReducedDegreesOfFreedomTarget(Dudley_NodeFile * in); 00103 00104 void Dudley_NodeFile_allocTable(Dudley_NodeFile *, dim_t); 00105 void Dudley_NodeFile_free(Dudley_NodeFile *); 00106 void Dudley_NodeFile_freeTable(Dudley_NodeFile *); 00107 void Dudley_NodeFile_setIdGlobalRange(index_t *, index_t *, Dudley_NodeFile *); 00108 void Dudley_NodeFile_setIdRange(index_t *, index_t *, Dudley_NodeFile *); 00109 void Dudley_NodeFile_setDOFGlobalRange(index_t *, index_t *, Dudley_NodeFile *); 00110 void Dudley_NodeFile_setDOFRange(index_t *, index_t *, Dudley_NodeFile *); 00111 00112 void Dudley_NodeFile_setGlobalDOFRange(index_t *, index_t *, Dudley_NodeFile *); 00113 void Dudley_NodeFile_setGlobalIdRange(index_t *, index_t *, Dudley_NodeFile *); 00114 index_t Dudley_NodeFile_maxGlobalDegreeOfFreedomIndex(Dudley_NodeFile *); 00115 index_t Dudley_NodeFile_maxGlobalReducedDegreeOfFreedomIndex(Dudley_NodeFile *); 00116 00117 void Dudley_NodeFile_setReducedDOFRange(index_t *, index_t *, Dudley_NodeFile *); 00118 dim_t Dudley_NodeFile_createDenseDOFLabeling(Dudley_NodeFile *); 00119 dim_t Dudley_NodeFile_createDenseNodeLabeling(Dudley_NodeFile * in, index_t * node_distribution, 00120 const index_t * dof_distribution); 00121 dim_t Dudley_NodeFile_createDenseReducedNodeLabeling(Dudley_NodeFile * in, index_t * reducedNodeMask); 00122 dim_t Dudley_NodeFile_createDenseReducedDOFLabeling(Dudley_NodeFile * in, index_t * reducedNodeMask); 00123 void Dudley_NodeFile_assignMPIRankToDOFs(Dudley_NodeFile * in, Esys_MPI_rank * mpiRankOfDOF, index_t * distribution); 00124 void Dudley_NodeFile_gather(index_t *, Dudley_NodeFile *, Dudley_NodeFile *); 00125 void Dudley_NodeFile_gather_global(index_t *, Dudley_NodeFile *, Dudley_NodeFile *); 00126 void Dudley_NodeFile_gatherEntries(dim_t, index_t *, index_t, index_t, index_t *, index_t *, index_t *, index_t *, 00127 index_t *, index_t *, dim_t numDim, double *, double *); 00128 void Dudley_NodeFile_copyTable(dim_t, Dudley_NodeFile *, dim_t, dim_t, Dudley_NodeFile *); 00129 void Dudley_NodeFile_scatter(index_t *, Dudley_NodeFile *, Dudley_NodeFile *); 00130 void Dudley_NodeFile_scatterEntries(dim_t, index_t *, index_t, index_t, index_t *, index_t *, index_t *, index_t *, 00131 index_t *, index_t *, dim_t numDim, double *, double *); 00132 void Dudley_NodeFile_copyTable(dim_t, Dudley_NodeFile *, dim_t, dim_t, Dudley_NodeFile *); 00133 void Dudley_NodeFile_setGlobalReducedDegreeOfFreedomRange(index_t * min_id, index_t * max_id, Dudley_NodeFile * in); 00134 void Dudley_NodeFile_setGlobalNodeIDIndexRange(index_t * min_id, index_t * max_id, Dudley_NodeFile * in); 00135 void Dudley_NodeFile_setGlobalReducedNodeIDIndexRange(index_t * min_id, index_t * max_id, Dudley_NodeFile * in); 00136 00137 /* ===================== */ 00138 void Dudley_NodeFile_setCoordinates(Dudley_NodeFile *, escriptDataC *); 00139 void Dudley_NodeFile_setTags(Dudley_NodeFile *, const int, escriptDataC *); 00140 void Dudley_NodeFile_setTagsInUse(Dudley_NodeFile * in); 00141 00142 #endif