int main(int argc,char **argv) { PetscErrorCode ierr; PetscInt n = 5,N,i; PetscMPIInt size,rank; PetscScalar value,zero = 0.0; Vec x,y; IS is1,is2; VecScatter ctx = 0; ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); /* create two vectors */ N = size*n; ierr = VecCreate(PETSC_COMM_WORLD,&y);CHKERRQ(ierr); ierr = VecSetSizes(y,n,PETSC_DECIDE);CHKERRQ(ierr) ierr = VecSetFromOptions(y);CHKERRQ(ierr); ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr); ierr = VecSetSizes(x,n,PETSC_DECIDE);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); /* create two index sets */ ierr = ISCreateStride(PETSC_COMM_WORLD,n,n*rank,1,&is1);CHKERRQ(ierr); ierr = ISCreateStride(PETSC_COMM_WORLD,n,(n*(rank+1))%N,1,&is2);CHKERRQ(ierr); /* fill local part of parallel vector x */ value = (PetscScalar)(rank+1); for (i=n*rank; i<n*(rank+1); i++) { ierr = VecSetValues(x,1,&i,&value,INSERT_VALUES);CHKERRQ(ierr); } ierr = VecAssemblyBegin(x);CHKERRQ(ierr); ierr = VecAssemblyEnd(x);CHKERRQ(ierr); ierr = VecSet(y,zero);CHKERRQ(ierr); ierr = VecScatterCreate(x,is1,y,is2,&ctx);CHKERRQ(ierr); ierr = VecScatterBegin(ctx,x,y,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterEnd(ctx,x,y,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterDestroy(ctx);CHKERRQ(ierr); ierr = VecView(y,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = VecDestroy(x);CHKERRQ(ierr); ierr = VecDestroy(y);CHKERRQ(ierr); ierr = ISDestroy(is1);CHKERRQ(ierr); ierr = ISDestroy(is2);CHKERRQ(ierr); ierr = PetscFinalize();CHKERRQ(ierr); return 0; }
Vector<Scalar>* PetscVector<Scalar>::change_sign() { PetscScalar* y = malloc_with_check(this->size, this); int *idx = malloc_with_check(this->size, this); for (unsigned int i = 0; i < this->size; i++) idx[i] = i; VecGetValues(vec, this->size, idx, y); for (unsigned int i = 0; i < this->size; i++) y[i] *= -1.; VecSetValues(vec, this->size, idx, y, INSERT_VALUES); free_with_check(y); free_with_check(idx); return this; }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscInt n = 5,i,idx2[3] = {0,2,3},idx1[3] = {0,1,2}; PetscMPIInt size,rank; PetscScalar value; Vec x,y; IS is1,is2; VecScatter ctx = 0; PetscInitialize(&argc,&argv,(char*)0,help); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); /* create two vectors */ ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr); ierr = VecSetSizes(x,PETSC_DECIDE,size*n);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); ierr = VecCreateSeq(PETSC_COMM_SELF,n,&y);CHKERRQ(ierr); /* create two index sets */ ierr = ISCreateGeneral(PETSC_COMM_SELF,3,idx1,PETSC_COPY_VALUES,&is1);CHKERRQ(ierr); ierr = ISCreateGeneral(PETSC_COMM_SELF,3,idx2,PETSC_COPY_VALUES,&is2);CHKERRQ(ierr); /* fill local part of parallel vector */ for (i=n*rank; i<n*(rank+1); i++) { value = (PetscScalar) i; ierr = VecSetValues(x,1,&i,&value,INSERT_VALUES);CHKERRQ(ierr); } ierr = VecAssemblyBegin(x);CHKERRQ(ierr); ierr = VecAssemblyEnd(x);CHKERRQ(ierr); ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = VecSet(y,-1.0);CHKERRQ(ierr); ierr = VecScatterCreate(x,is1,y,is2,&ctx);CHKERRQ(ierr); ierr = VecScatterBegin(ctx,x,y,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterEnd(ctx,x,y,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterDestroy(&ctx);CHKERRQ(ierr); if (!rank) { ierr = PetscPrintf(PETSC_COMM_SELF,"scattered vector\n");CHKERRQ(ierr); ierr = VecView(y,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr); } ierr = ISDestroy(&is1);CHKERRQ(ierr); ierr = ISDestroy(&is2);CHKERRQ(ierr); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&y);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
-fout <file> : output file name\n\n"; #include <petscmat.h> int main(int argc,char **args) { Mat A; Vec b; char fileout[PETSC_MAX_PATH_LEN]; PetscInt i,j,m = 6,n = 6,N = 36,Ii,J; PetscErrorCode ierr; PetscScalar val,v; PetscViewer view; ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,N,N);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); for (i=0; i<m; i++) { for (j=0; j<n; j++) { v = -1.0; Ii = j + n*i; if (i>0) {J = Ii - n; ierr = MatSetValues(A,1,&Ii,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr);} if (i<m-1) {J = Ii + n; ierr = MatSetValues(A,1,&Ii,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr);} if (j>0) {J = Ii - 1; ierr = MatSetValues(A,1,&Ii,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr);} if (j<n-1) {J = Ii + 1; ierr = MatSetValues(A,1,&Ii,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr);} v = 4.0; ierr = MatSetValues(A,1,&Ii,1,&Ii,&v,INSERT_VALUES);CHKERRQ(ierr); } } ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = VecCreate(PETSC_COMM_WORLD,&b);CHKERRQ(ierr); ierr = VecSetSizes(b,PETSC_DECIDE,N);CHKERRQ(ierr); ierr = VecSetFromOptions(b);CHKERRQ(ierr); for (i=0; i<N; i++) { val = i + 1; ierr = VecSetValues(b,1,&i,&val,INSERT_VALUES);CHKERRQ(ierr); } ierr = VecAssemblyBegin(b);CHKERRQ(ierr); ierr = VecAssemblyEnd(b);CHKERRQ(ierr); ierr = PetscOptionsGetString(NULL,NULL,"-fout",fileout,PETSC_MAX_PATH_LEN,NULL);CHKERRQ(ierr); ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,fileout,FILE_MODE_WRITE,&view);CHKERRQ(ierr); ierr = MatView(A,view);CHKERRQ(ierr); ierr = VecView(b,view);CHKERRQ(ierr); ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); ierr = VecDestroy(&b);CHKERRQ(ierr); ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
/* FormHessian - Forms the Hessian matrix. Input Parameters: . tao - the Tao context . X - the input vector . ptr - optional user-defined context, as set by TaoSetHessian() Output Parameters: . H - Hessian matrix . PrecH - optionally different preconditioning Hessian . flag - flag indicating matrix structure Notes: This routine is intended simply as an example of the interface to a Hessian evaluation routine. Since this example compute the Hessian a column at a time, it is not particularly efficient and is not recommended. */ PetscErrorCode FormHessian(Tao tao,Vec X,Mat H,Mat Hpre, void *ptr) { AppCtx *user = (AppCtx *) ptr; PetscErrorCode ierr; PetscInt i,j, ndim = user->ndim; PetscReal *y, zero = 0.0, one = 1.0; PetscBool assembled; user->xvec = X; /* Initialize Hessian entries and work vector to zero */ ierr = MatAssembled(H,&assembled);CHKERRQ(ierr); if (assembled){ierr = MatZeroEntries(H); CHKERRQ(ierr);} ierr = VecSet(user->s, zero);CHKERRQ(ierr); /* Loop over matrix columns to compute entries of the Hessian */ for (j=0; j<ndim; j++) { ierr = VecSetValues(user->s,1,&j,&one,INSERT_VALUES);CHKERRQ(ierr); ierr = VecAssemblyBegin(user->s);CHKERRQ(ierr); ierr = VecAssemblyEnd(user->s);CHKERRQ(ierr); ierr = HessianProduct(ptr,user->s,user->y);CHKERRQ(ierr); ierr = VecSetValues(user->s,1,&j,&zero,INSERT_VALUES);CHKERRQ(ierr); ierr = VecAssemblyBegin(user->s);CHKERRQ(ierr); ierr = VecAssemblyEnd(user->s);CHKERRQ(ierr); ierr = VecGetArray(user->y,&y);CHKERRQ(ierr); for (i=0; i<ndim; i++) { if (y[i] != zero) { ierr = MatSetValues(H,1,&i,1,&j,&y[i],ADD_VALUES);CHKERRQ(ierr); } } ierr = VecRestoreArray(user->y,&y);CHKERRQ(ierr); } ierr = MatAssemblyBegin(H,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(H,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); return 0; }
PetscErrorCode VecMerge(Vec r1, Vec r2, Vec r){ PetscErrorCode err; PetscInt low, high, n1_local, n2_local; PetscInt *n1_idx, *n2_idx; PetscScalar *r1_array, *r2_array; PetscInt n1; int i; //copy r1 to r err = VecGetSize(r1, &n1); CHKERRQ(err); err = VecGetOwnershipRange(r1, &low, &high); CHKERRQ(err); err = VecGetLocalSize(r1, &n1_local); CHKERRQ(err); err = PetscMalloc1(n1_local, &n1_idx); CHKERRQ(err); for(i = 0; i < n1_local; i++) n1_idx[i] = low + i; err = VecGetArray(r1, &r1_array); CHKERRQ(err); err = VecSetValues(r, n1_local, n1_idx, r1_array, INSERT_VALUES); CHKERRQ(err); err = VecAssemblyBegin(r); CHKERRQ(err); err = VecAssemblyEnd(r); CHKERRQ(err); err = VecRestoreArray(r1, &r1_array); CHKERRQ(err); err = PetscFree(n1_idx); CHKERRQ(err); err = VecGetOwnershipRange(r2, &low, &high); CHKERRQ(err); err = VecGetLocalSize(r2, &n2_local); CHKERRQ(err); err = PetscMalloc1(n2_local, &n2_idx); CHKERRQ(err); for(i = 0; i < n2_local; i++) n2_idx[i] = low + i + n1; err = VecGetArray(r2, &r2_array); CHKERRQ(err); err = VecSetValues(r, n2_local, n2_idx, r2_array, INSERT_VALUES); CHKERRQ(err); err = VecAssemblyBegin(r); CHKERRQ(err); err = VecAssemblyEnd(r); CHKERRQ(err); //err = VecRestoreArray(r1, &r1_array); CHKERRQ(err); err = VecRestoreArray(r2, &r2_array); CHKERRQ(err); err = PetscFree(n1_idx); CHKERRQ(err); //err = PetscFree(n2_idx); CHKERRQ(err); return err; }
PETSC_INTERN PetscErrorCode MatConvert_Shell(Mat oldmat, MatType newtype,MatReuse reuse,Mat *newmat) { Mat mat; Vec in,out; PetscErrorCode ierr; PetscInt i,M,m,*rows,start,end; MPI_Comm comm; PetscScalar *array,zero = 0.0,one = 1.0; PetscFunctionBegin; ierr = PetscObjectGetComm((PetscObject)oldmat,&comm);CHKERRQ(ierr); ierr = MatGetOwnershipRange(oldmat,&start,&end);CHKERRQ(ierr); ierr = VecCreateMPI(comm,end-start,PETSC_DECIDE,&in);CHKERRQ(ierr); ierr = VecDuplicate(in,&out);CHKERRQ(ierr); ierr = VecGetSize(in,&M);CHKERRQ(ierr); ierr = VecGetLocalSize(in,&m);CHKERRQ(ierr); ierr = PetscMalloc1(m+1,&rows);CHKERRQ(ierr); for (i=0; i<m; i++) rows[i] = start + i; ierr = MatCreate(comm,&mat);CHKERRQ(ierr); ierr = MatSetSizes(mat,m,M,M,M);CHKERRQ(ierr); ierr = MatSetType(mat,newtype);CHKERRQ(ierr); ierr = MatSetBlockSizesFromMats(mat,oldmat,oldmat);CHKERRQ(ierr); ierr = MatSetUp(mat);CHKERRQ(ierr); for (i=0; i<M; i++) { ierr = VecSet(in,zero);CHKERRQ(ierr); ierr = VecSetValues(in,1,&i,&one,INSERT_VALUES);CHKERRQ(ierr); ierr = VecAssemblyBegin(in);CHKERRQ(ierr); ierr = VecAssemblyEnd(in);CHKERRQ(ierr); ierr = MatMult(oldmat,in,out);CHKERRQ(ierr); ierr = VecGetArray(out,&array);CHKERRQ(ierr); ierr = MatSetValues(mat,m,rows,1,&i,array,INSERT_VALUES);CHKERRQ(ierr); ierr = VecRestoreArray(out,&array);CHKERRQ(ierr); } ierr = PetscFree(rows);CHKERRQ(ierr); ierr = VecDestroy(&in);CHKERRQ(ierr); ierr = VecDestroy(&out);CHKERRQ(ierr); ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); if (reuse == MAT_INPLACE_MATRIX) { ierr = MatHeaderReplace(oldmat,&mat);CHKERRQ(ierr); } else { *newmat = mat; } PetscFunctionReturn(0); }
int main(int argc, char **args) { PetscErrorCode ierr; MPI_Comm comm = MPI_COMM_SELF; FEMInf fem; ViewerFunc viewer; int n; ierr = SlepcInitialize(&argc, &args, (char*)0, help); CHKERRQ(ierr); // ==== Initialize ==== PrintTimeStamp(comm, "Init", NULL); ierr = FEMInfCreate(comm, &fem); CHKERRQ(ierr); ierr = ViewerFuncCreate(comm, &viewer); CHKERRQ(ierr); // ==== Set values ==== PrintTimeStamp(comm, "Set", NULL); PetscOptionsBegin(comm, "", "plot_basis.c options", "none"); ierr = FEMInfSetFromOptions(fem); CHKERRQ(ierr); ierr = ViewerFuncSetFromOptions(viewer); CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL, "-n", &n, NULL); CHKERRQ(ierr); PetscOptionsEnd(); // ==== Check input values ==== int num; FEMInfGetSize(fem, &num); if(n < 0 || num <= n) { SETERRQ(comm, 1, "n msut be zero or positive integer and smaller than size of FEM"); } // ==== Calc ==== Vec c; ierr = VecCreateSeq(comm, num, &c); CHKERRQ(ierr); ierr = VecSet(c, 0.0); CHKERRQ(ierr); int indices[1] = {n}; PetscScalar values[1] = {1.0}; ierr = VecSetValues(c, 1, indices, values, INSERT_VALUES); CHKERRQ(ierr); ierr = VecAssemblyBegin(c); CHKERRQ(ierr); ierr = VecAssemblyEnd(c); CHKERRQ(ierr); FEMInfViewFunc(fem, c, viewer); // ==== Finalize ==== ierr = SlepcFinalize(); CHKERRQ(ierr); return 0; }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscMPIInt size,rank; PetscInt n = 5,i; PetscScalar value; Vec x,y; IS is1,is2; VecScatter ctx = 0; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); /* create two vectors */ ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr); ierr = VecSetSizes(x,PETSC_DECIDE,size*n);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); ierr = VecCreateSeq(PETSC_COMM_SELF,n,&y);CHKERRQ(ierr); /* create two index sets */ ierr = ISCreateStride(PETSC_COMM_SELF,n,n*rank,1,&is1);CHKERRQ(ierr); ierr = ISCreateStride(PETSC_COMM_SELF,n,0,1,&is2);CHKERRQ(ierr); /* each processor inserts the entire vector */ /* this is redundant but tests assembly */ for (i=0; i<n*size; i++) { value = (PetscScalar) i; ierr = VecSetValues(x,1,&i,&value,INSERT_VALUES);CHKERRQ(ierr); } ierr = VecAssemblyBegin(x);CHKERRQ(ierr); ierr = VecAssemblyEnd(x);CHKERRQ(ierr); ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = VecScatterCreate(x,is1,y,is2,&ctx);CHKERRQ(ierr); ierr = VecScatterBegin(ctx,x,y,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterEnd(ctx,x,y,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterDestroy(&ctx);CHKERRQ(ierr); if (!rank) { printf("----\n"); VecView(y,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr); } ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&y);CHKERRQ(ierr); ierr = ISDestroy(&is1);CHKERRQ(ierr); ierr = ISDestroy(&is2);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
void linearSystemPETSc<fullMatrix<double> >::addToRightHandSide(int row, const fullMatrix<double> &val) { if (!_entriesPreAllocated) preAllocateEntries(); int blockSize; _try(MatGetBlockSize(_a, &blockSize)); for (int ii = 0; ii < blockSize; ii++) { PetscInt i = row * blockSize + ii; PetscScalar v = val(ii, 0); VecSetValues(_b, 1, &i, &v, ADD_VALUES); } }
void PetscVector<T>::add (const numeric_index_type i, const T value) { this->_restore_array(); libmesh_assert_less (i, size()); PetscErrorCode ierr=0; PetscInt i_val = static_cast<PetscInt>(i); PetscScalar petsc_value = static_cast<PetscScalar>(value); ierr = VecSetValues (_vec, 1, &i_val, &petsc_value, ADD_VALUES); CHKERRABORT(libMesh::COMM_WORLD,ierr); this->_is_closed = false; }
int main(int argc,char **args) { PetscErrorCode ierr; Vec x, b; Mat A; KSP ksp; int jb[4] = {0, 1, 2, 3}, i1[3] = {0, 1, 2}, j1[3] = {0, 1, 2}, i2 = 3, j2[3] = {1, 2, 3}, i3 = 1, j3 = 3; double ab[4] = {7.0, 1.0, 1.0, 3.0}, aA1[9] = { 1.0, 2.0, 3.0, 2.0, 1.0, -2.0, -1.0, 1.0, 1.0}, aA2[3] = { 1.0, 1.0, -1.0}, aA3 = -3.0; PetscInitialize(&argc,&args,NULL,help); ierr = VecCreate(PETSC_COMM_WORLD,&b); CHKERRQ(ierr); ierr = VecSetSizes(b,PETSC_DECIDE,4); CHKERRQ(ierr); ierr = VecSetFromOptions(b); CHKERRQ(ierr); ierr = VecSetValues(b,4,jb,ab,INSERT_VALUES); CHKERRQ(ierr); ierr = VecAssemblyBegin(b); CHKERRQ(ierr); ierr = VecAssemblyEnd(b); CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_WORLD,&A); CHKERRQ(ierr); ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,4,4); CHKERRQ(ierr); ierr = MatSetFromOptions(A); CHKERRQ(ierr); ierr = MatSetUp(A); CHKERRQ(ierr); ierr = MatSetValues(A,3,i1,3,j1,aA1,INSERT_VALUES); CHKERRQ(ierr); ierr = MatSetValues(A,1,&i2,3,j2,aA2,INSERT_VALUES); CHKERRQ(ierr); ierr = MatSetValue(A,i3,j3,aA3,INSERT_VALUES); CHKERRQ(ierr); ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); ierr = KSPCreate(PETSC_COMM_WORLD,&ksp); CHKERRQ(ierr); ierr = KSPSetOperators(ksp,A,A); CHKERRQ(ierr); ierr = KSPSetFromOptions(ksp); CHKERRQ(ierr); ierr = VecDuplicate(b,&x); CHKERRQ(ierr); ierr = KSPSolve(ksp,b,x); CHKERRQ(ierr); ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD); CHKERRQ(ierr); KSPDestroy(&ksp); MatDestroy(&A); VecDestroy(&x); VecDestroy(&b); PetscFinalize(); return 0; }
PetscErrorCode reInitializeCalcBC(PetscScalar tc, PetscInt Iterc, PetscScalar tf, PetscInt Iterf, PetscInt numTracers, Vec *v, Vec *bcc, Vec *bcf) { PetscErrorCode ierr; PetscScalar myTime; /* Recompute BC */ if (periodicBiogeochemForcing) { ierr = interpPeriodicVector(tc,&Tss,biogeochemTimer.cyclePeriod,biogeochemTimer.numPerPeriod,biogeochemTimer.tdp,&Tssp,"Tss_"); ierr = interpPeriodicVector(tc,&Sss,biogeochemTimer.cyclePeriod,biogeochemTimer.numPerPeriod,biogeochemTimer.tdp,&Sssp,"Sss_"); ierr = interpPeriodicVector(tc,&atmosp,biogeochemTimer.cyclePeriod,biogeochemTimer.numPerPeriod,biogeochemTimer.tdp,&atmospp,"atmosp_"); myTime = DeltaT*Iterc; /* Iter should start at 0 */ inert_gas_bc_(&lBCSize,&Iterc,&myTime,&localTss[0],&localSss[0], &localatmosp[0],&gasID, &localBCc[0]); ierr = interpPeriodicVector(tf,&Tss,biogeochemTimer.cyclePeriod,biogeochemTimer.numPerPeriod,biogeochemTimer.tdp,&Tssp,"Tss_"); ierr = interpPeriodicVector(tf,&Sss,biogeochemTimer.cyclePeriod,biogeochemTimer.numPerPeriod,biogeochemTimer.tdp,&Sssp,"Sss_"); ierr = interpPeriodicVector(tf,&atmosp,biogeochemTimer.cyclePeriod,biogeochemTimer.numPerPeriod,biogeochemTimer.tdp,&atmospp,"atmosp_"); myTime = DeltaT*Iterf; /* Iter should start at 0 */ inert_gas_bc_(&lBCSize,&Iterf,&myTime,&localTss[0],&localSss[0], &localatmosp[0],&gasID, &localBCf[0]); ierr = VecSetValues(BCc,lBCSize,gBCIndices,localBCc,INSERT_VALUES);CHKERRQ(ierr); ierr = VecAssemblyBegin(BCc);CHKERRQ(ierr); ierr = VecAssemblyEnd(BCc);CHKERRQ(ierr); ierr = VecSetValues(BCf,lBCSize,gBCIndices,localBCf,INSERT_VALUES);CHKERRQ(ierr); ierr = VecAssemblyBegin(BCf);CHKERRQ(ierr); ierr = VecAssemblyEnd(BCf);CHKERRQ(ierr); } return 0; }
/*! \brief Set the Eigen internal vector * * */ void setPetsc() const { PETSC_SAFE_CALL(VecSetFromOptions(v)); // set the vector if (row_val.size() != 0) PETSC_SAFE_CALL(VecSetValues(v,row_val.size(),&row_val.template get<row_id>(0),&row_val.template get<val_id>(0),INSERT_VALUES)) PETSC_SAFE_CALL(VecAssemblyBegin(v)); PETSC_SAFE_CALL(VecAssemblyEnd(v)); }
PetscErrorCode CalculateSolution(PetscInt n,Vec *solution) { PetscErrorCode ierr; PetscInt i; PetscReal h,x = 0.0; PetscScalar uu; PetscFunctionBegin; ierr = VecCreateSeq(PETSC_COMM_SELF,n,solution);CHKERRQ(ierr); h = 1.0/((PetscReal)(n+1)); for (i=0; i<n; i++) { x += h; uu = x*(1.-x); ierr = VecSetValues(*solution,1,&i,&uu,INSERT_VALUES);CHKERRQ(ierr); } PetscFunctionReturn(0); }
PetscErrorCode CalculateRhs(Vec u) { PetscErrorCode ierr; PetscInt i,n; PetscReal h,x = 0.0; PetscScalar uu; PetscFunctionBegin; ierr = VecGetSize(u,&n);CHKERRQ(ierr); h = 1.0/((PetscReal)(n+1)); for (i=0; i<n; i++) { x += h; uu = 2.0*h*h; ierr = VecSetValues(u,1,&i,&uu,INSERT_VALUES);CHKERRQ(ierr); } PetscFunctionReturn(0); }
PetscErrorCode PCGAMGGetDataWithGhosts(const Mat Gmat,const PetscInt data_sz,const PetscReal data_in[],PetscInt *a_stride,PetscReal **a_data_out) { PetscErrorCode ierr; PetscMPIInt rank,size; MPI_Comm comm; Vec tmp_crds; Mat_MPIAIJ *mpimat = (Mat_MPIAIJ*)Gmat->data; PetscInt nnodes,num_ghosts,dir,kk,jj,my0,Iend,nloc; PetscScalar *data_arr; PetscReal *datas; PetscBool isMPIAIJ; PetscFunctionBegin; ierr = PetscObjectGetComm((PetscObject)Gmat,&comm);CHKERRQ(ierr); ierr = PetscObjectTypeCompare((PetscObject)Gmat, MATMPIAIJ, &isMPIAIJ);CHKERRQ(ierr); ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); ierr = MatGetOwnershipRange(Gmat, &my0, &Iend);CHKERRQ(ierr); nloc = Iend - my0; ierr = VecGetLocalSize(mpimat->lvec, &num_ghosts);CHKERRQ(ierr); nnodes = num_ghosts + nloc; *a_stride = nnodes; ierr = MatGetVecs(Gmat, &tmp_crds, 0);CHKERRQ(ierr); ierr = PetscMalloc1(data_sz*nnodes, &datas);CHKERRQ(ierr); for (dir=0; dir<data_sz; dir++) { /* set local, and global */ for (kk=0; kk<nloc; kk++) { PetscInt gid = my0 + kk; PetscScalar crd = (PetscScalar)data_in[dir*nloc + kk]; /* col oriented */ datas[dir*nnodes + kk] = PetscRealPart(crd); ierr = VecSetValues(tmp_crds, 1, &gid, &crd, INSERT_VALUES);CHKERRQ(ierr); } ierr = VecAssemblyBegin(tmp_crds);CHKERRQ(ierr); ierr = VecAssemblyEnd(tmp_crds);CHKERRQ(ierr); /* get ghost datas */ ierr = VecScatterBegin(mpimat->Mvctx,tmp_crds,mpimat->lvec,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterEnd(mpimat->Mvctx,tmp_crds,mpimat->lvec,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecGetArray(mpimat->lvec, &data_arr);CHKERRQ(ierr); for (kk=nloc,jj=0;jj<num_ghosts;kk++,jj++) datas[dir*nnodes + kk] = PetscRealPart(data_arr[jj]); ierr = VecRestoreArray(mpimat->lvec, &data_arr);CHKERRQ(ierr); } ierr = VecDestroy(&tmp_crds);CHKERRQ(ierr); *a_data_out = datas; PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscMPIInt size; PetscInt i,j,n = 50,bs; PetscScalar val,*vals,zero=0.0; Vec x; ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); bs = size; ierr = PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);CHKERRQ(ierr); ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr); ierr = VecSetSizes(x,PETSC_DECIDE,n*bs);CHKERRQ(ierr); ierr = VecSetBlockSize(x,bs);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); for (i=0; i<n*bs; i++) { val = i*1.0; ierr = VecSetValues(x,1,&i,&val,INSERT_VALUES);CHKERRQ(ierr); } ierr = VecAssemblyBegin(x);CHKERRQ(ierr); ierr = VecAssemblyEnd(x);CHKERRQ(ierr); ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); /* Now do the blocksetvalues */ ierr = VecSet(x,zero);CHKERRQ(ierr); ierr = PetscMalloc(bs*sizeof(PetscScalar),&vals);CHKERRQ(ierr); for (i=0; i<n; i++) { for (j=0; j<bs; j++) { vals[j] = (i*bs+j)*1.0; } ierr = VecSetValuesBlocked(x,1,&i,vals,INSERT_VALUES);CHKERRQ(ierr); } ierr = VecAssemblyBegin(x);CHKERRQ(ierr); ierr = VecAssemblyEnd(x);CHKERRQ(ierr); ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = VecDestroy(x);CHKERRQ(ierr); ierr = PetscFree(vals);CHKERRQ(ierr); ierr = PetscFinalize();CHKERRQ(ierr); return 0; }
static PetscErrorCode ComputeRHS(KSP ksp,Vec b,void *ctx) { PetscErrorCode ierr; PetscInt mx,idx[2]; PetscScalar h,v[2]; DM da; PetscFunctionBeginUser; ierr = KSPGetDM(ksp,&da);CHKERRQ(ierr); ierr = DMDAGetInfo(da,0,&mx,0,0,0,0,0,0,0,0,0,0,0);CHKERRQ(ierr); h = 1.0/((mx-1)); ierr = VecSet(b,h);CHKERRQ(ierr); idx[0] = 0; idx[1] = mx -1; v[0] = v[1] = 0.0; ierr = VecSetValues(b,2,idx,v,INSERT_VALUES);CHKERRQ(ierr); ierr = VecAssemblyBegin(b);CHKERRQ(ierr); ierr = VecAssemblyEnd(b);CHKERRQ(ierr); PetscFunctionReturn(0); }
/* FormInitialGuess - Computes an initial approximation to the solution. Input Parameters: . user - user-defined application context . X - vector Output Parameters: . X - vector */ PetscErrorCode FormInitialGuess(AppCtx *user,Vec X) { PetscReal hx = user->hx, hy = user->hy, temp; PetscReal val; PetscErrorCode ierr; PetscInt i, j, k, nx = user->mx, ny = user->my; /* Compute initial guess */ for (j=0; j<ny; j++) { temp = PetscMin(j+1,ny-j)*hy; for (i=0; i<nx; i++) { k = nx*j + i; val = PetscMin((PetscMin(i+1,nx-i))*hx,temp); ierr = VecSetValues(X,1,&k,&val,ADD_VALUES);CHKERRQ(ierr); } } ierr = VecAssemblyBegin(X);CHKERRQ(ierr); ierr = VecAssemblyEnd(X);CHKERRQ(ierr); return 0; }
PetscErrorCode ComputeInitialSolution(DM da,Vec x) { PetscErrorCode ierr; PetscInt mx,col[2],xs,xm,i; PetscScalar Hx,val[2]; PetscFunctionBeginUser; ierr = DMDAGetInfo(da,0,&mx,0,0,0,0,0,0,0,0,0,0,0);CHKERRQ(ierr); Hx = 2.0*PETSC_PI / (PetscReal)(mx); ierr = DMDAGetCorners(da,&xs,0,0,&xm,0,0);CHKERRQ(ierr); for (i=xs; i<xs+xm; i++) { col[0] = 2*i; col[1] = 2*i + 1; val[0] = val[1] = PetscSinScalar(((PetscScalar)i)*Hx); ierr = VecSetValues(x,2,col,val,INSERT_VALUES);CHKERRQ(ierr); } ierr = VecAssemblyBegin(x);CHKERRQ(ierr); ierr = VecAssemblyEnd(x);CHKERRQ(ierr); PetscFunctionReturn(0); }
/** * Fills in a PETSc vector from a JNI double array. They must be the same size. * * @param env a pointer to the JNI environment * @param b a pointer to the the PETSc vector to fill * @param values a pointer to the JNI double array to use * @return 0 on success, PetscErrorCode on failure */ PetscErrorCode _fill_vector(JNIEnv *env, Vec *b, jdoubleArray *values) { PetscErrorCode ierr; // Get size and base pointer for array of values jsize value_length = (*env) -> GetArrayLength(env, *values); PetscScalar *value_array = (*env) -> GetDoubleArrayElements(env, *values, 0); // Make array of indices int indices[value_length]; for (int i = 0; i < value_length; i++) { indices[i] = i; } // Fill with values ierr = VecSetValues(*b, value_length, indices, value_array, INSERT_VALUES); CHKERRQ(ierr); (*env) -> ReleaseDoubleArrayElements(env, *values, value_array, 0); return 0; }
Vec PetscMatTools::GetMatrixRowDistributed(Mat matrix, unsigned rowIndex) { /* * We need to make sure that lhs_ith_row doesn't ignore off processor entries when assembling, * otherwise the VecSetValues call a few lines below will not work as expected. */ PetscInt lo, hi; PetscMatTools::GetOwnershipRange(matrix, lo, hi); unsigned size = PetscMatTools::GetSize(matrix); Vec mat_ith_row = PetscTools::CreateVec(size, hi-lo, false); PetscInt num_entries; const PetscInt* column_indices; const PetscScalar* values; bool am_row_owner = (PetscInt)rowIndex >= lo && (PetscInt)rowIndex < hi; /* * Am I the owner of the row? If so get the non-zero entries and add them lhs_ith_row. * In parallel, VecAssembly{Begin,End} will send values to the rest of processors. */ if (am_row_owner) { MatGetRow(matrix, rowIndex, &num_entries, &column_indices, &values); VecSetValues(mat_ith_row, num_entries, column_indices, values, INSERT_VALUES); } VecAssemblyBegin(mat_ith_row); VecAssemblyEnd(mat_ith_row); if (am_row_owner) { MatRestoreRow(matrix, rowIndex, &num_entries, &column_indices, &values); } return mat_ith_row; }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscInt n = 6,idx1[3] = {0,1,2},loc[6] = {0,1,2,3,4,5}; PetscScalar two = 2.0,vals[6] = {10,11,12,13,14,15}; Vec x,y; IS is1,is2; VecScatter ctx = 0; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; /* create two vectors */ ierr = VecCreateSeq(PETSC_COMM_SELF,n,&x);CHKERRQ(ierr); ierr = VecDuplicate(x,&y);CHKERRQ(ierr); /* create two index sets */ ierr = ISCreateStride(PETSC_COMM_SELF,3,0,2,&is1);CHKERRQ(ierr); ierr = ISCreateGeneral(PETSC_COMM_SELF,3,idx1,PETSC_COPY_VALUES,&is2);CHKERRQ(ierr); ierr = VecSetValues(x,6,loc,vals,INSERT_VALUES);CHKERRQ(ierr); ierr = VecView(x,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_SELF,"----\n");CHKERRQ(ierr); ierr = VecSet(y,two);CHKERRQ(ierr); ierr = VecScatterCreate(x,is1,y,is2,&ctx);CHKERRQ(ierr); ierr = VecScatterBegin(ctx,x,y,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterEnd(ctx,x,y,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterDestroy(&ctx);CHKERRQ(ierr); ierr = VecView(y,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr); ierr = ISDestroy(&is1);CHKERRQ(ierr); ierr = ISDestroy(&is2);CHKERRQ(ierr); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&y);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
void Field_solver::modify_rhs_near_object_boundaries( Spatial_mesh &spat_mesh, Inner_region &inner_region ) { int nx = spat_mesh.x_n_nodes; int ny = spat_mesh.y_n_nodes; int nz = spat_mesh.z_n_nodes; //int nrow = (nx-2)*(ny-2); double dx = spat_mesh.x_cell_size; double dy = spat_mesh.y_cell_size; double dz = spat_mesh.z_cell_size; PetscErrorCode ierr; std::vector<PetscInt> indices_of_nodes_near_boundaries; std::vector<PetscScalar> rhs_modification_for_nodes_near_boundaries; indicies_of_near_boundary_nodes_and_rhs_modifications( indices_of_nodes_near_boundaries, rhs_modification_for_nodes_near_boundaries, nx, ny, nz, dx, dy, dz, inner_region ); PetscInt number_of_elements = indices_of_nodes_near_boundaries.size(); if( number_of_elements != 0 ){ PetscInt *indices = &indices_of_nodes_near_boundaries[0]; PetscScalar *values = &rhs_modification_for_nodes_near_boundaries[0]; // ADD_VALUES gathers values from all processes. // Therefore, only a single process // should be responsible for calculation of rhs_modification // for a given node. ierr = VecSetValues( rhs, number_of_elements, indices, values, ADD_VALUES ); CHKERRXX( ierr ); CHKERRXX( ierr ); ierr = VecAssemblyBegin( rhs ); CHKERRXX( ierr ); ierr = VecAssemblyEnd( rhs ); CHKERRXX( ierr ); } }
PetscErrorCode ConvertVectorToVec(MPI_Comm comm,vector *v,Vec *Pv) { PetscErrorCode ierr; PetscMPIInt size,rank; int m,M,i,*mnls,*start_indices,*global_indices; PetscFunctionBegin; ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); m = v->mnl; M = v->n; ierr = VecCreateMPI(comm,m,M,Pv);CHKERRQ(ierr); ierr = PetscMalloc(size*sizeof(int),&mnls);CHKERRQ(ierr); ierr = MPI_Allgather(&v->mnl,1,MPI_INT,mnls,1,MPI_INT,comm);CHKERRQ(ierr); ierr = PetscMalloc(size*sizeof(int),&start_indices);CHKERRQ(ierr); start_indices[0] = 0; for (i=1; i<size; i++) start_indices[i] = start_indices[i-1] +mnls[i-1]; ierr = PetscMalloc(v->mnl*sizeof(int),&global_indices);CHKERRQ(ierr); for (i=0; i<v->mnl; i++) global_indices[i] = start_indices[rank] + i; ierr = PetscFree(mnls);CHKERRQ(ierr); ierr = PetscFree(start_indices);CHKERRQ(ierr); ierr = VecSetValues(*Pv,v->mnl,global_indices,v->v,INSERT_VALUES);CHKERRQ(ierr); ierr = VecAssemblyBegin(*Pv);CHKERRQ(ierr); ierr = VecAssemblyEnd(*Pv);CHKERRQ(ierr); ierr = PetscFree(global_indices);CHKERRQ(ierr); PetscFunctionReturn(0); }
void SolutionVector_LoadCurrentFeVariableValuesOntoVector( void* solutionVector ) { SolutionVector* self = (SolutionVector*)solutionVector; FeVariable* feVar = self->feVariable; FeMesh* feMesh = feVar->feMesh; Node_LocalIndex node_lI = 0; Dof_Index dof_I = 0; double value = 0; PetscInt insertionIndex = 0; for ( node_lI = 0; node_lI < FeMesh_GetNodeLocalSize( feMesh ); node_lI++ ) { for ( dof_I = 0; dof_I < feVar->dofLayout->dofCounts[node_lI]; dof_I++ ) { value = DofLayout_GetValueDouble( feVar->dofLayout, node_lI, dof_I ); insertionIndex = self->eqNum->mapNodeDof2Eq[node_lI][dof_I]; //Vector_InsertEntries( self->vector, 1, &insertionIndex, &value ); VecSetValues( self->vector, 1, &insertionIndex, &value, INSERT_VALUES ); } } //Vector_AssemblyBegin( self->vector ); //Vector_AssemblyEnd( self->vector ); VecAssemblyBegin( self->vector ); VecAssemblyEnd( self->vector ); }
void Field_solver::set_rhs_at_nodes_occupied_by_objects( Spatial_mesh &spat_mesh, Inner_region &inner_region ) { int nx = spat_mesh.x_n_nodes; int ny = spat_mesh.y_n_nodes; int nz = spat_mesh.z_n_nodes; std::vector<PetscInt> indices_of_inner_nodes_not_at_domain_edge; indices_of_inner_nodes_not_at_domain_edge = list_of_nodes_global_indices_in_matrix( inner_region.inner_nodes_not_at_domain_edge, nx, ny, nz ); PetscErrorCode ierr; PetscInt num_of_elements = indices_of_inner_nodes_not_at_domain_edge.size(); if( num_of_elements != 0 ){ PetscInt *global_indices = &indices_of_inner_nodes_not_at_domain_edge[0]; std::vector<PetscScalar> zeroes( num_of_elements, 0.0 ); ierr = VecSetValues( rhs, num_of_elements, global_indices, &zeroes[0], INSERT_VALUES ); CHKERRXX( ierr ); ierr = VecAssemblyBegin( rhs ); CHKERRXX( ierr ); ierr = VecAssemblyEnd( rhs ); CHKERRXX( ierr ); } }
int PetscSOE::setB(const Vector &v, double fact) { // check for a quick return if (fact == 0.0) return 0; if (size != v.Size() ) { opserr << "PetscSOE::addB() - Vector not of appropriate size\n"; return -1; } int n = size; int row; double value; for (int i=0; i<n; i++) { value = v(i) * fact; int ierr = VecSetValues(b,1,&i,&value,INSERT_VALUES); CHKERRA(ierr); } int ierr = VecAssemblyBegin(b); CHKERRA(ierr); ierr = VecAssemblyEnd(b); CHKERRA(ierr); return 0; }
int main(int argc,char **argv) { Vec V,W; MPI_Comm comm; PetscScalar one=1,e=2.7181; PetscReal nrm1,nrm2,nrm3,nrm4; PetscInt ione=1; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscInitialize(&argc,&argv,0,help);CHKERRQ(ierr); comm = MPI_COMM_SELF; ierr = VecCreateSeq(comm,10,&V);CHKERRQ(ierr); ierr = VecSetRandom(V,NULL);CHKERRQ(ierr); ierr = VecAssemblyBegin(V);CHKERRQ(ierr); ierr = VecAssemblyEnd(V);CHKERRQ(ierr); /* * Initial */ /* display norm 1 & 2 */ ierr = VecNorm(V,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(V,NORM_2,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"Original: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* display cached norm 1 & 2 */ ierr = VecNorm(V,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(V,NORM_2,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"cached: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* * Alter an element */ ierr = VecSetValues(V,1,&ione,&one,INSERT_VALUES);CHKERRQ(ierr); /* display norm 1 & 2 */ ierr = VecNorm(V,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(V,NORM_2,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"Altered: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* display cached norm 1 & 2 */ ierr = VecNorm(V,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(V,NORM_2,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"recomputed: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* * Scale the vector a little */ ierr = VecScale(V,e);CHKERRQ(ierr); /* display updated cached norm 1 & 2 */ ierr = VecNorm(V,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(V,NORM_2,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"Scale: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* display forced norm 1 & 2 */ ierr = PetscObjectStateIncrease((PetscObject)V);CHKERRQ(ierr); ierr = VecNorm(V,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(V,NORM_2,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"recompute: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* * Normalize the vector a little */ ierr = VecNormalize(V,&nrm1);CHKERRQ(ierr); /* display updated cached norm 1 & 2 */ ierr = VecNorm(V,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(V,NORM_2,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"Normalize: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* display forced norm 1 & 2 */ ierr = PetscObjectStateIncrease((PetscObject)V);CHKERRQ(ierr); ierr = VecNorm(V,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(V,NORM_2,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"recompute: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* * Copy to another vector */ ierr = VecDuplicate(V,&W);CHKERRQ(ierr); ierr = VecCopy(V,W);CHKERRQ(ierr); /* display norm 1 & 2 */ ierr = VecNorm(V,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(V,NORM_2,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"Original: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* display cached norm 1 & 2 */ ierr = VecNorm(W,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(W,NORM_2,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"copied: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* * Copy while data is invalid */ ierr = VecSetValues(V,1,&ione,&one,INSERT_VALUES);CHKERRQ(ierr); ierr = VecCopy(V,W);CHKERRQ(ierr); /* display norm 1 & 2 */ ierr = VecNorm(V,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(V,NORM_2,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"Invalidated: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* display norm 1 & 2 */ ierr = VecNorm(W,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(W,NORM_2,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"copied: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* * Constant vector */ ierr = VecSet(V,e);CHKERRQ(ierr); /* display updated cached norm 1 & 2 */ ierr = VecNorm(V,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(V,NORM_2,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"Constant: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* display forced norm 1 & 2 */ ierr = PetscObjectStateIncrease((PetscObject)V);CHKERRQ(ierr); ierr = VecNorm(V,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(V,NORM_2,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"recomputed: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* * Swap vectors */ ierr = VecNorm(V,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(W,NORM_1,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"Orig: norm_V=%e,norm_W=%e\n",(double)nrm1,(double)nrm2);CHKERRQ(ierr); /* store inf norm */ ierr = VecNorm(V,NORM_INFINITY,&nrm3);CHKERRQ(ierr); ierr = VecNorm(W,NORM_INFINITY,&nrm4);CHKERRQ(ierr); ierr = VecSwap(V,W);CHKERRQ(ierr); ierr = PetscObjectStateIncrease((PetscObject)V);CHKERRQ(ierr); ierr = PetscObjectStateIncrease((PetscObject)W);CHKERRQ(ierr); ierr = VecNorm(V,NORM_1,&nrm1);CHKERRQ(ierr); ierr = VecNorm(W,NORM_1,&nrm2);CHKERRQ(ierr); ierr = PetscPrintf(comm,"swapped: norm_V=%e,norm_W=%e\n",(double)nrm2,(double)nrm1);CHKERRQ(ierr); ierr = PetscPrintf(comm,"orig: F-norm_V=%e,F-norm_W=%e\n",(double)nrm3,(double)nrm4);CHKERRQ(ierr); ierr = VecNorm(V,NORM_INFINITY,&nrm3);CHKERRQ(ierr); ierr = VecNorm(W,NORM_INFINITY,&nrm4);CHKERRQ(ierr); ierr = PetscPrintf(comm,"swapped: F-norm_V=%e,F-norm_W=%e\n",(double)nrm4,(double)nrm3);CHKERRQ(ierr); ierr = VecDestroy(&V);CHKERRQ(ierr); ierr = VecDestroy(&W);CHKERRQ(ierr); PetscFinalize(); PetscFunctionReturn(0); }