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

Contents of /trunk/finley/src/ElementFile_markNodes.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 751 - (show annotations)
Mon Jun 26 01:46:34 2006 UTC (13 years, 2 months ago) by bcumming
File MIME type: text/plain
File size: 6719 byte(s)
Changes relating to the MPI version of escript
The standard OpenMP version of escript is unchanged

- updated data types (Finley_Mesh, Finley_NodeFile, etc) to store meshes
  over multiple MPI processes.
- added CommBuffer code in Paso for communication of Data associated
  with distributed meshes
- updates in Finley and Escript to support distributed data and operations
  on distributed data (such as interpolation).
- construction of RHS in MPI, so that simple explicit schemes (such as
  /docs/examples/wave.py without IO and the Locator) can run in MPI.
- updated mesh generation for first order line, rectangle and brick
  meshes and second order line meshes in MPI.        
- small changes to trunk/SConstruct and trunk/scons/ess_options.py to
  build the MPI version, these changes are turned off by default.

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: ElementFile */
16
17 /* mark the used nodes with offeset: */
18
19 /**************************************************************/
20
21 /* Copyrights by ACcESS Australia 2003,2004,2005 */
22 /* Author: gross@access.edu.au */
23 /* Version: $Id$ */
24
25 /**************************************************************/
26
27 #include "ElementFile.h"
28
29 /**************************************************************/
30
31 void Finley_ElementFile_markNodes(index_t* mask,index_t offset,Finley_ElementFile* in,bool_t useLinear) {
32 dim_t i,NN,NN2,e;
33 index_t color,*lin_node;
34 if (in!=NULL) {
35 index_t id[in->ReferenceElement->Type->numNodes];
36 for (i=0;i<in->ReferenceElement->Type->numNodes;i++) id[i]=i;
37 if (useLinear) {
38 NN=in->LinearReferenceElement->Type->numNodes;
39 lin_node=in->ReferenceElement->Type->linearNodes;
40 } else {
41 NN=in->ReferenceElement->Type->numNodes;
42 lin_node=id;
43 }
44 NN2=in->ReferenceElement->Type->numNodes;
45 /* knock out the OpenMP directives for the MPI version, get the OpenMP running
46 after the MPI is working satisfactorily */
47 #ifndef PASO_MPI
48 if ((in->maxColor-in->minColor+1)*NN<in->numElements) {
49 #pragma omp parallel private(color)
50 {
51 for (color=in->minColor;color<=in->maxColor;color++) {
52 #pragma omp for private(e,i) schedule(static)
53 for (e=0;e<in->numElements;e++) {
54 if (in->Color[e]==color) {
55 for (i=0;i<NN;i++)
56 mask[in->Nodes[INDEX2(lin_node[i],e,NN2)]-offset]=1;
57 }
58 }
59 }
60 #pragma omp barrier
61 }
62 } else {
63 #pragma omp parallel for private(e,i) schedule(static)
64 #endif
65 for (e=0;e<in->numElements;e++) {
66 for (i=0;i<NN;i++)
67 mask[in->Nodes[INDEX2(lin_node[i],e,NN2)]-offset]=1;
68 }
69 #ifndef PASO_MPI
70 }
71 #endif
72 }
73 }
74
75 #ifdef PASO_MPI
76
77 /* these have been trimmed down from the colors-based scheme for simplicity of testing
78 in the MPI scheme. */
79 void Finley_ElementFile_markBoundaryElementNodes(index_t* mask,index_t offset,Finley_ElementFile* in,bool_t useLinear) {
80 dim_t i,NN,NN2,e;
81 index_t color,*lin_node;
82 if (in!=NULL&& in->numElements>0) {
83 index_t id[in->ReferenceElement->Type->numNodes];
84 for (i=0;i<in->ReferenceElement->Type->numNodes;i++) id[i]=i;
85 if (useLinear) {
86 NN=in->LinearReferenceElement->Type->numNodes;
87 lin_node=in->ReferenceElement->Type->linearNodes;
88 } else {
89 NN=in->ReferenceElement->Type->numNodes;
90 lin_node=id;
91 }
92 NN2=in->ReferenceElement->Type->numNodes;
93 for (e=0;e<in->elementDistribution->numBoundary;e++)
94 for (i=0;i<NN;i++)
95 mask[in->Nodes[INDEX2(lin_node[i],e+in->elementDistribution->numInternal,NN2)]-offset]=1;
96 }
97 }
98
99 void Finley_ElementFile_markInternalElementNodes(index_t* mask,index_t offset,Finley_ElementFile* in,bool_t useLinear) {
100 dim_t i,NN,NN2,e;
101 index_t color,*lin_node;
102 if (in!=NULL && in->numElements>0) {
103 index_t id[in->ReferenceElement->Type->numNodes];
104 for (i=0;i<in->ReferenceElement->Type->numNodes;i++) id[i]=i;
105 if (useLinear) {
106 NN=in->LinearReferenceElement->Type->numNodes;
107 lin_node=in->ReferenceElement->Type->linearNodes;
108 } else {
109 NN=in->ReferenceElement->Type->numNodes;
110 lin_node=id;
111 }
112 NN2=in->ReferenceElement->Type->numNodes;
113
114 for (e=0;e<in->elementDistribution->numInternal;e++)
115 for (i=0;i<NN;i++)
116 mask[in->Nodes[INDEX2(lin_node[i],e,NN2)]-offset]=1;
117 }
118 }
119
120 void Finley_ElementFile_markBoundaryElementDOF(index_t* mask,index_t offset,index_t *degreeOfFreedom,Finley_ElementFile* in,bool_t useLinear) {
121 dim_t i,NN,NN2,e;
122 index_t color,*lin_node;
123 if (in!=NULL&& in->numElements>0) {
124 index_t id[in->ReferenceElement->Type->numNodes];
125 for (i=0;i<in->ReferenceElement->Type->numNodes;i++) id[i]=i;
126 if (useLinear) {
127 NN=in->LinearReferenceElement->Type->numNodes;
128 lin_node=in->ReferenceElement->Type->linearNodes;
129 } else {
130 NN=in->ReferenceElement->Type->numNodes;
131 lin_node=id;
132 }
133 NN2=in->ReferenceElement->Type->numNodes;
134 for (e=0;e<in->elementDistribution->numBoundary;e++)
135 for (i=0;i<NN;i++)
136 mask[degreeOfFreedom[in->Nodes[INDEX2(lin_node[i],e+in->elementDistribution->numInternal,NN2)]]-offset]=1;
137 }
138 }
139
140 void Finley_ElementFile_markInternalElementDOF(index_t* mask,index_t offset,index_t *degreeOfFreedom, Finley_ElementFile* in,bool_t useLinear) {
141 dim_t i,NN,NN2,e;
142 index_t color,*lin_node;
143 if (in!=NULL && in->numElements>0) {
144 index_t id[in->ReferenceElement->Type->numNodes];
145 for (i=0;i<in->ReferenceElement->Type->numNodes;i++) id[i]=i;
146 if (useLinear) {
147 NN=in->LinearReferenceElement->Type->numNodes;
148 lin_node=in->ReferenceElement->Type->linearNodes;
149 } else {
150 NN=in->ReferenceElement->Type->numNodes;
151 lin_node=id;
152 }
153 NN2=in->ReferenceElement->Type->numNodes;
154
155 for (e=0;e<in->elementDistribution->numInternal;e++)
156 for (i=0;i<NN;i++)
157 mask[degreeOfFreedom[in->Nodes[INDEX2(lin_node[i],e,NN2)]]-offset]=1;
158 }
159 }
160 #endif
161
162 /*
163 * $Log$
164 * Revision 1.4 2005/09/15 03:44:22 jgs
165 * Merge of development branch dev-02 back to main trunk on 2005-09-15
166 *
167 * Revision 1.3.2.1 2005/09/07 06:26:18 gross
168 * the solver from finley are put into the standalone package paso now
169 *
170 * Revision 1.3 2005/07/22 03:53:08 jgs
171 * Merge of development branch back to main trunk on 2005-07-22
172 *
173 * Revision 1.2 2005/07/08 04:07:50 jgs
174 * Merge of development branch back to main trunk on 2005-07-08
175 *
176 * Revision 1.1.1.1.2.2 2005/07/18 10:34:54 gross
177 * some informance improvements when reading meshes
178 *
179 * Revision 1.1.1.1.2.1 2005/06/29 02:34:49 gross
180 * some changes towards 64 integers in finley
181 *
182 * Revision 1.1.1.1 2004/10/26 06:53:57 jgs
183 * initial import of project esys2
184 *
185 * Revision 1.1.1.1 2004/06/24 04:00:40 johng
186 * Initial version of eys using boost-python.
187 *
188 *
189 */

Properties

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

  ViewVC Help
Powered by ViewVC 1.1.26