int main(int argc, char **argv) { PetscErrorCode ierr; Vec *V,t; PetscInt i,j,reps,n=15,k=6; PetscRandom rctx; PetscScalar *val_dot,*val_mdot,*tval_dot,*tval_mdot; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,NULL,"-k",&k,NULL);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"Test with %D random vectors of length %D",k,n);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"\n",k,n);CHKERRQ(ierr); ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rctx);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rctx);CHKERRQ(ierr); ierr = VecCreate(PETSC_COMM_WORLD,&t);CHKERRQ(ierr); ierr = VecSetSizes(t,n,PETSC_DECIDE);CHKERRQ(ierr); ierr = VecSetFromOptions(t);CHKERRQ(ierr); ierr = VecDuplicateVecs(t,k,&V);CHKERRQ(ierr); ierr = VecSetRandom(t,rctx);CHKERRQ(ierr); ierr = PetscMalloc1(k,&val_dot);CHKERRQ(ierr); ierr = PetscMalloc1(k,&val_mdot);CHKERRQ(ierr); ierr = PetscMalloc1(k,&tval_dot);CHKERRQ(ierr); ierr = PetscMalloc1(k,&tval_mdot);CHKERRQ(ierr); for (i=0; i<k; i++) { ierr = VecSetRandom(V[i],rctx);CHKERRQ(ierr); } for (reps=0; reps<20; reps++) { for (i=1; i<k; i++) { ierr = VecMDot(t,i,V,val_mdot);CHKERRQ(ierr); ierr = VecMTDot(t,i,V,tval_mdot);CHKERRQ(ierr); for (j=0;j<i;j++) { ierr = VecDot(t,V[j],&val_dot[j]);CHKERRQ(ierr); ierr = VecTDot(t,V[j],&tval_dot[j]);CHKERRQ(ierr); } /* Check result */ for (j=0;j<i;j++) { if (PetscAbsScalar(val_mdot[j] - val_dot[j])/PetscAbsScalar(val_dot[j]) > 1e-5) { ierr = PetscPrintf(PETSC_COMM_WORLD, "[TEST FAILED] i=%D, j=%D, val_mdot[j]=%g, val_dot[j]=%g\n",i,j,(double)PetscAbsScalar(val_mdot[j]), (double)PetscAbsScalar(val_dot[j]));CHKERRQ(ierr); break; } if (PetscAbsScalar(tval_mdot[j] - tval_dot[j])/PetscAbsScalar(tval_dot[j]) > 1e-5) { ierr = PetscPrintf(PETSC_COMM_WORLD, "[TEST FAILED] i=%D, j=%D, tval_mdot[j]=%g, tval_dot[j]=%g\n",i,j,(double)PetscAbsScalar(tval_mdot[j]), (double)PetscAbsScalar(tval_dot[j]));CHKERRQ(ierr); break; } } } } ierr = PetscPrintf(PETSC_COMM_WORLD,"Test completed successfully!\n",k,n);CHKERRQ(ierr); ierr = PetscFree(val_dot);CHKERRQ(ierr); ierr = PetscFree(val_mdot);CHKERRQ(ierr); ierr = PetscFree(tval_dot);CHKERRQ(ierr); ierr = PetscFree(tval_mdot);CHKERRQ(ierr); ierr = VecDestroyVecs(k,&V);CHKERRQ(ierr); ierr = VecDestroy(&t);CHKERRQ(ierr); ierr = PetscRandomDestroy(&rctx);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
static PetscErrorCode VecMTDot_Nest(Vec x,PetscInt nv,const Vec y[],PetscScalar *val) { PetscInt j; PetscErrorCode ierr; PetscFunctionBegin; for (j=0; j<nv; j++) { ierr = VecTDot(x,y[j],&val[j]);CHKERRQ(ierr); } PetscFunctionReturn(0); }
static PetscErrorCode VecTDot_Nest(Vec x,Vec y,PetscScalar *val) { Vec_Nest *bx = (Vec_Nest*)x->data; Vec_Nest *by = (Vec_Nest*)y->data; PetscInt i,nr; PetscScalar x_dot_y,_val; PetscErrorCode ierr; PetscFunctionBegin; nr = bx->nb; _val = 0.0; for (i=0; i<nr; i++) { ierr = VecTDot(bx->v[i],by->v[i],&x_dot_y);CHKERRQ(ierr); _val = _val + x_dot_y; } *val = _val; PetscFunctionReturn(0); }
T PetscVector<T>::indefinite_dot (const NumericVector<T>& V) const { this->_restore_array(); // Error flag PetscErrorCode ierr = 0; // Return value PetscScalar value=0.; // Make sure the NumericVector passed in is really a PetscVector const PetscVector<T>* v = libmesh_cast_ptr<const PetscVector<T>*>(&V); // 2.3.x (at least) style. Untested for previous versions. ierr = VecTDot(this->_vec, v->_vec, &value); CHKERRABORT(libMesh::COMM_WORLD,ierr); return static_cast<T>(value); }
PetscErrorCode BSSPsiOne(BSS self, Vec c, PetscReal x, PetscScalar *y) { PetscErrorCode ierr; ierr = BSSCheck(self); CHKERRQ(ierr); int n; BSSGetSize(self, &n); Vec us; BSSCreateR1Vec(self, &us); for(int i = 0; i < n; i++) { PetscScalar u; ierr = BSSBasisPsi(self, i, x, &u); CHKERRQ(ierr); VecSetValue(us, i, u, INSERT_VALUES); } VecAssemblyBegin(us); VecAssemblyEnd(us); PetscScalar yy; VecTDot(us, c, &yy); *y = yy; VecDestroy(&us); return 0; }
PetscErrorCode VecTDot_MultiVec(Vec x, Vec y, PetscScalar* val) { #if !defined(NDEBUG) TBOX_ASSERT(x); TBOX_ASSERT(y); #endif Vec_MultiVec* mx = static_cast<Vec_MultiVec*>(x->data); Vec_MultiVec* my = static_cast<Vec_MultiVec*>(y->data); #if !defined(NDEBUG) TBOX_ASSERT(mx); TBOX_ASSERT(my); TBOX_ASSERT(mx->n == my->n); #endif PetscErrorCode ierr; *val = 0.0; for (PetscInt k = 0; k < mx->n; ++k) { PetscScalar component_val; ierr = VecTDot(mx->array[k], my->array[k], &component_val); CHKERRQ(ierr); *val += component_val; } PetscFunctionReturn(0); } // VecTDot_MultiVec