38 #include <boost/bind.hpp>
40 namespace it = Input::Type;
51 init_guess_nonzero(false)
61 ierr = VecZeroEntries(
rhs_ ); CHKERRV( ierr );
71 :
LinSys(other), params_(other.params_), v_rhs_(NULL), solution_precision_(solution_precision_)
101 ASSERT(
false,
"Can not set values. Matrix is not preallocated.\n");
119 ASSERT(
false,
"Can not set values. Matrix is not preallocated.\n");
132 ierr = MatSetValues(
matrix_,nrow,rows,ncol,cols,vals,(InsertMode)
status_); CHKERRV( ierr );
137 default:
DBGMSG(
"LS SetValues with non allowed insert mode.\n");
150 ierr = VecSetValues(
rhs_,nrow,rows,vals,(InsertMode)
status_); CHKERRV( ierr );
154 default:
ASSERT(
false,
"LinSys's status disallow set values.\n");
166 for (i=0; i<nrow; i++) {
168 for(j=0; j<ncol; j++) {
171 VecSetValue(
on_vec_,row,1.0,ADD_VALUES);
173 VecSetValue(
off_vec_,row,1.0,ADD_VALUES);
183 PetscInt *on_nz, *off_nz;
184 PetscScalar *on_array, *off_array;
196 VecGetArray(
on_vec_, &on_array );
197 VecGetArray(
off_vec_, &off_array );
200 on_nz[i] =
static_cast<PetscInt
>( on_array[i]+0.1 );
201 off_nz[i] =
static_cast<PetscInt
>( off_array[i]+0.1 );
204 VecRestoreArray(
on_vec_,&on_array);
205 VecRestoreArray(
off_vec_,&off_array);
212 ierr = MatDestroy(&
matrix_); CHKERRV( ierr );
215 0, on_nz, 0, off_nz, &
matrix_); CHKERRV( ierr );
218 MatSetOption(
matrix_, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE);
226 MatAssemblyType assemblyType = MAT_FINAL_ASSEMBLY;
235 xprintf(
Warn,
"Finalizing linear system without setting values.\n");
238 ierr = MatAssemblyBegin(
matrix_, assembly_type); CHKERRV( ierr );
239 ierr = VecAssemblyBegin(
rhs_); CHKERRV( ierr );
240 ierr = MatAssemblyEnd(
matrix_, assembly_type); CHKERRV( ierr );
241 ierr = VecAssemblyEnd(
rhs_); CHKERRV( ierr );
243 if (assembly_type == MAT_FINAL_ASSEMBLY)
status_ =
DONE;
254 ASSERT (
status_ ==
DONE,
"System matrix and right-hand side are not assembled when applying constraints." );
257 PetscInt numConstraints =
static_cast<PetscInt
>(
constraints_.size() );
260 const PetscScalar diagScalar =
static_cast<PetscScalar
>( scalar );
266 ConstraintVec_::const_iterator cIter =
constraints_.begin( );
267 ConstraintVec_::const_iterator cEnd =
constraints_.end( );
269 for ( ; cIter != cEnd; ++cIter ) {
270 globalDofs.push_back( static_cast<PetscInt>( cIter -> first ) );
271 values.push_back( static_cast<PetscScalar>( cIter -> second ) * diagScalar );
279 ierr = MatZeroRows(
matrix_, numConstraints, globalDofPtr, diagScalar, PETSC_NULL, PETSC_NULL ); CHKERRV( ierr );
283 if ( numConstraints ) {
284 ierr = VecSetValues(
rhs_, numConstraints, globalDofPtr, valuePtr, INSERT_VALUES ); CHKERRV( ierr );
289 ierr = VecAssemblyBegin(
rhs_ ); CHKERRV( ierr );
290 ierr = VecAssemblyEnd(
rhs_ ); CHKERRV( ierr );
305 KSPConvergedReason reason;
307 const char *petsc_dflt_opt;
316 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";
320 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";
326 petsc_dflt_opt=
"-ksp_type cg -pc_type ilu -pc_factor_levels 3 -ksp_diagonal_scale_fix -pc_factor_shift_positive_definite -pc_factor_fill 6.0";
328 petsc_dflt_opt=
"-ksp_type bcgs -pc_type ilu -pc_factor_levels 5 -ksp_diagonal_scale_fix -pc_factor_shift_positive_definite";
334 PetscOptionsInsertString(
params_.c_str());
337 ierr = MatSetOption(
matrix_, MAT_USE_INODES, PETSC_FALSE );
339 ierr = KSPCreate(
comm_, &system );
340 ierr = KSPSetOperators(system,
matrix_,
matrix_, DIFFERENT_NONZERO_PATTERN);
347 ierr = KSPSetTolerances(system,
r_tol_,
a_tol_, PETSC_DEFAULT,PETSC_DEFAULT);
348 ierr = KSPSetFromOptions(system);
355 KSPGetType(system, &type);
356 if (strcmp(type, KSPPREONLY) != 0)
357 ierr = KSPSetInitialGuessNonzero(system, PETSC_TRUE);
361 ierr = KSPGetConvergedReason(system,&reason);
362 ierr = KSPGetIterationNumber(system,&nits);
367 xprintf(
MsgLog,
"convergence reason %d, number of iterations is %d\n", reason, nits);
375 ierr = KSPDestroy(&system);
377 return static_cast<int>(reason);
390 std::string matFileName =
"flow123d_matrix.m";
391 std::string rhsFileName =
"flow123d_rhs.m";
392 std::string solFileName =
"flow123d_sol.m";
394 PetscViewer myViewer;
396 PetscViewerASCIIOpen(
comm_,matFileName.c_str(),&myViewer);
397 PetscViewerSetFormat(myViewer,PETSC_VIEWER_ASCII_MATLAB);
399 PetscViewerDestroy(&myViewer);
401 PetscViewerASCIIOpen(
comm_,rhsFileName.c_str(),&myViewer);
402 PetscViewerSetFormat(myViewer,PETSC_VIEWER_ASCII_MATLAB);
403 VecView(
rhs_, myViewer );
404 PetscViewerDestroy(&myViewer);
407 PetscViewerASCIIOpen(
comm_,solFileName.c_str(),&myViewer);
408 PetscViewerSetFormat(myViewer,PETSC_VIEWER_ASCII_MATLAB);
410 PetscViewerDestroy(&myViewer);
418 if (
matrix_ != NULL) { ierr = MatDestroy(&
matrix_); CHKERRV( ierr ); }
419 ierr = VecDestroy(&
rhs_); CHKERRV( ierr );
431 Vec solutionGathered;
435 VecScatter VSdistToLarge;
436 ierr = VecScatterCreateToAll(
solution_, &VSdistToLarge, &solutionGathered ); CHKERRV( ierr );
440 ierr = VecScatterBegin( VSdistToLarge,
solution_, solutionGathered, INSERT_VALUES, SCATTER_FORWARD ); CHKERRV( ierr );
441 ierr = VecScatterEnd( VSdistToLarge,
solution_, solutionGathered, INSERT_VALUES, SCATTER_FORWARD ); CHKERRV( ierr );
444 PetscScalar *solutionGatheredArray;
445 ierr = VecGetArray( solutionGathered, &solutionGatheredArray );
453 for (
int i = 0; i < globalSize; i++ ) {
458 ierr = VecRestoreArray( solutionGathered, &solutionGatheredArray );
461 ierr = VecDestroy( &solutionGathered ); CHKERRV( ierr );
462 ierr = VecScatterDestroy( &VSdistToLarge ); CHKERRV( ierr );