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

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

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

revision 2747 by jfenwick, Mon Jul 20 06:20:06 2009 UTC revision 2748 by gross, Tue Nov 17 07:32:59 2009 UTC
# Line 36  Finley_Mesh* Finley_RectangularMesh_Rec4 Line 36  Finley_Mesh* Finley_RectangularMesh_Rec4
36  {  {
37    #define N_PER_E 1    #define N_PER_E 1
38    #define DIM 2    #define DIM 2
39    dim_t N0,N1,NE0,NE1,i0,i1,k,Nstride0,Nstride1, local_NE0, local_NE1, local_N0, local_N1, global_i0, global_i1;    dim_t N0,N1,NE0,NE1,i0,i1,k,Nstride0=0,Nstride1=0, local_NE0, local_NE1, local_N0=0, local_N1=0, global_i0, global_i1;
40    index_t offset0, offset1, e_offset0, e_offset1;    index_t offset0=0, offset1=0, e_offset0=0, e_offset1=0;
41    dim_t totalNECount,faceNECount,NDOF0,NDOF1,NFaceElements,NN;    dim_t totalNECount,faceNECount,NDOF0=0,NDOF1=0,NFaceElements,NN;
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 68  Finley_Mesh* Finley_RectangularMesh_Rec4 Line 69  Finley_Mesh* Finley_RectangularMesh_Rec4
69        Paso_MPIInfo_free( mpi_info );        Paso_MPIInfo_free( mpi_info );
70        return NULL;        return NULL;
71    }    }
72      refElements= Finley_ReferenceElementSet_alloc(Rec4,out->order,out->reduced_order);
   Finley_Mesh_setElements(out,Finley_ElementFile_alloc(Rec4,out->order,out->reduced_order,mpi_info));  
73    if (useElementsOnFace) {    if (useElementsOnFace) {
74           Finley_Mesh_setFaceElements(out,Finley_ElementFile_alloc(Rec4Face,          refFaceElements=Finley_ReferenceElementSet_alloc(Rec4Face, out->order, out->reduced_order);
75                                                                    out->order,          refContactElements=Finley_ReferenceElementSet_alloc(Rec4Face_Contact, out->order, out->reduced_order);
                                                                   out->reduced_order,  
                                                                   mpi_info));  
          Finley_Mesh_setContactElements(out,Finley_ElementFile_alloc(Rec4Face_Contact,  
                                                                     out->order,  
                                                                     out->reduced_order,  
                                                                     mpi_info));  
76    } else {    } else {
77           Finley_Mesh_setFaceElements(out,Finley_ElementFile_alloc(Line2,          refFaceElements=Finley_ReferenceElementSet_alloc(Line2, out->order, out->reduced_order);
78                                                                    out->order,          refContactElements=Finley_ReferenceElementSet_alloc(Line2_Contact, out->order, out->reduced_order);
                                                                   out->reduced_order,  
                                                                   mpi_info));  
          Finley_Mesh_setContactElements(out,Finley_ElementFile_alloc(Line2_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;  
79    }    }
80      refPoints=Finley_ReferenceElementSet_alloc(Point1, out->order, out->reduced_order);
81      
82      if ( Finley_noError()) {
83      
84          Finley_Mesh_setPoints(out,Finley_ElementFile_alloc(refPoints, mpi_info));
85          Finley_Mesh_setContactElements(out,Finley_ElementFile_alloc(refContactElements, mpi_info));
86          Finley_Mesh_setFaceElements(out,Finley_ElementFile_alloc(refFaceElements, mpi_info));
87          Finley_Mesh_setElements(out,Finley_ElementFile_alloc(refElements, mpi_info));
88    
89        /* work out the largest dimension */
90        if (N1==MAX(N0,N1)) {
91          Nstride0=1;
92            Nstride1=N0;
93            local_NE0=NE0;
94             e_offset0=0;
95             Paso_MPIInfo_Split(mpi_info,NE1,&local_NE1,&e_offset1);
96        } else {
97          Nstride0=N1;
98            Nstride1=1;
99            Paso_MPIInfo_Split(mpi_info,NE0,&local_NE0,&e_offset0);
100            local_NE1=NE1;
101             e_offset1=0;
102        }
103        offset0=e_offset0*N_PER_E;
104        offset1=e_offset1*N_PER_E;
105        local_N0=local_NE0>0 ? local_NE0*N_PER_E+1 : 0;
106        local_N1=local_NE1>0 ? local_NE1*N_PER_E+1 : 0;
107    
108        /* get the number of surface elements */
109    
110        NFaceElements=0;
111        if (!periodic[0] && (local_NE0>0)) {
112          NDOF0=N0;
113            if (e_offset0 == 0) NFaceElements+=local_NE1;
114             if (local_NE0+e_offset0 == NE0) NFaceElements+=local_NE1;
115        } else {
116            NDOF0=N0-1;
117        }
118        if (!periodic[1]  && (local_NE1>0)) {
119          NDOF1=N1;
120          if (e_offset1 == 0) NFaceElements+=local_NE0;
121          if (local_NE1+e_offset1 == NE1) NFaceElements+=local_NE0;
122        } else {
123            NDOF1=N1-1;
124        }
125    
126        /*  allocate tables: */
127    
128    
129        Finley_NodeFile_allocTable(out->Nodes,local_N0*local_N1);
130        Finley_ElementFile_allocTable(out->Elements,local_NE0*local_NE1);
131        Finley_ElementFile_allocTable(out->FaceElements,NFaceElements);
132    
   /* 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;  
133    }    }
   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;  
   }  
   
   /*  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);  
   
134    if (Finley_noError()) {    if (Finley_noError()) {
135       /* create nodes */       /* create nodes */
136       #pragma omp parallel for private(i0,i1,k,global_i0,global_i1)       #pragma omp parallel for private(i0,i1,k,global_i0,global_i1)
# Line 280  Finley_Mesh* Finley_RectangularMesh_Rec4 Line 269  Finley_Mesh* Finley_RectangularMesh_Rec4
269             faceNECount+=local_NE0;             faceNECount+=local_NE0;
270          }          }
271          totalNECount+=NE0;          totalNECount+=NE0;
272       }       }
273      }
274      if (Finley_noError()) {    
275       /* add tag names */       /* add tag names */
276       Finley_Mesh_addTagMap(out,"top", 20);       Finley_Mesh_addTagMap(out,"top", 20);
277       Finley_Mesh_addTagMap(out,"bottom", 10);       Finley_Mesh_addTagMap(out,"bottom", 10);
278       Finley_Mesh_addTagMap(out,"left", 1);       Finley_Mesh_addTagMap(out,"left", 1);
279       Finley_Mesh_addTagMap(out,"right", 2);       Finley_Mesh_addTagMap(out,"right", 2);
280        }
281       /* prepare mesh for further calculatuions:*/    /* prepare mesh for further calculatuions:*/
282       if (Finley_noError()) {    if (Finley_noError()) {
283           Finley_Mesh_resolveNodeIds(out);           Finley_Mesh_resolveNodeIds(out);
284       }    }
285       if (Finley_noError()) {    if (Finley_noError()) {
286           Finley_Mesh_prepare(out, optimize);           Finley_Mesh_prepare(out, optimize);
      }  
287    }    }
288    
   if (!Finley_noError()) {  
       Finley_Mesh_free(out);  
   }  
289    /* free up memory */    /* free up memory */
290      Finley_ReferenceElementSet_dealloc(refPoints);
291      Finley_ReferenceElementSet_dealloc(refContactElements);
292      Finley_ReferenceElementSet_dealloc(refFaceElements);
293      Finley_ReferenceElementSet_dealloc(refElements);
294    Paso_MPIInfo_free( mpi_info );      Paso_MPIInfo_free( mpi_info );  
   #ifdef Finley_TRACE  
   printf("timing: mesh generation: %.4e sec\n",Finley_timer()-time0);  
   #endif  
295    
296    return out;    return out;
297  }  }

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

  ViewVC Help
Powered by ViewVC 1.1.26