/[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

trunk/esys2/finley/src/finleyC/Mesh_hex8.c revision 123 by jgs, Fri Jul 8 04:08:13 2005 UTC trunk/finley/src/Mesh_hex8.c revision 730 by bcumming, Mon May 15 04:03:49 2006 UTC
# Line 1  Line 1 
1    /*
2     ************************************************************
3     *          Copyright 2006 by ACcESS MNRF                   *
4     *                                                          *
5     *              http://www.access.edu.au                    *
6     *       Primary Business: Queensland, Australia            *
7     *  Licensed under the Open Software License version 3.0    *
8     *     http://www.opensource.org/licenses/osl-3.0.php       *
9     *                                                          *
10     ************************************************************
11    */
12    
13  /**************************************************************/  /**************************************************************/
14    
15  /*   Finley: generates rectangular meshes */  /*   Finley: generates rectangular meshes */
# Line 8  Line 20 
20    
21  /**************************************************************/  /**************************************************************/
22    
23  /*   Copyrights by ACcESS Australia 2003/04 */  /*  Author: gross@access.edu.au */
24  /*   Author: gross@access.edu.au */  /*  Version: $Id$ */
 /*   Version: $Id$ */  
25    
26  /**************************************************************/  /**************************************************************/
27    
 #include "Common.h"  
 #include "Finley.h"  
 #include "Mesh.h"  
28  #include "RectangularMesh.h"  #include "RectangularMesh.h"
29    
30  /**************************************************************/  /**************************************************************/
31    
32  Finley_Mesh* Finley_RectangularMesh_Hex8(dim_t* numElements,double* Length,bool_t* periodic, index_t order,bool_t useElementsOnFace) {  Finley_Mesh* Finley_RectangularMesh_Hex8(dim_t* numElements,double* Length,bool_t* periodic, index_t order,bool_t useElementsOnFace) {
33    dim_t N0,N1,N2,NE0,NE1,NE2,i0,i1,i2,k,totalNECount,faceNECount,NDOF0,NDOF1,NDOF2,NFaceElements,NUMNODES;    dim_t N0,N1,N2,NE0,NE1,NE2,i0,i1,i2,k,totalNECount,faceNECount,NDOF0,NDOF1,NDOF2,NFaceElements,NUMNODES,M0,M1,M2;
34    index_t node0;    index_t node0;
35    Finley_Mesh* out;    Finley_Mesh* out;
36    char name[50];    char name[50];
# Line 34  Finley_Mesh* Finley_RectangularMesh_Hex8 Line 42  Finley_Mesh* Finley_RectangularMesh_Hex8
42    N1=NE1+1;    N1=NE1+1;
43    N2=NE2+1;    N2=NE2+1;
44    
45      if (N0<=MIN(N1,N2)) {
46         if (N1 <= N2) {
47            M0=1;
48            M1=N0;
49            M2=N0*N1;
50         } else {
51            M0=1;
52            M2=N0;
53            M1=N0*N2;
54         }
55      } else if (N1<=MIN(N2,N0)) {
56         if (N2 <= N0) {
57            M1=1;
58            M2=N1;
59            M0=N2*N1;
60         } else {
61            M1=1;
62            M0=N1;
63            M2=N1*N0;
64         }
65      } else {
66         if (N0 <= N1) {
67            M2=1;
68            M0=N2;
69            M1=N2*N0;
70         } else {
71            M2=1;
72            M1=N2;
73            M0=N1*N2;
74         }
75      }
76    
77    
78    NFaceElements=0;    NFaceElements=0;
79    if (!periodic[0]) {    if (!periodic[0]) {
80        NDOF0=N0;        NDOF0=N0;
# Line 57  Finley_Mesh* Finley_RectangularMesh_Hex8 Line 98  Finley_Mesh* Finley_RectangularMesh_Hex8
98    /*  allocate mesh: */    /*  allocate mesh: */
99        
100    sprintf(name,"Rectangular %d x %d x %d mesh",N0,N1,N2);    sprintf(name,"Rectangular %d x %d x %d mesh",N0,N1,N2);
101      /* TEMPFIX */
102    #ifndef PASO_MPI
103    out=Finley_Mesh_alloc(name,3,order);    out=Finley_Mesh_alloc(name,3,order);
104    if (Finley_ErrorCode!=NO_ERROR) return NULL;  #else
105      out=Finley_Mesh_alloc(name,3,order,NULL);
106    #endif
107      if (! Finley_noError()) return NULL;
108    
109    #ifndef PASO_MPI
110    out->Elements=Finley_ElementFile_alloc(Hex8,out->order);    out->Elements=Finley_ElementFile_alloc(Hex8,out->order);
111    if (useElementsOnFace) {    if (useElementsOnFace) {
112       out->FaceElements=Finley_ElementFile_alloc(Hex8Face,out->order);       out->FaceElements=Finley_ElementFile_alloc(Hex8Face,out->order);
# Line 69  Finley_Mesh* Finley_RectangularMesh_Hex8 Line 116  Finley_Mesh* Finley_RectangularMesh_Hex8
116       out->ContactElements=Finley_ElementFile_alloc(Rec4_Contact,out->order);       out->ContactElements=Finley_ElementFile_alloc(Rec4_Contact,out->order);
117    }    }
118    out->Points=Finley_ElementFile_alloc(Point1,out->order);    out->Points=Finley_ElementFile_alloc(Point1,out->order);
119    if (Finley_ErrorCode!=NO_ERROR) {  #else
120      out->Elements=Finley_ElementFile_alloc(Hex8,out->order,NULL);
121      if (useElementsOnFace) {
122         out->FaceElements=Finley_ElementFile_alloc(Hex8Face,out->order,NULL);
123         out->ContactElements=Finley_ElementFile_alloc(Hex8Face_Contact,out->order,NULL);
124      } else {
125         out->FaceElements=Finley_ElementFile_alloc(Rec4,out->order,NULL);
126         out->ContactElements=Finley_ElementFile_alloc(Rec4_Contact,out->order,NULL);
127      }
128      out->Points=Finley_ElementFile_alloc(Point1,out->order,NULL);
129    #endif
130      if (! Finley_noError()) {
131        Finley_Mesh_dealloc(out);        Finley_Mesh_dealloc(out);
132        return NULL;        return NULL;
133    }    }
134    
135        
136    /*  allocate tables: */    /*  allocate tables: */
137      #ifndef PASO_MPI  
138    Finley_NodeFile_allocTable(out->Nodes,N0*N1*N2);    Finley_NodeFile_allocTable(out->Nodes,N0*N1*N2);
139    #else
140     /* TODO */
141    #endif
142    Finley_ElementFile_allocTable(out->Elements,NE0*NE1*NE2);    Finley_ElementFile_allocTable(out->Elements,NE0*NE1*NE2);
143    Finley_ElementFile_allocTable(out->FaceElements,NFaceElements);    Finley_ElementFile_allocTable(out->FaceElements,NFaceElements);
144    if (Finley_ErrorCode!=NO_ERROR) {    if (! Finley_noError()) {
145        Finley_Mesh_dealloc(out);        Finley_Mesh_dealloc(out);
146        return NULL;        return NULL;
147    }    }
148        
149    /*  set nodes: */    /*  set nodes: */
150      
151    #pragma omp parallel for private(i0,i1,i2,k)    #pragma omp parallel for private(i0,i1,i2,k)
152    for (i2=0;i2<N2;i2++) {    for (i2=0;i2<N2;i2++) {
153      for (i1=0;i1<N1;i1++) {      for (i1=0;i1<N1;i1++) {
154        for (i0=0;i0<N0;i0++) {        for (i0=0;i0<N0;i0++) {
155          k=i0+N0*i1+N0*N1*i2;          k=M0*i0+M1*i1+M2*i2;
156          out->Nodes->Coordinates[INDEX2(0,k,3)]=DBLE(i0)/DBLE(N0-1)*Length[0];          out->Nodes->Coordinates[INDEX2(0,k,3)]=DBLE(i0)/DBLE(N0-1)*Length[0];
157          out->Nodes->Coordinates[INDEX2(1,k,3)]=DBLE(i1)/DBLE(N1-1)*Length[1];          out->Nodes->Coordinates[INDEX2(1,k,3)]=DBLE(i1)/DBLE(N1-1)*Length[1];
158          out->Nodes->Coordinates[INDEX2(2,k,3)]=DBLE(i2)/DBLE(N2-1)*Length[2];          out->Nodes->Coordinates[INDEX2(2,k,3)]=DBLE(i2)/DBLE(N2-1)*Length[2];
159          out->Nodes->Id[k]=k;          out->Nodes->Id[k]=i0+N0*i1+N0*N1*i2;
160          out->Nodes->Tag[k]=0;          out->Nodes->Tag[k]=0;
161          out->Nodes->degreeOfFreedom[k]=(i0%NDOF0) +N0*(i1%NDOF1) +N0*N1*(i2%NDOF2);          out->Nodes->degreeOfFreedom[k]=M0*(i0%NDOF0) +M1*(i1%NDOF1) +M2*(i2%NDOF2);
162        }        }
163      }      }
164    }    }
165    /* tags for the faces: */    /* tags for the faces: */
166      /* tags for the faces: */
167    if (!periodic[2]) {    if (!periodic[2]) {
168      for (i1=0;i1<N1;i1++) {       for (i1=0;i1<N1;i1++) {
169        for (i0=0;i0<N0;i0++) {         for (i0=0;i0<N0;i0++) {
170          out->Nodes->Tag[i0+N0*i1+N0*N1*0]+=100;           out->Nodes->Tag[M0*i0+M1*i1+M2*0]+=100;
171          out->Nodes->Tag[i0+N0*i1+N0*N1*(N2-1)]+=200;           out->Nodes->Tag[M0*i0+M1*i1+M2*(N2-1)]+=200;
172        }         }
173      }       }
174    }    }
175    if (!periodic[1]) {    if (!periodic[1]) {
176      for (i2=0;i2<N2;i2++) {      for (i2=0;i2<N2;i2++) {
177        for (i0=0;i0<N0;i0++) {        for (i0=0;i0<N0;i0++) {
178           out->Nodes->Tag[i0+N0*0+N0*N1*i2]+=10;           out->Nodes->Tag[M0*i0+M1*0+M2*i2]+=10;
179           out->Nodes->Tag[i0+N0*(N1-1)+N0*N1*i2]+=20;           out->Nodes->Tag[M0*i0+M1*(N1-1)+M2*i2]+=20;
180        }        }
181      }      }
182    }    }
183    if (!periodic[0]) {    if (!periodic[0]) {
184      for (i2=0;i2<N2;i2++) {      for (i2=0;i2<N2;i2++) {
185        for (i1=0;i1<N1;i1++) {        for (i1=0;i1<N1;i1++) {
186          out->Nodes->Tag[0+N0*i1+N0*N1*i2]+=1;          out->Nodes->Tag[M0*0+M1*i1+M2*i2]+=1;
187          out->Nodes->Tag[(N0-1)+N0*i1+N0*N1*i2]+=2;          out->Nodes->Tag[M0*(N0-1)+M1*i1+M2*i2]+=2;
188        }        }
189      }      }
190    }    }
191      
192    /*   set the elements: */    /*   set the elements: */
193        
194    #pragma omp parallel for private(i0,i1,i2,k,node0)    #pragma omp parallel for private(i0,i1,i2,k,node0)
# Line 376  Finley_Mesh* Finley_RectangularMesh_Hex8 Line 438  Finley_Mesh* Finley_RectangularMesh_Hex8
438    /* prepare mesh for further calculatuions:*/    /* prepare mesh for further calculatuions:*/
439    Finley_Mesh_prepare(out) ;    Finley_Mesh_prepare(out) ;
440    
441      #ifdef Finley_TRACE
442    printf("timing: mesh generation: %.4e sec\n",Finley_timer()-time0);    printf("timing: mesh generation: %.4e sec\n",Finley_timer()-time0);
443      #endif
444    
445    if (Finley_ErrorCode!=NO_ERROR) {    if (! Finley_noError()) {
446        Finley_Mesh_dealloc(out);        Finley_Mesh_dealloc(out);
447        return NULL;        return NULL;
448    }    }
449    return out;    return out;
450  }  }
   
 /*  
 * $Log$  
 * Revision 1.2  2005/07/08 04:07:52  jgs  
 * Merge of development branch back to main trunk on 2005-07-08  
 *  
 * Revision 1.1.1.1.2.1  2005/06/29 02:34:52  gross  
 * some changes towards 64 integers in finley  
 *  
 * Revision 1.1.1.1  2004/10/26 06:53:57  jgs  
 * initial import of project esys2  
 *  
 * Revision 1.1.1.1  2004/06/24 04:00:40  johng  
 * Initial version of eys using boost-python.  
 *  
 *  
 */  
   

Legend:
Removed from v.123  
changed lines
  Added in v.730

  ViewVC Help
Powered by ViewVC 1.1.26