1 #include "XdmfRegion.h"
2 
3 #include "XdmfDataItem.h"
4 #include "XdmfDataDesc.h"
5 #include "XdmfArray.h"
6 #include "XdmfDOM.h"
7 
8 namespace xdmf2
9 {
10 
XdmfRegion()11 XdmfRegion::XdmfRegion() {
12   this->SetElementName("Region");
13   this->ValuesAreMine = 1;
14   this->RegionType = XDMF_REGION_TYPE_UNSET;
15   this->Values = NULL;
16   this->ShapeDesc = new XdmfDataDesc();
17   this->Active = 0;
18   }
19 
~XdmfRegion()20 XdmfRegion::~XdmfRegion() {
21   if( this->ValuesAreMine && this->Values )  delete this->Values;
22   delete this->ShapeDesc;
23   }
24 
25 XdmfInt32
Release()26 XdmfRegion::Release(){
27   if( this->ValuesAreMine && this->Values )  delete this->Values;
28   this->Values = NULL;
29   return(XDMF_SUCCESS);
30 }
31 
32 XdmfInt32
Insert(XdmfElement * Child)33 XdmfRegion::Insert( XdmfElement *Child){
34     if(Child && (
35         XDMF_WORD_CMP(Child->GetElementName(), "Attribute") ||
36         XDMF_WORD_CMP(Child->GetElementName(), "DataItem") ||
37         XDMF_WORD_CMP(Child->GetElementName(), "Information")
38         )){
39         return(XdmfElement::Insert(Child));
40     }else{
41         XdmfErrorMessage("Region can only Insert Attribute, DataItem or Information elements");
42     }
43     return(XDMF_FAIL);
44 }
45 
46 XdmfInt32
Build()47 XdmfRegion::Build(){
48     if(XdmfElement::Build() != XDMF_SUCCESS) return(XDMF_FAIL);
49     this->Set("RegionType", this->GetRegionTypeAsString());
50     if(this->Values){
51         XdmfDataItem    *di = NULL;
52         XdmfXmlNode     node;
53         //! Is there already a DataItem
54         node = this->DOM->FindDataElement(0, this->GetElement());
55         if(node) {
56             di = (XdmfDataItem *)this->GetCurrentXdmfElement(node);
57         }
58         if(!di){
59             di = new XdmfDataItem;
60             node = this->DOM->InsertNew(this->GetElement(), "DataItem");
61             di->SetDOM(this->DOM);
62             di->SetElement(node);
63         }
64         di->SetArray(this->Values);
65         if(this->Values->GetNumberOfElements() > 100) di->SetFormat(XDMF_FORMAT_HDF);
66         di->Build();
67 
68     }
69     return(XDMF_SUCCESS);
70 }
71 
72 XdmfConstString
GetRegionTypeAsString(void)73 XdmfRegion::GetRegionTypeAsString( void ){
74   switch ( this->RegionType ){
75     case XDMF_REGION_TYPE_CELL :
76       return( "Cell" );
77     case XDMF_REGION_TYPE_FACE :
78       return( "Face" );
79     case XDMF_REGION_TYPE_EDGE :
80       return( "Edge" );
81     case XDMF_REGION_TYPE_NODE :
82       return( "Node" );
83     case XDMF_REGION_TYPE_UNSET :
84       return( "Unset" );
85     default :
86       break;
87     }
88     XdmfErrorMessage("Unknown RegionType = " << this->RegionType);
89     return(0);
90 }
91 
92 
93 XdmfInt32
SetRegionTypeFromString(XdmfConstString regionType)94 XdmfRegion::SetRegionTypeFromString( XdmfConstString regionType ){
95 if( XDMF_WORD_CMP( regionType, "Cell" ) ) {
96   this->RegionType = XDMF_REGION_TYPE_CELL;
97 } else if( XDMF_WORD_CMP( regionType, "Face" ) ) {
98   this->RegionType = XDMF_REGION_TYPE_FACE;
99 } else if( XDMF_WORD_CMP( regionType, "Edge" ) ) {
100   this->RegionType = XDMF_REGION_TYPE_EDGE;
101 } else if( XDMF_WORD_CMP( regionType, "Node" ) ) {
102   this->RegionType = XDMF_REGION_TYPE_NODE;
103 } else {
104   XdmfErrorMessage("Unknown Region Type " << regionType );
105   return( XDMF_FAIL );
106   }
107 return( XDMF_SUCCESS );
108 }
109 
110 XdmfInt32
SetValues(XdmfArray * someValues)111 XdmfRegion::SetValues(XdmfArray *someValues){
112     if(someValues == this->Values) return(XDMF_SUCCESS);
113     if(this->ValuesAreMine && this->Values) delete this->Values;
114     this->ValuesAreMine = 0;
115     this->Values = someValues;
116     return(XDMF_SUCCESS);
117 }
118 
119 XdmfArray *
GetValues(XdmfInt32 Create)120 XdmfRegion::GetValues(XdmfInt32 Create){
121     if(!this->Values && Create){
122         this->Values = new XdmfArray;
123         this->ValuesAreMine = 1;
124     }
125     return(this->Values);
126 }
127 
128 XdmfInt32
UpdateInformation()129 XdmfRegion::UpdateInformation() {
130 
131 XdmfConstString  Region;
132 
133 if(XdmfElement::UpdateInformation() != XDMF_SUCCESS) return(XDMF_FAIL);
134 if( XDMF_WORD_CMP(this->GetElementType(), "Region") == 0){
135     XdmfErrorMessage("Element type" << this->GetElementType() << " is not of type 'Region'");
136     return(XDMF_FAIL);
137 }
138 
139 Region = this->Get( "Active" );
140 this->Active = 0;
141 if ( Region ){
142   if( XDMF_WORD_CMP( Region, "1" ) ) {
143     this->Active = 1;
144   }
145 }
146 
147 Region = this->Get( "RegionType" );
148 if( Region ){
149   this->SetRegionTypeFromString( Region );
150 } else {
151   this->RegionType = XDMF_REGION_TYPE_NODE;
152 }
153 
154 Region= this->Get( "Dimensions" );
155 if( Region ){
156   this->ShapeDesc->SetShapeFromString( Region );
157 }else{
158     XdmfXmlNode  ValuesNode;
159     ValuesNode = this->DOM->FindDataElement( 0, Element );
160     if(!ValuesNode){
161         XdmfErrorMessage("Dimensions of Region not set in XML and no DataItem found");
162     }
163     Region = this->DOM->Get( ValuesNode, "Dimensions" );
164     if(!Region){
165         XdmfErrorMessage("Dimensions of Region not set in XML or DataItem");
166         return(XDMF_FAIL);
167     }else{
168         this->ShapeDesc->SetShapeFromString( Region );
169     }
170 }
171 if(!this->Name) this->SetName(GetUnique("Region_"));
172 return( XDMF_SUCCESS );
173 }
174 
175 XdmfInt32
Update()176 XdmfRegion::Update() {
177 
178 XdmfInt32  Status;
179 XdmfXmlNode  ValuesNode;
180 XdmfDataItem ValueReader;
181 
182 // check this out
183 if(XdmfElement::Update() != XDMF_SUCCESS) return(XDMF_FAIL);
184 
185 if( this->RegionType == XDMF_REGION_TYPE_UNSET ){
186   Status = this->UpdateInformation();
187   if( Status == XDMF_FAIL ) {
188     XdmfErrorMessage("Can't Initialize");
189     return( XDMF_FAIL );
190     }
191   }
192 
193 ValuesNode = this->DOM->FindDataElement( 0, Element );
194 if( ValuesNode ){
195   ValueReader.SetDOM( this->DOM );
196   ValueReader.SetDsmBuffer(this->DsmBuffer);
197   if( this->ValuesAreMine && this->Values ){
198     delete this->Values;
199     this->Values = NULL;
200   } else {
201   }
202   if(ValueReader.SetElement(ValuesNode) == XDMF_FAIL) return(XDMF_FAIL);
203   if(ValueReader.UpdateInformation() == XDMF_FAIL) return(XDMF_FAIL);
204   if(ValueReader.Update() == XDMF_FAIL) return(XDMF_FAIL);
205   // Steal the array
206   this->Values = ValueReader.GetArray();
207   ValueReader.SetArrayIsMine(0);
208   this->ValuesAreMine = 1;
209   if( !this->Values ) {
210     XdmfErrorMessage("Error Retrieving Data Values");
211     return( XDMF_FAIL );
212     }
213 } else {
214   XdmfErrorMessage("Element has no Data");
215   return( XDMF_FAIL );
216   }
217 return( XDMF_SUCCESS );
218 }
219 
220 }
221