Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Aland, Sebastian
amdis
Commits
aa1ec307
Commit
aa1ec307
authored
Feb 13, 2012
by
Thomas Witkowski
Browse files
Fixed some problems for mesh redistribution with mixed finite elements.
parent
8dd34fa5
Changes
2
Hide whitespace changes
Inline
Side-by-side
AMDiS/src/MeshStructure.cc
View file @
aa1ec307
...
...
@@ -428,8 +428,13 @@ namespace AMDiS {
const
FiniteElemSpace
*
feSpace
=
vec
->
getFeSpace
();
Mesh
*
mesh
=
feSpace
->
getMesh
();
int
nVertexPreDofs
=
feSpace
->
getAdmin
()
->
getNumberOfPreDofs
(
VERTEX
);
bool
feSpaceHasNonVertexDofs
=
(
feSpace
->
getBasisFcts
()
->
getDegree
()
>
1
);
values
.
clear
();
#if (DEBUG != 0)
// In debug mode we add the macro element index to the value code.
values
.
push_back
(
static_cast
<
double
>
(
macroElIndex
));
#endif
ElementDofIterator
elDofIter
(
feSpace
);
TraverseStack
stack
;
...
...
@@ -439,14 +444,14 @@ namespace AMDiS {
// For the macro element the mesh structure code stores all vertex values.
if
(
elInfo
->
getLevel
()
==
0
)
for
(
int
i
=
0
;
i
<
mesh
->
getGeo
(
VERTEX
);
i
++
)
values
.
push_back
((
*
vec
)[
elInfo
->
getElement
()
->
getDof
(
i
,
0
)]);
values
.
push_back
((
*
vec
)[
elInfo
->
getElement
()
->
getDof
(
i
,
nVertexPreDofs
)]);
if
(
!
elInfo
->
getElement
()
->
isLeaf
())
{
// If no leaf element store the value of the "new" DOF that is created
// by bisectioning of this element.
DegreeOfFreedom
dof0
=
elInfo
->
getElement
()
->
getChild
(
0
)
->
getDof
(
mesh
->
getDim
(),
0
);
elInfo
->
getElement
()
->
getChild
(
0
)
->
getDof
(
mesh
->
getDim
(),
nVertexPreDofs
);
values
.
push_back
((
*
vec
)[
dof0
]);
}
else
{
// If leaf element store all non vertex values of this element, thus
...
...
@@ -477,7 +482,14 @@ namespace AMDiS {
const
FiniteElemSpace
*
feSpace
=
vec
->
getFeSpace
();
Mesh
*
mesh
=
feSpace
->
getMesh
();
bool
feSpaceHasNonVertexDofs
=
(
feSpace
->
getBasisFcts
()
->
getDegree
()
>
1
);
int
nVertexPreDofs
=
feSpace
->
getAdmin
()
->
getNumberOfPreDofs
(
VERTEX
);
unsigned
int
counter
=
0
;
#if (DEBUG != 0)
TEST_EXIT
(
static_cast
<
int
>
(
values
[
0
])
==
macroElIndex
)
(
"Value structure code was created for macro element index %d, but should be set to macro element index %d
\n
"
,
static_cast
<
int
>
(
values
[
0
]),
macroElIndex
);
counter
++
;
#endif
TEST_EXIT_DBG
(
static_cast
<
int
>
(
values
.
size
())
>=
mesh
->
getGeo
(
VERTEX
))
(
"Should not happen!
\n
"
);
...
...
@@ -490,14 +502,15 @@ namespace AMDiS {
// For the macro element all vertex nodes are set first.
if
(
elInfo
->
getLevel
()
==
0
)
for
(
int
i
=
0
;
i
<
mesh
->
getGeo
(
VERTEX
);
i
++
)
(
*
vec
)[
elInfo
->
getElement
()
->
getDof
(
i
,
0
)]
=
values
[
counter
++
];
(
*
vec
)[
elInfo
->
getElement
()
->
getDof
(
i
,
nVertexPreDofs
)]
=
values
[
counter
++
];
if
(
!
elInfo
->
getElement
()
->
isLeaf
())
{
// If no leaf element set the value of the "new" DOF that is created
// by bisectioning of this element.
TEST_EXIT_DBG
(
counter
<
values
.
size
())(
"Should not happen!
\n
"
);
(
*
vec
)[
elInfo
->
getElement
()
->
getChild
(
0
)
->
getDof
(
mesh
->
getDim
(),
0
)]
=
(
*
vec
)[
elInfo
->
getElement
()
->
getChild
(
0
)
->
getDof
(
mesh
->
getDim
(),
nVertexPreDofs
)]
=
values
[
counter
++
];
}
else
{
// On leaf elements set all non vertex values (thus DOFs of higher order
...
...
AMDiS/src/parallel/MeshDistributor.cc
View file @
aa1ec307
...
...
@@ -1154,9 +1154,10 @@ namespace AMDiS {
// In the case the partitioner does not create a new mesh partition, return
// without and changes.
if
(
!
partitioner
->
meshChanged
())
if
(
!
partitioner
->
meshChanged
())
{
MSG
(
"Mesh partition does not create a new partition!
\n
"
);
return
;
}
// === Create map that maps macro element indices to pointers to the ===
// === macro elements. ===
...
...
@@ -1264,24 +1265,14 @@ namespace AMDiS {
for
(
map
<
int
,
vector
<
int
>
>::
iterator
it
=
partitioner
->
getRecvElements
().
begin
();
it
!=
partitioner
->
getRecvElements
().
end
();
++
it
)
{
MeshCodeVec
&
recvCodes
=
stdMpi
.
getRecvData
()[
it
->
first
];
vector
<
vector
<
double
>
>
&
recvValues
=
stdMpi2
.
getRecvData
()[
it
->
first
];
int
i
=
0
;
int
j
=
0
;
TEST_EXIT_DBG
(
recvCodes
.
size
()
==
it
->
second
.
size
())
(
"Should not happen!
\n
"
);
for
(
vector
<
int
>::
iterator
elIt
=
it
->
second
.
begin
();
elIt
!=
it
->
second
.
end
();
++
elIt
)
{
recvCodes
[
i
].
fitMeshToStructure
(
mesh
,
refineManager
,
false
,
*
elIt
);
for
(
unsigned
int
k
=
0
;
k
<
interchangeVectors
.
size
();
k
++
)
recvCodes
[
i
].
setMeshStructureValues
(
*
elIt
,
interchangeVectors
[
k
],
recvValues
[
j
++
]);
i
++
;
}
elIt
!=
it
->
second
.
end
();
++
elIt
)
recvCodes
[
i
++
].
fitMeshToStructure
(
mesh
,
refineManager
,
false
,
*
elIt
);
}
...
...
@@ -1343,6 +1334,25 @@ namespace AMDiS {
updateInteriorBoundaryInfo
();
updateLocalGlobalNumbering
();
// === After mesh adaption, set values of interchange vectors. ===
for
(
map
<
int
,
vector
<
int
>
>::
iterator
it
=
partitioner
->
getRecvElements
().
begin
();
it
!=
partitioner
->
getRecvElements
().
end
();
++
it
)
{
MeshCodeVec
&
recvCodes
=
stdMpi
.
getRecvData
()[
it
->
first
];
vector
<
vector
<
double
>
>
&
recvValues
=
stdMpi2
.
getRecvData
()[
it
->
first
];
int
i
=
0
,
j
=
0
;
for
(
vector
<
int
>::
iterator
elIt
=
it
->
second
.
begin
();
elIt
!=
it
->
second
.
end
();
++
elIt
)
{
for
(
unsigned
int
k
=
0
;
k
<
interchangeVectors
.
size
();
k
++
)
recvCodes
[
i
].
setMeshStructureValues
(
*
elIt
,
interchangeVectors
[
k
],
recvValues
[
j
++
]);
i
++
;
}
}
// === Update periodic mapping, if there are periodic boundaries. ===
createPeriodicMap
();
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a 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