/[escript]/trunk/dataexporter/src/FinleyMesh.cpp
ViewVC logotype

Contents of /trunk/dataexporter/src/FinleyMesh.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2187 - (show annotations)
Tue Dec 23 04:13:15 2008 UTC (11 years, 11 months ago) by caltinay
Original Path: trunk/tools/libescriptreader/src/escriptreader/MeshWithElements.cpp
File size: 9175 byte(s)
Moved escriptreader related classes into own namespace.

1
2 /*******************************************************
3 *
4 * Copyright (c) 2003-2008 by University of Queensland
5 * Earth Systems Science Computational Center (ESSCC)
6 * http://www.uq.edu.au/esscc
7 *
8 * Primary Business: Queensland, Australia
9 * Licensed under the Open Software License version 3.0
10 * http://www.opensource.org/licenses/osl-3.0.php
11 *
12 *******************************************************/
13
14 //
15 // MeshWithElements.cpp
16 //
17 #include <escriptreader/MeshWithElements.h>
18 #include <escriptreader/ElementData.h>
19 #include <netcdf.hh>
20 #if HAVE_SILO
21 #include <silo.h>
22 #endif
23
24 using namespace std;
25
26 namespace EscriptReader {
27
28 //
29 //
30 //
31 MeshWithElements::MeshWithElements() : Mesh()
32 {
33 name = "Elements";
34 }
35
36 //
37 //
38 //
39 MeshWithElements::MeshWithElements(const MeshWithElements& m) :
40 Mesh(m)
41 {
42 nodeTag = m.nodeTag;
43 nodeGDOF = m.nodeGDOF;
44 nodeGNI = m.nodeGNI;
45 nodeGRDFI = m.nodeGRDFI;
46 nodeGRNI = m.nodeGRNI;
47 cells = new ElementData(*m.cells);
48 faces = new ElementData(*m.faces);
49 contacts = new ElementData(*m.contacts);
50 points = new ElementData(*m.points);
51 }
52
53 //
54 //
55 //
56 MeshWithElements::~MeshWithElements()
57 {
58 delete cells;
59 delete faces;
60 delete contacts;
61 delete points;
62 }
63
64 //
65 // Returns a vector of strings containing Silo mesh names that have been
66 // written
67 //
68 StringVec MeshWithElements::getMeshNames() const
69 {
70 StringVec res;
71 res.push_back(name);
72 StringVec tmpVec;
73 tmpVec = cells->getMeshNames();
74 res.insert(res.end(), tmpVec.begin(), tmpVec.end());
75 tmpVec = faces->getMeshNames();
76 res.insert(res.end(), tmpVec.begin(), tmpVec.end());
77 tmpVec = contacts->getMeshNames();
78 res.insert(res.end(), tmpVec.begin(), tmpVec.end());
79 tmpVec = points->getMeshNames();
80 res.insert(res.end(), tmpVec.begin(), tmpVec.end());
81 return res;
82 }
83
84 Mesh* MeshWithElements::getMeshByName(const string name) const
85 {
86 Mesh* ret = NULL;
87 if (name == "Elements")
88 ret = cells->fullMesh;
89 else if (name == "ReducedElements")
90 ret = cells->reducedMesh;
91 else if (name == "FaceElements")
92 ret = faces->fullMesh;
93 else if (name == "ReducedFaceElements")
94 ret = faces->reducedMesh;
95 else if (name == "ContactElements")
96 ret = contacts->fullMesh;
97 else if (name == "ReducedContactElements")
98 ret = contacts->reducedMesh;
99 else if (name == "Points")
100 ret = points->fullMesh;
101
102 return ret;
103 }
104
105 //
106 // Returns a vector of strings containing Silo variable names that have
107 // been written
108 //
109 StringVec MeshWithElements::getVarNames() const
110 {
111 StringVec res;
112 res.push_back("Nodes_Id");
113 res.push_back("Nodes_Tag");
114 res.push_back("Nodes_gDOF");
115 res.push_back("Nodes_gNI");
116 res.push_back("Nodes_grDfI");
117 res.push_back("Nodes_grNI");
118
119 StringVec tmpVec;
120 tmpVec = cells->getVarNames();
121 res.insert(res.end(), tmpVec.begin(), tmpVec.end());
122 tmpVec = faces->getVarNames();
123 res.insert(res.end(), tmpVec.begin(), tmpVec.end());
124 tmpVec = contacts->getVarNames();
125 res.insert(res.end(), tmpVec.begin(), tmpVec.end());
126 tmpVec = points->getVarNames();
127 res.insert(res.end(), tmpVec.begin(), tmpVec.end());
128
129 return res;
130 }
131
132 const IntVec& MeshWithElements::getVarDataByName(const string name) const
133 {
134 if (name == "Nodes_Id")
135 return nodeID;
136 else if (name == "Nodes_Tag")
137 return nodeTag;
138 else if (name == "Nodes_gDOF")
139 return nodeGDOF;
140 else if (name == "Nodes_gNI")
141 return nodeGNI;
142 else if (name == "Nodes_grDfI")
143 return nodeGRDFI;
144 else if (name == "Nodes_grNI")
145 return nodeGRNI;
146 else if (name.compare(0, 9, "Elements_") == 0)
147 return cells->getVarDataByName(name);
148 else if (name.compare(0, 13, "FaceElements_") == 0)
149 return faces->getVarDataByName(name);
150 else if (name.compare(0, 16, "ContactElements_") == 0)
151 return contacts->getVarDataByName(name);
152 else if (name.compare(0, 7, "Points_") == 0)
153 return points->getVarDataByName(name);
154 else
155 return *(IntVec*)(NULL);
156 }
157
158 ElementData* MeshWithElements::getElementsByName(const string name) const
159 {
160 ElementData* ret = NULL;
161 if (name == "Elements" || name == "ReducedElements")
162 ret = cells;
163 else if (name == "FaceElements" || name == "ReducedFaceElements")
164 ret = faces;
165 else if (name == "ContactElements" || name == "ReducedContactElements")
166 ret = contacts;
167 else if (name == "Points")
168 ret = points;
169
170 return ret;
171 }
172
173 //
174 // Reads mesh and element data from NetCDF file with given name
175 //
176 bool MeshWithElements::readFromNc(const string& filename)
177 {
178 if (!Mesh::readFromNc(filename))
179 return false;
180
181 NcError ncerr(NcError::silent_nonfatal);
182 NcFile* input;
183 NcVar* var;
184
185 input = new NcFile(filename.c_str());
186 if (!input->is_valid()) {
187 cerr << "Could not open input file " << filename << "." << endl;
188 delete input;
189 return false;
190 }
191
192 nodeTag.clear();
193 nodeTag.insert(nodeTag.end(), numNodes, 0);
194 var = input->get_var("Nodes_Tag");
195 var->get(&nodeTag[0], numNodes);
196
197 nodeGDOF.clear();
198 nodeGDOF.insert(nodeGDOF.end(), numNodes, 0);
199 var = input->get_var("Nodes_gDOF");
200 var->get(&nodeGDOF[0], numNodes);
201
202 nodeGNI.clear();
203 nodeGNI.insert(nodeGNI.end(), numNodes, 0);
204 var = input->get_var("Nodes_gNI");
205 var->get(&nodeGNI[0], numNodes);
206
207 nodeGRDFI.clear();
208 nodeGRDFI.insert(nodeGRDFI.end(), numNodes, 0);
209 var = input->get_var("Nodes_grDfI");
210 var->get(&nodeGRDFI[0], numNodes);
211
212 nodeGRNI.clear();
213 nodeGRNI.insert(nodeGRNI.end(), numNodes, 0);
214 var = input->get_var("Nodes_grNI");
215 var->get(&nodeGRNI[0], numNodes);
216
217 // Read all element types
218 cells = new ElementData("Elements", this);
219 cells->readFromNc(input);
220 faces = new ElementData("FaceElements", this);
221 faces->readFromNc(input);
222 contacts = new ElementData("ContactElements", this);
223 contacts->readFromNc(input);
224 points = new ElementData("Points", this);
225 points->readFromNc(input);
226
227 delete input;
228 return true;
229 }
230
231 //
232 //
233 //
234 void MeshWithElements::handleGhostZones(int ownIndex)
235 {
236 cells->handleGhostZones(ownIndex);
237 faces->handleGhostZones(ownIndex);
238 contacts->handleGhostZones(ownIndex);
239 points->handleGhostZones(ownIndex);
240 #ifdef _DEBUG
241 cout << "block " << ownIndex << " has " << cells->getGhostCount()
242 << " (" << cells->getReducedGhostCount() << ") ghost zones," << endl;
243 cout << faces->getGhostCount() << " (" << faces->getReducedGhostCount()
244 << ") ghost faces," << endl;
245 cout << contacts->getGhostCount() << " ("
246 << contacts->getReducedGhostCount() << ") ghost contacts," << endl;
247 cout << points->getGhostCount() << " (" << points->getReducedGhostCount()
248 << ") ghost points." << endl;
249 #endif
250 }
251
252 //
253 //
254 //
255 void MeshWithElements::removeGhostZones()
256 {
257 cells->removeGhostZones();
258 faces->removeGhostZones();
259 contacts->removeGhostZones();
260 points->removeGhostZones();
261 #ifdef _DEBUG
262 cout << "After removing ghost zones there are" << endl;
263 cout << " " << numNodes << " Nodes, ";
264 cout << cells->getCount() << " Elements, ";
265 cout << faces->getCount() << " Face elements, ";
266 cout << contacts->getCount() << " Contact elements, ";
267 cout << points->getCount() << " Points left." << endl;
268 #endif
269 }
270
271 //
272 //
273 //
274 bool MeshWithElements::writeToSilo(DBfile* dbfile, const string& pathInSilo)
275 {
276 #if HAVE_SILO
277 int ret;
278
279 // Write meshes and zone-centered variables
280 if (!cells->writeToSilo(dbfile, pathInSilo) ||
281 !faces->writeToSilo(dbfile, pathInSilo) ||
282 !contacts->writeToSilo(dbfile, pathInSilo) ||
283 !points->writeToSilo(dbfile, pathInSilo))
284 return false;
285
286 if (!Mesh::writeToSilo(dbfile, pathInSilo))
287 return false;
288
289 if (pathInSilo != "") {
290 ret = DBSetDir(dbfile, pathInSilo.c_str());
291 if (ret != 0)
292 return false;
293 }
294
295 string siloMeshName = getFullSiloName();
296
297 // Write node-centered variables
298 ret = DBPutUcdvar1(dbfile, "Nodes_Tag", siloMeshName.c_str(),
299 (float*)&nodeTag[0], numNodes, NULL, 0, DB_INT,
300 DB_NODECENT, NULL);
301 if (ret == 0)
302 ret = DBPutUcdvar1(dbfile, "Nodes_gDOF", siloMeshName.c_str(),
303 (float*)&nodeGDOF[0], numNodes, NULL, 0, DB_INT,
304 DB_NODECENT, NULL);
305 if (ret == 0)
306 ret = DBPutUcdvar1(dbfile, "Nodes_gNI", siloMeshName.c_str(),
307 (float*)&nodeGNI[0], numNodes, NULL, 0, DB_INT,
308 DB_NODECENT, NULL);
309 if (ret == 0)
310 ret = DBPutUcdvar1(dbfile, "Nodes_grDfI", siloMeshName.c_str(),
311 (float*)&nodeGRDFI[0], numNodes, NULL, 0, DB_INT,
312 DB_NODECENT, NULL);
313 if (ret == 0)
314 ret = DBPutUcdvar1(dbfile, "Nodes_grNI", siloMeshName.c_str(),
315 (float*)&nodeGRNI[0], numNodes, NULL, 0, DB_INT,
316 DB_NODECENT, NULL);
317
318 DBSetDir(dbfile, "/");
319 return (ret == 0);
320
321 #else // !HAVE_SILO
322 return false;
323 #endif
324 }
325
326 } // namespace EscriptReader
327

  ViewVC Help
Powered by ViewVC 1.1.26