[petsc-users] problem in calling KSPSetComputeRHS and KSPSolve multiple times to solve different RHS.

Barry Smith bsmith at mcs.anl.gov
Fri Sep 13 07:47:15 CDT 2013

On Sep 13, 2013, at 6:21 AM, Bishesh Khanal <bisheshkh at gmail.com> wrote:

> Dear all,
> I'm trying to reuse an operator for the linear system multiple times with different RHS. 
> But it seems that the RHS is not changed in the KSP object. Here is the code to illustrate what I'm doing:
> Vec mX[3], mB[3];   //Solving Ax=b for 3 different RHS.
> ...
> ierr = KSPSetComputeOperators(mKsp,computeMatrix,this);CHKERRQ(ierr);
> ierr = KSPSetDM(mKsp,mDa);CHKERRQ(ierr);

   Move the line up above the previous line

> ierr = KSPSetFromOptions(mKsp);CHKERRQ(ierr);
> for(int i = 0; i<3; ++i) {
>         mBComponent = i;   //sets different component for RHS.
>         ierr = KSPSetComputeRHS(mKsp,computeRhs,this);CHKERRQ(ierr);

   Put the above line in the setup code above, not in the loop

>         ierr = KSPSetDM(mKsp,mDa);CHKERRQ(ierr);

   Remove the line above

>         ierr = KSPSolve(mKsp,NULL,NULL);CHKERRQ(ierr);
>         ierr = KSPGetSolution(mKsp,&mX[i]);CHKERRQ(ierr);
>         ierr = KSPGetRhs(mKsp,&mB[i]);CHKERRQ(ierr);
>  }

   After you make this changes it should work. If it does not then run with -start_in_debugger noxterm and put a break point in computeRHS, make sure it is being called.

> What I expect is to have three different solutions in mX array for the different Rhs computed by computeRhs function. However, the result when I see using VecView is that the Rhs mB[0], mB[1] and mB[2] are all identical (which should not have been the case). And mX also has three identical vectors as solution.
> What am I doing wrong here ?
> Thanks,
> Bishesh

More information about the petsc-users mailing list