/[escript]/branches/doubleplusgood/dudley/src/Mesh.cpp
ViewVC logotype

Annotation of /branches/doubleplusgood/dudley/src/Mesh.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2856 - (hide annotations)
Mon Jan 18 04:14:37 2010 UTC (9 years, 3 months ago) by gross
Original Path: trunk/finley/src/Mesh.c
File MIME type: text/plain
File size: 6823 byte(s)
FunctionSpaces provide now some information about their approximation order.
1 ksteube 1312 /*******************************************************
2 ksteube 1811 *
3 jfenwick 2548 * Copyright (c) 2003-2009 by University of Queensland
4 ksteube 1811 * Earth Systems Science Computational Center (ESSCC)
5     * http://www.uq.edu.au/esscc
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     *******************************************************/
12 ksteube 1312
13 ksteube 1811
14 jgs 82 /**************************************************************/
15    
16     /* Finley: Mesh */
17    
18     /**************************************************************/
19    
20     #include "Mesh.h"
21    
22     /**************************************************************/
23    
24     /* allocates a Mesh with name name for elements of type id using an integration order. If order is negative, */
25     /* the most appropriate order is selected indepently. */
26    
27 gross 2856 Finley_Mesh* Finley_Mesh_alloc(char* name,dim_t numDim, Paso_MPIInfo *mpi_info)
28 bcumming 730 {
29 jgs 82 Finley_Mesh *out;
30    
31     /* allocate the return value */
32    
33 jgs 102 out=MEMALLOC(1,Finley_Mesh);
34 jgs 82 if (Finley_checkPtr(out)) return NULL;
35     out->Name=NULL;
36     out->Nodes=NULL;
37     out->Elements=NULL;
38     out->FaceElements=NULL;
39     out->Points=NULL;
40     out->ContactElements=NULL;
41 gross 1044 out->TagMap=NULL;
42 jgs 82 out->reference_counter=0;
43 jgs 102
44     out->FullFullPattern=NULL;
45     out->FullReducedPattern=NULL;
46     out->ReducedFullPattern=NULL;
47     out->ReducedReducedPattern=NULL;
48 bcumming 730 out->MPIInfo = Paso_MPIInfo_getReference( mpi_info );
49     if (! Finley_noError()) {
50 ksteube 1312 Finley_Mesh_free(out);
51 bcumming 730 return NULL;
52     }
53 jgs 82 /* copy name: */
54    
55 jgs 102 out->Name=MEMALLOC(strlen(name)+1,char);
56 jgs 82 if (Finley_checkPtr(out->Name)) {
57 ksteube 1312 Finley_Mesh_free(out);
58 jgs 82 return NULL;
59     }
60     strcpy(out->Name,name);
61    
62     /* allocate node table: */
63 bcumming 730 out->Nodes=Finley_NodeFile_alloc( numDim, mpi_info );
64 jgs 150 if (! Finley_noError()) {
65 ksteube 1312 Finley_Mesh_free(out);
66 jgs 82 return NULL;
67     }
68 gross 2856 out->approximationOrder=-1;
69     out->reducedApproximationOrder=-1;
70     out->integrationOrder=-1;
71     out->reducedIntegrationOrder=-1;
72    
73 jgs 82 out->Elements=NULL;
74     out->FaceElements=NULL;
75     out->Points=NULL;
76     out->ContactElements=NULL;
77     out->reference_counter++;
78     return out;
79     }
80    
81 jgs 102 /* returns a reference to Finley_Mesh in */
82    
83     Finley_Mesh* Finley_Mesh_reference(Finley_Mesh* in) {
84     if (in!=NULL) ++(in->reference_counter);
85     return in;
86     }
87    
88 ksteube 1312 /* freeates a mesh: */
89 jgs 82
90 ksteube 1312 void Finley_Mesh_free(Finley_Mesh* in) {
91 jgs 82 if (in!=NULL) {
92     in->reference_counter--;
93     if (in->reference_counter<1) {
94     MEMFREE(in->Name);
95 ksteube 1312 Finley_NodeFile_free(in->Nodes);
96 gross 1804 Finley_ElementFile_free(in->FaceElements);
97 ksteube 1312 Finley_ElementFile_free(in->Elements);
98     Finley_ElementFile_free(in->ContactElements);
99     Finley_ElementFile_free(in->Points);
100 gross 1044 Finley_TagMap_free(in->TagMap);
101 ksteube 1312 Paso_SystemMatrixPattern_free(in->FullFullPattern);
102     Paso_SystemMatrixPattern_free(in->FullReducedPattern);
103     Paso_SystemMatrixPattern_free(in->ReducedFullPattern);
104     Paso_SystemMatrixPattern_free(in->ReducedReducedPattern);
105     Paso_MPIInfo_free( in->MPIInfo );
106 jgs 82 MEMFREE(in);
107     }
108     }
109     }
110    
111     /**************************************************************/
112    
113     /* returns the spatial dimension of the mesh: */
114    
115 jgs 123 dim_t Finley_Mesh_getDim(Finley_Mesh *in) {
116 jgs 82 return in->Nodes->numDim;
117     }
118    
119 ksteube 1312 void Finley_Mesh_setElements(Finley_Mesh* self,Finley_ElementFile *elements) {
120     Finley_ElementFile_free(self->Elements);
121     self->Elements=elements;
122 jgs 82 }
123 ksteube 1312 void Finley_Mesh_setFaceElements(Finley_Mesh* self,Finley_ElementFile *elements) {
124     Finley_ElementFile_free(self->FaceElements);
125     self->FaceElements=elements;
126 jgs 82 }
127 ksteube 1312 void Finley_Mesh_setContactElements(Finley_Mesh* self,Finley_ElementFile *elements) {
128     Finley_ElementFile_free(self->ContactElements);
129     self->ContactElements=elements;
130 jgs 82 }
131 ksteube 1312 void Finley_Mesh_setPoints(Finley_Mesh* self,Finley_ElementFile *elements) {
132     Finley_ElementFile_free(self->Points);
133     self->Points=elements;
134     }
135 gross 2533 int Finley_Mesh_getStatus(Finley_Mesh* in) {
136     if (in == NULL) {
137     return -1;
138     } else if (in->Nodes == NULL) {
139     return -1;
140     } else {
141     return in->Nodes->status;
142     }
143     }
144 gross 2856
145     void Mesh_setOrders(Finley_Mesh *in)
146     {
147     const dim_t order_max=9999999;
148     dim_t locals[4];
149     #ifdef PASO_MPI
150     dim_t globals[4];
151     #endif
152     locals[0]=order_max; locals[1]=order_max; locals[2]=order_max; locals[3]=order_max;
153    
154     if ( in->Elements!=NULL) {
155     if (in->Elements->numElements > 0) {
156     locals[0]=MIN(locals[0], in->Elements->referenceElementSet->referenceElement->BasisFunctions->Type->numOrder);
157     locals[1]=MIN(locals[1], in->Elements->referenceElementSet->referenceElement->LinearBasisFunctions->Type->numOrder);
158     locals[2]=MIN(locals[2], in->Elements->referenceElementSet->referenceElement->integrationOrder);
159     locals[3]=MIN(locals[3], in->Elements->referenceElementSet->referenceElementReducedQuadrature->integrationOrder);
160     }
161     }
162     if ( in->FaceElements!=NULL) {
163     if (in->FaceElements->numElements > 0) {
164     locals[0]=MIN(locals[0], in->FaceElements->referenceElementSet->referenceElement->BasisFunctions->Type->numOrder);
165     locals[1]=MIN(locals[1], in->FaceElements->referenceElementSet->referenceElement->LinearBasisFunctions->Type->numOrder);
166     locals[2]=MIN(locals[2], in->FaceElements->referenceElementSet->referenceElement->integrationOrder);
167     locals[3]=MIN(locals[3], in->FaceElements->referenceElementSet->referenceElementReducedQuadrature->integrationOrder);
168     }
169    
170    
171     }
172     if ( in->ContactElements!=NULL) {
173     if (in->ContactElements->numElements > 0) {
174     locals[0]=MIN(locals[0], in->ContactElements->referenceElementSet->referenceElement->BasisFunctions->Type->numOrder);
175     locals[1]=MIN(locals[1], in->ContactElements->referenceElementSet->referenceElement->LinearBasisFunctions->Type->numOrder);
176     locals[2]=MIN(locals[2], in->ContactElements->referenceElementSet->referenceElement->integrationOrder);
177     locals[3]=MIN(locals[3], in->ContactElements->referenceElementSet->referenceElementReducedQuadrature->integrationOrder);
178     }
179    
180     }
181    
182     #ifdef PASO_MPI
183     MPI_Allreduce( locals, globals, 4, MPI_INT, MPI_MIN, in->MPIInfo->comm );
184     in->approximationOrder=(globals[0] < order_max ? globals[0] : -1 );
185     in->reducedApproximationOrder=(globals[1] < order_max ? globals[1] : -1 );
186     in->integrationOrder=(globals[2] < order_max ? globals[2] : -1 );
187     in->reducedIntegrationOrder=(globals[3] < order_max ? globals[3] : -1 );
188     #else
189     in->approximationOrder=(locals[0] < order_max ? locals[0] : -1 );
190     in->reducedApproximationOrder=(locals[1] < order_max ? locals[1] : -1 );
191     in->integrationOrder=(locals[2] < order_max ? locals[2] : -1 );
192     in->reducedIntegrationOrder=(locals[3] < order_max ? locals[3] : -1 );
193     #endif
194    
195    
196     }
197    

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

  ViewVC Help
Powered by ViewVC 1.1.26