1 /*****************************************************************************/
2 /* XDMF */
3 /* eXtensible Data Model and Format */
4 /* */
5 /* Id : XdmfGrid.cpp */
6 /* */
7 /* Author: */
8 /* Kenneth Leiter */
9 /* kenneth.leiter@arl.army.mil */
10 /* US Army Research Laboratory */
11 /* Aberdeen Proving Ground, MD */
12 /* */
13 /* Copyright @ 2011 US Army Research Laboratory */
14 /* All Rights Reserved */
15 /* See Copyright.txt for details */
16 /* */
17 /* This software is distributed WITHOUT ANY WARRANTY; without */
18 /* even the implied warranty of MERCHANTABILITY or FITNESS */
19 /* FOR A PARTICULAR PURPOSE. See the above copyright notice */
20 /* for more information. */
21 /* */
22 /*****************************************************************************/
23
24 #include <utility>
25 #include <string.h>
26 #include "XdmfAttribute.hpp"
27 #include "XdmfError.hpp"
28 #include "XdmfGeometry.hpp"
29 #include "XdmfGrid.hpp"
30 #include "XdmfMap.hpp"
31 #include "XdmfSet.hpp"
32 #include "XdmfTime.hpp"
33 #include "XdmfTopology.hpp"
34
XDMF_CHILDREN_IMPLEMENTATION(XdmfGrid,XdmfAttribute,Attribute,Name)35 XDMF_CHILDREN_IMPLEMENTATION(XdmfGrid, XdmfAttribute, Attribute, Name)
36 XDMF_CHILDREN_IMPLEMENTATION(XdmfGrid, XdmfMap, Map, Name)
37 XDMF_CHILDREN_IMPLEMENTATION(XdmfGrid, XdmfSet, Set, Name)
38
39 XdmfGrid::XdmfGrid(const shared_ptr<XdmfGeometry> geometry,
40 const shared_ptr<XdmfTopology> topology,
41 const std::string & name) :
42 mGeometry(geometry),
43 mTopology(topology),
44 mName(name),
45 mTime(shared_ptr<XdmfTime>())
46 {
47 }
48
XdmfGrid(XdmfGrid & refGrid)49 XdmfGrid::XdmfGrid(XdmfGrid &refGrid):
50 XdmfItem(refGrid),
51 mAttributes(refGrid.mAttributes),
52 mSets(refGrid.mSets),
53 mMaps(refGrid.mMaps),
54 mGeometry(refGrid.mGeometry),
55 mTopology(refGrid.mTopology),
56 mName(refGrid.mName),
57 mTime(refGrid.mTime)
58 {
59 XdmfGridImpl * holder = refGrid.mImpl;
60 XdmfGridImpl * duplicateImpl = holder->duplicate();
61 mImpl = duplicateImpl;
62 }
63
~XdmfGrid()64 XdmfGrid::~XdmfGrid()
65 {
66 }
67
68 const std::string XdmfGrid::ItemTag = "Grid";
69
70 shared_ptr<XdmfGridController>
getGridController()71 XdmfGrid::getGridController()
72 {
73 return mGridController;
74 }
75
76 void
copyGrid(shared_ptr<XdmfGrid> sourceGrid)77 XdmfGrid::copyGrid(shared_ptr<XdmfGrid> sourceGrid)
78 {
79 this->setName(sourceGrid->getName());
80 this->setTime(sourceGrid->getTime());
81 while(this->getNumberAttributes() > 0)
82 {
83 this->removeAttribute(0);
84 }
85 for (unsigned int i = 0; i < sourceGrid->getNumberAttributes(); ++i)
86 {
87 this->insert(sourceGrid->getAttribute(i));
88 }
89 while(this->getNumberInformations() > 0)
90 {
91 this->removeInformation(0);
92 }
93 for (unsigned int i = 0; i < sourceGrid->getNumberInformations(); ++i)
94 {
95 this->insert(sourceGrid->getInformation(i));
96 }
97 while(this->getNumberSets() > 0)
98 {
99 this->removeSet(0);
100 }
101 for (unsigned int i = 0; i < sourceGrid->getNumberSets(); ++i)
102 {
103 this->insert(sourceGrid->getSet(i));
104 }
105 while(this->getNumberMaps() > 0)
106 {
107 this->removeMap(0);
108 }
109 for (unsigned int i = 0; i < sourceGrid->getNumberMaps(); ++i)
110 {
111 this->insert(sourceGrid->getMap(i));
112 }
113 }
114
115 shared_ptr<const XdmfGeometry>
getGeometry() const116 XdmfGrid::getGeometry() const
117 {
118 return mGeometry;
119 }
120
121 std::map<std::string, std::string>
getItemProperties() const122 XdmfGrid::getItemProperties() const
123 {
124 std::map<std::string, std::string> gridProperties;
125 gridProperties.insert(std::make_pair("Name", mName));
126 return gridProperties;
127 }
128
129 std::string
getItemTag() const130 XdmfGrid::getItemTag() const
131 {
132 return ItemTag;
133 }
134
135 std::string
getName() const136 XdmfGrid::getName() const
137 {
138 return mName;
139 }
140
141 shared_ptr<XdmfTime>
getTime()142 XdmfGrid::getTime()
143 {
144 return boost::const_pointer_cast<XdmfTime>
145 (static_cast<const XdmfGrid &>(*this).getTime());
146 }
147
148 shared_ptr<const XdmfTime>
getTime() const149 XdmfGrid::getTime() const
150 {
151 return mTime;
152 }
153
154 shared_ptr<const XdmfTopology>
getTopology() const155 XdmfGrid::getTopology() const
156 {
157 return mTopology;
158 }
159
160 void
populateItem(const std::map<std::string,std::string> & itemProperties,const std::vector<shared_ptr<XdmfItem>> & childItems,const XdmfCoreReader * const reader)161 XdmfGrid::populateItem(const std::map<std::string, std::string> & itemProperties,
162 const std::vector<shared_ptr<XdmfItem> > & childItems,
163 const XdmfCoreReader * const reader)
164 {
165 XdmfItem::populateItem(itemProperties, childItems, reader);
166 std::map<std::string, std::string>::const_iterator name =
167 itemProperties.find("Name");
168 if(name != itemProperties.end()) {
169 mName = name->second;
170 }
171 else {
172 mName = "";
173 }
174 for(std::vector<shared_ptr<XdmfItem> >::const_iterator iter =
175 childItems.begin();
176 iter != childItems.end();
177 ++iter) {
178 if(shared_ptr<XdmfAttribute> attribute =
179 shared_dynamic_cast<XdmfAttribute>(*iter)) {
180 this->insert(attribute);
181 }
182 else if(shared_ptr<XdmfGeometry> geometry =
183 shared_dynamic_cast<XdmfGeometry>(*iter)) {
184 mGeometry = geometry;
185 }
186 else if(shared_ptr<XdmfMap> map =
187 shared_dynamic_cast<XdmfMap>(*iter)) {
188 this->insert(map);
189 }
190 else if(shared_ptr<XdmfSet> set =
191 shared_dynamic_cast<XdmfSet>(*iter)) {
192 this->insert(set);
193 }
194 else if(shared_ptr<XdmfTime> time =
195 shared_dynamic_cast<XdmfTime>(*iter)) {
196 mTime = time;
197 }
198 else if(shared_ptr<XdmfTopology> topology =
199 shared_dynamic_cast<XdmfTopology>(*iter)) {
200 mTopology = topology;
201 }
202 else if(shared_ptr<XdmfGridController> gridController =
203 shared_dynamic_cast<XdmfGridController>(*iter)) {
204 this->setGridController(gridController);
205 }
206 }
207 }
208
209 void
read()210 XdmfGrid::read()
211 {
212
213 }
214
215 void
release()216 XdmfGrid::release()
217 {
218 this->setName("");
219 this->setTime(shared_ptr<XdmfTime>());
220 while(this->getNumberAttributes() > 0)
221 {
222 this->removeAttribute(0);
223 }
224 while(this->getNumberInformations() > 0)
225 {
226 this->removeInformation(0);
227 }
228 while(this->getNumberSets() > 0)
229 {
230 this->removeSet(0);
231 }
232 while(this->getNumberMaps() > 0)
233 {
234 this->removeMap(0);
235 }
236 }
237
238 void
setGridController(shared_ptr<XdmfGridController> newController)239 XdmfGrid::setGridController(shared_ptr<XdmfGridController> newController)
240 {
241 mGridController = newController;
242 }
243
244
245 void
setName(const std::string & name)246 XdmfGrid::setName(const std::string & name)
247 {
248 mName = name;
249 this->setIsChanged(true);
250 }
251
252 void
setTime(const shared_ptr<XdmfTime> time)253 XdmfGrid::setTime(const shared_ptr<XdmfTime> time)
254 {
255 mTime = time;
256 this->setIsChanged(true);
257 }
258
259 void
traverse(const shared_ptr<XdmfBaseVisitor> visitor)260 XdmfGrid::traverse(const shared_ptr<XdmfBaseVisitor> visitor)
261 {
262 XdmfItem::traverse(visitor);
263 if (mGridController) {
264 mGridController->accept(visitor);
265 }
266 if(mTime) {
267 mTime->accept(visitor);
268 }
269 if(mGeometry) {
270 mGeometry->accept(visitor);
271 }
272 if(mTopology) {
273 mTopology->accept(visitor);
274 }
275 for (unsigned int i = 0; i < mAttributes.size(); ++i)
276 {
277 mAttributes[i]->accept(visitor);
278 }
279 for (unsigned int i = 0; i < mMaps.size(); ++i)
280 {
281 mMaps[i]->accept(visitor);
282 }
283 for (unsigned int i = 0; i < mSets.size(); ++i)
284 {
285 mSets[i]->accept(visitor);
286 }
287 }
288
289 // C Wrappers
290
XdmfGridGetAttribute(XDMFGRID * grid,unsigned int index)291 XDMFATTRIBUTE * XdmfGridGetAttribute(XDMFGRID * grid, unsigned int index)
292 {
293 XdmfItem * tempPointer = (XdmfItem *)(grid);
294 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
295 return (XDMFATTRIBUTE *)((void *)(gridPointer->getAttribute(index).get()));
296 }
297
XdmfGridGetAttributeByName(XDMFGRID * grid,char * Name)298 XDMFATTRIBUTE * XdmfGridGetAttributeByName(XDMFGRID * grid, char * Name)
299 {
300 XdmfItem * tempPointer = (XdmfItem *)(grid);
301 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
302 return (XDMFATTRIBUTE *)((void *)(gridPointer->getAttribute(Name).get()));
303 }
304
XdmfGridGetNumberAttributes(XDMFGRID * grid)305 unsigned int XdmfGridGetNumberAttributes(XDMFGRID * grid)
306 {
307 XdmfItem * tempPointer = (XdmfItem *)(grid);
308 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
309 return gridPointer->getNumberAttributes();
310 }
311
XdmfGridInsertAttribute(XDMFGRID * grid,XDMFATTRIBUTE * Attribute,int passControl)312 void XdmfGridInsertAttribute(XDMFGRID * grid, XDMFATTRIBUTE * Attribute, int passControl)
313 {
314 XdmfItem * tempPointer = (XdmfItem *)(grid);
315 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
316 if (passControl) {
317 gridPointer->insert(shared_ptr<XdmfAttribute>((XdmfAttribute *)Attribute));
318 }
319 else {
320 gridPointer->insert(shared_ptr<XdmfAttribute>((XdmfAttribute *)Attribute, XdmfNullDeleter()));
321 }
322 }
323
XdmfGridRemoveAttribute(XDMFGRID * grid,unsigned int index)324 void XdmfGridRemoveAttribute(XDMFGRID * grid, unsigned int index)
325 {
326 XdmfItem * tempPointer = (XdmfItem *)(grid);
327 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
328 gridPointer->removeAttribute(index);
329 }
330
XdmfGridRemoveAttributeByName(XDMFGRID * grid,char * Name)331 void XdmfGridRemoveAttributeByName(XDMFGRID * grid, char * Name)
332 {
333 XdmfItem * tempPointer = (XdmfItem *)(grid);
334 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
335 gridPointer->removeAttribute(Name);
336 }
337
XdmfGridGetSet(XDMFGRID * grid,unsigned int index)338 XDMFSET * XdmfGridGetSet(XDMFGRID * grid, unsigned int index)
339 {
340 XdmfItem * tempPointer = (XdmfItem *)(grid);
341 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
342 return (XDMFSET *)((void *)(gridPointer->getSet(index).get()));
343 }
344
XdmfGridGetSetByName(XDMFGRID * grid,char * Name)345 XDMFSET * XdmfGridGetSetByName(XDMFGRID * grid, char * Name)
346 {
347 XdmfItem * tempPointer = (XdmfItem *)(grid);
348 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
349 return (XDMFSET *)((void *)(gridPointer->getSet(Name).get()));
350 }
351
XdmfGridGetNumberSets(XDMFGRID * grid)352 unsigned int XdmfGridGetNumberSets(XDMFGRID * grid)
353 {
354 XdmfItem * tempPointer = (XdmfItem *)(grid);
355 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
356 return gridPointer->getNumberSets();
357 }
358
XdmfGridInsertSet(XDMFGRID * grid,XDMFSET * Set,int passControl)359 void XdmfGridInsertSet(XDMFGRID * grid, XDMFSET * Set, int passControl)
360 {
361 XdmfItem * tempPointer = (XdmfItem *)(grid);
362 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
363 if (passControl) {
364 gridPointer->insert(shared_ptr<XdmfSet>((XdmfSet *)Set));
365 }
366 else {
367 gridPointer->insert(shared_ptr<XdmfSet>((XdmfSet *)Set, XdmfNullDeleter()));
368 }
369 }
370
XdmfGridRemoveSet(XDMFGRID * grid,unsigned int index)371 void XdmfGridRemoveSet(XDMFGRID * grid, unsigned int index)
372 {
373 XdmfItem * tempPointer = (XdmfItem *)(grid);
374 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
375 gridPointer->removeSet(index);
376 }
377
XdmfGridRemoveSetByName(XDMFGRID * grid,char * Name)378 void XdmfGridRemoveSetByName(XDMFGRID * grid, char * Name)
379 {
380 XdmfItem * tempPointer = (XdmfItem *)(grid);
381 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
382 gridPointer->removeSet(Name);
383 }
384
XdmfGridGetMap(XDMFGRID * grid,unsigned int index)385 XDMFMAP * XdmfGridGetMap(XDMFGRID * grid, unsigned int index)
386 {
387 XdmfItem * tempPointer = (XdmfItem *)(grid);
388 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
389 return (XDMFMAP *)((void *)(gridPointer->getMap(index).get()));
390 }
391
XdmfGridGetMapByName(XDMFGRID * grid,char * Name)392 XDMFMAP * XdmfGridGetMapByName(XDMFGRID * grid, char * Name)
393 {
394 XdmfItem * tempPointer = (XdmfItem *)(grid);
395 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
396 return (XDMFMAP *)((void *)(gridPointer->getMap(Name).get()));
397 }
398
XdmfGridGetNumberMaps(XDMFGRID * grid)399 unsigned int XdmfGridGetNumberMaps(XDMFGRID * grid)
400 {
401 XdmfItem * tempPointer = (XdmfItem *)(grid);
402 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
403 return gridPointer->getNumberMaps();
404 }
405
XdmfGridInsertMap(XDMFGRID * grid,XDMFMAP * Map,int passControl)406 void XdmfGridInsertMap(XDMFGRID * grid, XDMFMAP * Map, int passControl)
407 {
408 XdmfItem * tempPointer = (XdmfItem *)(grid);
409 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
410 if (passControl) {
411 gridPointer->insert(shared_ptr<XdmfMap>((XdmfMap *)Map));
412 }
413 else {
414 gridPointer->insert(shared_ptr<XdmfMap>((XdmfMap *)Map, XdmfNullDeleter()));
415 }
416 }
417
XdmfGridRemoveMap(XDMFGRID * grid,unsigned int index)418 void XdmfGridRemoveMap(XDMFGRID * grid, unsigned int index)
419 {
420 XdmfItem * tempPointer = (XdmfItem *)(grid);
421 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
422 gridPointer->removeMap(index);
423 }
424
XdmfGridRemoveMapByName(XDMFGRID * grid,char * Name)425 void XdmfGridRemoveMapByName(XDMFGRID * grid, char * Name)
426 {
427 XdmfItem * tempPointer = (XdmfItem *)(grid);
428 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
429 gridPointer->removeMap(Name);
430 }
431
XdmfGridGetGridController(XDMFGRID * grid)432 XDMFGRIDCONTROLLER * XdmfGridGetGridController(XDMFGRID * grid)
433 {
434 XdmfItem * classedPointer = (XdmfItem *)grid;
435 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(classedPointer);
436 shared_ptr<XdmfGridController> generatedController = gridPointer->getGridController();
437 return (XDMFGRIDCONTROLLER *)((void *)(generatedController.get()));
438
439 }
440
XdmfGridGetName(XDMFGRID * grid)441 char * XdmfGridGetName(XDMFGRID * grid)
442 {
443 XdmfItem * tempPointer = (XdmfItem *)(grid);
444 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
445 return strdup(gridPointer->getName().c_str());
446 }
447
XdmfGridGetTime(XDMFGRID * grid)448 XDMFTIME * XdmfGridGetTime(XDMFGRID * grid)
449 {
450 XdmfItem * classedPointer = (XdmfItem *)grid;
451 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(classedPointer);
452 shared_ptr<XdmfTime> generatedTime = gridPointer->getTime();
453 return (XDMFTIME *)((void *)(generatedTime.get()));
454 }
455
456 void
XdmfGridRead(XDMFGRID * grid,int * status)457 XdmfGridRead(XDMFGRID * grid, int * status)
458 {
459 XDMF_ERROR_WRAP_START(status)
460 try
461 {
462 XdmfItem * classedPointer = (XdmfItem *)grid;
463 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(classedPointer);
464 gridPointer->read();
465 }
466 catch (...)
467 {
468 XdmfItem * classedPointer = (XdmfItem *)grid;
469 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(classedPointer);
470 gridPointer->read();
471 }
472 XDMF_ERROR_WRAP_END(status)
473 }
474
475 void
XdmfGridRelease(XDMFGRID * grid)476 XdmfGridRelease(XDMFGRID * grid)
477 {
478 XdmfItem * classedPointer = (XdmfItem *)grid;
479 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(classedPointer);
480 gridPointer->release();
481 }
482
XdmfGridSetGridController(XDMFGRID * grid,XDMFGRIDCONTROLLER * controller,int passControl)483 void XdmfGridSetGridController(XDMFGRID * grid, XDMFGRIDCONTROLLER * controller, int passControl)
484 {
485 XdmfItem * classedPointer = (XdmfItem *)grid;
486 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(classedPointer);
487 XdmfItem * controllerPointer = (XdmfItem *) controller;
488 XdmfGridController * classedController = dynamic_cast<XdmfGridController *>(controllerPointer);
489 if (passControl) {
490 gridPointer->setGridController(shared_ptr<XdmfGridController>(classedController));
491 }
492 else {
493 gridPointer->setGridController(shared_ptr<XdmfGridController>(classedController, XdmfNullDeleter()));
494 }
495 }
496
XdmfGridSetName(XDMFGRID * grid,char * name,int * status)497 void XdmfGridSetName(XDMFGRID * grid, char * name, int * status)
498 {
499 XDMF_ERROR_WRAP_START(status)
500 XdmfItem * tempPointer = (XdmfItem *)(grid);
501 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(tempPointer);
502 gridPointer->setName(name);
503 XDMF_ERROR_WRAP_END(status)
504 }
505
XdmfGridSetTime(XDMFGRID * grid,XDMFTIME * time,int passControl)506 void XdmfGridSetTime(XDMFGRID * grid, XDMFTIME * time, int passControl)
507 {
508 XdmfItem * classedPointer = (XdmfItem *)grid;
509 XdmfGrid * gridPointer = dynamic_cast<XdmfGrid *>(classedPointer);
510 if (passControl) {
511 gridPointer->setTime(shared_ptr<XdmfTime>((XdmfTime *)time));
512 }
513 else {
514 gridPointer->setTime(shared_ptr<XdmfTime>((XdmfTime *)time, XdmfNullDeleter()));
515 }
516 }
517
518 XDMF_ITEM_C_CHILD_WRAPPER(XdmfGrid, XDMFGRID)
519