1 /*****************************************************************************/
2 /*                                    XDMF                                   */
3 /*                       eXtensible Data Model and Format                    */
4 /*                                                                           */
5 /*  Id : XdmfTopology.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 <sstream>
25 #include <utility>
26 #include "XdmfError.hpp"
27 #include "XdmfFunction.hpp"
28 #include "XdmfTopology.hpp"
29 #include "XdmfTopologyType.hpp"
30 
31 shared_ptr<XdmfTopology>
New()32 XdmfTopology::New()
33 {
34   shared_ptr<XdmfTopology> p(new XdmfTopology());
35   return p;
36 }
37 
XdmfTopology()38 XdmfTopology::XdmfTopology() :
39   mType(XdmfTopologyType::NoTopologyType()),
40   mBaseOffset(0)
41 {
42 }
43 
XdmfTopology(XdmfTopology & refTopo)44 XdmfTopology::XdmfTopology(XdmfTopology & refTopo) :
45   XdmfArray(refTopo),
46   mType(refTopo.mType)
47 {
48 }
49 
~XdmfTopology()50 XdmfTopology::~XdmfTopology()
51 {
52 }
53 
54 const std::string XdmfTopology::ItemTag = "Topology";
55 
56 int
getBaseOffset() const57 XdmfTopology::getBaseOffset() const
58 {
59   return mBaseOffset;
60 }
61 
62 std::string
getItemTag() const63 XdmfTopology::getItemTag() const
64 {
65   return ItemTag;
66 }
67 
68 std::map<std::string, std::string>
getItemProperties() const69 XdmfTopology::getItemProperties() const
70 {
71   std::map<std::string, std::string> topologyProperties;
72   mType->getProperties(topologyProperties);
73   if(mType->getCellType() != XdmfTopologyType::Structured) {
74     std::stringstream numElements;
75     numElements << this->getNumberElements();
76     topologyProperties.insert(std::make_pair("Dimensions", numElements.str()));
77   }
78   if (mBaseOffset != 0)
79   {
80     std::stringstream offsetString;
81     offsetString << mBaseOffset;
82     topologyProperties.insert(std::make_pair("BaseOffset", offsetString.str()));
83   }
84   return topologyProperties;
85 }
86 
87 unsigned int
getNumberElements() const88 XdmfTopology::getNumberElements() const
89 {
90   // deal with special cases first (mixed / no topology)
91   if(mType->getNodesPerElement() == 0) {
92     if(mType == XdmfTopologyType::Mixed()) {
93       unsigned int index = 0;
94       unsigned int numberElements = 0;
95       // iterate over all values in connectivity, pulling topology type ids
96       // and counting number of elements
97       while(index < this->getSize()) {
98         const unsigned int id = this->getValue<unsigned int>(index);
99         const shared_ptr<const XdmfTopologyType> topologyType =
100           XdmfTopologyType::New(id);
101         if(topologyType == NULL) {
102           XdmfError::message(XdmfError::FATAL,
103                              "Invalid topology type id found in connectivity "
104                              "when parsing mixed topology.");
105         }
106         if(topologyType == XdmfTopologyType::Polyvertex()) {
107           const unsigned int numberPolyvertexElements =
108             this->getValue<unsigned int>(index + 1);
109           numberElements += numberPolyvertexElements;
110           index += numberPolyvertexElements + 2;
111         }
112         else if(topologyType == XdmfTopologyType::Polyline(0) ||
113                 topologyType == XdmfTopologyType::Polygon(0)) {
114           const unsigned int numberNodes =
115             this->getValue<unsigned int>(index + 1);
116           numberElements += 1;
117           index += numberNodes + 2;
118         }
119         else if(topologyType == XdmfTopologyType::Polyhedron()) {
120           // get number of face
121           const unsigned int numberFaces =
122             this->getValue<unsigned int>(index + 1);
123           // skip to first face
124           index += 2;
125           // iterate over all faces and add number of nodes per face to index
126           for(unsigned int i=0; i<numberFaces; ++i) {
127             index += this->getValue<unsigned int>(index) + 1;
128           }
129           numberElements += 1;
130         }
131         else {
132           // add 1 to element count and move to next element id
133           numberElements += 1;
134           index += topologyType->getNodesPerElement() + 1;
135         }
136       }
137       return numberElements;
138     }
139     return 0;
140   }
141   return this->getSize() / mType->getNodesPerElement();
142 }
143 
144 shared_ptr<const XdmfTopologyType>
getType() const145 XdmfTopology::getType() const
146 {
147   return mType;
148 }
149 
150 void
populateItem(const std::map<std::string,std::string> & itemProperties,const std::vector<shared_ptr<XdmfItem>> & childItems,const XdmfCoreReader * const reader)151 XdmfTopology::populateItem(const std::map<std::string, std::string> & itemProperties,
152                            const std::vector<shared_ptr<XdmfItem> > & childItems,
153                            const XdmfCoreReader * const reader)
154 {
155   XdmfItem::populateItem(itemProperties, childItems, reader);
156   mType = XdmfTopologyType::New(itemProperties);
157   for(std::vector<shared_ptr<XdmfItem> >::const_iterator iter = childItems.begin();
158       iter != childItems.end();
159       ++iter) {
160     if(shared_ptr<XdmfArray> array = shared_dynamic_cast<XdmfArray>(*iter)) {
161       this->swap(array);
162       if (array->getReference()) {
163         this->setReference(array->getReference());
164         this->setReadMode(XdmfArray::Reference);
165       }
166       break;
167     }
168   }
169 
170   std::map<std::string, std::string>::const_iterator type =
171     itemProperties.find("Offset");
172   if (type != itemProperties.end()) {
173     type = itemProperties.find("BaseOffset");
174   }
175   if (type != itemProperties.end()) {
176     // Convert to double
177     double offset = atof(type->second.c_str());
178     std::stringstream expressionStream;
179     expressionStream << offset << "+X";
180     std::map<std::string, shared_ptr<XdmfArray> > offsetMap;
181     shared_ptr<XdmfArray> offsetBase = XdmfArray::New();
182     this->swap(offsetBase);
183     offsetMap["X"] = offsetBase;
184     shared_ptr<XdmfFunction> offsetFunction = XdmfFunction::New(expressionStream.str(), offsetMap);
185     this->setReference(offsetFunction);
186     this->setReadMode(XdmfArray::Reference);
187   }
188 }
189 
190 void
setBaseOffset(int offset)191 XdmfTopology::setBaseOffset(int offset)
192 {
193   mBaseOffset = offset;
194 }
195 
196 void
setType(const shared_ptr<const XdmfTopologyType> type)197 XdmfTopology::setType(const shared_ptr<const XdmfTopologyType> type)
198 {
199   mType = type;
200   this->setIsChanged(true);
201 }
202 
203 // C Wrappers
204 
XdmfTopologyNew()205 XDMFTOPOLOGY * XdmfTopologyNew()
206 {
207   try
208   {
209     shared_ptr<XdmfTopology> generatedTopology = XdmfTopology::New();
210     return (XDMFTOPOLOGY *)((void *)(new XdmfTopology(*generatedTopology.get())));
211   }
212   catch (...)
213   {
214     shared_ptr<XdmfTopology> generatedTopology = XdmfTopology::New();
215     return (XDMFTOPOLOGY *)((void *)(new XdmfTopology(*generatedTopology.get())));
216   }
217 }
218 
XdmfTopologyGetNumberElements(XDMFTOPOLOGY * topology,int * status)219 unsigned int XdmfTopologyGetNumberElements(XDMFTOPOLOGY * topology, int * status)
220 {
221   XDMF_ERROR_WRAP_START(status)
222   return ((XdmfTopology *)topology)->getNumberElements();
223   XDMF_ERROR_WRAP_END(status)
224   return 0;
225 }
226 
XdmfTopologyGetType(XDMFTOPOLOGY * topology)227 int XdmfTopologyGetType(XDMFTOPOLOGY * topology)
228 {
229   shared_ptr<const XdmfTopologyType> type = ((XdmfTopology *)topology)->getType();
230   int returnType = -1;
231 
232   if (type->getID() == XdmfTopologyType::Polyvertex()->getID()) {
233     returnType = XDMF_TOPOLOGY_TYPE_POLYVERTEX;
234   }
235   else if (type->getID() == XdmfTopologyType::Polyline(0)->getID()) {
236     returnType = XDMF_TOPOLOGY_TYPE_POLYLINE;
237   }
238   else if (type->getID() == XdmfTopologyType::Polygon(0)->getID()) {
239     returnType = XDMF_TOPOLOGY_TYPE_POLYGON;
240   }
241   else if (type->getID() == XdmfTopologyType::Triangle()->getID()) {
242     returnType = XDMF_TOPOLOGY_TYPE_TRIANGLE;
243   }
244   else if (type->getID() == XdmfTopologyType::Quadrilateral()->getID()) {
245     returnType = XDMF_TOPOLOGY_TYPE_QUADRILATERAL;
246   }
247   else if (type->getID() == XdmfTopologyType::Tetrahedron()->getID()) {
248     returnType = XDMF_TOPOLOGY_TYPE_TETRAHEDRON;
249   }
250   else if (type->getID() == XdmfTopologyType::Pyramid()->getID()) {
251     returnType = XDMF_TOPOLOGY_TYPE_PYRAMID;
252   }
253   else if (type->getID() == XdmfTopologyType::Wedge()->getID()) {
254     returnType = XDMF_TOPOLOGY_TYPE_WEDGE;
255   }
256   else if (type->getID() == XdmfTopologyType::Hexahedron()->getID()) {
257     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON;
258   }
259   else if (type->getID() == XdmfTopologyType::Edge_3()->getID()) {
260     returnType = XDMF_TOPOLOGY_TYPE_EDGE_3;
261   }
262   else if (type->getID() == XdmfTopologyType::Triangle_6()->getID()) {
263     returnType = XDMF_TOPOLOGY_TYPE_TRIANGLE_6;
264   }
265   else if (type->getID() == XdmfTopologyType::Quadrilateral_8()->getID()) {
266     returnType = XDMF_TOPOLOGY_TYPE_QUADRILATERAL_8;
267   }
268   else if (type->getID() == XdmfTopologyType::Quadrilateral_9()->getID()) {
269     returnType = XDMF_TOPOLOGY_TYPE_QUADRILATERAL_9;
270   }
271   else if (type->getID() == XdmfTopologyType::Tetrahedron_10()->getID()) {
272     returnType = XDMF_TOPOLOGY_TYPE_TETRAHEDRON_10;
273   }
274   else if (type->getID() == XdmfTopologyType::Pyramid_13()->getID()) {
275     returnType = XDMF_TOPOLOGY_TYPE_PYRAMID_13;
276   }
277   else if (type->getID() == XdmfTopologyType::Wedge_15()->getID()) {
278     returnType = XDMF_TOPOLOGY_TYPE_WEDGE_15;
279   }
280   else if (type->getID() == XdmfTopologyType::Wedge_18()->getID()) {
281     returnType = XDMF_TOPOLOGY_TYPE_WEDGE_18;
282   }
283   else if (type->getID() == XdmfTopologyType::Hexahedron_20()->getID()) {
284     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_20;
285   }
286   else if (type->getID() == XdmfTopologyType::Hexahedron_24()->getID()) {
287     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_24;
288   }
289   else if (type->getID() == XdmfTopologyType::Hexahedron_27()->getID()) {
290     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_27;
291   }
292   else if (type->getID() == XdmfTopologyType::Hexahedron_64()->getID()) {
293     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_64;
294   }
295   else if (type->getID() == XdmfTopologyType::Hexahedron_125()->getID()) {
296     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_125;
297   }
298   else if (type->getID() == XdmfTopologyType::Hexahedron_216()->getID()) {
299     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_216;
300   }
301   else if (type->getID() == XdmfTopologyType::Hexahedron_343()->getID()) {
302     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_343;
303   }
304   else if (type->getID() == XdmfTopologyType::Hexahedron_512()->getID()) {
305     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_512;
306   }
307   else if (type->getID() == XdmfTopologyType::Hexahedron_729()->getID()) {
308     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_729;
309   }
310   else if (type->getID() == XdmfTopologyType::Hexahedron_1000()->getID()) {
311     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_1000;
312   }
313   else if (type->getID() == XdmfTopologyType::Hexahedron_1331()->getID()) {
314     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_1331;
315   }
316   else if (type->getID() == XdmfTopologyType::Hexahedron_Spectral_64()->getID()) {
317     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_64;
318   }
319   else if (type->getID() == XdmfTopologyType::Hexahedron_Spectral_125()->getID()) {
320     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_125;
321   }
322   else if (type->getID() == XdmfTopologyType::Hexahedron_Spectral_216()->getID()) {
323     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_216;
324   }
325   else if (type->getID() == XdmfTopologyType::Hexahedron_Spectral_343()->getID()) {
326     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_343;
327   }
328   else if (type->getID() == XdmfTopologyType::Hexahedron_Spectral_512()->getID()) {
329     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_512;
330   }
331   else if (type->getID() == XdmfTopologyType::Hexahedron_Spectral_729()->getID()) {
332     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_729;
333   }
334   else if (type->getID() == XdmfTopologyType::Hexahedron_Spectral_1000()->getID()) {
335     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_1000;
336   }
337   else if (type->getID() == XdmfTopologyType::Hexahedron_Spectral_1331()->getID()) {
338     returnType = XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_1331;
339   }
340   else if (type->getID() == XdmfTopologyType::Mixed()->getID()) {
341     returnType = XDMF_TOPOLOGY_TYPE_MIXED;
342   }
343   else {
344     returnType = -1;
345   }
346 
347   return returnType;
348 }
349 
XdmfTopologySetType(XDMFTOPOLOGY * topology,int type,int * status)350 void XdmfTopologySetType(XDMFTOPOLOGY * topology, int type, int * status)
351 {
352   XDMF_ERROR_WRAP_START(status)
353   shared_ptr<const XdmfTopologyType> newType = shared_ptr<const XdmfTopologyType>();
354 
355   switch (type) {
356     case XDMF_TOPOLOGY_TYPE_POLYVERTEX:
357       newType = XdmfTopologyType::Polyvertex();
358       break;
359     case XDMF_TOPOLOGY_TYPE_POLYLINE:
360       newType = XdmfTopologyType::Polyline(0);
361       break;
362     case XDMF_TOPOLOGY_TYPE_POLYGON:
363       newType = XdmfTopologyType::Polygon(0);
364       break;
365     case XDMF_TOPOLOGY_TYPE_TRIANGLE:
366       newType = XdmfTopologyType::Triangle();
367       break;
368     case XDMF_TOPOLOGY_TYPE_QUADRILATERAL:
369       newType = XdmfTopologyType::Quadrilateral();
370       break;
371     case XDMF_TOPOLOGY_TYPE_TETRAHEDRON:
372       newType = XdmfTopologyType::Tetrahedron();
373       break;
374     case XDMF_TOPOLOGY_TYPE_PYRAMID:
375       newType = XdmfTopologyType::Pyramid();
376       break;
377     case XDMF_TOPOLOGY_TYPE_WEDGE:
378       newType = XdmfTopologyType::Wedge();
379       break;
380     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON:
381       newType = XdmfTopologyType::Hexahedron();
382       break;
383     case XDMF_TOPOLOGY_TYPE_EDGE_3:
384       newType = XdmfTopologyType::Edge_3();
385       break;
386     case XDMF_TOPOLOGY_TYPE_TRIANGLE_6:
387       newType = XdmfTopologyType::Triangle_6();
388       break;
389     case XDMF_TOPOLOGY_TYPE_QUADRILATERAL_8:
390       newType = XdmfTopologyType::Quadrilateral_8();
391       break;
392     case XDMF_TOPOLOGY_TYPE_QUADRILATERAL_9:
393       newType = XdmfTopologyType::Quadrilateral_9();
394       break;
395     case XDMF_TOPOLOGY_TYPE_TETRAHEDRON_10:
396       newType = XdmfTopologyType::Tetrahedron_10();
397       break;
398     case XDMF_TOPOLOGY_TYPE_PYRAMID_13:
399       newType = XdmfTopologyType::Pyramid_13();
400       break;
401     case XDMF_TOPOLOGY_TYPE_WEDGE_15:
402       newType = XdmfTopologyType::Wedge_15();
403       break;
404     case XDMF_TOPOLOGY_TYPE_WEDGE_18:
405       newType = XdmfTopologyType::Wedge_18();
406       break;
407     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_20:
408       newType = XdmfTopologyType::Hexahedron_20();
409       break;
410     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_24:
411       newType = XdmfTopologyType::Hexahedron_24();
412       break;
413     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_27:
414       newType = XdmfTopologyType::Hexahedron_27();
415       break;
416     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_64:
417       newType = XdmfTopologyType::Hexahedron_64();
418       break;
419     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_125:
420       newType = XdmfTopologyType::Hexahedron_125();
421       break;
422     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_216:
423       newType = XdmfTopologyType::Hexahedron_216();
424       break;
425     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_343:
426       newType = XdmfTopologyType::Hexahedron_343();
427       break;
428     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_512:
429       newType = XdmfTopologyType::Hexahedron_512();
430       break;
431     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_729:
432       newType = XdmfTopologyType::Hexahedron_729();
433       break;
434     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_1000:
435       newType = XdmfTopologyType::Hexahedron_1000();
436       break;
437     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_1331:
438       newType = XdmfTopologyType::Hexahedron_1331();
439       break;
440     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_64:
441       newType = XdmfTopologyType::Hexahedron_Spectral_64();
442       break;
443     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_125:
444       newType = XdmfTopologyType::Hexahedron_Spectral_125();
445       break;
446     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_216:
447       newType = XdmfTopologyType::Hexahedron_Spectral_216();
448       break;
449     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_343:
450       newType = XdmfTopologyType::Hexahedron_Spectral_343();
451       break;
452     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_512:
453       newType = XdmfTopologyType::Hexahedron_Spectral_512();
454       break;
455     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_729:
456       newType = XdmfTopologyType::Hexahedron_Spectral_729();
457       break;
458     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_1000:
459       newType = XdmfTopologyType::Hexahedron_Spectral_1000();
460       break;
461     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_1331:
462       newType = XdmfTopologyType::Hexahedron_Spectral_1331();
463       break;
464     case XDMF_TOPOLOGY_TYPE_MIXED:
465       newType = XdmfTopologyType::Mixed();
466       break;
467     default:
468       {
469         std::stringstream sstr;
470         sstr << "Error: Invalid Topology Type: Code " << type;
471         XdmfError::message(XdmfError::FATAL, sstr.str());
472       }
473       break;
474   }
475 
476   ((XdmfTopology *)topology)->setType(newType);
477   XDMF_ERROR_WRAP_END(status)
478 }
479 
XdmfTopologySetPolyType(XDMFTOPOLOGY * topology,int type,int nodes,int * status)480 void XdmfTopologySetPolyType(XDMFTOPOLOGY * topology, int type, int nodes, int * status)
481 {
482   XDMF_ERROR_WRAP_START(status)
483   shared_ptr<const XdmfTopologyType> newType = shared_ptr<const XdmfTopologyType>();
484 
485   switch (type) {
486     case XDMF_TOPOLOGY_TYPE_POLYVERTEX:
487       newType = XdmfTopologyType::Polyvertex();
488       break;
489     case XDMF_TOPOLOGY_TYPE_POLYLINE:
490       newType = XdmfTopologyType::Polyline(nodes);
491       break;
492     case XDMF_TOPOLOGY_TYPE_POLYGON:
493       newType = XdmfTopologyType::Polygon(nodes);
494       break;
495     case XDMF_TOPOLOGY_TYPE_TRIANGLE:
496       newType = XdmfTopologyType::Triangle();
497       break;
498     case XDMF_TOPOLOGY_TYPE_QUADRILATERAL:
499       newType = XdmfTopologyType::Quadrilateral();
500       break;
501     case XDMF_TOPOLOGY_TYPE_TETRAHEDRON:
502       newType = XdmfTopologyType::Tetrahedron();
503       break;
504     case XDMF_TOPOLOGY_TYPE_PYRAMID:
505       newType = XdmfTopologyType::Pyramid();
506       break;
507     case XDMF_TOPOLOGY_TYPE_WEDGE:
508       newType = XdmfTopologyType::Wedge();
509       break;
510     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON:
511       newType = XdmfTopologyType::Hexahedron();
512       break;
513     case XDMF_TOPOLOGY_TYPE_EDGE_3:
514       newType = XdmfTopologyType::Edge_3();
515       break;
516     case XDMF_TOPOLOGY_TYPE_TRIANGLE_6:
517       newType = XdmfTopologyType::Triangle_6();
518       break;
519     case XDMF_TOPOLOGY_TYPE_QUADRILATERAL_8:
520       newType = XdmfTopologyType::Quadrilateral_8();
521       break;
522     case XDMF_TOPOLOGY_TYPE_QUADRILATERAL_9:
523       newType = XdmfTopologyType::Quadrilateral_9();
524       break;
525     case XDMF_TOPOLOGY_TYPE_TETRAHEDRON_10:
526       newType = XdmfTopologyType::Tetrahedron_10();
527       break;
528     case XDMF_TOPOLOGY_TYPE_PYRAMID_13:
529       newType = XdmfTopologyType::Pyramid_13();
530       break;
531     case XDMF_TOPOLOGY_TYPE_WEDGE_15:
532       newType = XdmfTopologyType::Wedge_15();
533       break;
534     case XDMF_TOPOLOGY_TYPE_WEDGE_18:
535       newType = XdmfTopologyType::Wedge_18();
536       break;
537     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_20:
538       newType = XdmfTopologyType::Hexahedron_20();
539       break;
540     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_24:
541       newType = XdmfTopologyType::Hexahedron_24();
542       break;
543     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_27:
544       newType = XdmfTopologyType::Hexahedron_27();
545       break;
546     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_64:
547       newType = XdmfTopologyType::Hexahedron_64();
548       break;
549     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_125:
550       newType = XdmfTopologyType::Hexahedron_125();
551       break;
552     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_216:
553       newType = XdmfTopologyType::Hexahedron_216();
554       break;
555     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_343:
556       newType = XdmfTopologyType::Hexahedron_343();
557       break;
558     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_512:
559       newType = XdmfTopologyType::Hexahedron_512();
560       break;
561     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_729:
562       newType = XdmfTopologyType::Hexahedron_729();
563       break;
564     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_1000:
565       newType = XdmfTopologyType::Hexahedron_1000();
566       break;
567     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_1331:
568       newType = XdmfTopologyType::Hexahedron_1331();
569       break;
570     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_64:
571       newType = XdmfTopologyType::Hexahedron_Spectral_64();
572       break;
573     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_125:
574       newType = XdmfTopologyType::Hexahedron_Spectral_125();
575       break;
576     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_216:
577       newType = XdmfTopologyType::Hexahedron_Spectral_216();
578       break;
579     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_343:
580       newType = XdmfTopologyType::Hexahedron_Spectral_343();
581       break;
582     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_512:
583       newType = XdmfTopologyType::Hexahedron_Spectral_512();
584       break;
585     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_729:
586       newType = XdmfTopologyType::Hexahedron_Spectral_729();
587       break;
588     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_1000:
589       newType = XdmfTopologyType::Hexahedron_Spectral_1000();
590       break;
591     case XDMF_TOPOLOGY_TYPE_HEXAHEDRON_SPECTRAL_1331:
592       newType = XdmfTopologyType::Hexahedron_Spectral_1331();
593       break;
594     case XDMF_TOPOLOGY_TYPE_MIXED:
595       newType = XdmfTopologyType::Mixed();
596       break;
597     default:
598       {
599         std::stringstream sstr;
600         sstr << "Error: Invalid Topology Type: Code " << type;
601         XdmfError::message(XdmfError::FATAL, sstr.str());
602       }
603       break;
604   }
605   ((XdmfTopology *)topology)->setType(newType);
606   XDMF_ERROR_WRAP_END(status)
607 }
608 
609 XDMF_ITEM_C_CHILD_WRAPPER(XdmfTopology, XDMFTOPOLOGY)
610 XDMF_ARRAY_C_CHILD_WRAPPER(XdmfTopology, XDMFTOPOLOGY)
611