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