/[escript]/trunk/dataexporter/src/NodeData.cpp
ViewVC logotype

Diff of /trunk/dataexporter/src/NodeData.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2834 by caltinay, Thu Jan 7 06:06:56 2010 UTC revision 2881 by jfenwick, Thu Jan 28 02:03:15 2010 UTC
# Line 1  Line 1 
1    
2  /*******************************************************  /*******************************************************
3  *  *
4  * Copyright (c) 2003-2009 by University of Queensland  * Copyright (c) 2003-2010 by University of Queensland
5  * Earth Systems Science Computational Center (ESSCC)  * Earth Systems Science Computational Center (ESSCC)
6  * http://www.uq.edu.au/esscc  * http://www.uq.edu.au/esscc
7  *  *
# Line 125  bool NodeData::initFromFinley(const Finl Line 125  bool NodeData::initFromFinley(const Finl
125      numDims = finleyFile->numDim;      numDims = finleyFile->numDim;
126      numNodes = finleyFile->numNodes;      numNodes = finleyFile->numNodes;
127    
128        int mpisize = finleyFile->MPIInfo->size;
129        int* iPtr = finleyFile->nodesDistribution->first_component;
130        nodeDist.clear();
131        nodeDist.insert(nodeDist.end(), mpisize+1, 0);
132        copy(iPtr, iPtr+mpisize+1, nodeDist.begin());
133    
134      CoordArray::iterator it;      CoordArray::iterator it;
135      for (it = coords.begin(); it != coords.end(); it++)      for (it = coords.begin(); it != coords.end(); it++)
136          delete[] *it;          delete[] *it;
137      coords.clear();      coords.clear();
138        nodeID.clear();
139        nodeTag.clear();
140        nodeGDOF.clear();
141        nodeGNI.clear();
142        nodeGRDFI.clear();
143        nodeGRNI.clear();
144    
145      if (numNodes > 0) {      if (numNodes > 0) {
146          for (int i=0; i<numDims; i++) {          for (int i=0; i<numDims; i++) {
# Line 140  bool NodeData::initFromFinley(const Finl Line 152  bool NodeData::initFromFinley(const Finl
152              }              }
153          }          }
154    
         int* iPtr;  
   
155          iPtr = finleyFile->Id;          iPtr = finleyFile->Id;
         nodeID.clear();  
156          nodeID.insert(nodeID.end(), numNodes, 0);          nodeID.insert(nodeID.end(), numNodes, 0);
157          copy(iPtr, iPtr+numNodes, nodeID.begin());          copy(iPtr, iPtr+numNodes, nodeID.begin());
158    
159          iPtr = finleyFile->Tag;          iPtr = finleyFile->Tag;
         nodeTag.clear();  
160          nodeTag.insert(nodeTag.end(), numNodes, 0);          nodeTag.insert(nodeTag.end(), numNodes, 0);
161          copy(iPtr, iPtr+numNodes, nodeTag.begin());          copy(iPtr, iPtr+numNodes, nodeTag.begin());
162    
163          iPtr = finleyFile->globalDegreesOfFreedom;          iPtr = finleyFile->globalDegreesOfFreedom;
         nodeGDOF.clear();  
164          nodeGDOF.insert(nodeGDOF.end(), numNodes, 0);          nodeGDOF.insert(nodeGDOF.end(), numNodes, 0);
165          copy(iPtr, iPtr+numNodes, nodeGDOF.begin());          copy(iPtr, iPtr+numNodes, nodeGDOF.begin());
166    
167          iPtr = finleyFile->globalNodesIndex;          iPtr = finleyFile->globalNodesIndex;
         nodeGNI.clear();  
168          nodeGNI.insert(nodeGNI.end(), numNodes, 0);          nodeGNI.insert(nodeGNI.end(), numNodes, 0);
169          copy(iPtr, iPtr+numNodes, nodeGNI.begin());          copy(iPtr, iPtr+numNodes, nodeGNI.begin());
170    
171          iPtr = finleyFile->globalReducedDOFIndex;          iPtr = finleyFile->globalReducedDOFIndex;
         nodeGRDFI.clear();  
172          nodeGRDFI.insert(nodeGRDFI.end(), numNodes, 0);          nodeGRDFI.insert(nodeGRDFI.end(), numNodes, 0);
173          copy(iPtr, iPtr+numNodes, nodeGRDFI.begin());          copy(iPtr, iPtr+numNodes, nodeGRDFI.begin());
174    
175          iPtr = finleyFile->globalReducedNodesIndex;          iPtr = finleyFile->globalReducedNodesIndex;
         nodeGRNI.clear();  
176          nodeGRNI.insert(nodeGRNI.end(), numNodes, 0);          nodeGRNI.insert(nodeGRNI.end(), numNodes, 0);
177          copy(iPtr, iPtr+numNodes, nodeGRNI.begin());          copy(iPtr, iPtr+numNodes, nodeGRNI.begin());
178    
         int mpisize = finleyFile->MPIInfo->size;  
         iPtr = finleyFile->nodesDistribution->first_component;  
         nodeDist.clear();  
         nodeDist.insert(nodeDist.end(), mpisize+1, 0);  
         copy(iPtr, iPtr+mpisize+1, nodeDist.begin());  
179      }      }
180      return true;      return true;
181  }  }
# Line 199  bool NodeData::readFromNc(NcFile* ncFile Line 198  bool NodeData::readFromNc(NcFile* ncFile
198      att = ncFile->get_att("mpi_size");      att = ncFile->get_att("mpi_size");
199      int mpisize = att->as_int(0);      int mpisize = att->as_int(0);
200    
201        nodeDist.clear();
202        nodeDist.insert(nodeDist.end(), mpisize+1, 0);
203        var = ncFile->get_var("Nodes_NodeDistribution");
204        var->get(&nodeDist[0], mpisize+1);
205    
206      CoordArray::iterator it;      CoordArray::iterator it;
207      for (it = coords.begin(); it != coords.end(); it++)      for (it = coords.begin(); it != coords.end(); it++)
208          delete[] *it;          delete[] *it;
209      coords.clear();      coords.clear();
     var = ncFile->get_var("Nodes_Coordinates");  
     for (int i=0; i<numDims; i++) {  
         float* c = new float[numNodes];  
         var->set_cur(0, i);  
         var->get(c, numNodes, 1);  
         coords.push_back(c);  
     }  
   
210      nodeID.clear();      nodeID.clear();
     nodeID.insert(nodeID.end(), numNodes, 0);  
     var = ncFile->get_var("Nodes_Id");  
     var->get(&nodeID[0], numNodes);  
   
211      nodeTag.clear();      nodeTag.clear();
     nodeTag.insert(nodeTag.end(), numNodes, 0);  
     var = ncFile->get_var("Nodes_Tag");  
     var->get(&nodeTag[0], numNodes);  
   
212      nodeGDOF.clear();      nodeGDOF.clear();
     nodeGDOF.insert(nodeGDOF.end(), numNodes, 0);  
     var = ncFile->get_var("Nodes_gDOF");  
     var->get(&nodeGDOF[0], numNodes);  
   
213      nodeGNI.clear();      nodeGNI.clear();
     nodeGNI.insert(nodeGNI.end(), numNodes, 0);  
     var = ncFile->get_var("Nodes_gNI");  
     var->get(&nodeGNI[0], numNodes);  
   
214      nodeGRDFI.clear();      nodeGRDFI.clear();
     nodeGRDFI.insert(nodeGRDFI.end(), numNodes, 0);  
     var = ncFile->get_var("Nodes_grDfI");  
     var->get(&nodeGRDFI[0], numNodes);  
   
215      nodeGRNI.clear();      nodeGRNI.clear();
     nodeGRNI.insert(nodeGRNI.end(), numNodes, 0);  
     var = ncFile->get_var("Nodes_grNI");  
     var->get(&nodeGRNI[0], numNodes);  
216    
217      nodeDist.clear();      // Only attempt to read further if there are any nodes.
218      nodeDist.insert(nodeDist.end(), mpisize+1, 0);      // Having no nodes is not an error.
219      var = ncFile->get_var("Nodes_NodeDistribution");      if (numNodes > 0) {
220      var->get(&nodeDist[0], mpisize+1);          var = ncFile->get_var("Nodes_Coordinates");
221            for (int i=0; i<numDims; i++) {
222                float* c = new float[numNodes];
223                var->set_cur(0, i);
224                var->get(c, numNodes, 1);
225                coords.push_back(c);
226            }
227    
228            nodeID.insert(nodeID.end(), numNodes, 0);
229            var = ncFile->get_var("Nodes_Id");
230            var->get(&nodeID[0], numNodes);
231    
232            nodeTag.insert(nodeTag.end(), numNodes, 0);
233            var = ncFile->get_var("Nodes_Tag");
234            var->get(&nodeTag[0], numNodes);
235    
236            nodeGDOF.insert(nodeGDOF.end(), numNodes, 0);
237            var = ncFile->get_var("Nodes_gDOF");
238            var->get(&nodeGDOF[0], numNodes);
239    
240            nodeGNI.insert(nodeGNI.end(), numNodes, 0);
241            var = ncFile->get_var("Nodes_gNI");
242            var->get(&nodeGNI[0], numNodes);
243    
244            nodeGRDFI.insert(nodeGRDFI.end(), numNodes, 0);
245            var = ncFile->get_var("Nodes_grDfI");
246            var->get(&nodeGRDFI[0], numNodes);
247    
248            nodeGRNI.insert(nodeGRNI.end(), numNodes, 0);
249            var = ncFile->get_var("Nodes_grNI");
250            var->get(&nodeGRNI[0], numNodes);
251        }
252    
253      return true;      return true;
254  #else // !USE_NETCDF  #else // !USE_NETCDF
# Line 279  const IntVec& NodeData::getVarDataByName Line 283  const IntVec& NodeData::getVarDataByName
283  StringVec NodeData::getVarNames() const  StringVec NodeData::getVarNames() const
284  {  {
285      StringVec res;      StringVec res;
286      if (numNodes > 0) {      res.push_back("Nodes_Id");
287          res.push_back("Nodes_Id");      res.push_back("Nodes_Tag");
288          res.push_back("Nodes_Tag");      res.push_back("Nodes_gDOF");
289          res.push_back("Nodes_gDOF");      res.push_back("Nodes_gNI");
290          res.push_back("Nodes_gNI");      res.push_back("Nodes_grDfI");
291          res.push_back("Nodes_grDfI");      res.push_back("Nodes_grNI");
         res.push_back("Nodes_grNI");  
     }  
292      return res;      return res;
293  }  }
294    
295  //  //
 //  
 //  
 void NodeData::removeGhostNodes(int ownIndex)  
 {  
     if (nodeDist.empty() || ownIndex > nodeDist.size()-1)  
         return;  
   
     int firstId = nodeDist[ownIndex];  
     int lastId = nodeDist[ownIndex+1];  
   
     // no ghost nodes  
     if (lastId-firstId == numNodes)  
         return;  
   
     // we have at most lastId-firstId nodes, it could be less however if  
     // nodes were culled already  
     numNodes = lastId-firstId;  
   
     CoordArray newCoords;  
     CoordArray::iterator it;  
     for (int i=0; i<numDims; i++) {  
         float* c = new float[numNodes];  
         newCoords.push_back(c);  
     }  
   
     IntVec newNodeID, newNodeTag;  
     IntVec newNodeGDOF, newNodeGNI, newNodeGRDFI, newNodeGRNI;  
   
     IndexMap nodeID2idx = getIndexMap();  
     int destIdx = 0;  
     for (int i=firstId; i<lastId; i++) {  
         IndexMap::iterator it = nodeID2idx.find(i);  
         if (it == nodeID2idx.end()) {  
             continue;  
         }  
         int idx = it->second;  
         for (int dim=0; dim<numDims; dim++) {  
             newCoords[dim][destIdx] = coords[dim][idx];  
         }  
         destIdx++;  
         newNodeID.push_back(i);  
         newNodeTag.push_back(nodeTag[idx]);  
         newNodeGDOF.push_back(nodeGDOF[idx]);  
         newNodeGNI.push_back(nodeGNI[idx]);  
         newNodeGRDFI.push_back(nodeGRDFI[idx]);  
         newNodeGRNI.push_back(nodeGRNI[idx]);  
     }  
   
     numNodes = destIdx;  
   
     for (it = coords.begin(); it != coords.end(); it++)  
         delete[] *it;  
   
     coords = newCoords;  
     nodeID = newNodeID;  
     nodeTag = newNodeTag;  
     nodeGDOF = newNodeGDOF;  
     nodeGNI = newNodeGNI;  
     nodeGRDFI = newNodeGRDFI;  
     nodeGRNI = newNodeGRNI;  
 }  
   
 //  
296  //  //
297  //  //
298  bool NodeData::writeToSilo(DBfile* dbfile)  bool NodeData::writeToSilo(DBfile* dbfile)

Legend:
Removed from v.2834  
changed lines
  Added in v.2881

  ViewVC Help
Powered by ViewVC 1.1.26