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
amdis
amdis-core
Commits
52705161
Commit
52705161
authored
May 02, 2019
by
Praetorius, Simon
Browse files
add functionality to remove an added marker
parent
3fec45ce
Changes
3
Hide whitespace changes
Inline
Side-by-side
src/amdis/ProblemStat.hpp
View file @
52705161
...
...
@@ -253,10 +253,11 @@ namespace AMDiS
public:
/// Implementation of \ref ProblemStatBase::solve
void
solve
(
AdaptInfo
&
adaptInfo
,
bool
createMatrixData
=
true
,
bool
storeMatrixData
=
false
)
override
;
/// Implementation of \ref StandardProblemIteration::oneIteration.
Flag
oneIteration
(
AdaptInfo
&
adaptInfo
,
Flag
toDo
=
FULL_ITERATION
)
override
{
return
StandardProblemIteration
::
oneIteration
(
adaptInfo
,
toDo
);
}
/// Implementation of \ref ProblemStatBase::buildAfterCoarse
void
buildAfterAdapt
(
AdaptInfo
&
adaptInfo
,
...
...
@@ -271,6 +272,26 @@ namespace AMDiS
buildAfterAdapt
(
adaptInfo
,
Flag
{
0
},
true
,
true
);
}
/// Implementation of \ref ProblemStatBase::solve
void
solve
(
AdaptInfo
&
adaptInfo
,
bool
createMatrixData
=
true
,
bool
storeMatrixData
=
false
)
override
;
/// Implementation of \ref ProblemStatBase::estimate.
void
estimate
(
AdaptInfo
&
adaptInfo
)
override
{
/* do nothing. */
}
/// Implementation of \ref ProblemStatBase::refineMesh.
Flag
adaptGrid
(
AdaptInfo
&
adaptInfo
)
override
;
/// Implementation of \ref ProblemStatBase::markElements.
Flag
markElements
(
AdaptInfo
&
adaptInfo
)
override
;
/// Uniform global grid coarsening by up to n level
Flag
globalCoarsen
(
int
n
)
override
;
/// Uniform global refinement by n level
Flag
globalRefine
(
int
n
)
override
;
/// Writes output files.
void
writeFiles
(
AdaptInfo
&
adaptInfo
,
bool
force
=
false
);
...
...
@@ -335,14 +356,17 @@ namespace AMDiS
public:
// set-methods
/// Set a new linear solver for the problem
void
setSolver
(
std
::
shared_ptr
<
LinearSolverType
>
const
&
solver
)
void
setSolver
(
std
::
shared_ptr
<
LinearSolverType
>
solver
)
{
linearSolver_
=
solver
;
}
void
setSolver
(
LinearSolverType
&
solver
)
/// Wrap the solver into a non-destroying shared_ptr, or move it into a new shared_ptr
template
<
class
S
,
REQUIRES
(
std
::
is_base_of
<
LinearSolverType
,
remove_cvref_t
<
S
>
>::
value
)
>
void
setSolver
(
S
&&
solver
)
{
setSolver
(
Dune
::
stackobject_to_shared_ptr
(
solver
));
setSolver
(
Dune
::
wrap_or_move
(
FWD
(
solver
))
)
;
}
...
...
@@ -357,21 +381,44 @@ namespace AMDiS
createFileWriter
();
}
/// Wrap the grid into a non-destroying shared_ptr
void
setGrid
(
Grid
&
grid
)
{
setGrid
(
Dune
::
stackobject_to_shared_ptr
(
grid
));
}
void
addMarker
(
std
::
shared_ptr
<
Marker
<
Grid
>>
const
&
marker
)
/// Store the shared_ptr and the name of the marker in the problem
/**
* Note: multiple markers can be added but must have different names
**/
void
addMarker
(
std
::
shared_ptr
<
Marker
<
Grid
>>
marker
)
{
marker_
.
push_back
(
marker
);
auto
it
=
marker_
.
emplace
(
marker
->
name
(),
std
::
move
(
marker
)
)
;
if
(
marker_
.
size
()
>
1
)
marker_
.
back
()
->
setMaximumMarking
(
true
);
it
.
first
->
second
->
setMaximumMarking
(
true
);
}
void
addMarker
(
Marker
<
Grid
>&
marker
)
/// Wrap the reference into a non-destroying shared_ptr or move it into a new shared_ptr and
/// store it in the problemand store in the problem
template
<
class
M
,
REQUIRES
(
std
::
is_base_of
<
Marker
<
Grid
>,
remove_cvref_t
<
M
>>::
value
)
>
void
addMarker
(
M
&&
marker
)
{
addMarker
(
Dune
::
stackobject_to_shared_ptr
(
marker
));
addMarker
(
Dune
::
wrap_or_move
(
FWD
(
marker
)));
}
/// Remove a marker with the given name from the problem
void
removeMarker
(
std
::
string
name
)
{
std
::
size_t
num
=
marker_
.
erase
(
name
);
test_warning
(
num
==
1
,
"A marker with the given name '{}' does not exist."
,
name
);
}
/// Remove a marker from the problem
void
removeMarker
(
Marker
<
Grid
>
const
&
marker
)
{
removeMarker
(
marker
.
name
());
}
...
...
@@ -390,11 +437,6 @@ namespace AMDiS
initGlobalBasis
();
}
void
adoptGrid
(
std
::
shared_ptr
<
Grid
>
const
&
grid
)
{
adoptGrid
(
grid
,
std
::
make_shared
<
BoundaryManager
<
Grid
>>
(
grid
));
}
void
adoptGrid
(
std
::
shared_ptr
<
Grid
>
const
&
grid
,
std
::
shared_ptr
<
BoundaryManager
<
Grid
>>
const
&
boundaryManager
)
{
...
...
@@ -403,6 +445,11 @@ namespace AMDiS
Parameters
::
get
(
name_
+
"->mesh"
,
gridName_
);
}
void
adoptGrid
(
std
::
shared_ptr
<
Grid
>
const
&
grid
)
{
adoptGrid
(
grid
,
std
::
make_shared
<
BoundaryManager
<
Grid
>>
(
grid
));
}
private:
void
createGlobalBasisImpl
(
std
::
true_type
);
...
...
@@ -410,30 +457,6 @@ namespace AMDiS
void
initGlobalBasis
();
public:
// implementation of iteration interface methods
/// Implementation of \ref StandardProblemIteration::oneIteration.
Flag
oneIteration
(
AdaptInfo
&
adaptInfo
,
Flag
toDo
=
FULL_ITERATION
)
override
{
return
StandardProblemIteration
::
oneIteration
(
adaptInfo
,
toDo
);
}
/// Implementation of \ref ProblemStatBase::estimate.
void
estimate
(
AdaptInfo
&
adaptInfo
)
override
{
/* do nothing. */
}
/// Implementation of \ref ProblemStatBase::refineMesh.
Flag
adaptGrid
(
AdaptInfo
&
adaptInfo
)
override
;
/// Implementation of \ref ProblemStatBase::markElements.
Flag
markElements
(
AdaptInfo
&
adaptInfo
)
override
;
/// Uniform global grid coarsening by up to n level
Flag
globalCoarsen
(
int
n
)
override
;
/// Uniform global refinement by n level
Flag
globalRefine
(
int
n
)
override
;
private:
/// Name of this problem.
std
::
string
name_
;
...
...
@@ -454,7 +477,7 @@ namespace AMDiS
std
::
list
<
std
::
shared_ptr
<
FileWriterInterface
>>
filewriter_
;
/// Pointer to the adaptation markers
std
::
list
<
std
::
shared_ptr
<
Marker
<
Grid
>>>
marker_
;
std
::
map
<
std
::
string
,
std
::
shared_ptr
<
Marker
<
Grid
>>>
marker_
;
/// Pointer to the estimators for this problem
// std::vector<Estimator*> estimator;
...
...
src/amdis/ProblemStat.inc.hpp
View file @
52705161
...
...
@@ -217,14 +217,8 @@ void ProblemStat<Traits>::createMarker()
std
::
string
tp
=
to_string
(
treePath
);
auto
newMarker
=
EstimatorMarker
<
Grid
>::
createMarker
(
componentName
,
tp
,
estimates_
[
tp
],
grid_
);
if
(
newMarker
)
marker_
.
push_back
(
std
::
move
(
newMarker
));
// If there is more than one marker, and all components are defined
// on the same grid, the maximum marking has to be enabled.
// TODO: needs to be checked!
if
(
marker_
.
size
()
>
1
)
marker_
.
back
()
->
setMaximumMarking
(
true
);
assert
(
bool
(
newMarker
));
addMarker
(
std
::
move
(
newMarker
));
});
}
...
...
@@ -348,7 +342,7 @@ markElements(AdaptInfo& adaptInfo)
Flag
markFlag
=
0
;
for
(
auto
&
currentMarker
:
marker_
)
markFlag
|=
currentMarker
->
markGrid
(
adaptInfo
);
markFlag
|=
currentMarker
.
second
->
markGrid
(
adaptInfo
);
msg
(
"markElements needed {} seconds"
,
t
.
elapsed
());
...
...
test/MarkerTest.cpp
View file @
52705161
...
...
@@ -53,5 +53,10 @@ int main(int argc, char** argv)
prob
.
solution
().
interpolate
(
markerFunc
);
prob
.
writeFiles
(
adaptInfo
);
prob
.
removeMarker
(
marker
.
name
());
prob
.
addMarker
(
marker
);
prob
.
removeMarker
(
marker
);
return
report_errors
();
}
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