/[escript]/trunk/finley/src/Mesh_hex8.c
ViewVC logotype

Diff of /trunk/finley/src/Mesh_hex8.c

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

temp_trunk_copy/finley/src/Mesh_hex8.c revision 1384 by phornby, Fri Jan 11 02:29:38 2008 UTC trunk/finley/src/Mesh_hex8.c revision 2881 by jfenwick, Thu Jan 28 02:03:15 2010 UTC
# Line 1  Line 1 
1    
 /* $Id$ */  
   
2  /*******************************************************  /*******************************************************
3   *  *
4   *           Copyright 2003-2007 by ACceSS MNRF  * Copyright (c) 2003-2010 by University of Queensland
5   *       Copyright 2007 by University of Queensland  * Earth Systems Science Computational Center (ESSCC)
6   *  * http://www.uq.edu.au/esscc
7   *                http://esscc.uq.edu.au  *
8   *        Primary Business: Queensland, Australia  * Primary Business: Queensland, Australia
9   *  Licensed under the Open Software License version 3.0  * Licensed under the Open Software License version 3.0
10   *     http://www.opensource.org/licenses/osl-3.0.php  * http://www.opensource.org/licenses/osl-3.0.php
11   *  *
12   *******************************************************/  *******************************************************/
13    
14    
15  /**************************************************************/  /**************************************************************/
16    
# Line 36  Finley_Mesh* Finley_RectangularMesh_Hex8 Line 35  Finley_Mesh* Finley_RectangularMesh_Hex8
35  {  {
36    #define N_PER_E 1    #define N_PER_E 1
37    #define DIM 3    #define DIM 3
38    dim_t N0,N1,N2,NE0,NE1,NE2,i0,i1,i2,k,Nstride0,Nstride1,Nstride2, local_NE0, local_NE1, local_NE2, local_N0, local_N1, local_N2;    dim_t N0,N1,N2,NE0,NE1,NE2,i0,i1,i2,k,Nstride0=0, Nstride1=0,Nstride2=0, local_NE0, local_NE1, local_NE2, local_N0=0, local_N1=0, local_N2=0;
39    dim_t totalNECount,faceNECount,NDOF0,NDOF1,NDOF2,NFaceElements, NN;    dim_t totalNECount,faceNECount,NDOF0=0,NDOF1=0,NDOF2=0,NFaceElements=0, NN;
40    index_t node0, myRank, e_offset2, e_offset1, e_offset0, offset1, offset2, offset0, global_i0, global_i1, global_i2;    index_t node0, myRank, e_offset2, e_offset1, e_offset0=0, offset1=0, offset2=0, offset0=0, global_i0, global_i1, global_i2;
41      Finley_ReferenceElementSet *refPoints=NULL, *refContactElements=NULL, *refFaceElements=NULL, *refElements=NULL;
42    Finley_Mesh* out;    Finley_Mesh* out;
43    Paso_MPIInfo *mpi_info = NULL;    Paso_MPIInfo *mpi_info = NULL;
44    char name[50];    char name[50];
45      #ifdef Finley_TRACE
46    double time0=Finley_timer();    double time0=Finley_timer();
47      #endif
48    
49    /* get MPI information */    /* get MPI information */
50    mpi_info = Paso_MPIInfo_alloc( MPI_COMM_WORLD );    mpi_info = Paso_MPIInfo_alloc( MPI_COMM_WORLD );
# Line 62  Finley_Mesh* Finley_RectangularMesh_Hex8 Line 64  Finley_Mesh* Finley_RectangularMesh_Hex8
64    
65    /*  allocate mesh: */      /*  allocate mesh: */  
66    sprintf(name,"Rectangular %d x %d x %d mesh",N0,N1,N2);    sprintf(name,"Rectangular %d x %d x %d mesh",N0,N1,N2);
67    out=Finley_Mesh_alloc(name,DIM,order, reduced_order, mpi_info);    out=Finley_Mesh_alloc(name,DIM, mpi_info);
68    if (! Finley_noError()) {    if (! Finley_noError()) {
69        Paso_MPIInfo_free( mpi_info );        Paso_MPIInfo_free( mpi_info );
70        return NULL;        return NULL;
71    }    }
72      refElements= Finley_ReferenceElementSet_alloc(Hex8,order,reduced_order);
73   Finley_Mesh_setElements(out,Finley_ElementFile_alloc(Hex8,out->order,out->reduced_order,mpi_info));    if (useElementsOnFace) {
74   if (useElementsOnFace) {          refFaceElements=Finley_ReferenceElementSet_alloc(Hex8Face, order, reduced_order);
75           Finley_Mesh_setFaceElements(out,Finley_ElementFile_alloc(Hex8Face,          refContactElements=Finley_ReferenceElementSet_alloc(Hex8Face_Contact, order, reduced_order);
                                                                   out->order,  
                                                                   out->reduced_order,  
                                                                   mpi_info));  
          Finley_Mesh_setContactElements(out,Finley_ElementFile_alloc(Hex8Face_Contact,  
                                                                     out->order,  
                                                                     out->reduced_order,  
                                                                     mpi_info));  
76    } else {    } else {
77           Finley_Mesh_setFaceElements(out,Finley_ElementFile_alloc(Rec4,          refFaceElements=Finley_ReferenceElementSet_alloc(Rec4, order, reduced_order);
78                                                                    out->order,          refContactElements=Finley_ReferenceElementSet_alloc(Rec4_Contact, order, reduced_order);
                                                                   out->reduced_order,  
                                                                   mpi_info));  
          Finley_Mesh_setContactElements(out,Finley_ElementFile_alloc(Rec4_Contact,  
                                                                      out->order,  
                                                                      out->reduced_order,  
                                                                      mpi_info));  
   }  
   Finley_Mesh_setPoints(out,Finley_ElementFile_alloc(Point1,  
                                                  out->order,  
                                                  out->reduced_order,  
                                                  mpi_info));  
   if (! Finley_noError()) {  
       Paso_MPIInfo_free( mpi_info );  
       Finley_Mesh_free(out);  
       return NULL;  
   }  
   
   /* work out the largest dimension */  
   if (N2==MAX3(N0,N1,N2)) {  
      Nstride0=1;  
      Nstride1=N0;  
      Nstride2=N0*N1;  
      local_NE0=NE0;  
      e_offset0=0;  
      local_NE1=NE1;  
      e_offset1=0;  
      Paso_MPIInfo_Split(mpi_info,NE2,&local_NE2,&e_offset2);  
   } else if (N1==MAX3(N0,N1,N2)) {  
      Nstride0=N2;  
      Nstride1=N0*N2;  
      Nstride2=1;  
      local_NE0=NE0;  
      e_offset0=0;  
      Paso_MPIInfo_Split(mpi_info,NE1,&local_NE1,&e_offset1);  
      local_NE2=NE2;  
      e_offset2=0;  
   } else {  
      Nstride0=N1*N2;  
      Nstride1=1;  
      Nstride2=N1;  
      Paso_MPIInfo_Split(mpi_info,NE0,&local_NE0,&e_offset0);  
      local_NE1=NE1;  
      e_offset1=0;  
      local_NE2=NE2;  
      e_offset2=0;  
   }  
   offset0=e_offset0*N_PER_E;  
   offset1=e_offset1*N_PER_E;  
   offset2=e_offset2*N_PER_E;  
   local_N0=local_NE0*N_PER_E+1;  
   local_N1=local_NE1*N_PER_E+1;  
   local_N2=local_NE2*N_PER_E+1;  
   
   /* get the number of surface elements */  
   
   NFaceElements=0;  
   if (!periodic[2]) {  
     NDOF2=N2;  
     if (offset2==0) NFaceElements+=local_NE1*local_NE0;  
     if (local_NE2+e_offset2 == NE2) NFaceElements+=local_NE1*local_NE0;  
   } else {  
       NDOF2=N2-1;  
79    }    }
80      refPoints=Finley_ReferenceElementSet_alloc(Point1, order, reduced_order);
81      
82    
83    if (!periodic[0]) {    if ( Finley_noError()) {
84       NDOF0=N0;    
85       if (e_offset0 == 0) NFaceElements+=local_NE1*local_NE2;        Finley_Mesh_setPoints(out,Finley_ElementFile_alloc(refPoints, mpi_info));
86       if (local_NE0+e_offset0 == NE0) NFaceElements+=local_NE1*local_NE2;        Finley_Mesh_setContactElements(out,Finley_ElementFile_alloc(refContactElements, mpi_info));
87    } else {        Finley_Mesh_setFaceElements(out,Finley_ElementFile_alloc(refFaceElements, mpi_info));
88        NDOF0=N0-1;        Finley_Mesh_setElements(out,Finley_ElementFile_alloc(refElements, mpi_info));
89    }  
90    if (!periodic[1]) {        /* work out the largest dimension */
91       NDOF1=N1;        if (N2==MAX3(N0,N1,N2)) {
92       if (e_offset1 == 0) NFaceElements+=local_NE0*local_NE2;            Nstride0=1;
93       if (local_NE1+e_offset1 == NE1) NFaceElements+=local_NE0*local_NE2;            Nstride1=N0;
94    } else {            Nstride2=N0*N1;
95        NDOF1=N1-1;            local_NE0=NE0;
96              e_offset0=0;
97              local_NE1=NE1;
98              e_offset1=0;
99              Paso_MPIInfo_Split(mpi_info,NE2,&local_NE2,&e_offset2);
100          } else if (N1==MAX3(N0,N1,N2)) {
101              Nstride0=N2;
102              Nstride1=N0*N2;
103              Nstride2=1;
104              local_NE0=NE0;
105            e_offset0=0;
106            Paso_MPIInfo_Split(mpi_info,NE1,&local_NE1,&e_offset1);
107            local_NE2=NE2;
108            e_offset2=0;
109          } else {
110              Nstride0=N1*N2;
111              Nstride1=1;
112              Nstride2=N1;
113              Paso_MPIInfo_Split(mpi_info,NE0,&local_NE0,&e_offset0);
114              local_NE1=NE1;
115              e_offset1=0;
116              local_NE2=NE2;
117              e_offset2=0;
118          }
119          offset0=e_offset0*N_PER_E;
120          offset1=e_offset1*N_PER_E;
121          offset2=e_offset2*N_PER_E;
122          local_N0=local_NE0>0 ? local_NE0*N_PER_E+1 : 0;
123          local_N1=local_NE1>0 ? local_NE1*N_PER_E+1 : 0;
124          local_N2=local_NE2>0 ? local_NE2*N_PER_E+1 : 0;
125    
126          /* get the number of surface elements */
127    
128          NFaceElements=0;
129          if (!periodic[2] && (local_NE2>0)) {
130              NDOF2=N2;
131              if (offset2==0) NFaceElements+=local_NE1*local_NE0;
132              if (local_NE2+e_offset2 == NE2) NFaceElements+=local_NE1*local_NE0;
133          } else {
134              NDOF2=N2-1;
135          }
136    
137          if (!periodic[0] && (local_NE0>0)) {
138              NDOF0=N0;
139              if (e_offset0 == 0) NFaceElements+=local_NE1*local_NE2;
140              if (local_NE0+e_offset0 == NE0) NFaceElements+=local_NE1*local_NE2;
141          } else {
142              NDOF0=N0-1;
143          }
144             if (!periodic[1] && (local_NE1>0)) {
145                 NDOF1=N1;
146                 if (e_offset1 == 0) NFaceElements+=local_NE0*local_NE2;
147                 if (local_NE1+e_offset1 == NE1) NFaceElements+=local_NE0*local_NE2;
148             } else {
149                 NDOF1=N1-1;
150             }
151    }    }
152      
153      
154    /*  allocate tables: */    /*  allocate tables: */
155      if (Finley_noError()) {
156    
157    Finley_NodeFile_allocTable(out->Nodes,local_N0*local_N1*local_N2);        Finley_NodeFile_allocTable(out->Nodes,local_N0*local_N1*local_N2);
158    Finley_ElementFile_allocTable(out->Elements,local_NE0*local_NE1*local_NE2);        Finley_ElementFile_allocTable(out->Elements,local_NE0*local_NE1*local_NE2);
159    Finley_ElementFile_allocTable(out->FaceElements,NFaceElements);        Finley_ElementFile_allocTable(out->FaceElements,NFaceElements);
160      }
161      
162    if (Finley_noError()) {    if (Finley_noError()) {
163       /* create nodes */       /* create nodes */
164        
# Line 218  Finley_Mesh* Finley_RectangularMesh_Hex8 Line 211  Finley_Mesh* Finley_RectangularMesh_Hex8
211       totalNECount=NE0*NE1*NE2;       totalNECount=NE0*NE1*NE2;
212       faceNECount=0;       faceNECount=0;
213       /*   these are the quadrilateral elements on boundary 1 (x3=0): */       /*   these are the quadrilateral elements on boundary 1 (x3=0): */
214       if (!periodic[2]) {       if (!periodic[2]  && (local_NE2>0)) {
215         /* **  elements on boundary 100 (x3=0): */         /* **  elements on boundary 100 (x3=0): */
216         if (e_offset2==0) {         if (e_offset2==0) {
217            #pragma omp parallel for private(i0,i1,k,node0)            #pragma omp parallel for private(i0,i1,k,node0)
# Line 286  Finley_Mesh* Finley_RectangularMesh_Hex8 Line 279  Finley_Mesh* Finley_RectangularMesh_Hex8
279         }         }
280         totalNECount+=NE1*NE0;         totalNECount+=NE1*NE0;
281       }       }
282       if (!periodic[0]) {       if (!periodic[0]  && (local_NE0>0)) {
283          /* **  elements on boundary 001 (x1=0): */          /* **  elements on boundary 001 (x1=0): */
284            
285          if (e_offset0 == 0) {          if (e_offset0 == 0) {
# Line 355  Finley_Mesh* Finley_RectangularMesh_Hex8 Line 348  Finley_Mesh* Finley_RectangularMesh_Hex8
348           }           }
349           totalNECount+=NE1*NE2;           totalNECount+=NE1*NE2;
350       }       }
351       if (!periodic[1]) {       if (!periodic[1] && (local_NE1>0)) {
352          /* **  elements on boundary 010 (x2=0): */          /* **  elements on boundary 010 (x2=0): */
353          if (e_offset1 == 0) {          if (e_offset1 == 0) {
354             #pragma omp parallel for private(i0,i2,k,node0)             #pragma omp parallel for private(i0,i2,k,node0)
# Line 422  Finley_Mesh* Finley_RectangularMesh_Hex8 Line 415  Finley_Mesh* Finley_RectangularMesh_Hex8
415          }          }
416          totalNECount+=NE0*NE2;          totalNECount+=NE0*NE2;
417       }       }
418      }
419      if (Finley_noError()) {
420       /* add tag names */       /* add tag names */
421       Finley_Mesh_addTagMap(out,"top", 200);       Finley_Mesh_addTagMap(out,"top", 200);
422       Finley_Mesh_addTagMap(out,"bottom", 100);       Finley_Mesh_addTagMap(out,"bottom", 100);
# Line 429  Finley_Mesh* Finley_RectangularMesh_Hex8 Line 424  Finley_Mesh* Finley_RectangularMesh_Hex8
424       Finley_Mesh_addTagMap(out,"right", 2);       Finley_Mesh_addTagMap(out,"right", 2);
425       Finley_Mesh_addTagMap(out,"front", 10);       Finley_Mesh_addTagMap(out,"front", 10);
426       Finley_Mesh_addTagMap(out,"back", 20);       Finley_Mesh_addTagMap(out,"back", 20);
427        }
428       /* prepare mesh for further calculatuions:*/    /* prepare mesh for further calculatuions:*/
429       if (Finley_noError()) {    if (Finley_noError()) {
430           Finley_Mesh_resolveNodeIds(out);           Finley_Mesh_resolveNodeIds(out);
431       }    }
432       if (Finley_noError()) {    if (Finley_noError()) {
433           Finley_Mesh_prepare(out, optimize);           Finley_Mesh_prepare(out, optimize);
      }  
434    }    }
435    
436    if (!Finley_noError()) {    if (!Finley_noError()) {
437        Finley_Mesh_free(out);        Finley_Mesh_free(out);
438    }    }
439    /* free up memory */      /* free up memory */
440      Finley_ReferenceElementSet_dealloc(refPoints);
441      Finley_ReferenceElementSet_dealloc(refContactElements);
442      Finley_ReferenceElementSet_dealloc(refFaceElements);
443      Finley_ReferenceElementSet_dealloc(refElements);
444    Paso_MPIInfo_free( mpi_info );      Paso_MPIInfo_free( mpi_info );  
   #ifdef Finley_TRACE  
   printf("timing: mesh generation: %.4e sec\n",Finley_timer()-time0);  
   #endif  
445    
446    return out;    return out;
447  }  }

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

  ViewVC Help
Powered by ViewVC 1.1.26