Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Backofen, Rainer
amdis
Commits
f22281e0
Commit
f22281e0
authored
Apr 16, 2012
by
Thomas Witkowski
Browse files
DOES NOT COMILE .... but must be submitted.
parent
0645a6bf
Changes
7
Hide whitespace changes
Inline
Side-by-side
AMDiS/src/parallel/DofComm.h
View file @
f22281e0
...
...
@@ -34,16 +34,19 @@ namespace AMDiS {
class
DofComm
{
public:
DofComm
()
{}
DofComm
()
:
data
(
1
)
{}
typedef
map
<
const
FiniteElemSpace
*
,
DofContainer
>
FeMapType
;
typedef
FeMapType
::
iterator
FeMapIter
;
typedef
map
<
int
,
FeMapType
>
DataType
;
// meshLevel: map[rank -> map[feSpace -> DofContainer]]
typedef
vector
<
int
,
map
<
int
,
FeMapType
>
>
DataType
;
typedef
DataType
::
iterator
DataIter
;
DofContainer
&
getDofCont
(
int
rank
,
const
FiniteElemSpace
*
feSpace
)
DofContainer
&
getDofCont
ainer
(
int
rank
,
const
FiniteElemSpace
*
feSpace
)
{
return
data
[
rank
][
feSpace
];
return
data
[
0
][
rank
][
feSpace
];
}
void
removeEmpty
();
...
...
@@ -75,7 +78,7 @@ namespace AMDiS {
{
FUNCNAME
(
"DofComm::Iterator::Iterator()"
);
dataIter
=
dofComm
.
data
.
begin
();
dataIter
=
dofComm
.
data
[
0
]
.
begin
();
while
(
setNextFeMap
()
==
false
)
++
dataIter
;
...
...
@@ -83,7 +86,7 @@ namespace AMDiS {
inline
bool
end
()
{
return
(
dataIter
==
dofComm
.
data
.
end
());
return
(
dataIter
==
dofComm
.
data
[
0
]
.
end
());
}
inline
void
nextRank
()
...
...
AMDiS/src/parallel/InteriorBoundary.h
View file @
f22281e0
...
...
@@ -30,10 +30,13 @@
#include
"MacroElement.h"
#include
"Element.h"
#include
"Boundary.h"
#include
"parallel/MeshLevelData.h"
namespace
AMDiS
{
typedef
std
::
vector
<
std
::
pair
<
GeoIndex
,
int
>
>
ExcludeList
;
using
namespace
std
;
typedef
vector
<
pair
<
GeoIndex
,
int
>
>
ExcludeList
;
/// Defines the geometrical objects that forms the boundary;
struct
BoundaryObject
{
...
...
@@ -128,13 +131,23 @@ namespace AMDiS {
*/
class
InteriorBoundary
{
public:
typedef
std
::
map
<
int
,
std
::
vector
<
AtomicBoundary
>
>
RankToBoundMap
;
typedef
map
<
int
,
vector
<
AtomicBoundary
>
>
RankToBoundMap
;
/// Iterator for the interior boundary object.
class
iterator
{
public:
iterator
(
InteriorBoundary
&
b
)
:
bound
(
b
)
:
bound
(
b
),
levelData
(
NULL
),
level
(
0
)
{
reset
();
}
iterator
(
InteriorBoundary
&
b
,
MeshLevelData
&
levelData
,
int
level
)
:
bound
(
b
),
levelData
(
&
levelData
),
level
(
level
)
{
reset
();
}
...
...
@@ -209,9 +222,13 @@ namespace AMDiS {
protected:
RankToBoundMap
::
iterator
mapIt
;
std
::
vector
<
AtomicBoundary
>::
iterator
vecIt
;
vector
<
AtomicBoundary
>::
iterator
vecIt
;
InteriorBoundary
&
bound
;
MeshLevelData
*
levelData
;
int
level
;
};
public:
...
...
@@ -225,19 +242,19 @@ namespace AMDiS {
AtomicBoundary
&
getNewAtomic
(
int
rank
);
/// Writes this object to a file.
void
serialize
(
std
::
ostream
&
out
);
void
serialize
(
ostream
&
out
);
/// Reads the state of an interior boundary from a file.
void
deserialize
(
std
::
istream
&
in
,
std
::
map
<
int
,
Element
*>
&
elIndexMap
);
void
deserialize
(
istream
&
in
,
map
<
int
,
Element
*>
&
elIndexMap
);
/// Compares this interior boundaries with some other. The order of the
/// boundary elements within the object does not play a role.
bool
operator
==
(
const
InteriorBoundary
&
other
)
const
;
protected:
void
serializeExcludeList
(
std
::
ostream
&
out
,
ExcludeList
&
list
);
void
serializeExcludeList
(
ostream
&
out
,
ExcludeList
&
list
);
void
deserializeExcludeList
(
std
::
istream
&
in
,
ExcludeList
&
list
);
void
deserializeExcludeList
(
istream
&
in
,
ExcludeList
&
list
);
public:
RankToBoundMap
boundary
;
...
...
AMDiS/src/parallel/MeshDistributor.cc
View file @
f22281e0
...
...
@@ -1874,16 +1874,22 @@ namespace AMDiS {
sendDofs
.
clear
();
recvDofs
.
clear
();
int
nLevels
=
levelData
.
getLevelNumber
();
for
(
unsigned
int
i
=
0
;
i
<
feSpaces
.
size
();
i
++
)
createBoundaryDofs
(
feSpaces
[
i
]);
for
(
int
j
=
0
;
j
<
nLevels
;
j
++
)
createBoundaryDofs
(
feSpaces
[
i
],
j
);
}
void
MeshDistributor
::
createBoundaryDofs
(
const
FiniteElemSpace
*
feSpace
)
void
MeshDistributor
::
createBoundaryDofs
(
const
FiniteElemSpace
*
feSpace
,
int
level
)
{
FUNCNAME
(
"MeshDistributor::createBoundaryDofs()"
);
if
(
createBoundaryDofFlag
.
isSet
(
BOUNDARY_SUBOBJ_SORTED
))
{
TEST_EXIT
(
level
==
0
)
(
"This function does not support the usage of multi level structure!
\n
"
);
// === Clear data. ===
for
(
int
geo
=
FACE
;
geo
>=
VERTEX
;
geo
--
)
...
...
@@ -1896,7 +1902,7 @@ namespace AMDiS {
DofContainer
dofs
;
it
->
rankObj
.
el
->
getAllDofs
(
feSpace
,
it
->
rankObj
,
dofs
);
DofContainer
&
tmp
=
sendDofs
.
getDofCont
(
it
.
getRank
(),
feSpace
);
DofContainer
&
tmp
=
sendDofs
.
getDofCont
ainer
(
it
.
getRank
(),
feSpace
);
tmp
.
insert
(
tmp
.
end
(),
dofs
.
begin
(),
dofs
.
end
());
if
(
createBoundaryDofFlag
.
isSet
(
BOUNDARY_FILL_INFO_SEND_DOFS
))
...
...
@@ -1912,7 +1918,7 @@ namespace AMDiS {
DofContainer
dofs
;
it
->
rankObj
.
el
->
getAllDofs
(
feSpace
,
it
->
rankObj
,
dofs
);
DofContainer
&
tmp
=
recvDofs
.
getDofCont
(
it
.
getRank
(),
feSpace
);
DofContainer
&
tmp
=
recvDofs
.
getDofCont
ainer
(
it
.
getRank
(),
feSpace
);
tmp
.
insert
(
tmp
.
end
(),
dofs
.
begin
(),
dofs
.
end
());
if
(
createBoundaryDofFlag
.
isSet
(
BOUNDARY_FILL_INFO_RECV_DOFS
))
...
...
@@ -1921,13 +1927,15 @@ namespace AMDiS {
}
}
}
else
{
for
(
InteriorBoundary
::
iterator
it
(
rankIntBoundary
);
!
it
.
end
();
++
it
)
for
(
InteriorBoundary
::
iterator
it
(
rankIntBoundary
,
levelData
,
level
);
!
it
.
end
();
++
it
)
it
->
rankObj
.
el
->
getAllDofs
(
feSpace
,
it
->
rankObj
,
sendDofs
.
getDofCont
(
it
.
getRank
(),
feSpace
));
sendDofs
.
getDofCont
ainer
(
it
.
getRank
(),
feSpace
));
for
(
InteriorBoundary
::
iterator
it
(
otherIntBoundary
);
!
it
.
end
();
++
it
)
for
(
InteriorBoundary
::
iterator
it
(
otherIntBoundary
,
levelData
,
level
);
!
it
.
end
();
++
it
)
it
->
rankObj
.
el
->
getAllDofs
(
feSpace
,
it
->
rankObj
,
recvDofs
.
getDofCont
(
it
.
getRank
(),
feSpace
));
recvDofs
.
getDofCont
ainer
(
it
.
getRank
(),
feSpace
));
}
// === Delete all empty DOF send and recv positions ===
...
...
@@ -2010,8 +2018,12 @@ namespace AMDiS {
sort
(
rankDofs
.
begin
(),
rankDofs
.
end
(),
cmpDofsByValue
);
int
nRankAllDofs
=
rankDofs
.
size
();
// === Traverse interior boundaries and get all DOFs on them. ===
createBoundaryDofs
(
feSpace
);
int
nLevels
=
levelData
.
getLevelNumber
();
for
(
int
i
=
0
;
i
<
nLevels
;
i
++
)
createBoundaryDofs
(
feSpace
,
i
);
// All DOFs that must be received are DOFs not owned by rank and have
// therefore to be removed from the set 'rankDofs'.
...
...
@@ -2170,7 +2182,7 @@ namespace AMDiS {
// Here we have a periodic boundary between two ranks.
// Create DOF indices on the boundary.
DofContainer
&
dofs
=
periodicDofs
.
getDofCont
(
it
->
first
,
feSpace
);
DofContainer
&
dofs
=
periodicDofs
.
getDofCont
ainer
(
it
->
first
,
feSpace
);
for
(
vector
<
AtomicBoundary
>::
iterator
boundIt
=
it
->
second
.
begin
();
boundIt
!=
it
->
second
.
end
();
++
boundIt
)
{
...
...
@@ -2203,7 +2215,7 @@ namespace AMDiS {
for
(
RankToBoundMap
::
iterator
it
=
periodicBoundary
.
boundary
.
begin
();
it
!=
periodicBoundary
.
boundary
.
end
();
++
it
)
{
DofContainer
&
dofs
=
periodicDofs
.
getDofCont
(
it
->
first
,
feSpace
);
DofContainer
&
dofs
=
periodicDofs
.
getDofCont
ainer
(
it
->
first
,
feSpace
);
vector
<
int
>&
types
=
rankToDofType
[
it
->
first
];
TEST_EXIT_DBG
(
dofs
.
size
()
==
types
.
size
())(
"Should not happen!
\n
"
);
...
...
AMDiS/src/parallel/MeshDistributor.h
View file @
f22281e0
...
...
@@ -472,7 +472,7 @@ namespace AMDiS {
void
createBoundaryDofs
();
void
createBoundaryDofs
(
const
FiniteElemSpace
*
feSpace
);
void
createBoundaryDofs
(
const
FiniteElemSpace
*
feSpace
,
int
level
);
/// Removes all macro elements from the mesh that are not part of ranks
/// partition.
...
...
AMDiS/src/parallel/ParallelDebug.cc
View file @
f22281e0
...
...
@@ -454,7 +454,8 @@ namespace AMDiS {
MSG
(
"%s
\n
"
,
oss
.
str
().
c_str
());
debug
::
printInfoByDof
(
feSpace
,
*
(
pdb
.
recvDofs
.
getDofCont
(
it
->
first
,
feSpace
)[
i
]));
*
(
pdb
.
recvDofs
.
getDofContainer
(
it
->
first
,
feSpace
)[
i
]));
}
ERROR
(
"Wrong DOFs in rank %d!
\n
"
,
pdb
.
mpiRank
);
foundError
=
1
;
...
...
AMDiS/src/parallel/PetscSolverFeti.cc
View file @
f22281e0
...
...
@@ -188,7 +188,8 @@ namespace AMDiS {
:
PetscSolver
(),
schurPrimalSolver
(
0
),
multiLevelTest
(
false
),
subDomainSolver
(
NULL
)
subDomainSolver
(
NULL
),
meshLevel
(
0
)
{
FUNCNAME
(
"PetscSolverFeti::PetscSolverFeti()"
);
...
...
@@ -214,6 +215,8 @@ namespace AMDiS {
schurPrimalSolver
);
Parameters
::
get
(
"parallel->multi level test"
,
multiLevelTest
);
if
(
multiLevelTest
)
meshLevel
=
1
;
}
...
...
@@ -221,6 +224,9 @@ namespace AMDiS {
{
FUNCNAME
(
"PetscSolverFeti::initialize()"
);
TEST_EXIT_DBG
(
meshLevel
+
1
==
meshDistributor
->
getMeshLevelData
().
getLevelNumber
())
(
"Mesh hierarchy does not contain %d levels!
\n
"
,
meshLevel
+
1
);
if
(
subDomainSolver
==
NULL
)
subDomainSolver
=
new
SubDomainSolver
(
meshDistributor
,
mpiComm
,
mpiSelfComm
);
...
...
@@ -1253,11 +1259,10 @@ namespace AMDiS {
int
debug
=
0
;
Parameters
::
get
(
"parallel->debug feti"
,
debug
);
if
(
debug
)
{
if
(
debug
)
solveFetiMatrix
(
vec
);
}
else
{
else
solveReducedFetiMatrix
(
vec
);
}
MeshDistributor
::
globalMeshDistributor
->
synchVector
(
vec
);
}
...
...
AMDiS/src/parallel/PetscSolverFeti.h
View file @
f22281e0
...
...
@@ -243,6 +243,8 @@ namespace AMDiS {
bool
multiLevelTest
;
SubDomainSolver
*
subDomainSolver
;
int
meshLevel
;
};
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment