Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
amdis
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
iwr
amdis
Commits
c89c0012
Commit
c89c0012
authored
16 years ago
by
Thomas Witkowski
Browse files
Options
Downloads
Patches
Plain Diff
* Moved marker to source file
parent
45b07a0a
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
AMDiS/src/Marker.cc
+201
-1
201 additions, 1 deletion
AMDiS/src/Marker.cc
AMDiS/src/Marker.h
+15
-192
15 additions, 192 deletions
AMDiS/src/Marker.h
with
216 additions
and
193 deletions
AMDiS/src/Marker.cc
+
201
−
1
View file @
c89c0012
...
...
@@ -2,7 +2,7 @@
namespace
AMDiS
{
Marker
*
Marker
::
createMarker
(
::
std
::
string
name
,
int
row
)
{
Marker
*
Marker
::
createMarker
(
std
::
string
name
,
int
row
)
{
int
strategy
=
0
;
GET_PARAMETER
(
0
,
name
+
"->strategy"
,
"%d"
,
&
strategy
);
...
...
@@ -28,5 +28,205 @@ namespace AMDiS {
return
marker
;
}
void
Marker
::
initMarking
(
AdaptInfo
*
adaptInfo
,
Mesh
*
mesh
)
{
elMarkRefine
=
0
;
elMarkCoarsen
=
0
;
estSum
=
pow
(
adaptInfo
->
getEstSum
(
row
==
-
1
?
0
:
row
),
p
);
estMax
=
adaptInfo
->
getEstMax
(
row
==
-
1
?
0
:
row
);
}
void
Marker
::
finishMarking
(
AdaptInfo
*
adaptInfo
)
{
FUNCNAME
(
"Marker::finishMarking()"
);
INFO
(
info
,
4
)(
"%d elements marked for refinement
\n
"
,
elMarkRefine
);
INFO
(
info
,
4
)(
"%d elements marked for coarsening
\n
"
,
elMarkCoarsen
);
}
void
Marker
::
markElement
(
AdaptInfo
*
adaptInfo
,
ElInfo
*
elInfo
)
{
Element
*
el
=
elInfo
->
getElement
();
double
lError
=
el
->
getEstimation
(
row
);
if
(
adaptInfo
->
isRefinementAllowed
(
row
==
-
1
?
0
:
row
)
&&
lError
>
markRLimit
)
{
setMark
(
el
,
adaptInfo
->
getRefineBisections
(
row
==
-
1
?
0
:
row
));
}
else
{
if
(
adaptInfo
->
isCoarseningAllowed
(
row
==
-
1
?
0
:
row
)
&&
lError
<=
markCLimit
)
{
if
(
!
el
->
getElementData
()
->
getElementData
(
COARSENABLE
)
||
(
lError
+
el
->
getCoarseningEstimation
(
row
))
<=
markCLimit
)
{
setMark
(
el
,
-
adaptInfo
->
getCoarseBisections
(
row
==
-
1
?
0
:
row
));
}
}
}
}
Flag
Marker
::
markMesh
(
AdaptInfo
*
adaptInfo
,
Mesh
*
mesh
)
{
initMarking
(
adaptInfo
,
mesh
);
if
(
!
adaptInfo
->
isCoarseningAllowed
(
row
==
-
1
?
0
:
row
)
&&
!
adaptInfo
->
isRefinementAllowed
(
row
==
-
1
?
0
:
row
))
{
return
0
;
}
TraverseStack
stack
;
ElInfo
*
elInfo
=
NULL
;
elInfo
=
stack
.
traverseFirst
(
mesh
,
-
1
,
Mesh
::
CALL_LEAF_EL
);
while
(
elInfo
)
{
markElement
(
adaptInfo
,
elInfo
);
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
finishMarking
(
adaptInfo
);
Flag
markFlag
;
if
(
elMarkRefine
)
markFlag
=
1
;
if
(
elMarkCoarsen
)
markFlag
|=
2
;
return
(
markFlag
);
}
void
ESMarker
::
initMarking
(
AdaptInfo
*
adaptInfo
,
Mesh
*
mesh
)
{
FUNCNAME
(
"ESMarker::initMarking()"
);
Marker
::
initMarking
(
adaptInfo
,
mesh
);
double
ESThetaP
=
pow
(
ESTheta
,
p
);
double
ESThetaCP
=
pow
(
ESThetaC
,
p
);
double
epsP
=
pow
(
adaptInfo
->
getSpaceTolerance
(
row
==
-
1
?
0
:
row
),
p
);
markRLimit
=
ESThetaP
*
epsP
/
mesh
->
getNumberOfLeaves
();
markCLimit
=
ESThetaCP
*
epsP
/
mesh
->
getNumberOfLeaves
();
INFO
(
info
,
2
)
(
"start mark_limits: %.3le %.3le nt=%d
\n
"
,
markRLimit
,
markCLimit
,
mesh
->
getNumberOfLeaves
());
}
Flag
GERSMarker
::
markMesh
(
AdaptInfo
*
adaptInfo
,
Mesh
*
mesh
)
{
FUNCNAME
(
"GERSMarker::markMesh()"
);
initMarking
(
adaptInfo
,
mesh
);
if
(
!
adaptInfo
->
isCoarseningAllowed
(
row
==
-
1
?
0
:
row
)
&&
!
adaptInfo
->
isRefinementAllowed
(
row
==
-
1
?
0
:
row
))
{
return
0
;
}
GERSSum
=
0.0
;
double
LTheta
=
pow
(
1.0
-
GERSThetaStar
,
p
);
double
improv
,
redfac
,
wanted
,
epsP
,
GERSGamma
;
epsP
=
pow
(
adaptInfo
->
getSpaceTolerance
(
row
==
-
1
?
0
:
row
),
p
);
if
(
estSum
<
oldErrSum
)
{
improv
=
estSum
/
oldErrSum
;
wanted
=
0.8
*
epsP
/
estSum
;
redfac
=
std
::
min
((
1.0
-
wanted
)
/
(
1.0
-
improv
),
1.0
);
redfac
=
std
::
max
(
redfac
,
0.0
);
if
(
redfac
<
1.0
)
{
LTheta
*=
redfac
;
INFO
(
info
,
1
)
(
"GERS: use extrapolated theta_star = %lf
\n
"
,
pow
(
LTheta
,
1.0
/
p
));
}
}
oldErrSum
=
estSum
;
GERSGamma
=
1.0
;
if
(
adaptInfo
->
isRefinementAllowed
(
row
==
-
1
?
0
:
row
))
{
if
(
LTheta
>
0
)
{
do
{
GERSSum
=
0.0
;
GERSGamma
-=
GERSNu
;
markRLimit
=
GERSGamma
*
estMax
;
TraverseStack
stack
;
ElInfo
*
elInfo
=
NULL
;
elInfo
=
stack
.
traverseFirst
(
mesh
,
-
1
,
Mesh
::
CALL_LEAF_EL
);
while
(
elInfo
)
{
markElementForRefinement
(
adaptInfo
,
elInfo
);
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
}
while
((
GERSGamma
>
0
)
&&
(
GERSSum
<
LTheta
*
estSum
));
}
INFO
(
info
,
2
)
(
"GERS refinement with gamma = %.3lf
\n
"
,
GERSGamma
);
}
if
(
adaptInfo
->
isCoarseningAllowed
(
row
==
-
1
?
0
:
row
))
{
GERSGamma
=
0.3
;
LTheta
=
GERSThetaC
*
epsP
;
do
{
GERSSum
=
0.0
;
GERSGamma
-=
GERSNu
;
markCLimit
=
GERSGamma
*
estMax
;
TraverseStack
stack
;
ElInfo
*
elInfo
=
NULL
;
elInfo
=
stack
.
traverseFirst
(
mesh
,
-
1
,
Mesh
::
CALL_LEAF_EL
);
while
(
elInfo
)
{
markElementForCoarsening
(
adaptInfo
,
elInfo
);
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
INFO
(
info
,
6
)
(
"coarse loop: gamma=%.3e, sum=%.3e, limit=%.3e
\n
"
,
GERSGamma
,
GERSSum
,
LTheta
);
}
while
(
GERSSum
>
LTheta
);
INFO
(
info
,
2
)
(
"GERS coarsening with gamma = %.3lf
\n
"
,
GERSGamma
);
}
finishMarking
(
adaptInfo
);
Flag
markFlag
;
if
(
elMarkRefine
)
markFlag
=
1
;
if
(
elMarkCoarsen
)
markFlag
|=
2
;
return
(
markFlag
);
}
void
GERSMarker
::
markElementForRefinement
(
AdaptInfo
*
adaptInfo
,
ElInfo
*
elInfo
)
{
Element
*
el
=
elInfo
->
getElement
();
double
lError
=
el
->
getEstimation
(
row
);
if
(
lError
>
markRLimit
)
{
GERSSum
+=
lError
;
setMark
(
el
,
adaptInfo
->
getRefineBisections
(
row
==
-
1
?
0
:
row
));
}
}
void
GERSMarker
::
markElementForCoarsening
(
AdaptInfo
*
adaptInfo
,
ElInfo
*
elInfo
)
{
Element
*
el
=
elInfo
->
getElement
();
double
lError
=
el
->
getEstimation
(
row
);
if
(
el
->
getMark
()
<=
0
)
{
if
(
el
->
getElementData
()
->
getElementData
(
COARSENABLE
))
{
lError
+=
el
->
getCoarseningEstimation
(
row
);
}
if
(
lError
<=
markCLimit
)
{
GERSSum
+=
lError
;
setMark
(
el
,
-
adaptInfo
->
getCoarseBisections
(
row
==
-
1
?
0
:
row
));
}
else
{
setMark
(
el
,
0
);
}
}
}
}
This diff is collapsed.
Click to expand it.
AMDiS/src/Marker.h
+
15
−
192
View file @
c89c0012
...
...
@@ -54,7 +54,7 @@ namespace AMDiS {
/** \brief
* Constructor.
*/
Marker
(
::
std
::
string
name_
,
int
row_
)
Marker
(
std
::
string
name_
,
int
row_
)
:
name
(
name_
),
row
(
row_
),
maximumMarking
(
false
),
...
...
@@ -100,68 +100,22 @@ namespace AMDiS {
/** \brief
* Can be used by sub classes. Called before traversal.
*/
virtual
void
initMarking
(
AdaptInfo
*
adaptInfo
,
Mesh
*
mesh
)
{
elMarkRefine
=
0
;
elMarkCoarsen
=
0
;
estSum
=
pow
(
adaptInfo
->
getEstSum
(
row
==
-
1
?
0
:
row
),
p
);
estMax
=
adaptInfo
->
getEstMax
(
row
==
-
1
?
0
:
row
);
};
virtual
void
initMarking
(
AdaptInfo
*
adaptInfo
,
Mesh
*
mesh
);
/** \brief
* Can be used by sub classes. Called after traversal.
*/
virtual
void
finishMarking
(
AdaptInfo
*
adaptInfo
)
{
FUNCNAME
(
"Marker::finishMarking()"
);
INFO
(
info
,
4
)(
"%d elements marked for refinement
\n
"
,
elMarkRefine
);
INFO
(
info
,
4
)(
"%d elements marked for coarsening
\n
"
,
elMarkCoarsen
);
};
virtual
void
finishMarking
(
AdaptInfo
*
adaptInfo
);
/** \brief
* Marks one element.
*/
virtual
void
markElement
(
AdaptInfo
*
adaptInfo
,
ElInfo
*
elInfo
)
{
Element
*
el
=
elInfo
->
getElement
();
double
lError
=
el
->
getEstimation
(
row
);
if
(
adaptInfo
->
isRefinementAllowed
(
row
==
-
1
?
0
:
row
)
&&
lError
>
markRLimit
)
{
setMark
(
el
,
adaptInfo
->
getRefineBisections
(
row
==
-
1
?
0
:
row
));
}
else
{
if
(
adaptInfo
->
isCoarseningAllowed
(
row
==
-
1
?
0
:
row
)
&&
lError
<=
markCLimit
)
{
if
(
!
el
->
getElementData
()
->
getElementData
(
COARSENABLE
)
||
(
lError
+
el
->
getCoarseningEstimation
(
row
))
<=
markCLimit
)
{
setMark
(
el
,
-
adaptInfo
->
getCoarseBisections
(
row
==
-
1
?
0
:
row
));
}
}
}
};
virtual
void
markElement
(
AdaptInfo
*
adaptInfo
,
ElInfo
*
elInfo
);
/** \brief
* Marking of the mesh.
*/
virtual
Flag
markMesh
(
AdaptInfo
*
adaptInfo
,
Mesh
*
mesh
)
{
initMarking
(
adaptInfo
,
mesh
);
if
(
!
adaptInfo
->
isCoarseningAllowed
(
row
==
-
1
?
0
:
row
)
&&
!
adaptInfo
->
isRefinementAllowed
(
row
==
-
1
?
0
:
row
))
{
return
0
;
}
TraverseStack
stack
;
ElInfo
*
elInfo
=
NULL
;
elInfo
=
stack
.
traverseFirst
(
mesh
,
-
1
,
Mesh
::
CALL_LEAF_EL
);
while
(
elInfo
)
{
markElement
(
adaptInfo
,
elInfo
);
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
finishMarking
(
adaptInfo
);
Flag
markFlag
;
if
(
elMarkRefine
)
markFlag
=
1
;
if
(
elMarkCoarsen
)
markFlag
|=
2
;
return
(
markFlag
);
};
virtual
Flag
markMesh
(
AdaptInfo
*
adaptInfo
,
Mesh
*
mesh
);
/** \brief
* Sets \ref maximumMarking.
...
...
@@ -180,13 +134,13 @@ namespace AMDiS {
/** \brief
* Creates a scalr marker depending on the strategy set in parameters.
*/
static
Marker
*
createMarker
(
::
std
::
string
name
,
int
row_
);
static
Marker
*
createMarker
(
std
::
string
name
,
int
row_
);
protected
:
/** \brief
* Name of the scalar marker.
*/
::
std
::
string
name
;
std
::
string
name
;
/** \brief
* Equal to -1 for scalar problems. Component number if marker is
...
...
@@ -262,7 +216,7 @@ namespace AMDiS {
/** \brief
* Constructor.
*/
GRMarker
(
::
std
::
string
name_
,
int
row_
)
GRMarker
(
std
::
string
name_
,
int
row_
)
:
Marker
(
name_
,
row_
)
{};
...
...
@@ -294,7 +248,7 @@ namespace AMDiS {
/** \brief
* Constructor.
*/
MSMarker
(
::
std
::
string
name_
,
int
row_
)
MSMarker
(
std
::
string
name_
,
int
row_
)
:
Marker
(
name_
,
row_
),
MSGamma
(
0.5
),
MSGammaC
(
0.1
)
...
...
@@ -346,7 +300,7 @@ namespace AMDiS {
/** \brief
* Constructor.
*/
ESMarker
(
::
std
::
string
name_
,
int
row_
)
ESMarker
(
std
::
string
name_
,
int
row_
)
:
Marker
(
name_
,
row_
),
ESTheta
(
0.9
),
ESThetaC
(
0.2
)
...
...
@@ -358,23 +312,7 @@ namespace AMDiS {
/** \brief
* Implementation of MarkScal::initMarking().
*/
virtual
void
initMarking
(
AdaptInfo
*
adaptInfo
,
Mesh
*
mesh
)
{
FUNCNAME
(
"ESMarker::initMarking()"
);
Marker
::
initMarking
(
adaptInfo
,
mesh
);
double
ESThetaP
=
pow
(
ESTheta
,
p
);
double
ESThetaCP
=
pow
(
ESThetaC
,
p
);
double
epsP
=
pow
(
adaptInfo
->
getSpaceTolerance
(
row
==
-
1
?
0
:
row
),
p
);
markRLimit
=
ESThetaP
*
epsP
/
mesh
->
getNumberOfLeaves
();
markCLimit
=
ESThetaCP
*
epsP
/
mesh
->
getNumberOfLeaves
();
INFO
(
info
,
2
)
(
"start mark_limits: %.3le %.3le nt=%d
\n
"
,
markRLimit
,
markCLimit
,
mesh
->
getNumberOfLeaves
());
};
virtual
void
initMarking
(
AdaptInfo
*
adaptInfo
,
Mesh
*
mesh
);
protected
:
/** \brief
...
...
@@ -406,7 +344,7 @@ namespace AMDiS {
/** \brief
* Constructor.
*/
GERSMarker
(
::
std
::
string
name_
,
int
row_
)
GERSMarker
(
std
::
string
name_
,
int
row_
)
:
Marker
(
name_
,
row_
),
oldErrSum
(
0.0
),
GERSThetaStar
(
0.6
),
...
...
@@ -421,133 +359,18 @@ namespace AMDiS {
/** \brief
* Implementation of Marker::markMesh().
*/
virtual
Flag
markMesh
(
AdaptInfo
*
adaptInfo
,
Mesh
*
mesh
)
{
FUNCNAME
(
"GERSMarker::markMesh()"
);
initMarking
(
adaptInfo
,
mesh
);
if
(
!
adaptInfo
->
isCoarseningAllowed
(
row
==
-
1
?
0
:
row
)
&&
!
adaptInfo
->
isRefinementAllowed
(
row
==
-
1
?
0
:
row
))
{
return
0
;
}
GERSSum
=
0.0
;
double
LTheta
=
pow
(
1.0
-
GERSThetaStar
,
p
);
double
improv
,
redfac
,
wanted
,
epsP
,
GERSGamma
;
epsP
=
pow
(
adaptInfo
->
getSpaceTolerance
(
row
==
-
1
?
0
:
row
),
p
);
if
(
estSum
<
oldErrSum
)
{
improv
=
estSum
/
oldErrSum
;
wanted
=
0.8
*
epsP
/
estSum
;
redfac
=
::
std
::
min
((
1.0
-
wanted
)
/
(
1.0
-
improv
),
1.0
);
redfac
=
::
std
::
max
(
redfac
,
0.0
);
if
(
redfac
<
1.0
)
{
LTheta
*=
redfac
;
INFO
(
info
,
1
)
(
"GERS: use extrapolated theta_star = %lf
\n
"
,
pow
(
LTheta
,
1.0
/
p
));
}
}
oldErrSum
=
estSum
;
GERSGamma
=
1.0
;
if
(
adaptInfo
->
isRefinementAllowed
(
row
==
-
1
?
0
:
row
))
{
if
(
LTheta
>
0
)
{
do
{
GERSSum
=
0.0
;
GERSGamma
-=
GERSNu
;
markRLimit
=
GERSGamma
*
estMax
;
TraverseStack
stack
;
ElInfo
*
elInfo
=
NULL
;
elInfo
=
stack
.
traverseFirst
(
mesh
,
-
1
,
Mesh
::
CALL_LEAF_EL
);
while
(
elInfo
)
{
markElementForRefinement
(
adaptInfo
,
elInfo
);
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
}
while
((
GERSGamma
>
0
)
&&
(
GERSSum
<
LTheta
*
estSum
));
}
INFO
(
info
,
2
)
(
"GERS refinement with gamma = %.3lf
\n
"
,
GERSGamma
);
}
if
(
adaptInfo
->
isCoarseningAllowed
(
row
==
-
1
?
0
:
row
))
{
GERSGamma
=
0.3
;
LTheta
=
GERSThetaC
*
epsP
;
do
{
GERSSum
=
0.0
;
GERSGamma
-=
GERSNu
;
markCLimit
=
GERSGamma
*
estMax
;
TraverseStack
stack
;
ElInfo
*
elInfo
=
NULL
;
elInfo
=
stack
.
traverseFirst
(
mesh
,
-
1
,
Mesh
::
CALL_LEAF_EL
);
while
(
elInfo
)
{
markElementForCoarsening
(
adaptInfo
,
elInfo
);
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
INFO
(
info
,
6
)
(
"coarse loop: gamma=%.3e, sum=%.3e, limit=%.3e
\n
"
,
GERSGamma
,
GERSSum
,
LTheta
);
}
while
(
GERSSum
>
LTheta
);
INFO
(
info
,
2
)
(
"GERS coarsening with gamma = %.3lf
\n
"
,
GERSGamma
);
}
finishMarking
(
adaptInfo
);
Flag
markFlag
;
if
(
elMarkRefine
)
markFlag
=
1
;
if
(
elMarkCoarsen
)
markFlag
|=
2
;
return
(
markFlag
);
};
virtual
Flag
markMesh
(
AdaptInfo
*
adaptInfo
,
Mesh
*
mesh
);
protected
:
/** \brief
* Refinement marking function.
*/
void
markElementForRefinement
(
AdaptInfo
*
adaptInfo
,
ElInfo
*
elInfo
)
{
Element
*
el
=
elInfo
->
getElement
();
double
lError
=
el
->
getEstimation
(
row
);
if
(
lError
>
markRLimit
)
{
GERSSum
+=
lError
;
setMark
(
el
,
adaptInfo
->
getRefineBisections
(
row
==
-
1
?
0
:
row
));
}
};
void
markElementForRefinement
(
AdaptInfo
*
adaptInfo
,
ElInfo
*
elInfo
);
/** \brief
* Coarsening marking function.
*/
void
markElementForCoarsening
(
AdaptInfo
*
adaptInfo
,
ElInfo
*
elInfo
)
{
Element
*
el
=
elInfo
->
getElement
();
double
lError
=
el
->
getEstimation
(
row
);
if
(
el
->
getMark
()
<=
0
)
{
if
(
el
->
getElementData
()
->
getElementData
(
COARSENABLE
))
{
lError
+=
el
->
getCoarseningEstimation
(
row
);
}
if
(
lError
<=
markCLimit
)
{
GERSSum
+=
lError
;
setMark
(
el
,
-
adaptInfo
->
getCoarseBisections
(
row
==
-
1
?
0
:
row
));
}
else
{
setMark
(
el
,
0
);
}
}
};
void
markElementForCoarsening
(
AdaptInfo
*
adaptInfo
,
ElInfo
*
elInfo
);
protected
:
/** \brief
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
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!
Save comment
Cancel
Please
register
or
sign in
to comment