1 /*****************************************************************************/
2 /* XDMF */
3 /* eXtensible Data Model and Format */
4 /* */
5 /* Id : XdmfGeometryType.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 "XdmfGeometryType.hpp"
26 #include "XdmfError.hpp"
27 #include "string.h"
28
29 std::map<std::string, shared_ptr<const XdmfGeometryType>(*)()> XdmfGeometryType::mGeometryDefinitions;
30
31 // Supported XdmfGeometryTypes
32 shared_ptr<const XdmfGeometryType>
NoGeometryType()33 XdmfGeometryType::NoGeometryType()
34 {
35 static shared_ptr<const XdmfGeometryType> p(new XdmfGeometryType("None", 0));
36 return p;
37 }
38
39 shared_ptr<const XdmfGeometryType>
XYZ()40 XdmfGeometryType::XYZ()
41 {
42 static shared_ptr<const XdmfGeometryType> p(new XdmfGeometryType("XYZ", 3));
43 return p;
44 }
45
46 shared_ptr<const XdmfGeometryType>
XY()47 XdmfGeometryType::XY()
48 {
49 static shared_ptr<const XdmfGeometryType> p(new XdmfGeometryType("XY", 2));
50 return p;
51 }
52
53 shared_ptr<const XdmfGeometryType>
Polar()54 XdmfGeometryType::Polar()
55 {
56 static shared_ptr<const XdmfGeometryType> p(new XdmfGeometryType("Polar", 2));
57 return p;
58 }
59
60 shared_ptr<const XdmfGeometryType>
Spherical()61 XdmfGeometryType::Spherical()
62 {
63 static shared_ptr<const XdmfGeometryType> p(new XdmfGeometryType("Spherical", 3));
64 return p;
65 }
66
67 void
InitTypes()68 XdmfGeometryType::InitTypes()
69 {
70 mGeometryDefinitions["NONE"] = NoGeometryType;
71 mGeometryDefinitions["XYZ"] = XYZ;
72 mGeometryDefinitions["XY"] = XY;
73 mGeometryDefinitions["POLAR"] = Polar;
74 mGeometryDefinitions["SPHERICAL"] = Spherical;
75 }
76
XdmfGeometryType(const std::string & name,const int & dimensions)77 XdmfGeometryType::XdmfGeometryType(const std::string& name,
78 const int& dimensions) :
79 mDimensions(dimensions),
80 mName(name)
81 {
82 }
83
~XdmfGeometryType()84 XdmfGeometryType::~XdmfGeometryType()
85 {
86 }
87
88 shared_ptr<const XdmfGeometryType>
New(const std::map<std::string,std::string> & itemProperties)89 XdmfGeometryType::New(const std::map<std::string, std::string> & itemProperties)
90 {
91 InitTypes();
92
93 std::map<std::string, std::string>::const_iterator type =
94 itemProperties.find("Type");
95 if(type == itemProperties.end()) {
96 type = itemProperties.find("GeometryType");
97 }
98 if(type == itemProperties.end()) {
99 XdmfError::message(XdmfError::FATAL,
100 "Neither 'Type' nor 'GeometryType' in itemProperties "
101 "in XdmfGeometryType::New");
102 }
103
104 const std::string & typeVal = ConvertToUpper(type->second);
105
106 std::map<std::string, shared_ptr<const XdmfGeometryType>(*)()>::const_iterator returnType
107 = mGeometryDefinitions.find(typeVal);
108
109 if (returnType == mGeometryDefinitions.end()) {
110 XdmfError::message(XdmfError::FATAL, "Type "
111 + typeVal + " not Supported "
112 "in XdmfGeometryType::New");
113 }
114 else {
115 return (*(returnType->second))();
116 }
117
118 return shared_ptr<const XdmfGeometryType>();
119 }
120
121 unsigned int
getDimensions() const122 XdmfGeometryType::getDimensions() const
123 {
124 return mDimensions;
125 }
126
127 std::string
getName() const128 XdmfGeometryType::getName() const
129 {
130 return mName;
131 }
132
133 void
getProperties(std::map<std::string,std::string> & collectedProperties) const134 XdmfGeometryType::getProperties(std::map<std::string, std::string> & collectedProperties) const
135 {
136 collectedProperties.insert(std::make_pair("Type", mName));
137 }
138
139 // C Wrappers
140
XdmfGeometryTypeNoGeometryType()141 int XdmfGeometryTypeNoGeometryType()
142 {
143 return XDMF_GEOMETRY_TYPE_NO_GEOMETRY_TYPE;
144 }
145
XdmfGeometryTypeXYZ()146 int XdmfGeometryTypeXYZ()
147 {
148 return XDMF_GEOMETRY_TYPE_XYZ;
149 }
150
XdmfGeometryTypeXY()151 int XdmfGeometryTypeXY()
152 {
153 return XDMF_GEOMETRY_TYPE_XY;
154 }
155
XdmfGeometryTypePolar()156 int XdmfGeometryTypePolar()
157 {
158 return XDMF_GEOMETRY_TYPE_POLAR;
159 }
160
XdmfGeometryTypeSpherical()161 int XdmfGeometryTypeSpherical()
162 {
163 return XDMF_GEOMETRY_TYPE_SPHERICAL;
164 }
165
XdmfGeometryTypeGetDimensions(int type,int * status)166 unsigned int XdmfGeometryTypeGetDimensions(int type, int * status)
167 {
168 XDMF_ERROR_WRAP_START(status)
169 switch (type) {
170 case XDMF_GEOMETRY_TYPE_NO_GEOMETRY_TYPE:
171 return XdmfGeometryType::NoGeometryType()->getDimensions();
172 break;
173 case XDMF_GEOMETRY_TYPE_XYZ:
174 return XdmfGeometryType::XYZ()->getDimensions();
175 break;
176 case XDMF_GEOMETRY_TYPE_XY:
177 return XdmfGeometryType::XY()->getDimensions();
178 break;
179 case XDMF_GEOMETRY_TYPE_POLAR:
180 return XdmfGeometryType::Polar()->getDimensions();
181 break;
182 case XDMF_GEOMETRY_TYPE_SPHERICAL:
183 return XdmfGeometryType::Spherical()->getDimensions();
184 break;
185 default:
186 try {
187 XdmfError::message(XdmfError::FATAL,
188 "Error: Invalid Geometry Type: Code " + type);
189 }
190 catch (XdmfError & e) {
191 throw e;
192 }
193 break;
194 }
195 XDMF_ERROR_WRAP_END(status)
196 return 0;
197 }
198
XdmfGeometryTypeGetName(int type)199 char * XdmfGeometryTypeGetName(int type)
200 {
201 switch (type) {
202 case XDMF_GEOMETRY_TYPE_NO_GEOMETRY_TYPE:
203 {
204 char * returnPointer = strdup(XdmfGeometryType::NoGeometryType()->getName().c_str());
205 return returnPointer;
206 break;
207 }
208 case XDMF_GEOMETRY_TYPE_XYZ:
209 {
210 char * returnPointer = strdup(XdmfGeometryType::XYZ()->getName().c_str());
211 return returnPointer;
212 break;
213 }
214 case XDMF_GEOMETRY_TYPE_XY:
215 {
216 char * returnPointer = strdup(XdmfGeometryType::XY()->getName().c_str());
217 return returnPointer;
218 break;
219 }
220 case XDMF_GEOMETRY_TYPE_POLAR:
221 {
222 char * returnPointer = strdup(XdmfGeometryType::Polar()->getName().c_str());
223 return returnPointer;
224 break;
225 }
226 case XDMF_GEOMETRY_TYPE_SPHERICAL:
227 {
228 char * returnPointer = strdup(XdmfGeometryType::Spherical()->getName().c_str());
229 return returnPointer;
230 break;
231 }
232 default:
233 {
234 char * returnPointer = NULL;
235 return returnPointer;
236 break;
237 }
238 }
239 }
240