/* BVOrthogonalizeMGS1 - Compute one step of Modified Gram-Schmidt */ static PetscErrorCode BVOrthogonalizeMGS1(BV bv,PetscInt k,Vec v,PetscBool *which,PetscScalar *H) { PetscErrorCode ierr; PetscInt i; PetscScalar dot; Vec vi,z; PetscFunctionBegin; z = v; for (i=-bv->nc;i<k;i++) { if (which && i>=0 && !which[i]) continue; ierr = BVGetColumn(bv,i,&vi);CHKERRQ(ierr); /* h_i = ( v, v_i ) */ if (bv->matrix) { ierr = BV_IPMatMult(bv,v);CHKERRQ(ierr); z = bv->Bx; } ierr = VecDot(z,vi,&dot);CHKERRQ(ierr); /* v <- v - h_i v_i */ if (bv->indef) dot /= bv->omega[bv->nc+i]; ierr = VecAXPY(v,-dot,vi);CHKERRQ(ierr); if (bv->indef) dot *= bv->omega[bv->nc+i]; if (H) H[bv->nc+i] += dot; ierr = BVRestoreColumn(bv,i,&vi);CHKERRQ(ierr); } PetscFunctionReturn(0); }
PetscErrorCode BVDotVec_Contiguous(BV X,Vec y,PetscScalar *m) { PetscErrorCode ierr; BV_CONTIGUOUS *x = (BV_CONTIGUOUS*)X->data; PetscScalar *py; Vec z = y; PetscFunctionBegin; if (X->matrix) { ierr = BV_IPMatMult(X,y);CHKERRQ(ierr); z = X->Bx; } ierr = VecGetArray(z,&py);CHKERRQ(ierr); ierr = BVDotVec_BLAS_Private(X,X->n,X->k-X->l,x->array+(X->nc+X->l)*X->n,py,m,x->mpi);CHKERRQ(ierr); ierr = VecRestoreArray(z,&py);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode BVDotVec_Mat(BV X,Vec y,PetscScalar *m) { PetscErrorCode ierr; BV_MAT *x = (BV_MAT*)X->data; PetscScalar *px,*py; Vec z = y; PetscFunctionBegin; if (X->matrix) { ierr = BV_IPMatMult(X,y);CHKERRQ(ierr); z = X->Bx; } ierr = MatDenseGetArray(x->A,&px);CHKERRQ(ierr); ierr = VecGetArray(z,&py);CHKERRQ(ierr); ierr = BVDotVec_BLAS_Private(X,X->n,X->k-X->l,px+(X->nc+X->l)*X->n,py,m,x->mpi);CHKERRQ(ierr); ierr = VecRestoreArray(z,&py);CHKERRQ(ierr); ierr = MatDenseRestoreArray(x->A,&px);CHKERRQ(ierr); PetscFunctionReturn(0); }