Actual source code: transm.c
petsc-3.10.5 2019-03-28
Report Typos and Errors

      2:  #include <petsc/private/matimpl.h>

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

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

     14:   MatMultTranspose(Na->A,x,y);
     15:   return(0);
     16: }

     18: PetscErrorCode MatMultAdd_Transpose(Mat N,Vec v1,Vec v2,Vec v3)
     19: {
     20:   Mat_Transpose  *Na = (Mat_Transpose*)N->data;

     24:   MatMultTransposeAdd(Na->A,v1,v2,v3);
     25:   return(0);
     26: }

     28: PetscErrorCode MatMultTranspose_Transpose(Mat N,Vec x,Vec y)
     29: {
     30:   Mat_Transpose  *Na = (Mat_Transpose*)N->data;

     34:   MatMult(Na->A,x,y);
     35:   return(0);
     36: }

     38: PetscErrorCode MatMultTransposeAdd_Transpose(Mat N,Vec v1,Vec v2,Vec v3)
     39: {
     40:   Mat_Transpose  *Na = (Mat_Transpose*)N->data;

     44:   MatMultAdd(Na->A,v1,v2,v3);
     45:   return(0);
     46: }

     48: PetscErrorCode MatDestroy_Transpose(Mat N)
     49: {
     50:   Mat_Transpose  *Na = (Mat_Transpose*)N->data;

     54:   MatDestroy(&Na->A);
     55:   PetscObjectComposeFunction((PetscObject)N,"MatTransposeGetMat_C",NULL);
     56:   PetscFree(N->data);
     57:   return(0);
     58: }

     60: PetscErrorCode MatDuplicate_Transpose(Mat N, MatDuplicateOption op, Mat* m)
     61: {
     62:   Mat_Transpose  *Na = (Mat_Transpose*)N->data;

     66:   if (op == MAT_COPY_VALUES) {
     67:     MatTranspose(Na->A,MAT_INITIAL_MATRIX,m);
     68:   } else if (op == MAT_DO_NOT_COPY_VALUES) {
     69:     MatDuplicate(Na->A,MAT_DO_NOT_COPY_VALUES,m);
     70:     MatTranspose(*m,MAT_INPLACE_MATRIX,m);
     71:   } else SETERRQ(PetscObjectComm((PetscObject)N),PETSC_ERR_SUP,"MAT_SHARE_NONZERO_PATTERN not supported for this matrix type");
     72:   return(0);
     73: }

     75: PetscErrorCode MatCreateVecs_Transpose(Mat A,Vec *r, Vec *l)
     76: {
     77:   Mat_Transpose  *Aa = (Mat_Transpose*)A->data;

     81:   MatCreateVecs(Aa->A,l,r);
     82:   return(0);
     83: }

     86: PetscErrorCode MatTransposeGetMat_Transpose(Mat A,Mat *M)
     87: {
     88:   Mat_Transpose  *Aa = (Mat_Transpose*)A->data;

     91:   *M = Aa->A;
     92:   return(0);
     93: }

     95: /*@
     96:       MatTransposeGetMat - Gets the Mat object stored inside a MATTRANSPOSEMAT'

     98:    Logically collective on Mat

    100:    Input Parameter:
    101: .   A  - the MATTRANSPOSE matrix

    103:    Output Parameter:
    104: .   M - the matrix object stored inside A

    106:    Level: intermediate

    108: .seealso: MatCreateTranspose()

    110: @*/
    111: PetscErrorCode MatTransposeGetMat(Mat A,Mat *M)
    112: {

    119:   PetscUseMethod(A,"MatTransposeGetMat_C",(Mat,Mat*),(A,M));
    120:   return(0);
    121: }

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

    126:    Collective on Mat

    128:    Input Parameter:
    129: .   A  - the (possibly rectangular) matrix

    131:    Output Parameter:
    132: .   N - the matrix that represents A'

    134:    Level: intermediate

    136:    Notes:
    137:     The transpose A' is NOT actually formed! Rather the new matrix
    138:           object performs the matrix-vector product by using the MatMultTranspose() on
    139:           the original matrix

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

    143: @*/
    144: PetscErrorCode  MatCreateTranspose(Mat A,Mat *N)
    145: {
    147:   PetscInt       m,n;
    148:   Mat_Transpose  *Na;

    151:   MatGetLocalSize(A,&m,&n);
    152:   MatCreate(PetscObjectComm((PetscObject)A),N);
    153:   MatSetSizes(*N,n,m,PETSC_DECIDE,PETSC_DECIDE);
    154:   PetscLayoutSetUp((*N)->rmap);
    155:   PetscLayoutSetUp((*N)->cmap);
    156:   PetscObjectChangeTypeName((PetscObject)*N,MATTRANSPOSEMAT);

    158:   PetscNewLog(*N,&Na);
    159:   (*N)->data = (void*) Na;
    160:   PetscObjectReference((PetscObject)A);
    161:   Na->A      = A;

    163:   (*N)->ops->destroy          = MatDestroy_Transpose;
    164:   (*N)->ops->mult             = MatMult_Transpose;
    165:   (*N)->ops->multadd          = MatMultAdd_Transpose;
    166:   (*N)->ops->multtranspose    = MatMultTranspose_Transpose;
    167:   (*N)->ops->multtransposeadd = MatMultTransposeAdd_Transpose;
    168:   (*N)->ops->duplicate        = MatDuplicate_Transpose;
    169:   (*N)->ops->getvecs          = MatCreateVecs_Transpose;
    170:   (*N)->assembled             = PETSC_TRUE;

    172:   PetscObjectComposeFunction((PetscObject)(*N),"MatTransposeGetMat_C",MatTransposeGetMat_Transpose);
    173:   MatSetBlockSizes(*N,PetscAbs(A->cmap->bs),PetscAbs(A->rmap->bs));
    174:   MatSetUp(*N);
    175:   return(0);
    176: }