53PetscSolver :: ~PetscSolver() { }
84 VecDestroy(& globSolVec);
85 VecDestroy(& globRhsVec);
95 KSPConvergedReason reason;
107#ifdef __MPI_PARALLEL_MODE
108 MPI_Comm comm =
engngModel->giveParallelComm();
110 MPI_Comm comm = PETSC_COMM_SELF;
112 KSPCreate(comm, & Lhs.
ksp);
122 if ( this->
engngModel->requiresUnknownsDictionaryUpdate() ) {
123#if PETSC_VERSION_MAJOR >= 3 && PETSC_VERSION_MINOR >= 5
131#if PETSC_VERSION_MAJOR >= 3 && PETSC_VERSION_MINOR >= 5
147 KSPSetTolerances(Lhs.
ksp, PETSC_DEFAULT, PETSC_DEFAULT, PETSC_DEFAULT, PETSC_DEFAULT);
156 KSPSetFromOptions(Lhs.
ksp);
163 err = KSPSolve(Lhs.
ksp, b, x);
167 KSPGetConvergedReason(Lhs.
ksp, & reason);
168 KSPGetIterationNumber(Lhs.
ksp, & nite);
173 OOFEM_WARNING(
"Diverged! KSPConvergedReason: %d, number of iterations: %d\n", reason, nite);
178 OOFEM_LOG_INFO(
"PetscSolver: User time consumed by solution: %.2fs, KSPConvergedReason: %d, number of iterations: %d\n", timer.
getUtime(), reason, nite );
208 for (
int i = 0; i < cols; ++i ) {
209 VecCreateSeqWithArray(PETSC_COMM_SELF, rows, B.
givePointer() + rows * i, & globRhsVec);
210 VecDuplicate(globRhsVec, & globSolVec);
211 s = this->petsc_solve(*Lhs, globRhsVec, globSolVec, newLhs);
218 VecGetArray(globSolVec, & ptr);
219 for (
int j = 0; j < rows; ++j ) {
220 Xptr [ j + rows * i ] = ptr [ j ];
222 VecRestoreArray(globSolVec, & ptr);
224 VecDestroy(& globSolVec);
225 VecDestroy(& globRhsVec);
#define REGISTER_SparseLinSolver(class, type)
Index giveSize() const
Returns the size of receiver.
const double * givePointer() const
void resize(Index rows, Index cols)
int giveNumberOfColumns() const
Returns number of columns of receiver.
int giveNumberOfRows() const
Returns number of rows of receiver.
EngngModel * engngModel
Pointer to engineering model.
ConvergedReason petsc_solve(PetscSparseMtrx &A, Vec b, Vec x)
int scatterL2G(const FloatArray &src, Vec dest) const
bool kspInit
Flag if context initialized.
void createVecGlobal(Vec *answer) const
Creates a global vector that fits the instance of this matrix.
KSP ksp
Linear solver context.
bool newValues
Flag if matrix has changed since last solve.
int scatterG2L(Vec src, FloatArray &dest) const
Scatters global vector to natural one.
SparseLinearSystemNM(Domain *d, EngngModel *m)
Constructor.
double getUtime()
Returns total user time elapsed in seconds.
#define OOFEM_WARNING(...)
#define OOFEM_LOG_INFO(...)