Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
D
dune-solvers
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
agnumpde
dune-solvers
Commits
bad7fc61
Commit
bad7fc61
authored
May 29, 2017
by
Max Kahnt
Browse files
Options
Downloads
Patches
Plain Diff
Make LocalSolvers have an explicit type.
parent
36d177a6
No related branches found
No related tags found
1 merge request
!14
Feature/blockgsstep default constructible
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
dune/solvers/iterationsteps/blockgssteps.hh
+78
-40
78 additions, 40 deletions
dune/solvers/iterationsteps/blockgssteps.hh
with
78 additions
and
40 deletions
dune/solvers/iterationsteps/blockgssteps.hh
+
78
−
40
View file @
bad7fc61
...
...
@@ -240,70 +240,108 @@ auto diagRegularize(double p, LocalSolver&& localSolver) {
//! \brief is @LinearSolvers::direct with ignore nodes.
//! \param r Regularization parameter. Set to 0.0 to switch off regularization.
template
<
typename
dummy
=
void
>
auto
direct
(
double
r
=
LocalSolverRegularizer
::
defaultDiagRegularizeParameter
)
{
return
[
r
](
const
auto
&
m
,
const
auto
&
b
,
const
auto
&
ignore
)
{
auto
directSolver
=
LinearSolvers
::
direct
<
std
::
decay_t
<
decltype
(
m
)
>
,
std
::
decay_t
<
decltype
(
b
)
>>
;
struct
Direct
{
Direct
(
double
r
=
LocalSolverRegularizer
::
defaultDiagRegularizeParameter
)
:
r_
(
r
)
{}
template
<
class
M
,
class
V
,
class
I
>
V
operator
()(
const
M
&
m
,
const
V
&
b
,
const
I
&
ignore
)
const
{
auto
directSolver
=
LinearSolvers
::
direct
<
M
,
V
>
;
auto
directTruncatedSolver
=
LocalSolverFromLinearSolver
::
truncateSymmetrically
(
directSolver
);
auto
directTruncatedRegularizedSolver
=
LocalSolverRegularizer
::
diagRegularize
(
r
,
directTruncatedSolver
);
LocalSolverRegularizer
::
diagRegularize
(
r
_
,
directTruncatedSolver
);
return
directTruncatedRegularizedSolver
(
m
,
b
,
ignore
);
}
private
:
double
r_
;
};
template
<
class
...
Args
>
auto
direct
(
Args
&&
...
args
)
{
return
Direct
(
std
::
forward
<
Args
>
(
args
)...);
}
//! \brief is @LinearSolvers::ldlt with ignore nodes.
template
<
typename
dummy
=
void
>
auto
ldlt
(
double
r
=
LocalSolverRegularizer
::
defaultDiagRegularizeParameter
)
{
return
[
r
](
const
auto
&
m
,
const
auto
&
b
,
const
auto
&
ignore
)
{
auto
ldltSolver
=
LinearSolvers
::
ldlt
<
std
::
decay_t
<
decltype
(
m
)
>
,
std
::
decay_t
<
decltype
(
b
)
>>
;
struct
LDLt
{
LDLt
(
double
r
=
LocalSolverRegularizer
::
defaultDiagRegularizeParameter
)
:
r_
(
r
)
{}
template
<
class
M
,
class
V
,
class
I
>
V
operator
()(
const
M
&
m
,
const
V
&
b
,
const
I
&
ignore
)
const
{
auto
ldltSolver
=
LinearSolvers
::
ldlt
<
M
,
V
>
;
auto
ldltTruncatedSolver
=
LocalSolverFromLinearSolver
::
truncateSymmetrically
(
ldltSolver
);
auto
ldltTruncatedRegularizedSolver
=
LocalSolverRegularizer
::
diagRegularize
(
r
,
ldltTruncatedSolver
);
LocalSolverRegularizer
::
diagRegularize
(
r
_
,
ldltTruncatedSolver
);
return
ldltTruncatedRegularizedSolver
(
m
,
b
,
ignore
);
}
private
:
double
r_
;
};
template
<
class
...
Args
>
auto
ldlt
(
Args
&&
...
args
)
{
return
LDLt
(
std
::
forward
<
Args
>
(
args
)...);
}
//! \brief is @LinearSolvers::cg with ignore nodes.
template
<
typename
dummy
=
void
>
auto
cg
(
size_t
maxIter
=
LinearSolvers
::
defaultCgMaxIter
,
struct
CG
{
CG
(
size_t
maxIter
=
LinearSolvers
::
defaultCgMaxIter
,
double
tol
=
LinearSolvers
::
defaultCgTol
,
double
r
=
LocalSolverRegularizer
::
defaultDiagRegularizeParameter
)
{
return
[
maxIter
,
tol
,
r
](
const
auto
&
m
,
const
auto
&
b
,
const
auto
&
ignore
)
{
double
r
=
LocalSolverRegularizer
::
defaultDiagRegularizeParameter
)
:
maxIter_
(
maxIter
)
,
tol_
(
tol
)
,
r_
(
r
)
{}
template
<
class
M
,
class
V
,
class
I
>
V
operator
()(
const
M
&
m
,
const
V
&
b
,
const
I
&
ignore
)
const
{
using
namespace
std
::
placeholders
;
auto
cgSolver
=
std
::
bind
(
LinearSolvers
::
cg
<
std
::
decay_t
<
decltype
(
m
)
>
,
std
::
decay_t
<
decltype
(
b
)
>>
,
_1
,
_2
,
maxIter
,
tol
);
auto
cgTruncatedSolver
=
LocalSolverFromLinearSolver
::
truncateSymmetrically
(
cgSolver
);
auto
cgSolver
=
std
::
bind
(
LinearSolvers
::
cg
<
M
,
V
>
,
_1
,
_2
,
maxIter_
,
tol_
);
auto
cgTruncatedSolver
=
LocalSolverFromLinearSolver
::
truncateSymmetrically
(
cgSolver
);
auto
cgTruncatedRegularizedSolver
=
LocalSolverRegularizer
::
diagRegularize
(
r
,
cgTruncatedSolver
);
LocalSolverRegularizer
::
diagRegularize
(
r
_
,
cgTruncatedSolver
);
return
cgTruncatedRegularizedSolver
(
m
,
b
,
ignore
);
}
private
:
size_t
maxIter_
;
double
tol_
;
double
r_
;
};
template
<
class
...
Args
>
auto
cg
(
Args
&&
...
args
)
{
return
CG
(
std
::
forward
<
Args
>
(
args
)...);
}
/**
* \brief is @LinearSolvers::gs with ignore nodes.
* \param tol Tolerance value for skipping potentially zero diagonal entries
* after regularization.
* \param r Regularization parameter. Set to 0.0 to switch off regularization.
*/
template
<
typename
dummy
=
void
>
auto
gs
(
double
tol
=
LinearSolvers
::
defaultGsTol
,
double
r
=
LocalSolverRegularizer
::
defaultDiagRegularizeParameter
)
{
return
[
tol
,
r
](
const
auto
&
m
,
const
auto
&
b
,
const
auto
&
ignore
)
{
struct
GS
{
GS
(
double
tol
=
LinearSolvers
::
defaultGsTol
,
double
r
=
LocalSolverRegularizer
::
defaultDiagRegularizeParameter
)
:
tol_
(
tol
)
,
r_
(
r
)
{}
template
<
class
M
,
class
V
,
class
I
>
V
operator
()(
const
M
&
m
,
const
V
&
b
,
const
I
&
ignore
)
const
{
using
namespace
std
::
placeholders
;
auto
gsSolver
=
std
::
bind
(
LinearSolvers
::
gs
<
std
::
decay_t
<
decltype
(
m
)
>
,
std
::
decay_t
<
decltype
(
b
)
>>
,
_1
,
_2
,
tol
);
auto
gsSolver
=
std
::
bind
(
LinearSolvers
::
gs
<
M
,
V
>
,
_1
,
_2
,
tol_
);
auto
gsTruncatedSolver
=
LocalSolverFromLinearSolver
::
truncateSymmetrically
(
gsSolver
);
auto
gsTruncatedRegularizedSolver
=
LocalSolverRegularizer
::
diagRegularize
(
r
,
gsTruncatedSolver
);
LocalSolverRegularizer
::
diagRegularize
(
r
_
,
gsTruncatedSolver
);
return
gsTruncatedRegularizedSolver
(
m
,
b
,
ignore
);
}
private
:
double
tol_
;
double
r_
;
};
template
<
class
...
Args
>
auto
gs
(
Args
&&
...
args
)
{
return
GS
(
std
::
forward
<
Args
>
(
args
)...);
}
}
// end namespace LocalSolvers
...
...
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