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 "XdmfAttribute.hpp"
26 #include "XdmfGeometry.hpp"
27 #include "XdmfGrid.hpp"
28 #include "XdmfMap.hpp"
29 #include "XdmfSet.hpp"
30 #include "XdmfTime.hpp"
31 #include "XdmfTopology.hpp"
32 
XDMF_CHILDREN_IMPLEMENTATION(XdmfGrid,XdmfAttribute,Attribute,Name)33 XDMF_CHILDREN_IMPLEMENTATION(XdmfGrid, XdmfAttribute, Attribute, Name)
34 XDMF_CHILDREN_IMPLEMENTATION(XdmfGrid, XdmfMap, Map, Name)
35 XDMF_CHILDREN_IMPLEMENTATION(XdmfGrid, XdmfSet, Set, Name)
36 
37 XdmfGrid::XdmfGrid(const shared_ptr<XdmfGeometry> geometry,
38                    const shared_ptr<XdmfTopology> topology,
39                    const std::string & name) :
40   mGeometry(geometry),
41   mTopology(topology),
42   mName(name),
43   mTime(shared_ptr<XdmfTime>())
44 {
45 }
46 
~XdmfGrid()47 XdmfGrid::~XdmfGrid()
48 {
49 }
50 
51 const std::string XdmfGrid::ItemTag = "Grid";
52 
53 shared_ptr<const XdmfGeometry>
getGeometry() const54 XdmfGrid::getGeometry() const
55 {
56   return mGeometry;
57 }
58 
59 std::map<std::string, std::string>
getItemProperties() const60 XdmfGrid::getItemProperties() const
61 {
62   std::map<std::string, std::string> gridProperties;
63   gridProperties.insert(std::make_pair("Name", mName));
64   return gridProperties;
65 }
66 
67 std::string
getItemTag() const68 XdmfGrid::getItemTag() const
69 {
70   return ItemTag;
71 }
72 
73 std::string
getName() const74 XdmfGrid::getName() const
75 {
76     return mName;
77 }
78 
79 shared_ptr<XdmfTime>
getTime()80 XdmfGrid::getTime()
81 {
82   return boost::const_pointer_cast<XdmfTime>
83     (static_cast<const XdmfGrid &>(*this).getTime());
84 }
85 
86 shared_ptr<const XdmfTime>
getTime() const87 XdmfGrid::getTime() const
88 {
89   return mTime;
90 }
91 
92 shared_ptr<const XdmfTopology>
getTopology() const93 XdmfGrid::getTopology() const
94 {
95   return mTopology;
96 }
97 
98 void
populateItem(const std::map<std::string,std::string> & itemProperties,const std::vector<shared_ptr<XdmfItem>> & childItems,const XdmfCoreReader * const reader)99 XdmfGrid::populateItem(const std::map<std::string, std::string> & itemProperties,
100                        const std::vector<shared_ptr<XdmfItem> > & childItems,
101                        const XdmfCoreReader * const reader)
102 {
103   XdmfItem::populateItem(itemProperties, childItems, reader);
104   std::map<std::string, std::string>::const_iterator name =
105     itemProperties.find("Name");
106   if(name != itemProperties.end()) {
107     mName = name->second;
108   }
109   else {
110     mName = "";
111   }
112   for(std::vector<shared_ptr<XdmfItem> >::const_iterator iter =
113         childItems.begin();
114       iter != childItems.end();
115       ++iter) {
116     if(shared_ptr<XdmfAttribute> attribute =
117        shared_dynamic_cast<XdmfAttribute>(*iter)) {
118       this->insert(attribute);
119     }
120     else if(shared_ptr<XdmfGeometry> geometry =
121             shared_dynamic_cast<XdmfGeometry>(*iter)) {
122       mGeometry = geometry;
123     }
124     else if(shared_ptr<XdmfMap> map =
125             shared_dynamic_cast<XdmfMap>(*iter)) {
126       this->insert(map);
127     }
128     else if(shared_ptr<XdmfSet> set =
129             shared_dynamic_cast<XdmfSet>(*iter)) {
130       this->insert(set);
131     }
132     else if(shared_ptr<XdmfTime> time =
133             shared_dynamic_cast<XdmfTime>(*iter)) {
134       mTime = time;
135     }
136     else if(shared_ptr<XdmfTopology> topology =
137             shared_dynamic_cast<XdmfTopology>(*iter)) {
138       mTopology = topology;
139     }
140   }
141 }
142 
143 void
setName(const std::string & name)144 XdmfGrid::setName(const std::string & name)
145 {
146   mName = name;
147 }
148 
149 void
setTime(const shared_ptr<XdmfTime> time)150 XdmfGrid::setTime(const shared_ptr<XdmfTime> time)
151 {
152   mTime = time;
153 }
154 
155 void
traverse(const shared_ptr<XdmfBaseVisitor> visitor)156 XdmfGrid::traverse(const shared_ptr<XdmfBaseVisitor> visitor)
157 {
158   XdmfItem::traverse(visitor);
159   if(mTime) {
160     mTime->accept(visitor);
161   }
162   if(mGeometry) {
163     mGeometry->accept(visitor);
164   }
165   if(mTopology) {
166     mTopology->accept(visitor);
167   }
168   for(std::vector<shared_ptr<XdmfAttribute> >::const_iterator iter =
169         mAttributes.begin();
170       iter != mAttributes.end();
171       ++iter) {
172     (*iter)->accept(visitor);
173   }
174   for(std::vector<shared_ptr<XdmfMap> >::const_iterator iter =
175         mMaps.begin();
176       iter != mMaps.end();
177       ++iter) {
178     (*iter)->accept(visitor);
179   }
180   for(std::vector<shared_ptr<XdmfSet> >::const_iterator iter = mSets.begin();
181       iter != mSets.end();
182       ++iter) {
183     (*iter)->accept(visitor);
184   }
185 }
186