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