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
iwr
amdis
Commits
f024b3cb
Commit
f024b3cb
authored
Oct 27, 2016
by
Praetorius, Simon
Browse files
petsc api changes put into separate namespace
parent
8c4548a8
Changes
13
Hide whitespace changes
Inline
Side-by-side
AMDiS/src/parallel/PetscHelper.cc
View file @
f024b3cb
...
...
@@ -304,16 +304,12 @@ namespace AMDiS
PCSetFromOptions
(
pc
);
#ifndef NDEBUG
MSG
(
"PetscOptionsView:
\n
"
);
PetscViewer
viewer
;
PetscViewerCreate
(
PETSC_COMM_WORLD
,
&
viewer
);
PetscViewerSetType
(
viewer
,
PETSCVIEWERASCII
);
#if (PETSC_VERSION_MINOR >= 7)
PetscOptionsView
(
PETSC_NULL
,
viewer
);
#else
PetscOptionsView
(
viewer
);
#endif
PetscViewerDestroy
(
&
viewer
);
MSG
(
"PetscOptionsView:
\n
"
);
PetscViewer
viewer
;
PetscViewerCreate
(
PETSC_COMM_WORLD
,
&
viewer
);
PetscViewerSetType
(
viewer
,
PETSCVIEWERASCII
);
petsc
::
options_view
(
viewer
);
PetscViewerDestroy
(
&
viewer
);
#endif
}
...
...
@@ -334,19 +330,15 @@ namespace AMDiS
void
createSolver
(
MPI
::
Intracomm
comm
,
KSP
&
ksp
,
Mat
m
,
std
::
string
kspPrefix
,
int
info
)
{
KSPCreate
(
comm
,
&
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
);
KSPSetTolerances
(
ksp
,
0.0
,
1e-8
,
PETSC_DEFAULT
,
PETSC_DEFAULT
);
KSPSetType
(
ksp
,
KSPBCGS
);
KSPSetOptionsPrefix
(
ksp
,
kspPrefix
.
c_str
());
if
(
info
>=
10
)
KSPM
onitor
S
et
(
ksp
,
PETSC_MONITOR_CAST
(
KSPMonitorDefault
),
PETSC_NULL
,
PETSC_NULL
);
petsc
::
ksp_m
onitor
_s
et
(
ksp
,
KSPMonitorDefault
);
else
if
(
info
>=
20
)
KSPM
onitor
S
et
(
ksp
,
PETSC_MONITOR_CAST
(
KSPMonitorTrueResidualNorm
)
,
PETSC_NULL
,
PETSC_NULL
)
;
petsc
::
ksp_m
onitor
_s
et
(
ksp
,
KSPMonitorTrueResidualNorm
);
}
}
// end namespace petsc_helper
...
...
AMDiS/src/parallel/PetscHelper.h
View file @
f024b3cb
...
...
@@ -31,13 +31,6 @@
#include
<petsc.h>
#include
"AMDiS_fwd.h"
#if (PETSC_VERSION_MINOR >= 7)
#define PETSC_MONITOR_CAST(...) \
(PetscErrorCode (*)(KSP,PetscInt,PetscReal,void*))(__VA_ARGS__)
#else
#define PETSC_MONITOR_CAST(...) __VA_ARGS__
#endif
namespace
AMDiS
{
namespace
Parallel
...
...
@@ -126,7 +119,82 @@ namespace AMDiS
void
createSolver
(
MPI
::
Intracomm
comm
,
KSP
&
ksp
,
Mat
m
,
std
::
string
kspPrefix
=
""
,
int
info
=
0
);
}
// end namespace petsc_helper
}
// end namespace Parallel
// functions for PETSc API changes
namespace
petsc
{
inline
PetscErrorCode
options_view
(
etscViewer
viewer
)
{
#if (PETSC_VERSION_MINOR >= 7)
return
PetscOptionsView
(
PETSC_NULL
,
PetscViewer
);
#else
return
PetscOptionsView
(
PetscViewer
);
#endif
}
inline
PetscErrorCode
options_insert_string
(
const
char
in_str
[])
{
#if (PETSC_VERSION_MINOR >= 7)
return
PetscOptionsInsertString
(
PETSC_NULL
,
in_str
);
#else
return
PetscOptionsInsertString
(
in_str
);
#endif
}
inline
PetscErrorCode
ksp_set_operators
(
KSP
ksp
,
Mat
Amat
,
Mat
Pmat
)
{
#if (PETSC_VERSION_MINOR >= 5)
return
KSPSetOperators
(
ksp
,
Amat
,
Pmat
);
#else
return
KSPSetOperators
(
ksp
,
Amat
,
Pmat
,
SAME_NONZERO_PATTERN
);
#endif
}
inline
PetscErrorCode
ksp_get_operators
(
KSP
ksp
,
Mat
Amat
,
Mat
Pmat
)
{
#if (PETSC_VERSION_MINOR >= 5)
return
KSPGetOperators
(
ksp
,
Amat
,
Pmat
);
#else
return
KSPGetOperators
(
ksp
,
Amat
,
Pmat
,
SAME_NONZERO_PATTERN
);
#endif
}
template
<
class
Monitor
>
inline
PetscErrorCode
ksp_monitor_set
(
KSP
ksp
,
Monitor
monitor
)
{
#if (PETSC_VERSION_MINOR >= 7)
PetscViewerAndFormat
*
vf
;
PetscErrorCode
ierr
;
ierr
=
PetscViewerAndFormatCreate
(
PETSC_VIEWER_STDOUT_WORLD
,
PETSC_VIEWER_DEFAULT
,
&
vf
);
CHKERRQ
(
ierr
);
ierr
=
KSPMonitorSet
(
ksp
,(
PetscErrorCode
(
*
)(
KSP
,
PetscInt
,
PetscReal
,
void
*
))
monitor
,
vf
,(
PetscErrorCode
(
*
)(
void
**
))
PetscViewerAndFormatDestroy
);
CHKERRQ
(
ierr
);
return
ierr
;
#else
return
KSPMonitorSet
(
ksp
,
monitor
,
PETSC_NULL
,
PETSC_NULL
);
#endif
}
inline
PetscErrorCode
mat_create_vecs
(
Mat
mat
,
Vec
*
right
,
Vec
*
left
)
{
#if (PETSC_VERSION_MINOR >= 6)
return
MatCreateVecs
(
mat
,
right
,
left
);
#else
return
MatGetVecs
(
mat
,
right
,
left
);
#endif
}
inline
PetscErrorCode
mat_nullspace_remove
(
MatNullSpace
sp
,
Vec
vec
)
{
#if (PETSC_VERSION_MINOR >= 5)
return
MatNullSpaceRemove
(
sp
,
vec
);
#else
return
MatNullSpaceRemove
(
sp
,
vec
,
PETSC_NULL
);
#endif
}
}
// end namespace petsc
}
// end namespace AMDiS
#endif
AMDiS/src/parallel/PetscSolver.cc
View file @
f024b3cb
...
...
@@ -49,7 +49,7 @@ namespace AMDiS { namespace Parallel {
Parameters
::
get
(
name
+
"->ksp"
,
kspStr
);
if
(
kspStr
!=
""
)
petsc
_
options_insert_string
(
kspStr
.
c_str
());
petsc
::
options_insert_string
(
kspStr
.
c_str
());
Parameters
::
get
(
name
+
"->remove rhs null space"
,
removeRhsNullspace
);
Parameters
::
get
(
name
+
"->has constant null space"
,
hasConstantNullspace
);
...
...
AMDiS/src/parallel/PetscSolverCahnHilliard.cc
View file @
f024b3cb
...
...
@@ -85,15 +85,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
,
"ch_"
,
KSPFGMRES
,
PCNONE
,
getRelative
(),
getTolerance
(),
getMaxIterations
());
KSPSetFromOptions
(
ksp
);
...
...
AMDiS/src/parallel/PetscSolverCahnHilliard2.cc
View file @
f024b3cb
...
...
@@ -67,11 +67,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
,
1
);
{
PC
pc
;
...
...
@@ -117,15 +113,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
,
"ch_"
,
KSPFGMRES
,
PCNONE
,
getRelative
(),
getTolerance
(),
getMaxIterations
());
if
(
useOldInitialGuess
)
...
...
AMDiS/src/parallel/PetscSolverFeti.cc
View file @
f024b3cb
...
...
@@ -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 @
f024b3cb
...
...
@@ -150,11 +150,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 @
f024b3cb
...
...
@@ -50,15 +50,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 +70,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 +95,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 +329,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 +452,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 +605,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 +881,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 +894,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 +907,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 @
f024b3cb
...
...
@@ -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 @
f024b3cb
...
...
@@ -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 @
f024b3cb
...
...
@@ -293,11 +293,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 @
f024b3cb
...
...
@@ -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
);