xref: /petsc/src/mat/impls/shell/shellcnv.c (revision b3d09e869df0e6ebcb615ca876706bfed4fcf1cd)
16098dc10SBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/matimpl.h>        /*I "petscmat.h" I*/
36098dc10SBarry Smith 
4*b3d09e86SJed Brown PetscErrorCode MatConvert_Shell(Mat oldmat, MatType newtype,MatReuse reuse,Mat *newmat)
5dfbe8321SBarry Smith {
6676c34cdSKris Buschelman   Mat            mat;
76098dc10SBarry Smith   Vec            in,out;
8dfbe8321SBarry Smith   PetscErrorCode ierr;
96696f472SJed Brown   PetscInt       i,m,n,M,N,*rows,start;
106098dc10SBarry Smith   MPI_Comm       comm;
116696f472SJed Brown   PetscScalar    *array;
126098dc10SBarry Smith 
133a40ed3dSBarry Smith   PetscFunctionBegin;
14ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)oldmat,&comm);CHKERRQ(ierr);
156098dc10SBarry Smith 
166696f472SJed Brown   ierr = MatGetOwnershipRange(oldmat,&start,NULL);CHKERRQ(ierr);
176696f472SJed Brown   ierr = MatCreateVecs(oldmat,&in,&out);CHKERRQ(ierr);
186696f472SJed Brown   ierr = MatGetLocalSize(oldmat,&m,&n);CHKERRQ(ierr);
196696f472SJed Brown   ierr = MatGetSize(oldmat,&M,&N);CHKERRQ(ierr);
206696f472SJed Brown   ierr = PetscMalloc1(m,&rows);CHKERRQ(ierr);
212205254eSKarl Rupp   for (i=0; i<m; i++) rows[i] = start + i;
226098dc10SBarry Smith 
23f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,&mat);CHKERRQ(ierr);
246696f472SJed Brown   ierr = MatSetSizes(mat,m,n,M,N);CHKERRQ(ierr);
254a6a16e5SBarry Smith   ierr = MatSetType(mat,newtype);CHKERRQ(ierr);
2633d57670SJed Brown   ierr = MatSetBlockSizesFromMats(mat,oldmat,oldmat);CHKERRQ(ierr);
274a6a16e5SBarry Smith   ierr = MatSetUp(mat);CHKERRQ(ierr);
286696f472SJed Brown   ierr = VecSetOption(in,VEC_IGNORE_OFF_PROC_ENTRIES,PETSC_TRUE);CHKERRQ(ierr);
296098dc10SBarry Smith 
306696f472SJed Brown   for (i=0; i<N; i++) {
316696f472SJed Brown     ierr = VecZeroEntries(in);CHKERRQ(ierr);
326696f472SJed Brown     ierr = VecSetValue(in,i,1.,INSERT_VALUES);CHKERRQ(ierr);
336098dc10SBarry Smith     ierr = VecAssemblyBegin(in);CHKERRQ(ierr);
346098dc10SBarry Smith     ierr = VecAssemblyEnd(in);CHKERRQ(ierr);
356098dc10SBarry Smith 
366098dc10SBarry Smith     ierr = MatMult(oldmat,in,out);CHKERRQ(ierr);
376098dc10SBarry Smith 
386098dc10SBarry Smith     ierr = VecGetArray(out,&array);CHKERRQ(ierr);
39676c34cdSKris Buschelman     ierr = MatSetValues(mat,m,rows,1,&i,array,INSERT_VALUES);CHKERRQ(ierr);
406098dc10SBarry Smith     ierr = VecRestoreArray(out,&array);CHKERRQ(ierr);
416098dc10SBarry Smith 
426098dc10SBarry Smith   }
43606d414cSSatish Balay   ierr = PetscFree(rows);CHKERRQ(ierr);
446bf464f9SBarry Smith   ierr = VecDestroy(&in);CHKERRQ(ierr);
456bf464f9SBarry Smith   ierr = VecDestroy(&out);CHKERRQ(ierr);
46676c34cdSKris Buschelman   ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
47676c34cdSKris Buschelman   ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
48676c34cdSKris Buschelman 
49511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
5028be2f97SBarry Smith     ierr = MatHeaderReplace(oldmat,&mat);CHKERRQ(ierr);
51c3d102feSKris Buschelman   } else {
52676c34cdSKris Buschelman     *newmat = mat;
53c3d102feSKris Buschelman   }
543a40ed3dSBarry Smith   PetscFunctionReturn(0);
556098dc10SBarry Smith }
566098dc10SBarry Smith 
576098dc10SBarry Smith 
586098dc10SBarry Smith 
59