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
iwr
amdis
Commits
1e0015b3
Commit
1e0015b3
authored
Oct 30, 2016
by
Praetorius, Simon
Browse files
Merge branch 'master' of
https://gitlab.math.tu-dresden.de/iwr/amdis
parents
6a705e50
1ded5c55
Pipeline
#606
passed with stages
in 79 minutes and 29 seconds
Changes
57
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
AMDiS/src/parallel/PetscSolverFeti.cc
View file @
1e0015b3
...
...
@@ -1051,11 +1051,7 @@ namespace AMDiS { namespace Parallel {
}
KSPCreate
(
domainComm
,
&
ksp_schur_primal
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
ksp_schur_primal
,
mat_schur_primal
,
mat_schur_primal
);
#else
KSPSetOperators
(
ksp_schur_primal
,
mat_schur_primal
,
mat_schur_primal
,
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
ksp_schur_primal
,
mat_schur_primal
,
mat_schur_primal
);
KSPSetOptionsPrefix
(
ksp_schur_primal
,
"schur_primal_"
);
KSPSetType
(
ksp_schur_primal
,
KSPGMRES
);
KSPSetFromOptions
(
ksp_schur_primal
);
...
...
@@ -1075,11 +1071,7 @@ namespace AMDiS { namespace Parallel {
// === Create KSP solver object and set appropriate solver options. ===
KSPCreate
(
domainComm
,
&
ksp_schur_primal
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
ksp_schur_primal
,
mat_schur_primal
,
mat_schur_primal
);
#else
KSPSetOperators
(
ksp_schur_primal
,
mat_schur_primal
,
mat_schur_primal
,
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
ksp_schur_primal
,
mat_schur_primal
,
mat_schur_primal
);
KSPSetOptionsPrefix
(
ksp_schur_primal
,
"schur_primal_"
);
KSPSetType
(
ksp_schur_primal
,
KSPPREONLY
);
PC
pc_schur_primal
;
...
...
@@ -1365,11 +1357,7 @@ namespace AMDiS { namespace Parallel {
}
KSPCreate
(
domainComm
,
&
ksp_feti
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
ksp_feti
,
mat_feti
,
mat_feti
);
#else
KSPSetOperators
(
ksp_feti
,
mat_feti
,
mat_feti
,
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
ksp_feti
,
mat_feti
,
mat_feti
);
KSPSetOptionsPrefix
(
ksp_feti
,
"feti_"
);
KSPSetType
(
ksp_feti
,
KSPGMRES
);
KSPSetTolerances
(
ksp_feti
,
0
,
1e-8
,
1e+3
,
1000
);
...
...
@@ -1382,9 +1370,9 @@ namespace AMDiS { namespace Parallel {
Parameters
::
get
(
name
+
"->feti->monitor"
,
monitor
);
if
(
monitor
)
{
if
(
stokesMode
)
KSPM
onitor
S
et
(
ksp_feti
,
PETSC_MONITOR_CAST
(
KSPMonitorFetiStokes
)
,
&
fetiKspData
,
PETSC_NULL
)
;
petsc
::
ksp_m
onitor
_s
et
(
ksp_feti
,
KSPMonitorFetiStokes
);
else
KSPM
onitor
S
et
(
ksp_feti
,
PETSC_MONITOR_CAST
(
KSPMonitorTrueResidualNorm
)
,
PETSC_NULL
,
PETSC_NULL
)
;
petsc
::
ksp_m
onitor
_s
et
(
ksp_feti
,
KSPMonitorTrueResidualNorm
);
}
...
...
@@ -1443,11 +1431,7 @@ namespace AMDiS { namespace Parallel {
(
void
(
*
)(
void
))
petscMultMatFetiInexact
);
KSPCreate
(
domainComm
,
&
ksp_feti
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
ksp_feti
,
mat_feti
,
mat_feti
);
#else
KSPSetOperators
(
ksp_feti
,
mat_feti
,
mat_feti
,
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
ksp_feti
,
mat_feti
,
mat_feti
);
KSPSetOptionsPrefix
(
ksp_feti
,
"feti_"
);
KSPSetType
(
ksp_feti
,
KSPGMRES
);
KSPSetTolerances
(
ksp_feti
,
0
,
1e-8
,
1e+3
,
1000
);
...
...
@@ -1464,11 +1448,7 @@ namespace AMDiS { namespace Parallel {
createVec
(
localDofMap
,
fetiInexactPreconData
.
tmp_vec_b0
);
KSPCreate
(
domainComm
,
&
(
fetiInexactPreconData
.
ksp_pc_feti
));
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
fetiInexactPreconData
.
ksp_pc_feti
,
mat_lagrange
,
mat_lagrange
);
#else
KSPSetOperators
(
fetiInexactPreconData
.
ksp_pc_feti
,
mat_lagrange
,
mat_lagrange
,
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
fetiInexactPreconData
.
ksp_pc_feti
,
mat_lagrange
,
mat_lagrange
);
KSPGetPC
(
fetiInexactPreconData
.
ksp_pc_feti
,
&
(
fetiInexactPreconData
.
pc_feti
));
createFetiPreconLumped
(
fetiInexactPreconData
.
pc_feti
);
...
...
@@ -1505,17 +1485,11 @@ namespace AMDiS { namespace Parallel {
VecCreateMPI
(
meshDistributor
->
getMeshLevelData
().
getMpiComm
(
meshLevel
),
localDofMap
.
getRankDofs
(),
nGlobalOverallInterior
,
&
(
lumpedData
->
tmp_vec_b0
));
#if (PETSC_VERSION_MINOR >= 6)
MatCreateVecs
(
mat_duals_duals
,
PETSC_NULL
,
&
(
lumpedData
->
tmp_vec_duals0
));
MatCreateVecs
(
mat_duals_duals
,
PETSC_NULL
,
&
(
lumpedData
->
tmp_vec_duals1
));
#else
MatGetVecs
(
mat_duals_duals
,
PETSC_NULL
,
&
(
lumpedData
->
tmp_vec_duals0
));
MatGetVecs
(
mat_duals_duals
,
PETSC_NULL
,
&
(
lumpedData
->
tmp_vec_duals1
));
#endif
petsc
::
mat_create_vecs
(
mat_duals_duals
,
PETSC_NULL
,
&
(
lumpedData
->
tmp_vec_duals0
));
petsc
::
mat_create_vecs
(
mat_duals_duals
,
PETSC_NULL
,
&
(
lumpedData
->
tmp_vec_duals1
));
for
(
int
component
=
0
;
component
<
static_cast
<
int
>
(
componentSpaces
.
size
());
component
++
)
{
...
...
@@ -1607,11 +1581,7 @@ namespace AMDiS { namespace Parallel {
(
"Stokes mode does not yet support the Dirichlet precondition!
\n
"
);
KSPCreate
(
PETSC_COMM_SELF
,
&
ksp_interior
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
ksp_interior
,
mat_interior_interior
,
mat_interior_interior
);
#else
KSPSetOperators
(
ksp_interior
,
mat_interior_interior
,
mat_interior_interior
,
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
ksp_interior
,
mat_interior_interior
,
mat_interior_interior
);
KSPSetOptionsPrefix
(
ksp_interior
,
"precon_interior_"
);
KSPSetType
(
ksp_interior
,
KSPPREONLY
);
PC
pc_interior
;
...
...
@@ -1635,21 +1605,13 @@ namespace AMDiS { namespace Parallel {
VecCreateMPI
(
meshDistributor
->
getMeshLevelData
().
getMpiComm
(
meshLevel
),
localDofMap
.
getRankDofs
(),
nGlobalOverallInterior
,
&
(
fetiDirichletPreconData
.
tmp_vec_b
));
#if (PETSC_VERSION_MINOR >= 6)
MatCreateVecs
(
mat_duals_duals
,
PETSC_NULL
,
&
(
fetiDirichletPreconData
.
tmp_vec_duals0
));
MatCreateVecs
(
mat_duals_duals
,
PETSC_NULL
,
&
(
fetiDirichletPreconData
.
tmp_vec_duals1
));
MatCreateVecs
(
mat_interior_interior
,
PETSC_NULL
,
&
(
fetiDirichletPreconData
.
tmp_vec_interior
));
#else
MatGetVecs
(
mat_duals_duals
,
PETSC_NULL
,
petsc
::
mat_create_vecs
(
mat_duals_duals
,
PETSC_NULL
,
&
(
fetiDirichletPreconData
.
tmp_vec_duals0
));
MatGetV
ecs
(
mat_duals_duals
,
PETSC_NULL
,
petsc
::
mat_create_v
ecs
(
mat_duals_duals
,
PETSC_NULL
,
&
(
fetiDirichletPreconData
.
tmp_vec_duals1
));
MatGetV
ecs
(
mat_interior_interior
,
PETSC_NULL
,
petsc
::
mat_create_v
ecs
(
mat_interior_interior
,
PETSC_NULL
,
&
(
fetiDirichletPreconData
.
tmp_vec_interior
));
#endif
TEST_EXIT_DBG
(
subDomainIsLocal
)
(
"Should not happen, check usage of localDofMap!
\n
"
);
...
...
@@ -2509,13 +2471,8 @@ namespace AMDiS { namespace Parallel {
Vec
vecRhs
,
vecSol
;
Vec
vecRhsLagrange
,
vecSolLagrange
;
#if (PETSC_VERSION_MINOR >= 6)
MatCreateVecs
(
mat_lagrange
,
PETSC_NULL
,
&
vecRhsLagrange
);
MatCreateVecs
(
mat_lagrange
,
PETSC_NULL
,
&
vecSolLagrange
);
#else
MatGetVecs
(
mat_lagrange
,
PETSC_NULL
,
&
vecRhsLagrange
);
MatGetVecs
(
mat_lagrange
,
PETSC_NULL
,
&
vecSolLagrange
);
#endif
petsc
::
mat_create_vecs
(
mat_lagrange
,
PETSC_NULL
,
&
vecRhsLagrange
);
petsc
::
mat_create_vecs
(
mat_lagrange
,
PETSC_NULL
,
&
vecSolLagrange
);
vecRhs
=
vecRhsLagrange
;
vecSol
=
vecSolLagrange
;
...
...
AMDiS/src/parallel/PetscSolverGlobalBlockMatrix.cc
View file @
1e0015b3
...
...
@@ -20,6 +20,7 @@
#include
"parallel/PetscSolverGlobalBlockMatrix.h"
#include
"parallel/PetscHelper.h"
#include
"parallel/StdMpi.h"
#include
"parallel/MpiHelper.h"
...
...
@@ -150,11 +151,7 @@ namespace AMDiS { namespace Parallel {
FUNCNAME
(
"PetscSolverGlobalBlockMatrix::initSolver()"
);
KSPCreate
(
domainComm
,
&
ksp
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
());
#else
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
(),
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
ksp
,
getMatInterior
(),
getMatInterior
());
KSPSetOptionsPrefix
(
ksp
,
kspPrefix
.
c_str
());
KSPSetFromOptions
(
ksp
);
}
...
...
AMDiS/src/parallel/PetscSolverGlobalMatrix.cc
View file @
1e0015b3
...
...
@@ -22,6 +22,7 @@
// #include "DirichletBC.h"
#include
"DOFVector.h"
#include
"parallel/PetscSolverGlobalMatrix.h"
#include
"parallel/PetscHelper.h"
#include
"parallel/StdMpi.h"
#include
"parallel/MpiHelper.h"
#include
"solver/PetscTypes.h"
...
...
@@ -50,15 +51,15 @@ namespace AMDiS { namespace Parallel {
if
(
params
.
matSolverPackage
.
find
(
kspSolver
)
!=
params
.
matSolverPackage
.
end
())
{
// direct solvers
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_type preonly"
).
c_str
());
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"pc_type lu"
).
c_str
());
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"pc_factor_mat_solver_package "
+
kspSolver
).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_type preonly"
).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"pc_type lu"
).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"pc_factor_mat_solver_package "
+
kspSolver
).
c_str
());
setMaxIterations
(
1
);
zeroStartVector
=
true
;
matSolverPackage
=
true
;
}
else
if
(
params
.
emptyParam
.
find
(
kspSolver
)
==
params
.
emptyParam
.
end
()
&&
solverName
!=
"petsc"
)
{
// other solvers
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_type "
+
kspSolver
).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_type "
+
kspSolver
).
c_str
());
}
// set the preconditioner
...
...
@@ -70,17 +71,17 @@ namespace AMDiS { namespace Parallel {
Parameters
::
get
(
name
+
"->right precon"
,
precon
);
if
(
!
matSolverPackage
&&
params
.
emptyParam
.
find
(
precon
)
==
params
.
emptyParam
.
end
())
{
precon
=
(
params
.
preconMap
.
find
(
precon
)
!=
params
.
preconMap
.
end
()
?
params
.
preconMap
[
precon
]
:
precon
);
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"pc_type "
+
precon
).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"pc_type "
+
precon
).
c_str
());
}
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_max_it "
+
boost
::
lexical_cast
<
std
::
string
>
(
getMaxIterations
())).
c_str
());
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_rtol "
+
boost
::
lexical_cast
<
std
::
string
>
(
getRelative
())).
c_str
());
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_atol "
+
boost
::
lexical_cast
<
std
::
string
>
(
getTolerance
())).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_max_it "
+
boost
::
lexical_cast
<
std
::
string
>
(
getMaxIterations
())).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_rtol "
+
boost
::
lexical_cast
<
std
::
string
>
(
getRelative
())).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_atol "
+
boost
::
lexical_cast
<
std
::
string
>
(
getTolerance
())).
c_str
());
if
(
getInfo
()
>=
20
)
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_monitor_true_residual"
).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_monitor_true_residual"
).
c_str
());
else
if
(
getInfo
()
>=
10
)
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_monitor"
).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_monitor"
).
c_str
());
}
if
(
!
matSolverPackage
)
{
Parameters
::
get
(
name
+
"->use zero start vector"
,
zeroStartVector
);
...
...
@@ -95,11 +96,7 @@ namespace AMDiS { namespace Parallel {
PetscViewer
viewer
;
PetscViewerCreate
(
PETSC_COMM_WORLD
,
&
viewer
);
PetscViewerSetType
(
viewer
,
PETSCVIEWERASCII
);
#if (PETSC_VERSION_MINOR >= 7)
PetscOptionsView
(
PETSC_NULL
,
viewer
);
#else
PetscOptionsView
(
viewer
);
#endif
petsc
::
options_view
(
viewer
);
PetscViewerDestroy
(
&
viewer
);
}
...
...
@@ -333,11 +330,7 @@ namespace AMDiS { namespace Parallel {
// === Create solver for the non primal (thus local) variables. ===
KSPCreate
(
domainComm
,
&
kspInterior
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
kspInterior
,
getMatInterior
(),
getMatInterior
());
#else
KSPSetOperators
(
kspInterior
,
getMatInterior
(),
getMatInterior
(),
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
kspInterior
,
getMatInterior
(),
getMatInterior
());
KSPSetOptionsPrefix
(
kspInterior
,
"interior_"
);
KSPSetType
(
kspInterior
,
KSPPREONLY
);
KSPGetPC
(
kspInterior
,
&
pcInterior
);
...
...
@@ -460,11 +453,7 @@ namespace AMDiS { namespace Parallel {
TEST_EXIT_DBG
(
coarseSpaceMap
.
empty
())(
"Not supported!
\n
"
);
MSG
(
"Remove nullspace from rhs vector.
\n
"
);
#if (PETSC_VERSION_MINOR >= 5)
MatNullSpaceRemove
(
matNullspace
,
getVecRhsInterior
());
#else
MatNullSpaceRemove
(
matNullspace
,
getVecRhsInterior
(),
PETSC_NULL
);
#endif
petsc
::
mat_nullspace_remove
(
matNullspace
,
getVecRhsInterior
());
}
}
else
{
TEST_EXIT
(
removeRhsNullspace
==
false
)
...
...
@@ -617,11 +606,7 @@ namespace AMDiS { namespace Parallel {
void
PetscSolverGlobalMatrix
::
initSolver
(
KSP
&
ksp
)
{
KSPCreate
(
domainComm
,
&
ksp
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
());
#else
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
(),
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
ksp
,
getMatInterior
(),
getMatInterior
());
KSPSetTolerances
(
ksp
,
0.0
,
1e-8
,
PETSC_DEFAULT
,
PETSC_DEFAULT
);
KSPSetType
(
ksp
,
KSPBCGS
);
KSPSetOptionsPrefix
(
ksp
,
kspPrefix
.
c_str
());
...
...
@@ -897,11 +882,7 @@ namespace AMDiS { namespace Parallel {
if
(
test
)
{
Vec
tmp
;
#if (PETSC_VERSION_MINOR >= 6)
MatCreateVecs
(
getMatInterior
(),
&
tmp
,
PETSC_NULL
);
#else
MatGetVecs
(
getMatInterior
(),
&
tmp
,
PETSC_NULL
);
#endif
petsc
::
mat_create_vecs
(
getMatInterior
(),
&
tmp
,
PETSC_NULL
);
MatMult
(
getMatInterior
(),
nullSpaceBasis
,
tmp
);
PetscReal
n
;
VecNorm
(
tmp
,
NORM_2
,
&
n
);
...
...
@@ -914,11 +895,7 @@ namespace AMDiS { namespace Parallel {
MatNullSpaceCreate
(
domainComm
,
PETSC_FALSE
,
1
,
&
nullSpaceBasis
,
&
matNullSpace
);
Mat
amat
,
pmat
;
#if (PETSC_VERSION_MINOR >= 5)
KSPGetOperators
(
ksp
,
&
amat
,
&
pmat
);
#else
KSPGetOperators
(
ksp
,
&
amat
,
&
pmat
,
PETSC_NULL
);
#endif
petsc
::
ksp_get_operators
(
ksp
,
&
amat
,
&
pmat
);
MatSetNullSpace
(
amat
,
matNullSpace
);
MatNullSpaceDestroy
(
&
matNullSpace
);
...
...
@@ -931,11 +908,7 @@ namespace AMDiS { namespace Parallel {
MatNullSpace
matNullSpace
;
MatNullSpaceCreate
(
domainComm
,
PETSC_TRUE
,
0
,
PETSC_NULL
,
&
matNullSpace
);
Mat
amat
,
pmat
;
#if (PETSC_VERSION_MINOR >= 5)
KSPGetOperators
(
ksp
,
&
amat
,
&
pmat
);
#else
KSPGetOperators
(
ksp
,
&
amat
,
&
pmat
,
PETSC_NULL
);
#endif
petsc
::
ksp_get_operators
(
ksp
,
&
amat
,
&
pmat
);
MatSetNullSpace
(
amat
,
matNullSpace
);
MatNullSpaceDestroy
(
&
matNullSpace
);
}
...
...
AMDiS/src/parallel/PetscSolverNSCH.cc
View file @
1e0015b3
...
...
@@ -184,12 +184,8 @@ namespace AMDiS { namespace Parallel {
// Create FGMRES based outer solver
MSG
(
"CREATE POS 1: %p
\n
"
,
&
ksp
);
KSPCreate
(
domainComm
,
&
ksp
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
());
#else
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
(),
SAME_NONZERO_PATTERN
);
#endif
KSPMonitorSet
(
ksp
,
PETSC_MONITOR_CAST
(
KSPMonitorTrueResidualNorm
),
PETSC_NULL
,
PETSC_NULL
);
petsc
::
ksp_set_operators
(
ksp
,
getMatInterior
(),
getMatInterior
());
petsc
::
ksp_monitor_set
(
ksp
,
KSPMonitorTrueResidualNorm
);
petsc_helper
::
setSolver
(
ksp
,
"ch_"
,
KSPFGMRES
,
PCSHELL
,
getRelative
(),
getTolerance
(),
getMaxIterations
());
setConstantNullSpace
(
ksp
,
componentSpaces
[
0
]
->
getMesh
()
->
getDim
()
,
true
);
}
...
...
@@ -337,12 +333,7 @@ namespace AMDiS { namespace Parallel {
///erstelle kspVelocity
KSPCreate
((
meshDistributor
->
getMpiComm
(
0
)),
&
(
matShellContext
.
kspVelocity
));
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
matShellContext
.
kspVelocity
,
matShellContext
.
velocityMat
,
matShellContext
.
velocityMat
);
#else
KSPSetOperators
(
matShellContext
.
kspVelocity
,
matShellContext
.
velocityMat
,
matShellContext
.
velocityMat
,
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
matShellContext
.
kspVelocity
,
matShellContext
.
velocityMat
,
matShellContext
.
velocityMat
);
///regularisiere LaplaceMatrix
if
(
regularizeLaplace
)
...
...
@@ -351,11 +342,7 @@ namespace AMDiS { namespace Parallel {
rows
[
0
]
=
0
;
MatZeroRows
(
laplaceMatrixSolver
->
getMatInterior
(),
1
,
rows
,
0
,
PETSC_NULL
,
PETSC_NULL
);
KSPCreate
((
meshDistributor
->
getMpiComm
(
0
)),
&
(
matShellContext
.
kspLaplace
));
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
matShellContext
.
kspLaplace
,
laplaceMatrixSolver
->
getMatInterior
(),
laplaceMatrixSolver
->
getMatInterior
());
#else
KSPSetOperators
(
matShellContext
.
kspLaplace
,
laplaceMatrixSolver
->
getMatInterior
(),
laplaceMatrixSolver
->
getMatInterior
(),
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
matShellContext
.
kspLaplace
,
laplaceMatrixSolver
->
getMatInterior
(),
laplaceMatrixSolver
->
getMatInterior
());
}
else
{
matShellContext
.
kspLaplace
=
laplaceMatrixSolver
->
getSolver
();
...
...
AMDiS/src/parallel/PetscSolverNavierStokes.cc
View file @
1e0015b3
...
...
@@ -117,15 +117,11 @@ namespace AMDiS { namespace Parallel {
MSG
(
"CREATE POS 1: %p
\n
"
,
&
ksp
);
KSPCreate
(
domainComm
,
&
ksp
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
());
#else
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
(),
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
ksp
,
getMatInterior
(),
getMatInterior
());
if
(
getInfo
()
>=
10
)
KSPM
onitor
S
et
(
ksp
,
PETSC_MONITOR_CAST
(
KSPMonitorDefault
),
PETSC_NULL
,
PETSC_NULL
);
petsc
::
ksp_m
onitor
_s
et
(
ksp
,
KSPMonitorDefault
);
else
if
(
getInfo
()
>=
20
)
KSPM
onitor
S
et
(
ksp
,
PETSC_MONITOR_CAST
(
KSPMonitorTrueResidualNorm
)
,
PETSC_NULL
,
PETSC_NULL
)
;
petsc
::
ksp_m
onitor
_s
et
(
ksp
,
KSPMonitorTrueResidualNorm
);
petsc_helper
::
setSolver
(
ksp
,
"ns_"
,
KSPFGMRES
,
PCNONE
,
getRelative
(),
getTolerance
(),
getMaxIterations
());
// Create null space information.
...
...
AMDiS/src/parallel/PetscSolverSchur.cc
View file @
1e0015b3
...
...
@@ -20,6 +20,7 @@
#include
"parallel/PetscSolverSchur.h"
#include
"parallel/PetscHelper.h"
#include
"parallel/StdMpi.h"
#include
"parallel/MpiHelper.h"
...
...
@@ -293,11 +294,7 @@ namespace AMDiS { namespace Parallel {
KSPCreate
(
domainComm
,
&
kspInterior
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
kspInterior
,
getMatInterior
(),
getMatInterior
());
#else
KSPSetOperators
(
kspInterior
,
getMatInterior
(),
getMatInterior
(),
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
kspInterior
,
getMatInterior
(),
getMatInterior
());
KSPSetTolerances
(
kspInterior
,
0.0
,
1e-8
,
PETSC_DEFAULT
,
PETSC_DEFAULT
);
KSPSetFromOptions
(
kspInterior
);
...
...
AMDiS/src/solver/PetscSolver.hh
View file @
1e0015b3
...
...
@@ -47,30 +47,30 @@ namespace AMDiS {
if
(
params
.
matSolverPackage
[
kspSolver
])
{
// direct solvers
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_type preonly"
).
c_str
());
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"pc_type lu"
).
c_str
());
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"pc_factor_mat_solver_package "
+
(
kspSolver
!=
"direct"
?
kspSolver
:
"umfpack"
)).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_type preonly"
).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"pc_type lu"
).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"pc_factor_mat_solver_package "
+
(
kspSolver
!=
"direct"
?
kspSolver
:
"umfpack"
)).
c_str
());
oem
.
setMaxIterations
(
1
);
zeroStartVector
=
true
;
matSolverPackage
=
true
;
}
else
if
(
!
params
.
emptyParam
[
kspSolver
])
{
// other solvers
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_type "
+
kspSolver
).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_type "
+
kspSolver
).
c_str
());
}
// set the preconditioner
setPrecon
();
if
(
oem
.
getInfo
()
>=
20
)
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_monitor_true_residual"
).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_monitor_true_residual"
).
c_str
());
else
if
(
oem
.
getInfo
()
>=
10
)
petsc
_
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_monitor"
).
c_str
());
petsc
::
options_insert_string
((
"-"
+
kspPrefix
+
"ksp_monitor"
).
c_str
());
// command line string
std
::
string
kspString
=
""
;
Parameters
::
get
(
oem
.
getName
()
+
"->ksp"
,
kspString
);
if
(
kspString
!=
""
)
petsc
_
options_insert_string
(
kspString
.
c_str
());
petsc
::
options_insert_string
(
kspString
.
c_str
());
}
...
...
@@ -128,11 +128,7 @@ namespace AMDiS {
void
PetscRunner
<
M
,
V
>::
createSubSolver
(
KSP
&
ksp_
,
Mat
m
,
std
::
string
kspPrefix_
)
{
KSPCreate
(
PETSC_COMM_SELF
,
&
ksp_
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
ksp_
,
m
,
m
);
#else
KSPSetOperators
(
ksp_
,
m
,
m
,
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
ksp_
,
m
,
m
);
KSPSetOptionsPrefix
(
ksp_
,
kspPrefix_
.
c_str
());
KSPSetFromOptions
(
ksp_
);
}
...
...
AMDiS/src/solver/PetscTypes.h
View file @
1e0015b3
...
...
@@ -144,16 +144,6 @@ namespace AMDiS {
void
operator
>>
(
const
PetscVectorNested
&
dest
,
VecMap
<
SystemVector
,
Mapper
>&
rhs
);
inline
PetscErrorCode
petsc_options_insert_string
(
const
char
in_str
[])
{
#if (PETSC_VERSION_MINOR >= 7)
return
PetscOptionsInsertString
(
NULL
,
in_str
);
#else
return
PetscOptionsInsertString
(
in_str
);
#endif
}
}
// end namespace AMDiS
#include
"solver/PetscTypes.hh"
...
...
AMDiS/src/traits/basic.hpp
View file @
1e0015b3
...
...
@@ -35,7 +35,7 @@
#include
<boost/utility/enable_if.hpp>
#endif
#if HAS_CXX11
#if
AMDIS_
HAS_CXX11
#include
<type_traits>
#endif
...
...
@@ -45,7 +45,7 @@ namespace AMDiS
// introduce some shortcuts for boost::mpl
// ---------------------------------------
#if HAS_CXX11
#if
AMDIS_
HAS_CXX11
template
<
bool
B
>
using
bool_
=
std
::
integral_constant
<
bool
,
B
>
;
...
...
extensions/demo/cahn_hilliard/src/PetscSolverCahnHilliard_DD.cc
View file @
1e0015b3
...
...
@@ -68,11 +68,7 @@ namespace AMDiS { namespace Parallel {
/// create new solver for S
KSP
kspS
;
KSPCreate
(
*
data
->
mpiCommGlobal
,
&
kspS
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
kspS
,
S
,
S
);
#else
KSPSetOperators
(
kspS
,
S
,
S
,
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
kspS
,
S
,
S
);
petsc_helper
::
setSolver
(
kspS
,
"S_"
,
KSPFGMRES
,
PCSHELL
,
1e-6
,
1e-8
,
5
);
{
PC
pc
;
...
...
@@ -118,15 +114,11 @@ namespace AMDiS { namespace Parallel {
MSG
(
"CREATE POS 1: %p
\n
"
,
&
ksp
);
KSPCreate
(
domainComm
,
&
ksp
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
());
#else
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
(),
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
ksp
,
getMatInterior
(),
getMatInterior
());
if
(
getInfo
()
>=
10
)
KSPM
onitor
S
et
(
ksp
,
KSPMonitorDefault
,
PETSC_NULL
,
PETSC_NULL
);
petsc
::
ksp_m
onitor
_s
et
(
ksp
,
KSPMonitorDefault
);
else
if
(
getInfo
()
>=
20
)
KSPM
onitor
S
et
(
ksp
,
KSPMonitorTrueResidualNorm
,
PETSC_NULL
,
PETSC_NULL
);
petsc
::
ksp_m
onitor
_s
et
(
ksp
,
KSPMonitorTrueResidualNorm
);
petsc_helper
::
setSolver
(
ksp
,
"ch_"
,
KSPFGMRES
,
PCNONE
,
getRelative
(),
getTolerance
(),
getMaxIterations
());
if
(
useOldInitialGuess
)
...
...
extensions/preconditioner/PetscSolverNavierStokes2.cc
View file @
1e0015b3
...
...
@@ -133,15 +133,11 @@ namespace AMDiS { namespace Parallel {
{
// Create FGMRES based outer solver
KSPCreate
(
domainComm
,
&
ksp
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
());
#else
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
(),
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
ksp
,
getMatInterior
(),
getMatInterior
());
if
(
getInfo
()
>=
10
)
KSPM
onitor
S
et
(
ksp
,
PETSC_MONITOR_CAST
(
KSPMonitorDefault
),
PETSC_NULL
,
PETSC_NULL
);
petsc
::
ksp_m
onitor
_s
et
(
ksp
,
KSPMonitorDefault
);
else
if
(
getInfo
()
>=
20
)
KSPM
onitor
S
et
(
ksp
,
PETSC_MONITOR_CAST
(
KSPMonitorTrueResidualNorm
)
,
PETSC_NULL
,
PETSC_NULL
)
;
petsc
::
ksp_m
onitor
_s
et
(
ksp
,
KSPMonitorTrueResidualNorm
);
petsc_helper
::
setSolver
(
ksp
,
"ns_"
,
KSPFGMRES
,
PCNONE
,
getRelative
(),
getTolerance
(),
getMaxIterations
());
// Create null space information.
...
...
extensions/preconditioner/PetscSolverPfc.cc
View file @
1e0015b3
...
...
@@ -78,15 +78,11 @@ namespace AMDiS { namespace Parallel {
{
// Create FGMRES based outer solver
KSPCreate
(
meshDistributor
->
getMpiComm
(
0
),
&
ksp
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
());
#else
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
(),
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
ksp
,
getMatInterior
(),
getMatInterior
());
if
(
getInfo
()
>=
10
)
KSPM
onitor
S
et
(
ksp
,
PETSC_MONITOR_CAST
(
KSPMonitorDefault
),
PETSC_NULL
,
PETSC_NULL
);
petsc
::
ksp_m
onitor
_s
et
(
ksp
,
KSPMonitorDefault
);
else
if
(
getInfo
()
>=
20
)
KSPM
onitor
S
et
(
ksp
,
PETSC_MONITOR_CAST
(
KSPMonitorTrueResidualNorm
)
,
PETSC_NULL
,
PETSC_NULL
)
;
petsc
::
ksp_m
onitor
_s
et
(
ksp
,
KSPMonitorTrueResidualNorm
);
petsc_helper
::
setSolver
(
ksp
,
"pfc_"
,
KSPFGMRES
,
PCNONE
,
getRelative
(),
getTolerance
(),
getMaxIterations
());
KSPSetFromOptions
(
ksp
);
...
...
extensions/preconditioner/PetscSolverPfc_diag.cc
View file @
1e0015b3
...
...
@@ -76,15 +76,11 @@ namespace AMDiS { namespace Parallel {
{
// Create FGMRES based outer solver
KSPCreate
(
meshDistributor
->
getMpiComm
(
0
),
&
ksp
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
());
#else
KSPSetOperators
(
ksp
,
getMatInterior
(),
getMatInterior
(),
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
ksp
,
getMatInterior
(),
getMatInterior
());
if
(
getInfo
()
>=
10
)
KSPM
onitor
S
et
(
ksp
,
PETSC_MONITOR_CAST
(
KSPMonitorDefault
),
PETSC_NULL
,
PETSC_NULL
);
petsc
::
ksp_m
onitor
_s
et
(
ksp
,
KSPMonitorDefault
);
else
if
(
getInfo
()
>=
20
)
KSPM
onitor
S
et
(
ksp
,
PETSC_MONITOR_CAST
(
KSPMonitorTrueResidualNorm
)
,
PETSC_NULL
,
PETSC_NULL
)
;
petsc
::
ksp_m
onitor
_s
et
(
ksp
,
KSPMonitorTrueResidualNorm
);
petsc_helper
::
setSolver
(
ksp
,
"pfc_"
,
KSPFGMRES
,
PCNONE
,
getRelative
(),
getTolerance
(),
getMaxIterations
());
KSPSetFromOptions
(
ksp
);
...
...
@@ -167,11 +163,7 @@ namespace AMDiS { namespace Parallel {
VecDestroy
(
&
x
);
MatDestroy
(
&
DK
);
#if (PETSC_VERSION_MINOR >= 5)
KSPSetOperators
(
data
.
kspS
,
matS
,
matS
);
#else
KSPSetOperators
(
data
.
kspS
,
matS
,
matS
,
SAME_NONZERO_PATTERN
);
#endif
petsc
::
ksp_set_operators
(
data
.
kspS
,
matS
,
matS
);
// === Setup preconditioner data ===