32 return it::Record(
"Petsc",
"Interface to PETSc solvers. Convergence criteria is:\n" 33 " ```norm( res_n ) < max( norm( res_0 ) * r_tol, a_tol )```\n" 34 "where res_i is the residuum vector after i-th iteration of the solver and res_0 is an estimate of the norm of initial residual.\n" 35 "If the initial guess of the solution is provided (usually only for transient equations) the residual of this estimate is used,\n" 36 "otherwise the norm of preconditioned RHS is used.\n" 37 "The default norm is L2 norm of preconditioned residual: (($ P^{-1}(Ax-b)$)), usage of other norm may be prescribed using the 'option' key.\n" 38 "See also PETSc documentation for KSPSetNormType.")
41 "Relative residual tolerance, (to initial error).")
43 "Absolute residual tolerance.")
45 "Maximum number of outer iterations of the linear solver.")
64 ierr = VecZeroEntries(
rhs_ ); CHKERRV( ierr );
116 OLD_ASSERT(
false,
"Can not set values. Matrix is not preallocated.\n");
134 OLD_ASSERT(
false,
"Can not set values. Matrix is not preallocated.\n");
147 ierr = MatSetValues(
matrix_,nrow,rows,ncol,cols,vals,(InsertMode)
status_); CHKERRV( ierr );
152 default:
DebugOut() <<
"LS SetValues with non allowed insert mode.\n";
165 ierr = VecSetValues(
rhs_,nrow,rows,vals,(InsertMode)
status_); CHKERRV( ierr );
169 default:
OLD_ASSERT(
false,
"LinSys's status disallow set values.\n");
181 for (i=0; i<nrow; i++) {
183 for(j=0; j<ncol; j++) {
186 VecSetValue(
on_vec_,row,1.0,ADD_VALUES);
188 VecSetValue(
off_vec_,row,1.0,ADD_VALUES);
198 PetscInt *on_nz, *off_nz;
199 PetscScalar *on_array, *off_array;
211 VecGetArray(
on_vec_, &on_array );
212 VecGetArray(
off_vec_, &off_array );
215 on_nz[i] =
static_cast<PetscInt
>( on_array[i]+0.1 );
216 off_nz[i] =
static_cast<PetscInt
>( off_array[i]+0.1 );
219 VecRestoreArray(
on_vec_,&on_array);
220 VecRestoreArray(
off_vec_,&off_array);
227 ierr = MatDestroy(&
matrix_); CHKERRV( ierr );
230 0, on_nz, 0, off_nz, &
matrix_); CHKERRV( ierr );
233 MatSetOption(
matrix_, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE);
241 MatAssemblyType assemblyType = MAT_FINAL_ASSEMBLY;
250 WarningOut() <<
"Finalizing linear system without setting values.\n";
253 ierr = MatAssemblyBegin(
matrix_, assembly_type); CHKERRV( ierr );
254 ierr = VecAssemblyBegin(
rhs_); CHKERRV( ierr );
255 ierr = MatAssemblyEnd(
matrix_, assembly_type); CHKERRV( ierr );
256 ierr = VecAssemblyEnd(
rhs_); CHKERRV( ierr );
258 if (assembly_type == MAT_FINAL_ASSEMBLY)
status_ =
DONE;
269 OLD_ASSERT (
status_ ==
DONE,
"System matrix and right-hand side are not assembled when applying constraints." );
272 PetscInt numConstraints =
static_cast<PetscInt
>(
constraints_.size() );
275 const PetscScalar diagScalar =
static_cast<PetscScalar
>( scalar );
281 ConstraintVec_::const_iterator cIter =
constraints_.begin( );
282 ConstraintVec_::const_iterator cEnd =
constraints_.end( );
284 for ( ; cIter != cEnd; ++cIter ) {
285 globalDofs.push_back( static_cast<PetscInt>( cIter -> first ) );
286 values.push_back( static_cast<PetscScalar>( cIter -> second ) * diagScalar );
294 ierr = MatZeroRows(
matrix_, numConstraints, globalDofPtr, diagScalar, PETSC_NULL, PETSC_NULL ); CHKERRV( ierr );
298 if ( numConstraints ) {
299 ierr = VecSetValues(
rhs_, numConstraints, globalDofPtr, valuePtr, INSERT_VALUES ); CHKERRV( ierr );
304 ierr = VecAssemblyBegin(
rhs_ ); CHKERRV( ierr );
305 ierr = VecAssemblyEnd(
rhs_ ); CHKERRV( ierr );
318 const char *petsc_dflt_opt;
327 petsc_dflt_opt=
"-ksp_type bcgs -ksp_diagonal_scale_fix -pc_type asm -pc_asm_overlap 4 -sub_pc_type ilu -sub_pc_factor_levels 3 -sub_pc_factor_fill 6.0";
329 petsc_dflt_opt=
"-ksp_type bcgs -ksp_diagonal_scale_fix -pc_type asm -pc_asm_overlap 4 -sub_pc_type ilu -sub_pc_factor_levels 3 -sub_pc_factor_fill 6.0";
336 petsc_dflt_opt=
"-ksp_type bcgs -pc_type ilu -pc_factor_levels 5 -ksp_diagonal_scale_fix -pc_factor_fill 6.0";
338 petsc_dflt_opt=
"-ksp_type bcgs -pc_type ilu -pc_factor_levels 5 -ksp_diagonal_scale_fix -pc_factor_fill 6.0";
342 LogOut().fmt(
"inserting petsc options: {}\n",
params_.c_str());
343 PetscOptionsInsertString(
params_.c_str());
345 MatSetOption(
matrix_, MAT_USE_INODES, PETSC_FALSE );
353 KSPSetFromOptions(
system);
360 KSPGetType(
system, &type);
361 if (strcmp(type, KSPPREONLY) != 0)
362 KSPSetInitialGuessNonzero(
system, PETSC_TRUE);
370 KSPGetIterationNumber(
system,&nits);
376 LogOut().fmt(
"convergence reason {}, number of iterations is {}\n",
reason, nits);
386 return static_cast<int>(
reason);
392 std::string matFileName =
"flow123d_matrix.m";
393 std::string rhsFileName =
"flow123d_rhs.m";
394 std::string solFileName =
"flow123d_sol.m";
396 PetscViewer myViewer;
398 PetscViewerASCIIOpen(
comm_,matFileName.c_str(),&myViewer);
399 PetscViewerSetFormat(myViewer,PETSC_VIEWER_ASCII_MATLAB);
401 PetscViewerDestroy(&myViewer);
403 PetscViewerASCIIOpen(
comm_,rhsFileName.c_str(),&myViewer);
404 PetscViewerSetFormat(myViewer,PETSC_VIEWER_ASCII_MATLAB);
405 VecView(
rhs_, myViewer );
406 PetscViewerDestroy(&myViewer);
409 PetscViewerASCIIOpen(
comm_,solFileName.c_str(),&myViewer);
410 PetscViewerSetFormat(myViewer,PETSC_VIEWER_ASCII_MATLAB);
412 PetscViewerDestroy(&myViewer);
420 if (
matrix_ != NULL) { ierr = MatDestroy(&
matrix_); CHKERRV( ierr ); }
421 ierr = VecDestroy(&
rhs_); CHKERRV( ierr );
447 double residual_norm;
448 VecNorm(
residual_, NORM_2, &residual_norm);
449 return residual_norm;
unsigned int get_proc(unsigned int idx) const
get processor of the given index
SetValuesMode status_
Set value status of the linear system.
void start_insert_assembly()
void apply_constrains(double scalar=1.)
Solver based on the original PETSc solver using MPIAIJ matrix and succesive Schur complement construc...
virtual void set_from_input(const Input::Record in_rec)
bool matrix_changed_
true if the matrix was changed since the last solve
double * v_rhs_
local RHS array pointing to Vec rhs_
LinSys_PETSC(const Distribution *rows_ds)
ConstraintVec_ constraints_
Vec rhs_
PETSc vector constructed with vx array.
void chkerr(unsigned int ierr)
Replacement of new/delete operator in the spirit of xmalloc.
#define ADD_CALLS(n_calls)
Increase number of calls in actual timer.
void set_from_input(const Input::Record in_rec)
void preallocate_values(int nrow, int *rows, int ncol, int *cols)
void rhs_set_values(int nrow, int *rows, double *vals)
#define LogOut()
Macro defining 'log' record of log.
bool rhs_changed_
true if the right hand side was changed since the last solve
unsigned int max_it_
maximum number of iterations of linear solver
T * makePetscPointer_(std::vector< T > &array)
#define START_TIMER(tag)
Starts a timer with specified tag.
const Distribution * rows_ds_
final distribution of rows of MH matrix
double a_tol_
absolute tolerance of linear solver
unsigned int np() const
get num of processors
double residual_norm_
local solution array pointing into Vec solution_
Vec on_vec_
Vectors for counting non-zero entries in diagonal block.
void preallocate_matrix()
double compute_residual() override
std::string params_
command-line-like options for the PETSc solver
void mat_set_values(int nrow, int *rows, int ncol, int *cols, double *vals)
void start_add_assembly()
KSPConvergedReason reason
Vec off_vec_
Vectors for counting non-zero entries in off-diagonal block.
double r_tol_
relative tolerance of linear solver
double get_solution_precision()
Abstract linear system class.
bool is_positive_definite()
#define WarningOut()
Macro defining 'warning' record of log.
void set_initial_guess_nonzero(bool set_nonzero=true)
static const Input::Type::Record & get_input_type()
void set_tolerances(double r_tol, double a_tol, unsigned int max_it) override
Mat matrix_
Petsc matrix of the problem.
static const int registrar
Registrar of class to factory.
static Input::Type::Abstract & get_input_type()
bool init_guess_nonzero
flag for starting from nonzero guess
#define DebugOut()
Macro defining 'debug' record of log.
Vec solution_
PETSc vector constructed with vb array.
double solution_precision_
unsigned int lsize(int proc) const
get local size