/[escript]/trunk/finley/src/Mesh_prepare.cpp
ViewVC logotype

Diff of /trunk/finley/src/Mesh_prepare.cpp

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

temp/finley/src/Mesh_prepare.c revision 1387 by trankine, Fri Jan 11 07:45:26 2008 UTC trunk/finley/src/Mesh_prepare.cpp revision 4428 by caltinay, Thu May 30 06:39:10 2013 UTC
# Line 1  Line 1 
1    
2  /* $Id$ */  /*****************************************************************************
3    *
4    * Copyright (c) 2003-2013 by University of Queensland
5    * http://www.uq.edu.au
6    *
7    * Primary Business: Queensland, Australia
8    * Licensed under the Open Software License version 3.0
9    * http://www.opensource.org/licenses/osl-3.0.php
10    *
11    * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12    * Development since 2012 by School of Earth Sciences
13    *
14    *****************************************************************************/
15    
 /*******************************************************  
  *  
  *           Copyright 2003-2007 by ACceSS MNRF  
  *       Copyright 2007 by University of Queensland  
  *  
  *                http://esscc.uq.edu.au  
  *        Primary Business: Queensland, Australia  
  *  Licensed under the Open Software License version 3.0  
  *     http://www.opensource.org/licenses/osl-3.0.php  
  *  
  *******************************************************/  
16    
17  /**************************************************************/  /************************************************************************************/
18    
19  /*   Finley: Mesh: prepares the mesh for further calculations  */  /*   Finley: Mesh: prepares the mesh for further calculations  */
20    
21  /**************************************************************/  /************************************************************************************/
22    
23  #include "Mesh.h"  #include "Mesh.h"
24    
25  /**************************************************************/  /************************************************************************************/
26    
27  void Finley_Mesh_prepare(Finley_Mesh* in, bool_t optimize) {  void Finley_Mesh_prepare(Finley_Mesh* in, bool_t optimize) {
28       dim_t newGlobalNumDOFs=0, numReducedNodes=0,i;       dim_t newGlobalNumDOFs=0, numReducedNodes=0,i;
29       index_t* distribution=NULL, *maskReducedNodes=NULL, *indexReducedNodes=NULL;       index_t* distribution=NULL, *maskReducedNodes=NULL, *indexReducedNodes=NULL, *node_distribution=NULL;
30       if (in==NULL) return;       if (in==NULL) return;
31       if (in->Nodes == NULL) return;       if (in->Nodes == NULL) return;
32    
33         Finley_Mesh_setOrders(in);
34    
35       /* first step is to distribute the elements according to a global distribution of DOF */       /* first step is to distribute the elements according to a global distribution of DOF */
36    
37       distribution=TMPMEMALLOC(in->MPIInfo->size+1,index_t);       distribution=new index_t[in->MPIInfo->size+1];
38       if (! Finley_checkPtr(distribution)) {       node_distribution=new index_t[in->MPIInfo->size+1];
39         if (! (Finley_checkPtr(distribution) || Finley_checkPtr(node_distribution))) {
40          /* first we create dense labeling for the DOFs */          /* first we create dense labeling for the DOFs */
41          newGlobalNumDOFs=Finley_NodeFile_createDenseDOFLabeling(in->Nodes);  
42            newGlobalNumDOFs=in->Nodes->createDenseDOFLabeling();
43    
44          /* create a distribution of the global DOFs and determine          /* create a distribution of the global DOFs and determine
45             the MPI_rank controling the DOFs on this processor      */             the MPI_rank controlling the DOFs on this processor      */
46          Paso_MPIInfo_setDistribution(in->MPIInfo,0,newGlobalNumDOFs-1,distribution);          Esys_MPIInfo_setDistribution(in->MPIInfo,0,newGlobalNumDOFs-1,distribution);
47    
48          /* now the mesh is re-distributed according to the mpiRankOfDOF vector */          /* now the mesh is re-distributed according to the mpiRankOfDOF vector */
49          /* this will redistribute the Nodes and Elements including overlap and will create an element coloring          /* this will redistribute the Nodes and Elements including overlap and will create an element coloring
50             but will not create any mappings (see later in this function)                                   */             but will not create any mappings (see later in this function) */
51          if (Finley_noError()) Finley_Mesh_distributeByRankOfDOF(in,distribution);          if (Finley_noError()) Finley_Mesh_distributeByRankOfDOF(in,distribution);
52       }       }
53    
54       /* at this stage we are able to start an optimization of the DOF distribution using ParaMetis */       /* at this stage we are able to start an optimization of the DOF distribution using ParMetis */
55       /* on return distribution is altered and new DOF ids have been assigned */       /* on return distribution is altered and new DOF ids have been assigned */
56       if (Finley_noError() && optimize && in->MPIInfo->size>1) {       if (Finley_noError() && optimize && in->MPIInfo->size>1) {
57             Finley_Mesh_optimizeDOFDistribution(in,distribution);
          Finley_Mesh_optimizeDOFDistribution(in,distribution);  
   
58           if (Finley_noError()) Finley_Mesh_distributeByRankOfDOF(in,distribution);           if (Finley_noError()) Finley_Mesh_distributeByRankOfDOF(in,distribution);
   
59       }       }
60       /* now a local labeling of the DOF is introduced */       /* the local labelling of the degrees of freedom is optimized */
61       if (Finley_noError() && optimize) {       if (Finley_noError() && optimize) {
62         Finley_Mesh_optimizeDOFLabeling(in,distribution);         Finley_Mesh_optimizeDOFLabeling(in,distribution);
63       }       }
# Line 65  void Finley_Mesh_prepare(Finley_Mesh* in Line 67  void Finley_Mesh_prepare(Finley_Mesh* in
67    
68       /* create the global indices */       /* create the global indices */
69       if (Finley_noError()) {       if (Finley_noError()) {
70          maskReducedNodes=TMPMEMALLOC(in->Nodes->numNodes,index_t);  
71          indexReducedNodes=TMPMEMALLOC(in->Nodes->numNodes,index_t);  
72            maskReducedNodes=new index_t[in->Nodes->numNodes];
73            indexReducedNodes=new index_t[in->Nodes->numNodes];
74          if (! ( Finley_checkPtr(maskReducedNodes) ||  Finley_checkPtr(indexReducedNodes) ) ) {          if (! ( Finley_checkPtr(maskReducedNodes) ||  Finley_checkPtr(indexReducedNodes) ) ) {
75    
76    /* useful DEBUG:
77    {index_t MIN_id,MAX_id;
78    printf("Mesh_prepare: global DOF : %d\n",newGlobalNumDOFs);
79    in->Nodes->setGlobalIdRange(&MIN_id,&MAX_id);
80    printf("Mesh_prepare: global node id range = %d :%d\n", MIN_id,MAX_id);
81    in->Nodes->setIdRange(&MIN_id,&MAX_id);
82    printf("Mesh_prepare: local node id range = %d :%d\n", MIN_id,MAX_id);
83    }
84    */
85            #pragma omp parallel for private(i) schedule(static)            #pragma omp parallel for private(i) schedule(static)
86            for (i=0;i<in->Nodes->numNodes;++i) maskReducedNodes[i]=-1;            for (i=0;i<in->Nodes->numNodes;++i) maskReducedNodes[i]=-1;
87    
88            Finley_Mesh_markNodes(maskReducedNodes,0,in,1);            Finley_Mesh_markNodes(maskReducedNodes,0,in,TRUE);
89        
90            numReducedNodes=Finley_Util_packMask(in->Nodes->numNodes,maskReducedNodes,indexReducedNodes);            numReducedNodes=Finley_Util_packMask(in->Nodes->numNodes,maskReducedNodes,indexReducedNodes);
91    
92            Finley_NodeFile_createDenseNodeLabeling(in->Nodes);            in->Nodes->createDenseNodeLabeling(node_distribution, distribution);
93            Finley_NodeFile_createDenseReducedNodeLabeling(in->Nodes,maskReducedNodes);            // created reduced DOF labeling
94            Finley_NodeFile_createDenseReducedDOFLabeling(in->Nodes,maskReducedNodes);            in->Nodes->createDenseReducedLabeling(maskReducedNodes, false);
95              // created reduced node labeling
96              in->Nodes->createDenseReducedLabeling(maskReducedNodes, true);
97    
98            /* create the missing mappings */            /* create the missing mappings */
99            if (Finley_noError()) Finley_Mesh_createNodeFileMappings(in,numReducedNodes,indexReducedNodes,distribution);            if (Finley_noError()) Finley_Mesh_createNodeFileMappings(in,numReducedNodes,indexReducedNodes,distribution, node_distribution);
100          }          }
101    
102          TMPMEMFREE(maskReducedNodes);          delete[] maskReducedNodes;
103          TMPMEMFREE(indexReducedNodes);          delete[] indexReducedNodes;
104       }       }
105    
106       TMPMEMFREE(distribution);       delete[] distribution;
107         delete[] node_distribution;
108    
109       return;       Finley_Mesh_setTagsInUse(in);
110  }  }
111    
112  /*                                                      */  /*                                                      */
# Line 110  void Finley_Mesh_optimizeElementOrdering Line 127  void Finley_Mesh_optimizeElementOrdering
127    if (Finley_noError()) Finley_ElementFile_optimizeOrdering(&(in->Points));    if (Finley_noError()) Finley_ElementFile_optimizeOrdering(&(in->Points));
128    if (Finley_noError()) Finley_ElementFile_optimizeOrdering(&(in->ContactElements));    if (Finley_noError()) Finley_ElementFile_optimizeOrdering(&(in->ContactElements));
129  }  }
130    
131    void Finley_Mesh_setTagsInUse(Finley_Mesh* in)
132    {
133        if (Finley_noError()) in->Nodes->updateTagList();
134        if (Finley_noError()) Finley_ElementFile_setTagsInUse(in->Elements);
135        if (Finley_noError()) Finley_ElementFile_setTagsInUse(in->FaceElements);
136        if (Finley_noError()) Finley_ElementFile_setTagsInUse(in->Points);
137        if (Finley_noError()) Finley_ElementFile_setTagsInUse(in->ContactElements);
138    }
139    

Legend:
Removed from v.1387  
changed lines
  Added in v.4428

  ViewVC Help
Powered by ViewVC 1.1.26