ESYS13  Revision_
NodeFile.h
Go to the documentation of this file.
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