On Dec 2, 2010, at 3:02 PM, Vijay S. Mahadevan wrote: >> I suggest making a shell MatMultAdd_Mine() that does everything then >> also code a MatMult_Mine() that zeros the output vector and then calls >> directly MatMultAdd_Mine(). This way you'll >> have one code to routine but can handle both operations. > > Barry, thanks for the suggestion. I will implement the MatMultAdd in > this way. Puristically speaking though, this does reverse the > dependency between the two routines !
Well one could argue that MatMult() is a special case of MatMultAdd() with a zero vector input. Barry > > Vijay > > On Thu, Dec 2, 2010 at 2:51 PM, Barry Smith <bsmith at mcs.anl.gov> wrote: >> >> On Dec 2, 2010, at 2:45 PM, Vijay S. Mahadevan wrote: >> >>> Hi all, >>> >>> There is probably some minor inconsistency in my understanding but is >>> there a fundamental difference between the following two options ? >>> >>> // Option 1 >>> ierr = MatMult(A, solution, temporaryvec) ;CHKERRQ(ierr); >>> ierr = VecAXPY(rhs, 1.0, temporaryvec) ;CHKERRQ(ierr); >>> // Option 2 >>> ierr = MatMultAdd(A, solution, rhs, rhs) ;CHKERRQ(ierr); >>> >>> Here A is a shell matrix (serial) that has a routine defined to >>> perform MATOP_MULT only. >>> >>> I ask because Option 1 gives me the right result while Option 2 >>> segfaults at the MatMultAdd line. My only logical conclusion is that I >>> need to define a MATOP_MULT_ADD or something similar for the shell for >>> this to work. Is this understanding correct ? >> >> Yes, if your code will use a MatMultAdd() then you need to provide that to >> the shell matrix. >> >>> I implicitly assumed >>> that petsc recognizes that MATOP_MULT has been defined already and >>> since MatMultAdd only requires the action of a matrix on a vector to >>> perform its operation, should this not be computed by petsc >>> automatically ? >> >> Sorry it doesn't though of course it could. >> >>> I really do not want to creat an extra vector here >>> with Option 1 since this occurs at a finer level in my calculation. >>> But is there any way that you would suggest I do this without extra >>> allocations ? Any comments or pointers will be much appreciated. >> >> I suggest making a shell MatMultAdd_Mine() that does everything then >> also code a MatMult_Mine() that zeros the output vector and then calls >> directly MatMultAdd_Mine(). This way you'll >> have one code to routine but can handle both operations. >> >> Barry >> >> >> >>> >>> Vijay >> >>
