[petsc-users] successive linear solves

Umut Tabak u.tabak at tudelft.nl
Tue Feb 2 10:23:43 CST 2010


Dear all,

I was trying to solve two linear systems in the same ksp context while 
setting the operators with KSPSetOperators. But I am getting a Memory 
corruption error. What  I try to do is to set two linear operators and 
rhs vectors and get the solutions, say

for solA, xa,

(Ka-lambs*Ma)*xa = -lambs*KsaT*modeS (I extract lambs from a vector of 
eigenvalues and modeS from a matrix of eigenvectors)

and for solS, xs

(Ks-lamba*Ms)*xs = -Ksa*modeP (similarly lamba is extracted from a 
vector and the modeP also from a matrix of vectors as columns)

I am using MatDuplicate functions to update the operator matrices at 
each iteration, there is not a problem in the first solve, at least no 
errors, but on the second one I am getting the Memory corruption error 
mentioned above. Also one more question is on where to use 
KSPSetFromOptions on the iterations. If I use KSPSetFromOptions on the 
same iteration twice(before solve)I get the same error from this 
function(this was not also reasonable to me). Section of the code is 
below(a bit crappy however should give the idea on what I tried to do). 
I am sure this is a simple problem but could not find the reason.

   KSP ksp;
   KSPCreate(PETSC_COMM_WORLD, &ksp);
   for(int j=0; j!=nR; j++)
   {
     //KSPCreate(PETSC_COMM_WORLD, &kspA);
     // duplicate the matrix
     MatDuplicate(Ka, MAT_COPY_VALUES, &OpA);
     //
     MatAXPY(OpA, -eSolverS.getRoot(j), Ma, SAME_NONZERO_PATTERN);
     MatGetColumnVector(eigVecsStr, modeS, j);
     // create the rhs for the operation
     MatMult(KsaT, modeS, rhsA);
     VecScale(rhsA, -eSolverS.getRoot(j));
     cout << "Solving the linear system for pressure side corrections" 
<< endl;
     KSPSetOperators(ksp, OpA, OpA, DIFFERENT_NONZERO_PATTERN);
     //KSPGetPC(kspA, &pcA);
     //PCSetType(pcA, PCJACOBI);
     //KSPSetTolerances(ksp, 1e-7, 
PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT);
     //KSPSetFromOptions(kspA);
     // solve
     KSPSolve(ksp,rhsA,solA);
     corA.assignSubVector(solA, 1, ra, j);
     //
     MatDuplicate(Ks, MAT_COPY_VALUES, &OpS);
     MatAXPY(OpS, -eSolverA.getRoot(j), Ms, SAME_NONZERO_PATTERN);
     MatGetColumnVector(eigVecsAco, modeA, j);
     // create the rhs for the operation
     MatMult(Ksa, modeA, rhsS);
     VecScale(rhsS, -1.0);
     cout << "Solving the linear system for structure side corrections" 
<< endl;
     //KSPCreate(PETSC_COMM_WORLD, &kspS);
     KSPSetOperators(ksp, OpS, OpS, DIFFERENT_NONZERO_PATTERN);
     //KSPGetPC(kspS, &pcS);
     //PCSetType(pcS, PCJACOBI);
     //KSPSetTolerances(kspS, 1e-7, 
PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT);
     //KSPSetFromOptions(kspS);
     // solve
     KSPSolve(ksp,rhsS,solS);
     //int r,m;
     //VecGetSize(rhsS, &r);
     //VecGetSize(solS, &m);
     //cout << r << " " << m << endl;
     corS.assignSubVector(solS, 1, rs, j);
     cout << "Solved  the linear system for structure corrections" << endl;
   }
   corA.finalize(); corS.finalize();

Best,
Umut



More information about the petsc-users mailing list