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