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
54114ba0
Commit
54114ba0
authored
May 11, 2010
by
Thomas Witkowski
Browse files
Work on parallelization, merged two version.
parent
36f3e956
Changes
7
Hide whitespace changes
Inline
Side-by-side
AMDiS/src/Mesh.cc
View file @
54114ba0
...
@@ -645,28 +645,6 @@ namespace AMDiS {
...
@@ -645,28 +645,6 @@ namespace AMDiS {
}
}
void
Mesh
::
fillElInfo
(
ElInfo
*
elInfo
,
Element
*
el
,
Flag
fillFlag
)
{
FUNCNAME
(
"Mesh::fillElInfo()"
);
TEST_EXIT_DBG
(
elInfo
!=
NULL
)(
"No valide elInfo pointer given!
\n
"
);
TEST_EXIT_DBG
(
el
!=
NULL
)(
"No valid el pointer given!
\n
"
);
TraverseStack
stack
;
ElInfo
*
traverseElInfo
=
stack
.
traverseFirst
(
this
,
-
1
,
Mesh
::
CALL_EVERY_EL_PREORDER
|
fillFlag
);
while
(
traverseElInfo
)
{
if
(
traverseElInfo
->
getElement
()
==
el
)
{
*
elInfo
=
*
traverseElInfo
;
break
;
}
traverseElInfo
=
stack
.
traverseNext
(
traverseElInfo
);
}
}
bool
Mesh
::
findElInfoAtPoint
(
const
WorldVector
<
double
>&
xy
,
bool
Mesh
::
findElInfoAtPoint
(
const
WorldVector
<
double
>&
xy
,
ElInfo
*
el_info
,
ElInfo
*
el_info
,
DimVec
<
double
>&
bary
,
DimVec
<
double
>&
bary
,
...
...
AMDiS/src/Mesh.h
View file @
54114ba0
...
@@ -374,19 +374,6 @@ namespace AMDiS {
...
@@ -374,19 +374,6 @@ namespace AMDiS {
/// Creates a new ElInfo dependent of \ref dim of the mesh
/// Creates a new ElInfo dependent of \ref dim of the mesh
ElInfo
*
createNewElInfo
();
ElInfo
*
createNewElInfo
();
/** \brief
* Fills an ElInfo-object with the information data for a given element. Note
* that this function is quite slow, since it has to traverse the whole mesh to
* find the element.
*
* \param[out] elInfo Must be a pointer to a valide object. The data of
* the element is stored here.
* \param[in] el Pointer to the element the function has to search for.
* \param[in] fillFlag Flags for mesh traverse. Defines the data that should
* be created for the element.
*/
void
fillElInfo
(
ElInfo
*
elInfo
,
Element
*
el
,
Flag
fillFlag
);
/// Frees DOFs at the given position pointed by dof
/// Frees DOFs at the given position pointed by dof
void
freeDOF
(
DegreeOfFreedom
*
dof
,
GeoIndex
position
);
void
freeDOF
(
DegreeOfFreedom
*
dof
,
GeoIndex
position
);
...
...
AMDiS/src/RefinementManager3d.cc
View file @
54114ba0
...
@@ -77,22 +77,22 @@ namespace AMDiS {
...
@@ -77,22 +77,22 @@ namespace AMDiS {
child
[
0
]
->
child
[
0
]
->
setDOF
(
node
,
setDOF
(
node
,
const_cast
<
int
*>
(
el
->
getDOF
(
node
+
Tetrahedron
::
childEdge
[
el_type
][
0
][
0
])));
const_cast
<
int
*>
(
el
->
getDOF
(
node
+
Tetrahedron
::
childEdge
[
el_type
][
0
][
0
])));
child
[
1
]
->
child
[
1
]
->
setDOF
(
node
,
setDOF
(
node
,
const_cast
<
int
*>
(
el
->
getDOF
(
node
+
Tetrahedron
::
childEdge
[
el_type
][
1
][
0
])));
const_cast
<
int
*>
(
el
->
getDOF
(
node
+
Tetrahedron
::
childEdge
[
el_type
][
1
][
0
])));
child
[
0
]
->
child
[
0
]
->
setDOF
(
node
+
1
,
setDOF
(
node
+
1
,
const_cast
<
int
*>
(
el
->
getDOF
(
node
+
Tetrahedron
::
childEdge
[
el_type
][
0
][
1
])));
const_cast
<
int
*>
(
el
->
getDOF
(
node
+
Tetrahedron
::
childEdge
[
el_type
][
0
][
1
])));
child
[
1
]
->
child
[
1
]
->
setDOF
(
node
+
1
,
setDOF
(
node
+
1
,
const_cast
<
int
*>
(
el
->
getDOF
(
node
+
Tetrahedron
::
childEdge
[
el_type
][
1
][
1
])));
const_cast
<
int
*>
(
el
->
getDOF
(
node
+
Tetrahedron
::
childEdge
[
el_type
][
1
][
1
])));
child
[
0
]
->
child
[
0
]
->
setDOF
(
node
+
3
,
setDOF
(
node
+
3
,
const_cast
<
int
*>
(
el
->
getDOF
(
node
+
Tetrahedron
::
childEdge
[
el_type
][
0
][
3
])));
const_cast
<
int
*>
(
el
->
getDOF
(
node
+
Tetrahedron
::
childEdge
[
el_type
][
0
][
3
])));
child
[
1
]
->
child
[
1
]
->
setDOF
(
node
+
3
,
setDOF
(
node
+
3
,
const_cast
<
int
*>
(
el
->
getDOF
(
node
+
Tetrahedron
::
childEdge
[
el_type
][
1
][
3
])));
const_cast
<
int
*>
(
el
->
getDOF
(
node
+
Tetrahedron
::
childEdge
[
el_type
][
1
][
3
])));
/****************************************************************************/
/****************************************************************************/
/* adjust pointers to the dof's in the refinement edge */
/* adjust pointers to the dof's in the refinement edge */
...
@@ -136,6 +136,7 @@ namespace AMDiS {
...
@@ -136,6 +136,7 @@ namespace AMDiS {
fillPatchConnectivity
(
ref_list
,
index
);
fillPatchConnectivity
(
ref_list
,
index
);
}
}
void
RefinementManager3d
::
fillPatchConnectivity
(
RCNeighbourList
*
ref_list
,
void
RefinementManager3d
::
fillPatchConnectivity
(
RCNeighbourList
*
ref_list
,
int
index
)
int
index
)
{
{
...
@@ -213,7 +214,7 @@ namespace AMDiS {
...
@@ -213,7 +214,7 @@ namespace AMDiS {
neigh
->
getChild
(
j
)
->
getIndex
(),
node1
);
neigh
->
getChild
(
j
)
->
getIndex
(),
node1
);
(
const_cast
<
Element
*>
(
el
->
getChild
(
i
)))
->
(
const_cast
<
Element
*>
(
el
->
getChild
(
i
)))
->
setDOF
(
node0
,
const_cast
<
int
*>
(
neigh
->
getChild
(
j
)
->
getDOF
(
node1
)));
setDOF
(
node0
,
const_cast
<
int
*>
(
neigh
->
getChild
(
j
)
->
getDOF
(
node1
)));
}
}
if
(
mesh
->
getNumberOfDOFs
(
FACE
))
{
if
(
mesh
->
getNumberOfDOFs
(
FACE
))
{
node0
=
mesh
->
getNode
(
FACE
)
+
i_neigh
;
node0
=
mesh
->
getNode
(
FACE
)
+
i_neigh
;
...
@@ -400,28 +401,34 @@ namespace AMDiS {
...
@@ -400,28 +401,34 @@ namespace AMDiS {
int
neigh_el_type
=
neigh_info
->
getType
();
int
neigh_el_type
=
neigh_info
->
getType
();
Tetrahedron
*
neigh
=
Tetrahedron
*
neigh
=
dynamic_cast
<
Tetrahedron
*>
(
const_cast
<
Element
*>
(
neigh_info
->
getElement
()));
dynamic_cast
<
Tetrahedron
*>
(
const_cast
<
Element
*>
(
neigh_info
->
getElement
()));
int
vertices
=
mesh
->
getGeo
(
VERTEX
);
int
vertices
=
mesh
->
getGeo
(
VERTEX
);
while
(
neigh
!=
el
)
{
while
(
neigh
!=
el
)
{
for
(
j
=
0
;
j
<
vertices
;
j
++
)
for
(
j
=
0
;
j
<
vertices
;
j
++
)
if
(
neigh
->
getDOF
(
j
)
==
edge
[
0
])
break
;
if
(
neigh
->
getDOF
(
j
)
==
edge
[
0
])
break
;
for
(
k
=
0
;
k
<
vertices
;
k
++
)
for
(
k
=
0
;
k
<
vertices
;
k
++
)
if
(
neigh
->
getDOF
(
k
)
==
edge
[
1
])
break
;
if
(
neigh
->
getDOF
(
k
)
==
edge
[
1
])
break
;
if
(
j
>
3
||
k
>
3
)
{
if
(
j
>
3
||
k
>
3
)
{
for
(
j
=
0
;
j
<
vertices
;
j
++
)
for
(
j
=
0
;
j
<
vertices
;
j
++
)
if
(
mesh
->
associated
(
neigh
->
getDOF
(
j
,
0
),
edge
[
0
][
0
]))
break
;
if
(
mesh
->
associated
(
neigh
->
getDOF
(
j
,
0
),
edge
[
0
][
0
]))
break
;
for
(
k
=
0
;
k
<
vertices
;
k
++
)
for
(
k
=
0
;
k
<
vertices
;
k
++
)
if
(
mesh
->
associated
(
neigh
->
getDOF
(
k
,
0
),
edge
[
1
][
0
]))
break
;
if
(
mesh
->
associated
(
neigh
->
getDOF
(
k
,
0
),
edge
[
1
][
0
]))
break
;
if
(
j
>
3
||
k
>
3
)
{
if
(
j
>
3
||
k
>
3
)
{
for
(
j
=
0
;
j
<
vertices
;
j
++
)
for
(
j
=
0
;
j
<
vertices
;
j
++
)
if
(
mesh
->
indirectlyAssociated
(
neigh
->
getDOF
(
j
,
0
),
edge
[
0
][
0
]))
break
;
if
(
mesh
->
indirectlyAssociated
(
neigh
->
getDOF
(
j
,
0
),
edge
[
0
][
0
]))
break
;
for
(
k
=
0
;
k
<
vertices
;
k
++
)
for
(
k
=
0
;
k
<
vertices
;
k
++
)
if
(
mesh
->
indirectlyAssociated
(
neigh
->
getDOF
(
k
,
0
),
edge
[
1
][
0
]))
break
;
if
(
mesh
->
indirectlyAssociated
(
neigh
->
getDOF
(
k
,
0
),
edge
[
1
][
0
]))
break
;
TEST_EXIT_DBG
(
j
<
vertices
&&
k
<
vertices
)
TEST_EXIT_DBG
(
j
<
vertices
&&
k
<
vertices
)
(
"dof %d or dof %d not found on element %d with nodes (%d %d %d %d)
\n
"
,
(
"dof %d or dof %d not found on element %d with nodes (%d %d %d %d)
\n
"
,
...
...
AMDiS/src/Traverse.cc
View file @
54114ba0
...
@@ -145,7 +145,7 @@ namespace AMDiS {
...
@@ -145,7 +145,7 @@ namespace AMDiS {
el
=
elinfo_stack
[
stack_used
]
->
getElement
();
el
=
elinfo_stack
[
stack_used
]
->
getElement
();
if
(
el
==
NULL
||
el
->
getFirstChild
()
==
NULL
)
if
(
el
==
NULL
||
el
->
getFirstChild
()
==
NULL
)
return
(
elinfo_stack
[
stack_used
]
);
return
elinfo_stack
[
stack_used
]
;
}
else
{
}
else
{
el
=
elinfo_stack
[
stack_used
]
->
getElement
();
el
=
elinfo_stack
[
stack_used
]
->
getElement
();
...
@@ -173,7 +173,7 @@ namespace AMDiS {
...
@@ -173,7 +173,7 @@ namespace AMDiS {
el
=
elinfo_stack
[
stack_used
]
->
getElement
();
el
=
elinfo_stack
[
stack_used
]
->
getElement
();
if
(
el
==
NULL
||
el
->
getFirstChild
()
==
NULL
)
if
(
el
==
NULL
||
el
->
getFirstChild
()
==
NULL
)
return
(
elinfo_stack
[
stack_used
]
);
return
elinfo_stack
[
stack_used
]
;
}
}
}
}
...
@@ -229,7 +229,8 @@ namespace AMDiS {
...
@@ -229,7 +229,8 @@ namespace AMDiS {
if
(
stack_used
==
0
)
{
/* first call */
if
(
stack_used
==
0
)
{
/* first call */
currentMacro
=
traverse_mesh
->
firstMacroElement
();
currentMacro
=
traverse_mesh
->
firstMacroElement
();
traverse_mel
=
*
currentMacro
;
traverse_mel
=
*
currentMacro
;
if
(
traverse_mel
==
NULL
)
return
NULL
;
if
(
traverse_mel
==
NULL
)
return
NULL
;
stack_used
=
1
;
stack_used
=
1
;
elinfo_stack
[
stack_used
]
->
fillMacroInfo
(
traverse_mel
);
elinfo_stack
[
stack_used
]
->
fillMacroInfo
(
traverse_mel
);
...
@@ -238,7 +239,7 @@ namespace AMDiS {
...
@@ -238,7 +239,7 @@ namespace AMDiS {
if
((
elinfo_stack
[
stack_used
]
->
getLevel
()
==
traverse_level
)
||
if
((
elinfo_stack
[
stack_used
]
->
getLevel
()
==
traverse_level
)
||
(
elinfo_stack
[
stack_used
]
->
getLevel
()
<
traverse_level
&&
(
elinfo_stack
[
stack_used
]
->
getLevel
()
<
traverse_level
&&
elinfo_stack
[
stack_used
]
->
getElement
()
->
isLeaf
()))
elinfo_stack
[
stack_used
]
->
getElement
()
->
isLeaf
()))
return
(
elinfo_stack
[
stack_used
]
)
;
return
elinfo_stack
[
stack_used
];
}
}
Element
*
el
=
elinfo_stack
[
stack_used
]
->
getElement
();
Element
*
el
=
elinfo_stack
[
stack_used
]
->
getElement
();
...
@@ -255,7 +256,7 @@ namespace AMDiS {
...
@@ -255,7 +256,7 @@ namespace AMDiS {
if
(
stack_used
<
1
)
{
if
(
stack_used
<
1
)
{
currentMacro
++
;
currentMacro
++
;
if
(
currentMacro
==
traverse_mesh
->
endOfMacroElements
())
if
(
currentMacro
==
traverse_mesh
->
endOfMacroElements
())
return
(
NULL
)
;
return
NULL
;
traverse_mel
=
*
currentMacro
;
traverse_mel
=
*
currentMacro
;
stack_used
=
1
;
stack_used
=
1
;
...
@@ -265,7 +266,7 @@ namespace AMDiS {
...
@@ -265,7 +266,7 @@ namespace AMDiS {
if
((
elinfo_stack
[
stack_used
]
->
getLevel
()
==
traverse_level
)
||
if
((
elinfo_stack
[
stack_used
]
->
getLevel
()
==
traverse_level
)
||
(
elinfo_stack
[
stack_used
]
->
getLevel
()
<
traverse_level
&&
(
elinfo_stack
[
stack_used
]
->
getLevel
()
<
traverse_level
&&
elinfo_stack
[
stack_used
]
->
getElement
()
->
isLeaf
()))
elinfo_stack
[
stack_used
]
->
getElement
()
->
isLeaf
()))
return
(
elinfo_stack
[
stack_used
]
)
;
return
elinfo_stack
[
stack_used
];
}
}
...
@@ -289,7 +290,7 @@ namespace AMDiS {
...
@@ -289,7 +290,7 @@ namespace AMDiS {
if
((
elinfo_stack
[
stack_used
]
->
getLevel
()
==
traverse_level
)
||
if
((
elinfo_stack
[
stack_used
]
->
getLevel
()
==
traverse_level
)
||
(
elinfo_stack
[
stack_used
]
->
getLevel
()
<
traverse_level
&&
(
elinfo_stack
[
stack_used
]
->
getLevel
()
<
traverse_level
&&
elinfo_stack
[
stack_used
]
->
getElement
()
->
isLeaf
()))
elinfo_stack
[
stack_used
]
->
getElement
()
->
isLeaf
()))
return
(
elinfo_stack
[
stack_used
]
)
;
return
elinfo_stack
[
stack_used
];
return
traverseMultiGridLevel
();
return
traverseMultiGridLevel
();
}
}
...
@@ -309,7 +310,7 @@ namespace AMDiS {
...
@@ -309,7 +310,7 @@ namespace AMDiS {
elinfo_stack
[
stack_used
]
->
fillMacroInfo
(
traverse_mel
);
elinfo_stack
[
stack_used
]
->
fillMacroInfo
(
traverse_mel
);
info_stack
[
stack_used
]
=
0
;
info_stack
[
stack_used
]
=
0
;
return
(
elinfo_stack
[
stack_used
]
)
;
return
elinfo_stack
[
stack_used
];
}
}
Element
*
el
=
elinfo_stack
[
stack_used
]
->
getElement
();
Element
*
el
=
elinfo_stack
[
stack_used
]
->
getElement
();
...
@@ -326,14 +327,14 @@ namespace AMDiS {
...
@@ -326,14 +327,14 @@ namespace AMDiS {
if
(
stack_used
<
1
)
{
if
(
stack_used
<
1
)
{
currentMacro
++
;
currentMacro
++
;
if
(
currentMacro
==
traverse_mesh
->
endOfMacroElements
())
if
(
currentMacro
==
traverse_mesh
->
endOfMacroElements
())
return
(
NULL
)
;
return
NULL
;
traverse_mel
=
*
currentMacro
;
traverse_mel
=
*
currentMacro
;
stack_used
=
1
;
stack_used
=
1
;
elinfo_stack
[
stack_used
]
->
fillMacroInfo
(
traverse_mel
);
elinfo_stack
[
stack_used
]
->
fillMacroInfo
(
traverse_mel
);
info_stack
[
stack_used
]
=
0
;
info_stack
[
stack_used
]
=
0
;
return
(
elinfo_stack
[
stack_used
]
)
;
return
elinfo_stack
[
stack_used
];
}
}
...
@@ -354,7 +355,7 @@ namespace AMDiS {
...
@@ -354,7 +355,7 @@ namespace AMDiS {
info_stack
[
stack_used
]
=
0
;
info_stack
[
stack_used
]
=
0
;
return
(
elinfo_stack
[
stack_used
]
)
;
return
elinfo_stack
[
stack_used
];
}
}
...
@@ -422,7 +423,7 @@ namespace AMDiS {
...
@@ -422,7 +423,7 @@ namespace AMDiS {
info_stack
[
stack_used
]
++
;
/* postorder!!! */
info_stack
[
stack_used
]
++
;
/* postorder!!! */
return
(
elinfo_stack
[
stack_used
]
)
;
return
elinfo_stack
[
stack_used
];
}
}
...
@@ -517,7 +518,7 @@ namespace AMDiS {
...
@@ -517,7 +518,7 @@ namespace AMDiS {
i
=
traverse_mel
->
getOppVertex
(
nb
);
i
=
traverse_mel
->
getOppVertex
(
nb
);
traverse_mel
=
traverse_mel
->
getNeighbour
(
nb
);
traverse_mel
=
traverse_mel
->
getNeighbour
(
nb
);
if
(
traverse_mel
==
NULL
)
if
(
traverse_mel
==
NULL
)
return
(
NULL
)
;
return
NULL
;
if
(
nb
<
2
&&
save_stack_used
>
1
)
if
(
nb
<
2
&&
save_stack_used
>
1
)
stack2_used
=
2
;
/* go down one level in OLD hierarchy */
stack2_used
=
2
;
/* go down one level in OLD hierarchy */
...
@@ -746,23 +747,22 @@ namespace AMDiS {
...
@@ -746,23 +747,22 @@ namespace AMDiS {
stack_used
=
1
;
stack_used
=
1
;
elinfo_stack
[
stack_used
]
->
fillMacroInfo
(
const_cast
<
MacroElement
*>
(
traverse_mel
));
elinfo_stack
[
stack_used
]
->
fillMacroInfo
(
const_cast
<
MacroElement
*>
(
traverse_mel
));
info_stack
[
stack_used
]
=
0
;
info_stack
[
stack_used
]
=
0
;
}
else
{
/* goto other child */
}
else
{
/* goto other child */
stack2_used
=
stack_used
+
1
;
stack2_used
=
stack_used
+
1
;
if
(
save_stack_used
>
stack2_used
)
{
if
(
save_stack_used
>
stack2_used
)
stack2_used
++
;
/* go down one level in OLD hierarchy */
stack2_used
++
;
/* go down one level in OLD hierarchy */
}
elinfo2
=
save_elinfo_stack
[
stack2_used
];
elinfo2
=
save_elinfo_stack
[
stack2_used
];
el2
=
dynamic_cast
<
Triangle
*>
(
const_cast
<
Element
*>
(
elinfo2
->
getElement
()));
el2
=
dynamic_cast
<
Triangle
*>
(
const_cast
<
Element
*>
(
elinfo2
->
getElement
()));
if
(
stack_used
>=
stack_size
-
1
)
{
if
(
stack_used
>=
stack_size
-
1
)
enlargeTraverseStack
();
enlargeTraverseStack
();
}
i
=
2
-
info_stack
[
stack_used
];
i
=
2
-
info_stack
[
stack_used
];
info_stack
[
stack_used
]
=
i
+
1
;
info_stack
[
stack_used
]
=
i
+
1
;
elinfo_stack
[
stack_used
+
1
]
->
fillElInfo
(
i
,
elinfo_stack
[
stack_used
]);
elinfo_stack
[
stack_used
+
1
]
->
fillElInfo
(
i
,
elinfo_stack
[
stack_used
]);
stack_used
++
;
stack_used
++
;
nb
=
1
-
i
;
nb
=
1
-
i
;
}
}
...
@@ -846,7 +846,7 @@ namespace AMDiS {
...
@@ -846,7 +846,7 @@ namespace AMDiS {
elinfo
->
fillDetGrdLambda
();
elinfo
->
fillDetGrdLambda
();
}
}
return
(
elinfo
)
;
return
elinfo
;
}
}
...
@@ -854,7 +854,8 @@ namespace AMDiS {
...
@@ -854,7 +854,8 @@ namespace AMDiS {
{
{
FUNCNAME
(
"TraverseStack::update()"
);
FUNCNAME
(
"TraverseStack::update()"
);
TEST_EXIT_DBG
(
traverse_mesh
->
getDim
()
==
3
)(
"update only in 3d
\n
"
);
TEST_EXIT_DBG
(
traverse_mesh
->
getDim
()
==
3
)
(
"Update only in 3d, mesh is d = %d
\n
"
,
traverse_mesh
->
getDim
());
for
(
int
i
=
stack_used
;
i
>
0
;
i
--
)
for
(
int
i
=
stack_used
;
i
>
0
;
i
--
)
dynamic_cast
<
ElInfo3d
*>
(
elinfo_stack
[
i
])
->
update
();
dynamic_cast
<
ElInfo3d
*>
(
elinfo_stack
[
i
])
->
update
();
...
...
AMDiS/src/Traverse.h
View file @
54114ba0
...
@@ -136,6 +136,20 @@ namespace AMDiS {
...
@@ -136,6 +136,20 @@ namespace AMDiS {
return
stack_used
;
return
stack_used
;
}
}
/// Returns the elInfo object on the top of the stack.
ElInfo
*
getElInfo
()
{
FUNCNAME
(
"TraverseStack::getElInfo()"
);
if
(
stack_used
<
0
)
return
NULL
;
TEST_EXIT_DBG
(
elinfo_stack
.
size
()
>
static_cast
<
unsigned
int
>
(
stack_used
))
(
"Should not happen!
\n
"
);
return
elinfo_stack
[
stack_used
];
}
private:
private:
/// Enlargement of the stack
/// Enlargement of the stack
void
enlargeTraverseStack
();
void
enlargeTraverseStack
();
...
...
AMDiS/src/parallel/ParallelDomainBase.cc
View file @
54114ba0
...
@@ -450,6 +450,8 @@ namespace AMDiS {
...
@@ -450,6 +450,8 @@ namespace AMDiS {
if
(
elCode
.
getCode
()
!=
recvCodes
[
i
].
getCode
())
{
if
(
elCode
.
getCode
()
!=
recvCodes
[
i
].
getCode
())
{
TEST_EXIT_DBG
(
refineManager
)(
"Refinement manager is not set correctly!
\n
"
);
TEST_EXIT_DBG
(
refineManager
)(
"Refinement manager is not set correctly!
\n
"
);
// MSG("START WITH I = %d\n", i);
bool
b
=
fitElementToMeshCode
(
recvCodes
[
i
],
bool
b
=
fitElementToMeshCode
(
recvCodes
[
i
],
boundIt
->
rankObj
.
el
,
boundIt
->
rankObj
.
el
,
boundIt
->
rankObj
.
ithObj
,
boundIt
->
rankObj
.
ithObj
,
...
@@ -474,6 +476,8 @@ namespace AMDiS {
...
@@ -474,6 +476,8 @@ namespace AMDiS {
{
{
FUNCNAME
(
"ParallelDomainBase::fitElementToMeshCode()"
);
FUNCNAME
(
"ParallelDomainBase::fitElementToMeshCode()"
);
TEST_EXIT_DBG
(
el
)(
"No element given!
\n
"
);
if
(
code
.
empty
())
if
(
code
.
empty
())
return
false
;
return
false
;
...
@@ -483,63 +487,106 @@ namespace AMDiS {
...
@@ -483,63 +487,106 @@ namespace AMDiS {
TEST_EXIT_DBG
(
s1
!=
-
1
||
s2
!=
-
1
)(
"This should not happen!
\n
"
);
TEST_EXIT_DBG
(
s1
!=
-
1
||
s2
!=
-
1
)(
"This should not happen!
\n
"
);
bool
meshChanged
=
false
;
bool
meshChanged
=
false
;
ElInfo
*
elInfo
=
el
->
getMesh
()
->
createNewElInfo
();
el
->
getMesh
()
->
fillElInfo
(
elInfo
,
el
,
Mesh
::
FILL_NEIGH
|
Mesh
::
FILL_BOUND
);
if
(
s1
!=
-
1
&&
s2
!=
-
1
)
{
if
(
s1
!=
-
1
&&
s2
!=
-
1
)
{
meshChanged
=
fitElementToMeshCode2
(
code
,
el
,
elInfo
,
ithSide
,
elType
);
TraverseStack
stack
;
delete
elInfo
;
ElInfo
*
elInfo
=
stack
.
traverseFirst
(
el
->
getMesh
(),
-
1
,
Mesh
::
CALL_EVERY_EL_PREORDER
|
Mesh
::
FILL_NEIGH
|
Mesh
::
FILL_BOUND
);
while
(
elInfo
&&
elInfo
->
getElement
()
!=
el
)
{
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
// MSG("------- START 0 ----------\n");
meshChanged
=
fitElementToMeshCode2
(
code
,
stack
,
elInfo
,
ithSide
,
elType
);
return
meshChanged
;
return
meshChanged
;
}
}
if
(
el
->
isLeaf
())
{
if
(
el
->
isLeaf
())
{
if
(
code
.
getNumElements
()
==
1
&&
code
.
isLeafElement
())
{
if
(
code
.
getNumElements
()
==
1
&&
code
.
isLeafElement
())
delete
elInfo
;
return
false
;
return
false
;
}
ERROR_EXIT
(
"NOT YET WORKING!
\n
"
);
ElInfo
*
elInfo
=
el
->
getMesh
()
->
createNewElInfo
();
// el->getMesh()->fillElInfo(elInfo, el, Mesh::FILL_NEIGH | Mesh::FILL_BOUND);
el
->
setMark
(
1
);
el
->
setMark
(
1
);
refineManager
->
refineFunction
(
elInfo
);
refineManager
->
refineFunction
(
elInfo
);
delete
elInfo
;
meshChanged
=
true
;
meshChanged
=
true
;
}
}
ElInfo
*
childElInfo
=
el
->
getMesh
()
->
createNewElInfo
();
if
(
s1
!=
-
1
)
{
if
(
s1
!=
-
1
)
{
childElInfo
->
fillElInfo
(
0
,
elInfo
);
// MSG("------- START 1 ----------\n");
meshChanged
|=
fitElementToMeshCode2
(
code
,
el
->
getFirstChild
(),
childElInfo
,
s1
,
el
->
getChildType
(
elType
));
TraverseStack
stack
;
ElInfo
*
elInfo
=
stack
.
traverseFirst
(
el
->
getMesh
(),
-
1
,
Mesh
::
CALL_EVERY_EL_PREORDER
|
Mesh
::
FILL_NEIGH
|
Mesh
::
FILL_BOUND
);
while
(
elInfo
&&
elInfo
->
getElement
()
!=
el
->
getFirstChild
())
{
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
meshChanged
|=
fitElementToMeshCode2
(
code
,
stack
,
elInfo
,
s1
,
el
->
getChildType
(
elType
));
}
else
{
}
else
{
childElInfo
->
fillElInfo
(
1
,
elInfo
);
// MSG("------- START 2 --------- %d \n", el->getIndex());
meshChanged
|=
fitElementToMeshCode2
(
code
,
el
->
getSecondChild
(),
childElInfo
,
s2
,
el
->
getChildType
(
elType
));
TraverseStack
stack
;
ElInfo
*
elInfo
=
stack
.
traverseFirst
(
el
->
getMesh
(),
-
1
,
Mesh
::
CALL_EVERY_EL_PREORDER
|
Mesh
::
FILL_NEIGH
|
Mesh
::
FILL_BOUND
);
while
(
elInfo
&&
elInfo
->
getElement
()
!=
el
->
getSecondChild
())
{
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
meshChanged
|=
fitElementToMeshCode2
(
code
,
stack
,
elInfo
,
s2
,
el
->
getChildType
(
elType
));
}
}
delete
childElInfo
;
// MSG("-------- ENDE ---------\n");
delete
elInfo
;
return
meshChanged
;
return
meshChanged
;
}
}
bool
ParallelDomainBase
::
fitElementToMeshCode2
(
MeshStructure
&
code
,
bool
ParallelDomainBase
::
fitElementToMeshCode2
(
MeshStructure
&
code
,
Element
*
el
,
TraverseStack
&
stack
,
ElInfo
*
elInfo
,
ElInfo
*
a
elInfo
,
int
ithSide
,
int
ithSide
,
int
elType
)
int
elType
)
{
{
FUNCNAME
(
"ParallelDomainBase::fitElementToMeshCode2()"
);
FUNCNAME
(
"ParallelDomainBase::fitElementToMeshCode2()"
);
if
(
code
.
isLeafElement
())
ElInfo
*
elInfo
=
stack
.
getElInfo
();
return
false
;
// MSG("START EL WITH LEVEL = %d\n", elInfo->getLevel());
bool
value
=
false
;
bool
value
=
false
;
if
(
!
elInfo
)