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

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

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

revision 2747 by gross, Fri Oct 16 06:45:01 2009 UTC revision 2748 by gross, Tue Nov 17 07:32:59 2009 UTC
# Line 36  Finley_Mesh* Finley_RectangularMesh_Rec8 Line 36  Finley_Mesh* Finley_RectangularMesh_Rec8
36  {  {
37    #define N_PER_E 2    #define N_PER_E 2
38    #define DIM 2    #define DIM 2
39    dim_t N0,N1,NE0,NE1,i0,i1,k,Nstride0,Nstride1;    dim_t N0,N1,NE0,NE1,i0,i1,k,Nstride0=0,Nstride1=0;
40    dim_t totalNECount,faceNECount,NDOF0,NDOF1,NFaceElements,NN, local_NE0, local_NE1, local_N0, local_N1;    dim_t totalNECount,faceNECount,NDOF0=0,NDOF1=0,NFaceElements,NN, local_NE0, local_NE1, local_N0=0, local_N1=0;
41    index_t e_offset1, e_offset0, offset0, offset1, global_i0, global_i1;    index_t e_offset1, e_offset0, offset0=0, offset1=0, global_i0, global_i1;
42      Finley_ReferenceElementSet *refPoints=NULL, *refContactElements=NULL, *refFaceElements=NULL, *refElements=NULL;
43    index_t node0, myRank;    index_t node0, myRank;
44    Finley_Mesh* out;    Finley_Mesh* out;
45    Paso_MPIInfo *mpi_info = NULL;    Paso_MPIInfo *mpi_info = NULL;
# Line 69  Finley_Mesh* Finley_RectangularMesh_Rec8 Line 70  Finley_Mesh* Finley_RectangularMesh_Rec8
70        Paso_MPIInfo_free( mpi_info );        Paso_MPIInfo_free( mpi_info );
71        return NULL;        return NULL;
72    }    }
   
73    if (generateAllNodes) {    if (generateAllNodes) {
74         /* Finley_setError(SYSTEM_ERROR,"full element order for Hex elements is not supported yet."); */
75       if (useMacroElements) {       if (useMacroElements) {
76           Finley_Mesh_setElements(out,Finley_ElementFile_alloc(Rec9Macro,            refElements= Finley_ReferenceElementSet_alloc(Rec9Macro,out->order,out->reduced_order);
                                                                 out->order,  
                                                                 out->reduced_order,  
                                                                 mpi_info));  
77       } else {       } else {
78           Finley_Mesh_setElements(out,Finley_ElementFile_alloc(Rec9,            refElements=Finley_ReferenceElementSet_alloc(Rec9, out->order,out->reduced_order);
                                                                 out->order,  
                                                                 out->reduced_order,  
                                                                 mpi_info));  
79       }       }
80       if (useElementsOnFace) {       if (useElementsOnFace) {
81           Finley_setError(SYSTEM_ERROR,"rich elements for Rec9 elements is not supported yet.");           Finley_setError(SYSTEM_ERROR,"rich elements for Rec9 elements is not supported yet.");
82       } else {       } else {
83           if (useMacroElements) {           if (useMacroElements) {
84                 Finley_Mesh_setFaceElements(out,Finley_ElementFile_alloc(Line3Macro,               refFaceElements=Finley_ReferenceElementSet_alloc(Line3Macro, out->order, out->reduced_order);
                                                     out->order,  
                                                     out->reduced_order,  
                                                     mpi_info));  
85           } else {           } else {
86                 Finley_Mesh_setFaceElements(out,Finley_ElementFile_alloc(Line3,               refFaceElements=Finley_ReferenceElementSet_alloc(Line3, out->order, out->reduced_order);
                                                     out->order,  
                                                     out->reduced_order,  
                                                     mpi_info));  
87           }           }
88           Finley_Mesh_setContactElements(out,Finley_ElementFile_alloc(Line3_Contact,           refContactElements=Finley_ReferenceElementSet_alloc(Line3_Contact, out->order, out->reduced_order);
                                                        out->order,  
                                                        out->reduced_order,  
                                                        mpi_info));  
89       }       }
90    
91    } else  {    } else  {
92       Finley_Mesh_setElements(out,Finley_ElementFile_alloc(Rec8,out->order,out->reduced_order,mpi_info));       refElements= Finley_ReferenceElementSet_alloc(Rec8,out->order,out->reduced_order);
93       if (useElementsOnFace) {       if (useElementsOnFace) {
94           Finley_Mesh_setFaceElements(out,Finley_ElementFile_alloc(Rec8Face,           refFaceElements= Finley_ReferenceElementSet_alloc(Rec8Face ,out->order,out->reduced_order);
95                                                                    out->order,           refContactElements=Finley_ReferenceElementSet_alloc(Rec8Face_Contact, out->order, out->reduced_order);
96                                                                    out->reduced_order,  
                                                                   mpi_info));  
          Finley_Mesh_setContactElements(out,Finley_ElementFile_alloc(Rec8Face_Contact,  
                                                                     out->order,  
                                                                     out->reduced_order,  
                                                                     mpi_info));  
97       } else {       } else {
98           Finley_Mesh_setFaceElements(out,Finley_ElementFile_alloc(Line3,           refFaceElements= Finley_ReferenceElementSet_alloc(Line3 ,out->order,out->reduced_order);
99                                                                    out->order,           refContactElements=Finley_ReferenceElementSet_alloc(Line3_Contact, out->order, out->reduced_order);
                                                                   out->reduced_order,  
                                                                   mpi_info));  
          Finley_Mesh_setContactElements(out,Finley_ElementFile_alloc(Line3_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;  
   }  
100    
101    /* work out the largest dimension */       }
   if (N1==MAX(N0,N1)) {  
      Nstride0=1;  
      Nstride1=N0;  
      local_NE0=NE0;  
      e_offset0=0;  
      Paso_MPIInfo_Split(mpi_info,NE1,&local_NE1,&e_offset1);  
   } else {  
      Nstride0=N1;  
      Nstride1=1;  
      Paso_MPIInfo_Split(mpi_info,NE0,&local_NE0,&e_offset0);  
      local_NE1=NE1;  
      e_offset1=0;  
   }  
   offset0=e_offset0*N_PER_E;  
   offset1=e_offset1*N_PER_E;  
   local_N0=local_NE0>0 ? local_NE0*N_PER_E+1 : 0;  
   local_N1=local_NE1>0 ? local_NE1*N_PER_E+1 : 0;  
   
   /* get the number of surface elements */  
   
   NFaceElements=0;  
   if (!periodic[0] &&  (local_NE0>0)) {  
      NDOF0=N0;  
      if (e_offset0 == 0) NFaceElements+=local_NE1;  
      if (local_NE0+e_offset0 == NE0) NFaceElements+=local_NE1;  
   } else {  
       NDOF0=N0-1;  
   }  
   if (!periodic[1] && (local_NE1>0)) {  
      NDOF1=N1;  
      if (e_offset1 == 0) NFaceElements+=local_NE0;  
      if (local_NE1+e_offset1 == NE1) NFaceElements+=local_NE0;  
   } else {  
       NDOF1=N1-1;  
102    }    }
103      refPoints=Finley_ReferenceElementSet_alloc(Point1, out->order, out->reduced_order);
104    
   /*  allocate tables: */  
   
   Finley_NodeFile_allocTable(out->Nodes,local_N0*local_N1);  
   Finley_ElementFile_allocTable(out->Elements,local_NE0*local_NE1);  
   Finley_ElementFile_allocTable(out->FaceElements,NFaceElements);  
105    
106      if ( Finley_noError()) {
107      
108          Finley_Mesh_setPoints(out,Finley_ElementFile_alloc(refPoints, mpi_info));
109          Finley_Mesh_setContactElements(out,Finley_ElementFile_alloc(refContactElements, mpi_info));
110          Finley_Mesh_setFaceElements(out,Finley_ElementFile_alloc(refFaceElements, mpi_info));
111          Finley_Mesh_setElements(out,Finley_ElementFile_alloc(refElements, mpi_info));
112    
113          /* work out the largest dimension */
114          if (N1==MAX(N0,N1)) {
115              Nstride0=1;
116              Nstride1=N0;
117              local_NE0=NE0;
118              e_offset0=0;
119              Paso_MPIInfo_Split(mpi_info,NE1,&local_NE1,&e_offset1);
120          } else {
121              Nstride0=N1;
122              Nstride1=1;
123              Paso_MPIInfo_Split(mpi_info,NE0,&local_NE0,&e_offset0);
124              local_NE1=NE1;
125              e_offset1=0;
126          }
127          offset0=e_offset0*N_PER_E;
128          offset1=e_offset1*N_PER_E;
129          local_N0=local_NE0>0 ? local_NE0*N_PER_E+1 : 0;
130          local_N1=local_NE1>0 ? local_NE1*N_PER_E+1 : 0;
131    
132          /* get the number of surface elements */
133    
134          NFaceElements=0;
135          if (!periodic[0] &&  (local_NE0>0)) {
136              NDOF0=N0;
137              if (e_offset0 == 0) NFaceElements+=local_NE1;
138              if (local_NE0+e_offset0 == NE0) NFaceElements+=local_NE1;
139          } else {
140              NDOF0=N0-1;
141          }
142          if (!periodic[1] && (local_NE1>0)) {
143              NDOF1=N1;
144              if (e_offset1 == 0) NFaceElements+=local_NE0;
145              if (local_NE1+e_offset1 == NE1) NFaceElements+=local_NE0;
146          } else {
147              NDOF1=N1-1;
148          }
149      
150          /*  allocate tables: */
151    
152          Finley_NodeFile_allocTable(out->Nodes,local_N0*local_N1);
153          Finley_ElementFile_allocTable(out->Elements,local_NE0*local_NE1);
154          Finley_ElementFile_allocTable(out->FaceElements,NFaceElements);
155      }
156          
157    if (Finley_noError()) {    if (Finley_noError()) {
158       /* create nodes */       /* create nodes */
159        
# Line 343  Finley_Mesh* Finley_RectangularMesh_Rec8 Line 321  Finley_Mesh* Finley_RectangularMesh_Rec8
321          }          }
322          totalNECount+=NE0;          totalNECount+=NE0;
323       }       }
324      }
325      if (Finley_noError()) {
326       /* add tag names */       /* add tag names */
327       Finley_Mesh_addTagMap(out,"top", 20);       Finley_Mesh_addTagMap(out,"top", 20);
328       Finley_Mesh_addTagMap(out,"bottom", 10);       Finley_Mesh_addTagMap(out,"bottom", 10);
329       Finley_Mesh_addTagMap(out,"left", 1);       Finley_Mesh_addTagMap(out,"left", 1);
330       Finley_Mesh_addTagMap(out,"right", 2);       Finley_Mesh_addTagMap(out,"right", 2);
331         }
332       /* prepare mesh for further calculatuions:*/     /* prepare mesh for further calculatuions:*/
333       if (Finley_noError()) {     if (Finley_noError()) {
334           Finley_Mesh_resolveNodeIds(out);           Finley_Mesh_resolveNodeIds(out);
335       }     }
336       if (Finley_noError()) {     if (Finley_noError()) {
337           Finley_Mesh_prepare(out, optimize);           Finley_Mesh_prepare(out, optimize);
338       }     }
339    }     if (!Finley_noError()) {
   if (!Finley_noError()) {  
340        Finley_Mesh_free(out);        Finley_Mesh_free(out);
341    }     }
342    /* free up memory */      /* free up memory */
343    Paso_MPIInfo_free( mpi_info );        Finley_ReferenceElementSet_dealloc(refPoints);
344    #ifdef Finley_TRACE      Finley_ReferenceElementSet_dealloc(refContactElements);
345    printf("timing: mesh generation: %.4e sec\n",Finley_timer()-time0);      Finley_ReferenceElementSet_dealloc(refFaceElements);
346    #endif      Finley_ReferenceElementSet_dealloc(refElements);
347        Paso_MPIInfo_free( mpi_info );  
348    
349    return out;     return out;
350  }  }

Legend:
Removed from v.2747  
changed lines
  Added in v.2748

  ViewVC Help
Powered by ViewVC 1.1.26