Actual source code: transm.c

petsc-3.3-p7 2013-05-11
  2: #include <petsc-private/matimpl.h>          /*I "petscmat.h" I*/

  4: typedef struct {
  5:   Mat A;
  6: } Mat_Transpose;

 10: PetscErrorCode MatMult_Transpose(Mat N,Vec x,Vec y)
 11: {
 12:   Mat_Transpose  *Na = (Mat_Transpose*)N->data;

 16:   MatMultTranspose(Na->A,x,y);
 17:   return(0);
 18: }
 19: 
 22: PetscErrorCode MatMultAdd_Transpose(Mat N,Vec v1,Vec v2,Vec v3)
 23: {
 24:   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
 26: 
 28:   MatMultTransposeAdd(Na->A,v1,v2,v3);
 29:   return(0);
 30: }

 34: PetscErrorCode MatMultTranspose_Transpose(Mat N,Vec x,Vec y)
 35: {
 36:   Mat_Transpose  *Na = (Mat_Transpose*)N->data;

 40:   MatMult(Na->A,x,y);
 41:   return(0);
 42: }
 43: 
 46: PetscErrorCode MatMultTransposeAdd_Transpose(Mat N,Vec v1,Vec v2,Vec v3)
 47: {
 48:   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
 50: 
 52:   MatMultAdd(Na->A,v1,v2,v3);
 53:   return(0);
 54: }

 58: PetscErrorCode MatDestroy_Transpose(Mat N)
 59: {
 60:   Mat_Transpose  *Na = (Mat_Transpose*)N->data;

 64:   MatDestroy(&Na->A);
 65:   PetscFree(N->data);
 66:   return(0);
 67: }

 71: /*@
 72:       MatCreateTranspose - Creates a new matrix object that behaves like A'

 74:    Collective on Mat

 76:    Input Parameter:
 77: .   A  - the (possibly rectangular) matrix

 79:    Output Parameter:
 80: .   N - the matrix that represents A'

 82:    Level: intermediate

 84:    Notes: The transpose A' is NOT actually formed! Rather the new matrix
 85:           object performs the matrix-vector product by using the MatMultTranspose() on
 86:           the original matrix

 88: .seealso: MatCreateNormal(), MatMult(), MatMultTranspose(), MatCreate()

 90: @*/
 91: PetscErrorCode  MatCreateTranspose(Mat A,Mat *N)
 92: {
 94:   PetscInt       m,n;
 95:   Mat_Transpose  *Na;

 98:   MatGetLocalSize(A,&m,&n);
 99:   MatCreate(((PetscObject)A)->comm,N);
100:   MatSetSizes(*N,n,m,PETSC_DECIDE,PETSC_DECIDE);
101:   PetscObjectChangeTypeName((PetscObject)*N,MATTRANSPOSEMAT);
102: 
103:   PetscNewLog(*N,Mat_Transpose,&Na);
104:   (*N)->data = (void*) Na;
105:   PetscObjectReference((PetscObject)A);
106:   Na->A     = A;

108:   (*N)->ops->destroy          = MatDestroy_Transpose;
109:   (*N)->ops->mult             = MatMult_Transpose;
110:   (*N)->ops->multadd          = MatMultAdd_Transpose;
111:   (*N)->ops->multtranspose    = MatMultTranspose_Transpose;
112:   (*N)->ops->multtransposeadd = MatMultTransposeAdd_Transpose;
113:   (*N)->assembled             = PETSC_TRUE;

115:   PetscLayoutSetBlockSize((*N)->rmap,A->cmap->bs);
116:   PetscLayoutSetBlockSize((*N)->cmap,A->rmap->bs);
117:   PetscLayoutSetUp((*N)->rmap);
118:   PetscLayoutSetUp((*N)->cmap);
119:   MatSetUp(*N);
120:   return(0);
121: }