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