1*c8a8475eSBarry Smith /*$Id: bvec2.c,v 1.202 2001/09/12 03:26:24 bsmith Exp $*/ 2*c8a8475eSBarry Smith 3*c8a8475eSBarry Smith #include "src/mat/matimpl.h" /*I "petscmat.h" I*/ 4*c8a8475eSBarry Smith 5*c8a8475eSBarry Smith typedef struct { 6*c8a8475eSBarry Smith Mat A; 7*c8a8475eSBarry Smith Vec w; 8*c8a8475eSBarry Smith } Mat_Normal; 9*c8a8475eSBarry Smith 10*c8a8475eSBarry Smith #undef __FUNCT__ 11*c8a8475eSBarry Smith #define __FUNCT__ "MatMult_Normal" 12*c8a8475eSBarry Smith int MatMult_Normal(Mat N,Vec x,Vec y) 13*c8a8475eSBarry Smith { 14*c8a8475eSBarry Smith Mat_Normal *Na = (Mat_Normal*)N->data; 15*c8a8475eSBarry Smith int ierr; 16*c8a8475eSBarry Smith 17*c8a8475eSBarry Smith PetscFunctionBegin; 18*c8a8475eSBarry Smith ierr = MatMult(Na->A,x,Na->w);CHKERRQ(ierr); 19*c8a8475eSBarry Smith ierr = MatMultTranspose(Na->A,Na->w,y);CHKERRQ(ierr); 20*c8a8475eSBarry Smith PetscFunctionReturn(0); 21*c8a8475eSBarry Smith } 22*c8a8475eSBarry Smith 23*c8a8475eSBarry Smith #undef __FUNCT__ 24*c8a8475eSBarry Smith #define __FUNCT__ "MatDestroy_Normal" 25*c8a8475eSBarry Smith int MatDestroy_Normal(Mat N) 26*c8a8475eSBarry Smith { 27*c8a8475eSBarry Smith Mat_Normal *Na = (Mat_Normal*)N->data; 28*c8a8475eSBarry Smith int ierr; 29*c8a8475eSBarry Smith 30*c8a8475eSBarry Smith PetscFunctionBegin; 31*c8a8475eSBarry Smith ierr = PetscObjectDereference((PetscObject)Na->A);CHKERRQ(ierr); 32*c8a8475eSBarry Smith ierr = VecDestroy(Na->w);CHKERRQ(ierr); 33*c8a8475eSBarry Smith ierr = PetscFree(Na);CHKERRQ(ierr); 34*c8a8475eSBarry Smith PetscFunctionReturn(0); 35*c8a8475eSBarry Smith } 36*c8a8475eSBarry Smith 37*c8a8475eSBarry Smith 38*c8a8475eSBarry Smith #undef __FUNCT__ 39*c8a8475eSBarry Smith #define __FUNCT__ "MatCreateNormal" 40*c8a8475eSBarry Smith /*@ 41*c8a8475eSBarry Smith MatCreateNormal - Creates a new matrix object that behaves like A'*A. 42*c8a8475eSBarry Smith 43*c8a8475eSBarry Smith Collective on Mat 44*c8a8475eSBarry Smith 45*c8a8475eSBarry Smith Input Parameter: 46*c8a8475eSBarry Smith . A - the (possibly rectangular) matrix 47*c8a8475eSBarry Smith 48*c8a8475eSBarry Smith Output Parameter: 49*c8a8475eSBarry Smith . N - the matrix that represents A'*A 50*c8a8475eSBarry Smith 51*c8a8475eSBarry Smith Notes: The product A'*A is NOT actually formed! Rather the new matrix 52*c8a8475eSBarry Smith object performs the matrix-vector product by first multiplying by 53*c8a8475eSBarry Smith A and then A' 54*c8a8475eSBarry Smith @*/ 55*c8a8475eSBarry Smith int MatCreateNormal(Mat A,Mat *N) 56*c8a8475eSBarry Smith { 57*c8a8475eSBarry Smith int ierr,m,n; 58*c8a8475eSBarry Smith Mat_Normal *Na; 59*c8a8475eSBarry Smith 60*c8a8475eSBarry Smith PetscFunctionBegin; 61*c8a8475eSBarry Smith ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr); 62*c8a8475eSBarry Smith ierr = MatCreate(A->comm,n,n,PETSC_DECIDE,PETSC_DECIDE,N);CHKERRQ(ierr); 63*c8a8475eSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)*N,MATNORMAL);CHKERRQ(ierr); 64*c8a8475eSBarry Smith 65*c8a8475eSBarry Smith ierr = PetscNew(Mat_Normal,&Na);CHKERRQ(ierr); 66*c8a8475eSBarry Smith Na->A = A; 67*c8a8475eSBarry Smith ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 68*c8a8475eSBarry Smith (*N)->data = (void*) Na; 69*c8a8475eSBarry Smith 70*c8a8475eSBarry Smith ierr = VecCreateMPI(A->comm,m,PETSC_DECIDE,&Na->w);CHKERRQ(ierr); 71*c8a8475eSBarry Smith (*N)->ops->destroy = MatDestroy_Normal; 72*c8a8475eSBarry Smith (*N)->ops->mult = MatMult_Normal; 73*c8a8475eSBarry Smith (*N)->assembled = PETSC_TRUE; 74*c8a8475eSBarry Smith (*N)->N = A->N; 75*c8a8475eSBarry Smith (*N)->M = A->N; 76*c8a8475eSBarry Smith (*N)->n = A->n; 77*c8a8475eSBarry Smith (*N)->m = A->n; 78*c8a8475eSBarry Smith PetscFunctionReturn(0); 79*c8a8475eSBarry Smith } 80*c8a8475eSBarry Smith 81