Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
CrayzeeWulf
Xdmf
Commits
317d6f81
Commit
317d6f81
authored
Jul 03, 2013
by
Andrew J. Burns (Cont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
cosmetic changes to comments
parent
3249266f
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
1438 additions
and
1684 deletions
+1438
-1684
core/XdmfCoreReader.cpp
core/XdmfCoreReader.cpp
+44
-44
core/XdmfDSMBuffer.cpp
core/XdmfDSMBuffer.cpp
+496
-652
core/XdmfDSMCommMPI.cpp
core/XdmfDSMCommMPI.cpp
+198
-259
core/XdmfDSMManager.cpp
core/XdmfDSMManager.cpp
+47
-53
core/XdmfHDF5ControllerDSM.cpp
core/XdmfHDF5ControllerDSM.cpp
+185
-220
core/XdmfHDF5Writer.cpp
core/XdmfHDF5Writer.cpp
+253
-209
core/XdmfHDF5WriterDSM.cpp
core/XdmfHDF5WriterDSM.cpp
+207
-240
core/XdmfWriter.cpp
core/XdmfWriter.cpp
+8
-7
No files found.
core/XdmfCoreReader.cpp
View file @
317d6f81
...
...
@@ -182,17 +182,17 @@ public:
}
else
if
(
xmlStrcmp
(
currNode
->
name
,
(
xmlChar
*
)
"Function"
)
==
0
)
{
//
f
unction handling goes here
//
F
unction handling goes here
xmlNodePtr
childNode
=
currNode
->
children
;
std
::
string
arraySubType
=
""
;
// get Array Subtype, if any
//
G
get Array Subtype, if any
xmlAttrPtr
currAttribute
=
currNode
->
properties
;
while
(
currAttribute
!=
NULL
)
{
if
(
xmlStrcmp
(
currAttribute
->
name
,
(
xmlChar
*
)
"Type"
)
==
0
)
{
arraySubType
=
(
char
*
)
currAttribute
->
children
->
content
;
break
;
//
u
ses the first type found
//
U
ses the first type found
}
}
...
...
@@ -200,7 +200,7 @@ public:
while
(
childNode
!=
NULL
)
{
if
(
xmlStrcmp
(
childNode
->
name
,
(
xmlChar
*
)
"Expression"
)
==
0
){
//
s
tore expression
//
S
tore expression
xmlAttrPtr
childAttribute
=
childNode
->
properties
;
while
(
childAttribute
!=
NULL
)
{
if
(
xmlStrcmp
(
childAttribute
->
name
,
(
xmlChar
*
)
"Value"
)
==
0
)
{
...
...
@@ -224,13 +224,13 @@ public:
}
}
//
t
wo seperate loops to allow for different orders and multiple variable sets
//
T
wo seperate loops to allow for different orders and multiple variable sets
childNode
=
currNode
->
children
;
std
::
map
<
std
::
string
,
shared_ptr
<
XdmfArray
>
>
variableCollection
;
while
(
childNode
!=
NULL
)
{
if
(
xmlStrcmp
(
childNode
->
name
,
(
xmlChar
*
)
"Variable"
)
==
0
)
{
//
s
tore child variables
//
S
tore child variables
xmlNodePtr
childVariable
=
childNode
->
children
;
while
(
childVariable
!=
NULL
)
{
...
...
@@ -246,31 +246,31 @@ public:
std
::
map
<
std
::
string
,
std
::
string
>
typeMap
;
while
(
childAttribute
!=
NULL
)
{
//
t
he variable type of the array
//
T
he variable type of the array
if
(
xmlStrcmp
(
childAttribute
->
name
,
(
xmlChar
*
)
"DataType"
)
==
0
)
{
typeMap
[
"DataType"
]
=
(
char
*
)
childAttribute
->
children
->
content
;
}
//
t
he precision of the variable type (only used for long and double)
//
T
he precision of the variable type (only used for long and double)
else
if
(
xmlStrcmp
(
childAttribute
->
name
,
(
xmlChar
*
)
"Precision"
)
==
0
)
{
typeMap
[
"Precision"
]
=
(
char
*
)
childAttribute
->
children
->
content
;
}
//
t
he key or mapped string for the variable
//
T
he key or mapped string for the variable
else
if
(
xmlStrcmp
(
childAttribute
->
name
,
(
xmlChar
*
)
"Key"
)
==
0
)
{
childKey
=
(
char
*
)
childAttribute
->
children
->
content
;
}
//
t
ext based xml data
//
T
ext based xml data
else
if
(
xmlStrcmp
(
childAttribute
->
name
,
(
xmlChar
*
)
"Value"
)
==
0
)
{
dataString
=
(
char
*
)
childAttribute
->
children
->
content
;
}
//
a
n x pointer to another XdmfArray
//
A
n x pointer to another XdmfArray
else
if
(
xmlStrcmp
(
childAttribute
->
name
,
(
xmlChar
*
)
"XPointer"
)
==
0
)
{
childXPointer
=
childAttribute
->
children
->
content
;
}
//
u
sed in conjunction with Xpointers to reference objects in a different file
//
U
sed in conjunction with Xpointers to reference objects in a different file
else
if
(
xmlStrcmp
(
childAttribute
->
name
,
(
xmlChar
*
)
"href"
)
==
0
)
{
childhref
=
childAttribute
->
children
->
content
;
}
//
p
ath to hdf5 data sets and the dimensions of those sets
//
P
ath to hdf5 data sets and the dimensions of those sets
else
if
(
xmlStrcmp
(
childAttribute
->
name
,
(
xmlChar
*
)
"hdf5"
)
==
0
)
{
childhdf5
=
(
char
*
)
childAttribute
->
children
->
content
;
}
...
...
@@ -315,7 +315,7 @@ public:
dataType
=
XdmfArrayType
::
Uninitialized
();
}
//
i
f xpointer grab item at that location
//
I
f xpointer grab item at that location
if
(
childXPointer
)
{
xmlXPathContextPtr
context
=
mXPathContext
;
...
...
@@ -338,18 +338,18 @@ public:
xmlXPathObjectPtr
result
=
xmlXPtrEval
(
childXPointer
,
context
);
if
(
result
&&
!
xmlXPathNodeSetIsEmpty
(
result
->
nodesetval
))
{
for
(
int
i
=
0
;
i
<
result
->
nodesetval
->
nodeNr
;
++
i
)
{
//
t
here should only be one item being returned here
//
p
lace into a new vector
//
T
here should only be one item being returned here
//
P
lace into a new vector
std
::
vector
<
shared_ptr
<
XdmfItem
>
>
pointedItems
;
this
->
readSingleNode
(
result
->
nodesetval
->
nodeTab
[
i
],
pointedItems
);
try
{
//
t
ry to cast it as an array
//
T
ry to cast it as an array
childArray
=
shared_dynamic_cast
<
XdmfArray
>
(
pointedItems
[
0
]);
}
catch
(...)
{
//
i
f that doesn't work throw an error
//
I
f that doesn't work throw an error
try
{
//
b
ecause we should only be working with arrays
//
B
ecause we should only be working with arrays
XdmfError
::
message
(
XdmfError
::
FATAL
,
"Error: Variable not Equivalent to an Array"
);
}
...
...
@@ -366,11 +366,11 @@ public:
xmlXPathFreeContext
(
context
);
}
}
//
i
f hdf5 create controllers and attach it
//
I
f hdf5 create controllers and attach it
else
if
(
childhdf5
.
compare
(
""
)
!=
0
)
{
//
p
arse the hdf5 controllers
//
P
arse the hdf5 controllers
std
::
vector
<
std
::
string
>
controllerParts
;
//
s
plit the content based on "|" characters
//
S
plit the content based on "|" characters
size_t
barSplit
=
0
;
std
::
string
splitString
(
childhdf5
);
std
::
string
subcontent
;
...
...
@@ -389,7 +389,7 @@ public:
controllerParts
.
push_back
(
subcontent
);
}
//
i
nsert those controllers into the childArray
//
I
nsert those controllers into the childArray
int
hdf5step
=
2
;
for
(
unsigned
int
i
=
0
;
i
<
controllerParts
.
size
();
i
=
i
+
hdf5step
)
{
size_t
colonLocation
=
controllerParts
[
i
].
find
(
":"
);
...
...
@@ -410,18 +410,18 @@ public:
std
::
vector
<
unsigned
int
>
contentDims
;
if
(
i
+
1
<
controllerParts
.
size
()){
//
t
his is the string that contains the dimensions
//
T
his is the string that contains the dimensions
boost
::
tokenizer
<>
dimtokens
(
controllerParts
[
i
+
1
]);
for
(
boost
::
tokenizer
<>::
const_iterator
iter
=
dimtokens
.
begin
();
iter
!=
dimtokens
.
end
();
++
iter
)
{
contentDims
.
push_back
(
atoi
((
*
iter
).
c_str
()));
}
hdf5step
=
2
;
//
i
f this works then the dimension content should be skipped over
hdf5step
=
2
;
//
I
f this works then the dimension content should be skipped over
}
else
{
//
i
f it fails then it means that the next content is not a dimension string
//
i
n this case an error should be thrown, formatting error
//
I
f it fails then it means that the next content is not a dimension string
//
I
n this case an error should be thrown, formatting error
// because there is no base array to pull dimensions from
try
{
XdmfError
::
message
(
XdmfError
::
FATAL
,
...
...
@@ -441,9 +441,9 @@ public:
contentDims
));
}
}
//
i
f xml parse strait to insert
//
I
f xml parse strait to insert
else
if
(
dataString
.
compare
(
""
)
!=
0
)
{
//
p
arse the data into tokens
//
P
arse the data into tokens
childArray
->
initialize
(
dataType
,
0
);
unsigned
int
index
=
0
;
boost
::
char_separator
<
char
>
sep
(
"
\t\n
"
);
...
...
@@ -453,7 +453,7 @@ public:
iter
=
tokens
.
begin
();
iter
!=
tokens
.
end
();
++
iter
,
++
index
)
{
//
i
nsert those tokens into the childArray
//
I
nsert those tokens into the childArray
childArray
->
insert
(
index
,
*
iter
);
}
}
...
...
@@ -462,13 +462,13 @@ public:
iter
=
tokens
.
begin
();
iter
!=
tokens
.
end
();
++
iter
,
++
index
)
{
//
i
nsert those tokens into the childArray
//
I
nsert those tokens into the childArray
childArray
->
insert
(
index
,
atof
((
*
iter
).
c_str
()));
}
}
}
//
p
arse the value into the array
//
P
arse the value into the array
if
(
childKey
.
compare
(
""
)
!=
0
){
if
(
variableCollection
.
find
(
childKey
)
!=
variableCollection
.
end
())
{
try
{
...
...
@@ -504,25 +504,25 @@ public:
catch
(
XdmfError
e
)
{
throw
e
;
}
//
t
he properties and children aren't really needed to generate the object, but the factory still requires them.
//
T
he properties and children aren't really needed to generate the object, but the factory still requires them.
std
::
map
<
std
::
string
,
std
::
string
>
newArrayProperties
;
std
::
vector
<
shared_ptr
<
XdmfItem
>
>
newArrayChildren
;
shared_ptr
<
XdmfArray
>
returnArray
=
XdmfArray
::
New
();
if
(
arraySubType
.
compare
(
""
)
==
0
)
{
//
i
f no type is specified an array is generated
//
I
f no type is specified an array is generated
arraySubType
=
"DataItem"
;
}
//
t
his should generate an item that corresponds to the tag provided, the casting ensures that it is a subtype of array
//
u
sing a factory to be able to build things outside of core
//
T
his should generate an item that corresponds to the tag provided, the casting ensures that it is a subtype of array
//
U
sing a factory to be able to build things outside of core
returnArray
=
shared_dynamic_cast
<
XdmfArray
>
(
mItemFactory
->
createItem
(
arraySubType
,
newArrayProperties
,
newArrayChildren
));
if
(
!
returnArray
)
{
//
i
f the specified tag fails to generate an item then reclass as an array
//
I
f the specified tag fails to generate an item then reclass as an array
arraySubType
=
"DataItem"
;
returnArray
=
shared_dynamic_cast
<
XdmfArray
>
(
mItemFactory
->
createItem
(
arraySubType
,
...
...
@@ -557,15 +557,15 @@ public:
readSingleNode
(
const
xmlNodePtr
currNode
,
std
::
vector
<
shared_ptr
<
XdmfItem
>
>
&
myItems
)
{
//
c
heck to see if the node is already in the Xpath
//
C
heck to see if the node is already in the Xpath
std
::
map
<
xmlNodePtr
,
shared_ptr
<
XdmfItem
>
>::
const_iterator
iter
=
mXPathMap
.
find
(
currNode
);
//
i
f it is grab it from the previously stored items
//
I
f it is grab it from the previously stored items
if
(
iter
!=
mXPathMap
.
end
())
{
myItems
.
push_back
(
iter
->
second
);
}
else
{
//
o
therwise, generate it from the node
//
O
therwise, generate it from the node
std
::
map
<
std
::
string
,
std
::
string
>
itemProperties
;
xmlNodePtr
childNode
=
currNode
->
children
;
...
...
@@ -575,13 +575,13 @@ public:
if
(
childNode
->
type
==
XML_TEXT_NODE
&&
childNode
->
content
)
{
const
char
*
content
=
(
char
*
)
childNode
->
content
;
//
d
etermine if content is whitespace
//
D
etermine if content is whitespace
bool
whitespace
=
true
;
const
char
*
contentPtr
=
content
;
//
s
tep through to end of pointer
//
S
tep through to end of pointer
while
(
contentPtr
!=
NULL
)
{
//
i
f not a whitespace character, break
//
I
f not a whitespace character, break
if
(
!
isspace
(
*
contentPtr
++
))
{
whitespace
=
false
;
break
;
...
...
@@ -593,7 +593,7 @@ public:
itemProperties
.
insert
(
std
::
make_pair
(
"XMLDir"
,
mXMLDir
));
}
//
s
plit the content based on "|" characters
//
S
plit the content based on "|" characters
size_t
barSplit
=
0
;
std
::
string
splitString
(
content
);
std
::
string
subcontent
;
...
...
core/XdmfDSMBuffer.cpp
View file @
317d6f81
...
...
@@ -61,46 +61,45 @@
XdmfDSMBuffer
::
XdmfDSMBuffer
()
{
this
->
CommChannel
=
XDMF_DSM_INTER_COMM
;
this
->
IsServer
=
true
;
this
->
StartAddress
=
this
->
EndAddress
=
0
;
this
->
StartServerId
=
this
->
EndServerId
=
-
1
;
this
->
Length
=
0
;
this
->
TotalLength
=
0
;
this
->
BlockLength
=
0
;
this
->
Comm
=
NULL
;
this
->
DataPointer
=
NULL
;
this
->
IsConnected
=
false
;
this
->
CommChannel
=
XDMF_DSM_INTER_COMM
;
this
->
IsServer
=
true
;
this
->
StartAddress
=
this
->
EndAddress
=
0
;
this
->
StartServerId
=
this
->
EndServerId
=
-
1
;
this
->
Length
=
0
;
this
->
TotalLength
=
0
;
this
->
BlockLength
=
0
;
this
->
Comm
=
NULL
;
this
->
DataPointer
=
NULL
;
this
->
IsConnected
=
false
;
}
XdmfDSMBuffer
::~
XdmfDSMBuffer
()
{
if
(
this
->
DataPointer
)
{
free
(
this
->
DataPointer
);
}
this
->
DataPointer
=
NULL
;
if
(
this
->
DataPointer
)
{
free
(
this
->
DataPointer
);
}
this
->
DataPointer
=
NULL
;
}
class
XdmfDSMBuffer
::
CommandMsg
{
public:
int
Opcode
;
int
Source
;
int
Target
;
int
Address
;
int
Length
;
public:
int
Opcode
;
int
Source
;
int
Target
;
int
Address
;
int
Length
;
};
class
XdmfDSMBuffer
::
InfoMsg
{
public:
int
type
;
unsigned
int
length
;
unsigned
int
total_length
;
unsigned
int
block_length
;
int
start_server_id
;
int
end_server_id
;
public:
int
type
;
unsigned
int
length
;
unsigned
int
total_length
;
unsigned
int
block_length
;
int
start_server_id
;
int
end_server_id
;
};
void
...
...
@@ -108,509 +107,439 @@ XdmfDSMBuffer::ConfigureUniform(XdmfDSMCommMPI *aComm, long aLength,
int
startId
,
int
endId
,
long
aBlockLength
,
bool
random
)
{
if
(
startId
<
0
)
{
startId
=
0
;
}
if
(
endId
<
0
)
{
endId
=
aComm
->
GetIntraSize
()
-
1
;
}
this
->
SetDsmType
(
XDMF_DSM_TYPE_UNIFORM_RANGE
);
if
((
startId
==
0
)
&&
(
endId
==
aComm
->
GetIntraSize
()
-
1
))
{
this
->
SetDsmType
(
XDMF_DSM_TYPE_UNIFORM
);
}
if
(
aBlockLength
)
{
if
(
!
random
)
{
this
->
SetDsmType
(
XDMF_DSM_TYPE_BLOCK_CYCLIC
);
}
else
{
this
->
SetDsmType
(
XDMF_DSM_TYPE_BLOCK_RANDOM
);
}
this
->
SetBlockLength
(
aBlockLength
);
}
this
->
StartServerId
=
startId
;
this
->
EndServerId
=
endId
;
this
->
SetComm
(
aComm
);
if
((
aComm
->
GetId
()
>=
startId
)
&&
(
aComm
->
GetId
()
<=
endId
)
&&
this
->
IsServer
)
{
try
{
if
(
aBlockLength
)
{
// For optimization we make the DSM length fit to a multiple of block size
this
->
SetLength
(((
long
)(
aLength
/
aBlockLength
))
*
aBlockLength
);
}
else
{
this
->
SetLength
(
aLength
);
}
}
catch
(
XdmfError
e
)
{
throw
e
;
}
this
->
StartAddress
=
(
aComm
->
GetId
()
-
startId
)
*
aLength
;
this
->
EndAddress
=
this
->
StartAddress
+
aLength
-
1
;
}
else
{
if
(
aBlockLength
)
{
this
->
Length
=
((
long
)(
aLength
/
aBlockLength
))
*
aBlockLength
;
}
else
{
this
->
Length
=
aLength
;
}
}
this
->
TotalLength
=
this
->
GetLength
()
*
(
endId
-
startId
+
1
);
if
(
startId
<
0
)
{
startId
=
0
;
}
if
(
endId
<
0
)
{
endId
=
aComm
->
GetIntraSize
()
-
1
;
}
this
->
SetDsmType
(
XDMF_DSM_TYPE_UNIFORM_RANGE
);
if
((
startId
==
0
)
&&
(
endId
==
aComm
->
GetIntraSize
()
-
1
))
{
this
->
SetDsmType
(
XDMF_DSM_TYPE_UNIFORM
);
}
if
(
aBlockLength
)
{
if
(
!
random
)
{
this
->
SetDsmType
(
XDMF_DSM_TYPE_BLOCK_CYCLIC
);
}
else
{
this
->
SetDsmType
(
XDMF_DSM_TYPE_BLOCK_RANDOM
);
}
this
->
SetBlockLength
(
aBlockLength
);
}
this
->
StartServerId
=
startId
;
this
->
EndServerId
=
endId
;
this
->
SetComm
(
aComm
);
if
((
aComm
->
GetId
()
>=
startId
)
&&
(
aComm
->
GetId
()
<=
endId
)
&&
this
->
IsServer
)
{
try
{
if
(
aBlockLength
)
{
// For optimization we make the DSM length fit to a multiple of block size
this
->
SetLength
(((
long
)(
aLength
/
aBlockLength
))
*
aBlockLength
);
}
else
{
this
->
SetLength
(
aLength
);
}
}
catch
(
XdmfError
e
)
{
throw
e
;
}
this
->
StartAddress
=
(
aComm
->
GetId
()
-
startId
)
*
aLength
;
this
->
EndAddress
=
this
->
StartAddress
+
aLength
-
1
;
}
else
{
if
(
aBlockLength
)
{
this
->
Length
=
((
long
)(
aLength
/
aBlockLength
))
*
aBlockLength
;
}
else
{
this
->
Length
=
aLength
;
}
}
this
->
TotalLength
=
this
->
GetLength
()
*
(
endId
-
startId
+
1
);
}
bool
XdmfDSMBuffer
::
GetIsConnected
()
{
return
IsConnected
;
return
IsConnected
;
}
void
XdmfDSMBuffer
::
SetIsConnected
(
bool
newStatus
)
{
IsConnected
=
newStatus
;
IsConnected
=
newStatus
;
}
char
*
XdmfDSMBuffer
::
GetDataPointer
()
{
return
this
->
DataPointer
;
return
this
->
DataPointer
;
}
int
XdmfDSMBuffer
::
GetDsmType
()
{
return
this
->
DsmType
;
return
this
->
DsmType
;
}
void
XdmfDSMBuffer
::
SetDsmType
(
int
newDsmType
)
{
this
->
DsmType
=
newDsmType
;
this
->
DsmType
=
newDsmType
;
}
bool
XdmfDSMBuffer
::
GetIsServer
()
{
return
this
->
IsServer
;
return
this
->
IsServer
;
}
void
XdmfDSMBuffer
::
SetIsServer
(
bool
newIsServer
)
{
this
->
IsServer
=
newIsServer
;
this
->
IsServer
=
newIsServer
;
}
int
XdmfDSMBuffer
::
GetEndAddress
()
{
return
this
->
EndAddress
;
return
this
->
EndAddress
;
}
int
XdmfDSMBuffer
::
GetStartAddress
()
{
return
this
->
StartAddress
;
return
this
->
StartAddress
;
}
int
XdmfDSMBuffer
::
GetStartServerId
()
{
return
this
->
StartServerId
;
return
this
->
StartServerId
;
}
int
XdmfDSMBuffer
::
GetEndServerId
()
{
return
this
->
EndServerId
;
return
this
->
EndServerId
;
}
long
XdmfDSMBuffer
::
GetLength
()
{
return
this
->
Length
;
return
this
->
Length
;
}
long
XdmfDSMBuffer
::
GetTotalLength
()
{
return
this
->
TotalLength
;
return
this
->
TotalLength
;
}
long
XdmfDSMBuffer
::
GetBlockLength
()
{
return
this
->
BlockLength
;
return
this
->
BlockLength
;
}
void
XdmfDSMBuffer
::
SetBlockLength
(
long
newBlock
)
{
this
->
BlockLength
=
newBlock
;
this
->
BlockLength
=
newBlock
;
}
XdmfDSMCommMPI
*
XdmfDSMBuffer
::
GetComm
()
{
return
this
->
Comm
;
return
this
->
Comm
;
}
void
XdmfDSMBuffer
::
SetComm
(
XdmfDSMCommMPI
*
newComm
)
{
this
->
Comm
=
newComm
;
this
->
Comm
=
newComm
;
}
void
XdmfDSMBuffer
::
SetLength
(
long
aLength
)
{
this
->
Length
=
aLength
;
if
(
this
->
DataPointer
)
{
// try to reallocate
// this should not be called in most cases
this
->
DataPointer
=
static_cast
<
char
*>
(
realloc
(
this
->
DataPointer
,
this
->
Length
*
sizeof
(
char
)));
}
else
{
this
->
Length
=
aLength
;
if
(
this
->
DataPointer
)
{
// Try to reallocate
// This should not be called in most cases
this
->
DataPointer
=
static_cast
<
char
*>
(
realloc
(
this
->
DataPointer
,
this
->
Length
*
sizeof
(
char
)));
}
else
{
#ifdef _WIN32
this
->
DataPointer
=
calloc
(
this
->
Length
,
sizeof
(
char
));
this
->
DataPointer
=
calloc
(
this
->
Length
,
sizeof
(
char
));
#else
posix_memalign
((
void
**
)(
&
this
->
DataPointer
),
getpagesize
(),
this
->
Length
);
memset
(
this
->
DataPointer
,
0
,
this
->
Length
);
posix_memalign
((
void
**
)(
&
this
->
DataPointer
),
getpagesize
(),
this
->
Length
);
memset
(
this
->
DataPointer
,
0
,
this
->
Length
);
#endif
}
if
(
this
->
DataPointer
==
NULL
)
{
std
::
stringstream
message
;
message
<<
"Allocation Failed, unable to allocate "
<<
this
->
Length
;
XdmfError
::
message
(
XdmfError
::
FATAL
,
message
.
str
());
}
}
if
(
this
->
DataPointer
==
NULL
)
{
std
::
stringstream
message
;
message
<<
"Allocation Failed, unable to allocate "
<<
this
->
Length
;
XdmfError
::
message
(
XdmfError
::
FATAL
,
message
.
str
());
}
}
void