Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
Backofen, Rainer
amdis
Commits
1a6ac357
Commit
1a6ac357
authored
Sep 29, 2009
by
Thomas Witkowski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Modified Serializer for parallel serialization.
parent
ded81b7f
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
180 additions
and
119 deletions
+180
-119
AMDiS/src/ElementData.cc
AMDiS/src/ElementData.cc
+26
-27
AMDiS/src/ElementData.h
AMDiS/src/ElementData.h
+18
-18
AMDiS/src/ElementRegion_ED.h
AMDiS/src/ElementRegion_ED.h
+15
-15
AMDiS/src/LeafData.h
AMDiS/src/LeafData.h
+5
-5
AMDiS/src/ParallelDomainScal.cc
AMDiS/src/ParallelDomainScal.cc
+6
-0
AMDiS/src/ParallelDomainScal.h
AMDiS/src/ParallelDomainScal.h
+15
-0
AMDiS/src/ParallelDomainVec.cc
AMDiS/src/ParallelDomainVec.cc
+9
-0
AMDiS/src/ParallelDomainVec.h
AMDiS/src/ParallelDomainVec.h
+14
-0
AMDiS/src/PartitionElementData.h
AMDiS/src/PartitionElementData.h
+37
-26
AMDiS/src/ProblemScal.h
AMDiS/src/ProblemScal.h
+2
-2
AMDiS/src/Serializer.h
AMDiS/src/Serializer.h
+9
-3
AMDiS/src/SurfaceRegion_ED.h
AMDiS/src/SurfaceRegion_ED.h
+24
-23
No files found.
AMDiS/src/ElementData.cc
View file @
1a6ac357
...
...
@@ -7,32 +7,31 @@ namespace AMDiS {
Element
*
otherChild
,
int
elTypeParent
)
{
if
(
decorated_
)
{
PartitionElementData
*
ped
=
NULL
;
ped
=
dynamic_cast
<
PartitionElementData
*>
(
thisChild
->
getElementData
(
PARTITION_ED
));
ped
=
NULL
;
ped
=
dynamic_cast
<
PartitionElementData
*>
(
otherChild
->
getElementData
(
PARTITION_ED
));
ped
=
NULL
;
ped
=
dynamic_cast
<
PartitionElementData
*>
(
parent
->
getElementData
(
PARTITION_ED
));
decorated_
->
coarsenElementData
(
parent
,
thisChild
,
otherChild
,
elTypeParent
);
delete
decorated_
;
decorated_
=
NULL
;
if
(
decorated
)
{
PartitionElementData
*
ped
=
NULL
;
ped
=
dynamic_cast
<
PartitionElementData
*>
(
thisChild
->
getElementData
(
PARTITION_ED
));
ped
=
NULL
;
ped
=
dynamic_cast
<
PartitionElementData
*>
(
otherChild
->
getElementData
(
PARTITION_ED
));
ped
=
NULL
;
ped
=
dynamic_cast
<
PartitionElementData
*>
(
parent
->
getElementData
(
PARTITION_ED
));
decorated
->
coarsenElementData
(
parent
,
thisChild
,
otherChild
,
elTypeParent
);
delete
decorated
;
decorated
=
NULL
;
}
}
bool
ElementData
::
deleteDecorated
(
int
typeID
)
{
if
(
decorated
_
)
{
if
(
decorated
_
->
isOfType
(
typeID
))
{
ElementData
*
tmp
=
decorated
_
;
decorated
_
=
decorated
_
->
decorated
_
;
if
(
decorated
)
{
if
(
decorated
->
isOfType
(
typeID
))
{
ElementData
*
tmp
=
decorated
;
decorated
=
decorated
->
decorated
;
delete
tmp
;
tmp
=
NULL
;
return
true
;
}
else
{
return
decorated
_
->
deleteDecorated
(
typeID
);
return
decorated
->
deleteDecorated
(
typeID
);
}
}
return
false
;
...
...
@@ -40,9 +39,9 @@ namespace AMDiS {
void
ElementData
::
deleteDecorated
()
{
if
(
decorated
_
)
{
decorated
_
->
deleteDecorated
();
delete
decorated
_
;
if
(
decorated
)
{
decorated
->
deleteDecorated
();
delete
decorated
;
}
}
...
...
@@ -53,10 +52,10 @@ namespace AMDiS {
void
ElementData
::
serialize
(
std
::
ostream
&
out
)
{
std
::
string
decoratedType
;
if
(
decorated
_
)
{
decoratedType
=
decorated
_
->
getTypeName
();
if
(
decorated
)
{
decoratedType
=
decorated
->
getTypeName
();
out
<<
decoratedType
<<
"
\n
"
;
decorated
_
->
serialize
(
out
);
decorated
->
serialize
(
out
);
}
else
{
out
<<
"NULL
\n
"
;
}
...
...
@@ -64,16 +63,16 @@ namespace AMDiS {
void
ElementData
::
deserialize
(
std
::
istream
&
in
)
{
TEST_EXIT
(
decorated
_
==
NULL
)
TEST_EXIT
(
decorated
==
NULL
)
(
"there are already decorated element data
\n
"
);
std
::
string
decoratedType
;
in
>>
decoratedType
;
in
.
get
();
if
(
decoratedType
!=
"NULL"
)
{
decorated
_
=
CreatorMap
<
ElementData
>::
getCreator
(
decoratedType
)
->
create
();
decorated
_
->
deserialize
(
in
);
decorated
=
CreatorMap
<
ElementData
>::
getCreator
(
decoratedType
)
->
create
();
decorated
->
deserialize
(
in
);
}
else
{
decorated
_
=
NULL
;
decorated
=
NULL
;
}
}
...
...
AMDiS/src/ElementData.h
View file @
1a6ac357
...
...
@@ -43,8 +43,8 @@ namespace AMDiS {
{
public:
/// constructor
ElementData
(
ElementData
*
dec
orated
=
NULL
)
:
decorated
_
(
dec
orated
)
ElementData
(
ElementData
*
dec
=
NULL
)
:
decorated
(
dec
)
{}
/// destructor
...
...
@@ -56,14 +56,14 @@ namespace AMDiS {
Element
*
child2
,
int
elType
)
{
if
(
decorated
_
)
{
if
(
decorated
)
{
bool
remove
=
decorated
_
->
refineElementData
(
parent
,
child1
,
child2
,
elType
);
decorated
->
refineElementData
(
parent
,
child1
,
child2
,
elType
);
if
(
remove
)
{
ElementData
*
tmp
=
decorated
_
->
decorated
_
;
delete
decorated
_
;
decorated
_
=
tmp
;
ElementData
*
tmp
=
decorated
->
decorated
;
delete
decorated
;
decorated
=
tmp
;
}
}
return
false
;
...
...
@@ -78,8 +78,8 @@ namespace AMDiS {
/// Returns a copy of this ElementData object including all decorated data.
virtual
ElementData
*
clone
()
const
{
if
(
decorated
_
)
return
decorated
_
->
clone
();
if
(
decorated
)
return
decorated
->
clone
();
return
NULL
;
}
...
...
@@ -108,32 +108,32 @@ namespace AMDiS {
if
(
this
->
isOfType
(
typeID
))
{
return
this
;
}
else
{
if
(
decorated
_
)
return
decorated
_
->
getElementData
(
typeID
);
if
(
decorated
)
return
decorated
->
getElementData
(
typeID
);
}
return
NULL
;
}
inline
ElementData
*
getDecorated
(
int
typeID
)
{
if
(
decorated
_
)
return
decorated
_
->
getElementData
(
typeID
);
if
(
decorated
)
return
decorated
->
getElementData
(
typeID
);
return
NULL
;
}
/** \ref
* Search the \ref decorated
_
chain for a specific type ID, and delets
* Search the \ref decorated chain for a specific type ID, and delets
* this entry.
*/
bool
deleteDecorated
(
int
typeID
);
/// Delets the whole \ref decorated
_
chain.
/// Delets the whole \ref decorated chain.
void
deleteDecorated
();
inline
ElementData
*
getDecorated
()
{
return
decorated
_
;
return
decorated
;
}
inline
void
setDecorated
(
ElementData
*
d
)
...
...
@@ -142,12 +142,12 @@ namespace AMDiS {
if
(
d
!=
NULL
)
std
::
cout
<<
"leafdata decorated with nonzero"
<<
std
::
endl
;
decorated
_
=
d
;
decorated
=
d
;
}
protected:
/// Pointer to next ElementData object in the chain of responsibility.
ElementData
*
decorated
_
;
ElementData
*
decorated
;
};
}
...
...
AMDiS/src/ElementRegion_ED.h
View file @
1a6ac357
...
...
@@ -17,10 +17,10 @@
// == ==
// ============================================================================
/** \file ElementRegion
_
ED.h */
/** \file ElementRegionED.h */
#ifndef AMDIS_ELEMENTREGION
_
ED_H
#define AMDIS_ELEMENTREGION
_
ED_H
#ifndef AMDIS_ELEMENTREGIONED_H
#define AMDIS_ELEMENTREGIONED_H
#include "ElementData.h"
#include "FixVec.h"
...
...
@@ -48,7 +48,7 @@ namespace AMDiS {
ElementRegion_ED
(
ElementData
*
decorated
=
NULL
)
:
ElementData
(
decorated
),
region
_
(
-
1
)
region
(
-
1
)
{}
bool
refineElementData
(
Element
*
parent
,
...
...
@@ -61,11 +61,11 @@ namespace AMDiS {
ElementRegion_ED
*
ep
;
ep
=
new
ElementRegion_ED
(
child1
->
getElementData
());
ep
->
region
_
=
region
_
;
ep
->
region
=
region
;
child1
->
setElementData
(
ep
);
ep
=
new
ElementRegion_ED
(
child2
->
getElementData
());
ep
->
region
_
=
region
_
;
ep
->
region
=
region
;
child2
->
setElementData
(
ep
);
return
false
;
...
...
@@ -74,14 +74,14 @@ namespace AMDiS {
ElementData
*
clone
()
const
{
ElementRegion_ED
*
newObj
=
new
ElementRegion_ED
;
newObj
->
region
_
=
region
_
;
newObj
->
decorated
_
=
ElementData
::
clone
();
newObj
->
region
=
region
;
newObj
->
decorated
=
ElementData
::
clone
();
return
newObj
;
}
inline
std
::
string
getTypeName
()
const
{
return
"ElementRegion
_
ED"
;
return
"ElementRegionED"
;
}
inline
const
int
getTypeID
()
const
...
...
@@ -92,27 +92,27 @@ namespace AMDiS {
void
serialize
(
std
::
ostream
&
out
)
{
ElementData
::
serialize
(
out
);
out
.
write
(
reinterpret_cast
<
const
char
*>
(
&
region
_
),
sizeof
(
int
));
out
.
write
(
reinterpret_cast
<
const
char
*>
(
&
region
),
sizeof
(
int
));
}
void
deserialize
(
std
::
istream
&
in
)
{
ElementData
::
deserialize
(
in
);
in
.
read
(
reinterpret_cast
<
char
*>
(
&
region
_
),
sizeof
(
int
));
in
.
read
(
reinterpret_cast
<
char
*>
(
&
region
),
sizeof
(
int
));
}
inline
void
setRegion
(
int
r
egion
)
inline
void
setRegion
(
int
r
)
{
region
_
=
r
egion
;
region
=
r
;
}
inline
int
getRegion
()
const
{
return
region
_
;
return
region
;
}
protected:
int
region
_
;
int
region
;
};
}
...
...
AMDiS/src/LeafData.h
View file @
1a6ac357
...
...
@@ -102,7 +102,7 @@ namespace AMDiS {
newObj
->
errorEstimate
=
errorEstimate
;
// clone decorated element data (=> deep copy)
newObj
->
decorated
_
=
ElementData
::
clone
();
newObj
->
decorated
=
ElementData
::
clone
();
// return the clone
return
newObj
;
...
...
@@ -193,7 +193,7 @@ namespace AMDiS {
newObj
->
errorEstimate
=
errorEstimate
;
// clone decorated element data (=> deep copy)
newObj
->
decorated
_
=
ElementData
::
clone
();
newObj
->
decorated
=
ElementData
::
clone
();
// return the clone
return
newObj
;
...
...
@@ -298,7 +298,7 @@ namespace AMDiS {
LeafDataCoarsenable
*
newObj
=
new
LeafDataCoarsenable
(
NULL
);
// clone decorated element data (=> deep copy)
newObj
->
decorated
_
=
ElementData
::
clone
();
newObj
->
decorated
=
ElementData
::
clone
();
// return the clone
return
newObj
;
...
...
@@ -377,7 +377,7 @@ namespace AMDiS {
newObj
->
coarseningError
=
coarseningError
;
// clone decorated leaf data (=> deep copy)
newObj
->
decorated
_
=
ElementData
::
clone
();
newObj
->
decorated
=
ElementData
::
clone
();
// return the clone
return
newObj
;
...
...
@@ -547,7 +547,7 @@ namespace AMDiS {
inline
ElementData
*
clone
()
const
{
LeafDataPeriodic
*
newObj
=
new
LeafDataPeriodic
;
newObj
->
decorated
_
=
ElementData
::
clone
();
newObj
->
decorated
=
ElementData
::
clone
();
return
newObj
;
}
...
...
AMDiS/src/ParallelDomainScal.cc
View file @
1a6ac357
...
...
@@ -14,6 +14,12 @@ namespace AMDiS {
probScal
(
problem
)
{
info
=
problem
->
getInfo
();
// Create parallel serialization file writer, if needed.
int
writeSerialization
=
0
;
GET_PARAMETER
(
0
,
name
+
"->output->write serialization"
,
"%d"
,
&
writeSerialization
);
if
(
writeSerialization
)
problem
->
getFileWriterList
().
push_back
(
new
Serializer
<
ParallelDomainScal
>
(
this
));
}
void
ParallelDomainScal
::
initParallelization
(
AdaptInfo
*
adaptInfo
)
...
...
AMDiS/src/ParallelDomainScal.h
View file @
1a6ac357
...
...
@@ -23,6 +23,7 @@
#define AMDIS_PARALLELDOMAINSCAL_H
#include "ParallelDomainBase.h"
#include "ProblemScal.h"
namespace
AMDiS
{
...
...
@@ -34,6 +35,20 @@ namespace AMDiS {
void
initParallelization
(
AdaptInfo
*
adaptInfo
);
// Writes all data of this object to an output stream.
virtual
void
serialize
(
std
::
ostream
&
out
)
{
probScal
->
serialize
(
out
);
ParallelDomainBase
::
serialize
(
out
);
}
// Reads the object data from an input stream.
virtual
void
deserialize
(
std
::
istream
&
in
)
{
probScal
->
deserialize
(
in
);
ParallelDomainBase
::
deserialize
(
in
);
}
protected:
/// Starts the solution of the linear system using Petsc.
void
solve
();
...
...
AMDiS/src/ParallelDomainVec.cc
View file @
1a6ac357
...
...
@@ -2,6 +2,7 @@
#include "ProblemVec.h"
#include "ProblemInstat.h"
#include "SystemVector.h"
#include "Serializer.h"
namespace
AMDiS
{
...
...
@@ -18,10 +19,18 @@ namespace AMDiS {
info
=
probVec
->
getInfo
();
nComponents
=
probVec
->
getNumComponents
();
// Test if all fe spaces are equal. Yet, different fe spaces are not supported for
// domain parallelization.
const
FiniteElemSpace
*
fe
=
probVec
->
getFESpace
(
0
);
for
(
int
i
=
0
;
i
<
nComponents
;
i
++
)
TEST_EXIT
(
fe
==
probVec
->
getFESpace
(
i
))
(
"Parallelization does not supported different FE spaces!
\n
"
);
// Create parallel serialization file writer, if needed.
int
writeSerialization
=
0
;
GET_PARAMETER
(
0
,
name
+
"->output->write serialization"
,
"%d"
,
&
writeSerialization
);
if
(
writeSerialization
)
problem
->
getFileWriterList
().
push_back
(
new
Serializer
<
ParallelDomainVec
>
(
this
));
}
...
...
AMDiS/src/ParallelDomainVec.h
View file @
1a6ac357
...
...
@@ -42,6 +42,20 @@ namespace AMDiS {
synchVectors
(
*
(
probVec
->
getSolution
()));
}
// Writes all data of this object to an output stream.
virtual
void
serialize
(
std
::
ostream
&
out
)
{
probVec
->
serialize
(
out
);
ParallelDomainBase
::
serialize
(
out
);
}
// Reads the object data from an input stream.
virtual
void
deserialize
(
std
::
istream
&
in
)
{
probVec
->
deserialize
(
in
);
ParallelDomainBase
::
deserialize
(
in
);
}
protected:
/// Starts the solution of the linear system using Petsc.
void
solve
();
...
...
AMDiS/src/PartitionElementData.h
View file @
1a6ac357
...
...
@@ -40,16 +40,18 @@ namespace AMDiS {
class
PartitionElementData
:
public
ElementData
{
public:
inline
bool
isOfType
(
int
typeID
)
const
{
inline
bool
isOfType
(
int
typeID
)
const
{
if
(
typeID
==
PARTITION_ED
)
return
true
;
return
true
;
return
false
;
}
class
Creator
:
public
CreatorInterface
<
ElementData
>
{
public:
ElementData
*
create
()
{
ElementData
*
create
()
{
return
new
PartitionElementData
;
}
};
...
...
@@ -68,10 +70,12 @@ namespace AMDiS {
Element
*
child2
,
int
elType
)
{
ElementData
::
refineElementData
(
parent
,
child1
,
child2
,
elType
);
ElementData
::
refineElementData
(
parent
,
child1
,
child2
,
elType
);
PartitionElementData
*
child1Data
=
new
PartitionElementData
(
child1
->
getElementData
());
PartitionElementData
*
child2Data
=
new
PartitionElementData
(
child2
->
getElementData
());
PartitionElementData
*
child1Data
=
new
PartitionElementData
(
child1
->
getElementData
());
PartitionElementData
*
child2Data
=
new
PartitionElementData
(
child2
->
getElementData
());
child1Data
->
setPartitionStatus
(
status
);
child2Data
->
setPartitionStatus
(
status
);
child1Data
->
setLevel
(
level
+
1
);
...
...
@@ -79,51 +83,58 @@ namespace AMDiS {
child1
->
setElementData
(
child1Data
);
child2
->
setElementData
(
child2Data
);
return
false
;
}
;
}
ElementData
*
clone
()
const
{
ElementData
*
clone
()
const
{
PartitionElementData
*
newObj
=
new
PartitionElementData
;
newObj
->
decorated
_
=
ElementData
::
clone
();
newObj
->
decorated
=
ElementData
::
clone
();
return
newObj
;
}
;
}
inline
std
::
string
getTypeName
()
const
{
inline
std
::
string
getTypeName
()
const
{
return
"PartitionElementData"
;
}
;
}
inline
const
int
getTypeID
()
const
{
inline
const
int
getTypeID
()
const
{
return
PARTITION_ED
;
}
;
}
void
serialize
(
std
::
ostream
&
out
)
{
ElementData
::
serialize
(
out
);
out
.
write
(
reinterpret_cast
<
const
char
*>
(
&
status
),
sizeof
(
PartitionStatus
));
out
.
write
(
reinterpret_cast
<
const
char
*>
(
&
level
),
sizeof
(
int
));
}
;
}
void
deserialize
(
std
::
istream
&
in
)
{
ElementData
::
deserialize
(
in
);
in
.
read
(
reinterpret_cast
<
char
*>
(
&
status
),
sizeof
(
PartitionStatus
));
in
.
read
(
reinterpret_cast
<
char
*>
(
&
level
),
sizeof
(
int
));
}
;
}
inline
void
setPartitionStatus
(
PartitionStatus
status_
)
{
inline
void
setPartitionStatus
(
PartitionStatus
status_
)
{
status
=
status_
;
}
;
}
inline
PartitionStatus
getPartitionStatus
()
{
inline
PartitionStatus
getPartitionStatus
()
{
return
status
;
}
;
}
inline
void
setLevel
(
int
level_
)
{
level
=
level_
;
};
inline
void
setLevel
(
int
l
)
{
level
=
l
;
}
inline
int
getLevel
()
{
inline
int
getLevel
()
{
return
level
;
}
;
}
void
descend
(
Element
*
element
)
{
...
...
@@ -145,7 +156,7 @@ namespace AMDiS {
child0Data
->
descend
(
child0
);
child1Data
->
descend
(
child1
);
}
}
;
}
protected:
PartitionStatus
status
;
...
...
AMDiS/src/ProblemScal.h
View file @
1a6ac357
...
...
@@ -186,7 +186,7 @@ namespace AMDiS {
/// Adds robin boundary conditions.
virtual
void
addRobinBC
(
BoundaryType
type
,
DOFVector
<
double
>
*
n
,
DOFVector
<
double
>
*
n
,
DOFVector
<
double
>
*
r
);
/// Adds Neumann boundary conditions.
...
...
@@ -317,7 +317,7 @@ namespace AMDiS {
virtual
void
deserialize
(
std
::
istream
&
in
);
/// Returns \ref fileWriters.
std
::
vector
<
FileWriterInterface
*>
getFileWriterList
()
std
::
vector
<
FileWriterInterface
*>
&
getFileWriterList
()
{
return
fileWriters
;
}
...
...
AMDiS/src/Serializer.h
View file @
1a6ac357
...
...
@@ -40,11 +40,17 @@ namespace AMDiS {
tsModulo
(
1
),
timestepNumber
(
-
1
)
{
GET_PARAMETER
(
0
,
problem
->
getName
()
+
"->output->serialization filename"
,
&
name
);
GET_PARAMETER
(
0
,
problem
->
getName
()
+
"->output->write every i-th timestep"
,
FUNCNAME
(
"Serializer::Serializer()"
);
GET_PARAMETER
(
0
,
problem
->
getName
()
+
"->output->serialization filename"
,
&
name
);
GET_PARAMETER
(
0
,
problem
->
getName
()
+
"->output->write every i-th timestep"
,
"%d"
,
&
tsModulo
);
TEST_EXIT
(
name
!=
""
)(
"no filename
\n
"
);
#if HAVE_PARALLEL_DOMAIN_AMDIS
name
+=
".p"
;
name
+=
MPI
::
COMM_WORLD
.
Get_rank
();
#endif
}
virtual
~
Serializer
()
{}
...
...
AMDiS/src/SurfaceRegion_ED.h
View file @
1a6ac357
...
...
@@ -30,7 +30,8 @@ namespace AMDiS {
class
SurfaceRegion_ED
:
public
ElementData
{
public:
inline
bool
isOfType
(
int
typeID
)
const
{
inline
bool
isOfType
(
int
typeID
)
const
{
if
(
typeID
==
SURFACE_REGION
)
return
true
;
return
false
;
...
...
@@ -47,8 +48,8 @@ namespace AMDiS {
SurfaceRegion_ED
(
ElementData
*
decorated
=
NULL
)
:
ElementData
(
decorated
),
side
_
(
-
1
),
region
_
(
-
1
)
side
(
-
1
),
region
(
-
1
)
{}
bool
refineElementData
(
Element
*
parent
,
...
...
@@ -61,19 +62,19 @@ namespace AMDiS {
int
sideOfChild
;
SurfaceRegion_ED
*
surfaceRegion
;
sideOfChild
=
parent
->
getSideOfChild
(
0
,
side
_
,
elType
);
sideOfChild
=
parent
->
getSideOfChild
(
0
,
side
,
elType
);
if
(
sideOfChild
>=
0
)
{
surfaceRegion
=
new
SurfaceRegion_ED
(
child1
->
getElementData
());
surfaceRegion
->
setSide
(
sideOfChild
);
surfaceRegion
->
setRegion
(
region
_
);
surfaceRegion
->
setRegion
(
region
);
child1
->
setElementData
(
surfaceRegion
);
}
sideOfChild
=
parent
->
getSideOfChild
(
1
,
side
_
,
elType
);
sideOfChild
=
parent
->
getSideOfChild
(
1
,
side
,
elType
);
if
(
sideOfChild
>=
0
)
{
surfaceRegion
=
new
SurfaceRegion_ED
(
child2
->
getElementData
());
surfaceRegion
->
side
_
=
sideOfChild
;
surfaceRegion
->
region
_
=
region
_
;
surfaceRegion
->
side
=
sideOfChild
;
surfaceRegion
->
region
=
region
;
child2
->
setElementData
(
surfaceRegion
);
}
...
...
@@ -83,9 +84,9 @@ namespace AMDiS {
ElementData
*
clone
()
const
{
SurfaceRegion_ED
*
newObj
=
new
SurfaceRegion_ED
;