int main(int argc,char **argv) { PetscErrorCode ierr; PetscInt i,blocks[2],nlocal; PetscMPIInt size,rank; PetscScalar value; Vec x,y; IS is1,is2; VecScatter ctx = 0; PetscViewer subviewer; 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); if (size != 2) SETERRQ(PETSC_COMM_SELF,1,"Must run with 2 processors"); /* create two vectors */ if (!rank) nlocal = 8; else nlocal = 4; ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr); ierr = VecSetSizes(x,nlocal,12);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); ierr = VecCreate(PETSC_COMM_SELF,&y);CHKERRQ(ierr); ierr = VecSetSizes(y,8,PETSC_DECIDE);CHKERRQ(ierr); ierr = VecSetFromOptions(y);CHKERRQ(ierr); /* create two index sets */ if (!rank) { blocks[0] = 0; blocks[1] = 2; } else { blocks[0] = 1; blocks[1] = 2; } ierr = ISCreateBlock(PETSC_COMM_SELF,4,2,blocks,PETSC_COPY_VALUES,&is1);CHKERRQ(ierr); ierr = ISCreateStride(PETSC_COMM_SELF,8,0,1,&is2);CHKERRQ(ierr); for (i=0; i<12; i++) { value = i; ierr = VecSetValues(x,1,&i,&value,INSERT_VALUES);CHKERRQ(ierr); } ierr = VecAssemblyBegin(x);CHKERRQ(ierr); ierr = VecAssemblyEnd(x);CHKERRQ(ierr); ierr = VecScatterCreateWithData(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 = PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD,PETSC_COMM_SELF,&subviewer);CHKERRQ(ierr); ierr = VecView(y,subviewer);CHKERRQ(ierr); ierr = PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD,PETSC_COMM_SELF,&subviewer);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 PETSc::Create( MPI_Comm Comm, int ilower, int iupper, int d_nz, int o_nz) { int n = iupper - ilower +1; comm = Comm; iLower = ilower; iUpper = iupper; MatCreateAIJ(PETSC_COMM_WORLD,n,n,PETSC_DECIDE,PETSC_DECIDE, d_nz,PETSC_NULL,o_nz,PETSC_NULL,&A); ierr = PetscObjectSetName((PetscObject) A, "A"); ierr = MatSetFromOptions(A); // b ierr = VecCreate(PETSC_COMM_WORLD, &b); ierr = PetscObjectSetName((PetscObject) b, "b"); ierr = VecSetSizes(b, n, PETSC_DECIDE); ierr = VecSetFromOptions(b); ierr = VecCreate(PETSC_COMM_WORLD,&x); ierr = PetscObjectSetName((PetscObject) x, "X"); ierr = VecSetSizes(x, n, PETSC_DECIDE); ierr = VecSetFromOptions(x); }
int main(int argc,char **argv) { Vec v,s,r,vecs[2]; /* vectors */ PetscInt i,start,end,n = 20; PetscErrorCode ierr; PetscScalar value; PetscInitialize(&argc,&argv,(char*)0,help); ierr = PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);CHKERRQ(ierr); /* Create multi-component vector with 2 components */ ierr = VecCreate(PETSC_COMM_WORLD,&v);CHKERRQ(ierr); ierr = VecSetSizes(v,PETSC_DECIDE,n);CHKERRQ(ierr); ierr = VecSetBlockSize(v,4);CHKERRQ(ierr); ierr = VecSetFromOptions(v);CHKERRQ(ierr); /* Create double-component vectors */ ierr = VecCreate(PETSC_COMM_WORLD,&s);CHKERRQ(ierr); ierr = VecSetSizes(s,PETSC_DECIDE,n/2);CHKERRQ(ierr); ierr = VecSetBlockSize(s,2);CHKERRQ(ierr); ierr = VecSetFromOptions(s);CHKERRQ(ierr); ierr = VecDuplicate(s,&r);CHKERRQ(ierr); vecs[0] = s; vecs[1] = r; /* Set the vector values */ ierr = VecGetOwnershipRange(v,&start,&end);CHKERRQ(ierr); for (i=start; i<end; i++) { value = i; ierr = VecSetValues(v,1,&i,&value,INSERT_VALUES);CHKERRQ(ierr); } /* Get the components from the multi-component vector to the other vectors */ ierr = VecStrideGatherAll(v,vecs,INSERT_VALUES);CHKERRQ(ierr); ierr = VecView(s,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = VecView(r,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = VecStrideScatterAll(vecs,v,ADD_VALUES);CHKERRQ(ierr); ierr = VecView(v,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); /* Free work space. All PETSc objects should be destroyed when they are no longer needed. */ ierr = VecDestroy(&v);CHKERRQ(ierr); ierr = VecDestroy(&s);CHKERRQ(ierr); ierr = VecDestroy(&r);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
void FETI_Operations::export_ext_solver_rhs(Vec vec_in) { homemade_assert_msg(m_bScratchFolderSet,"Scratch folder not set yet!"); Vec vec_C_micro_t_p_kkk_PETSc; VecCreate(m_comm.get(),&vec_C_micro_t_p_kkk_PETSc); VecSetSizes(vec_C_micro_t_p_kkk_PETSc,m_C_R_micro_N_local,m_C_R_micro_N); VecSetFromOptions(vec_C_micro_t_p_kkk_PETSc); Vec vec_C_BIG_t_p_kkk_PETSc; VecCreate(m_comm.get(),&vec_C_BIG_t_p_kkk_PETSc); VecSetSizes(vec_C_BIG_t_p_kkk_PETSc,m_C_R_BIG_N_local,m_C_R_BIG_N); VecSetFromOptions(vec_C_BIG_t_p_kkk_PETSc); MatMultTranspose(m_C_R_micro,vec_in,vec_C_micro_t_p_kkk_PETSc); MatMultTranspose(m_C_R_BIG,vec_in,vec_C_BIG_t_p_kkk_PETSc); write_PETSC_vector(vec_C_BIG_t_p_kkk_PETSc,m_scratch_folder_path + "/ext_solver_A_rhs.petscvec",m_comm.rank(),m_comm.get()); write_PETSC_vector(vec_C_micro_t_p_kkk_PETSc,m_scratch_folder_path + "/ext_solver_B_rhs.petscvec",m_comm.rank(),m_comm.get()); // Print MatLab debugging output? Variable defined at "carl_headers.h" #ifdef PRINT_MATLAB_DEBUG write_PETSC_vector_MATLAB(vec_C_micro_t_p_kkk_PETSc,m_scratch_folder_path + "/ext_solver_B_rhs.m",m_comm.get()); write_PETSC_vector_MATLAB(vec_C_BIG_t_p_kkk_PETSc,m_scratch_folder_path + "/ext_solver_A_rhs.m",m_comm.get()); #endif VecDestroy(&vec_C_micro_t_p_kkk_PETSc); VecDestroy(&vec_C_BIG_t_p_kkk_PETSc); }
/*@ MatMultEqual - Compares matrix-vector products of two matrices. Collective on Mat Input Parameters: + A - the first matrix - B - the second matrix - n - number of random vectors to be tested Output Parameter: . flg - PETSC_TRUE if the products are equal; PETSC_FALSE otherwise. Level: intermediate Concepts: matrices^equality between @*/ PetscErrorCode MatMultEqual(Mat A,Mat B,PetscInt n,PetscBool *flg) { PetscErrorCode ierr; Vec x,s1,s2; PetscRandom rctx; PetscReal r1,r2,tol=1.e-10; PetscInt am,an,bm,bn,k; PetscScalar none = -1.0; PetscFunctionBegin; PetscValidHeaderSpecific(A,MAT_CLASSID,1); PetscValidHeaderSpecific(B,MAT_CLASSID,2); ierr = MatGetLocalSize(A,&am,&an);CHKERRQ(ierr); ierr = MatGetLocalSize(B,&bm,&bn);CHKERRQ(ierr); if (am != bm || an != bn) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Mat A,Mat B: local dim %D %D %D %D",am,bm,an,bn); PetscCheckSameComm(A,1,B,2); #if defined(PETSC_USE_REAL_SINGLE) tol = 1.e-5; #endif ierr = PetscRandomCreate(((PetscObject)A)->comm,&rctx);CHKERRQ(ierr); ierr = PetscRandomSetFromOptions(rctx);CHKERRQ(ierr); ierr = VecCreate(((PetscObject)A)->comm,&x);CHKERRQ(ierr); ierr = VecSetSizes(x,an,PETSC_DECIDE);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); ierr = VecCreate(((PetscObject)A)->comm,&s1);CHKERRQ(ierr); ierr = VecSetSizes(s1,am,PETSC_DECIDE);CHKERRQ(ierr); ierr = VecSetFromOptions(s1);CHKERRQ(ierr); ierr = VecDuplicate(s1,&s2);CHKERRQ(ierr); *flg = PETSC_TRUE; for (k=0; k<n; k++) { ierr = VecSetRandom(x,rctx);CHKERRQ(ierr); ierr = MatMult(A,x,s1);CHKERRQ(ierr); ierr = MatMult(B,x,s2);CHKERRQ(ierr); ierr = VecNorm(s2,NORM_INFINITY,&r2);CHKERRQ(ierr); if (r2 < tol){ ierr = VecNorm(s1,NORM_INFINITY,&r1);CHKERRQ(ierr); } else { ierr = VecAXPY(s2,none,s1);CHKERRQ(ierr); ierr = VecNorm(s2,NORM_INFINITY,&r1);CHKERRQ(ierr); r1 /= r2; } if (r1 > tol) { *flg = PETSC_FALSE; ierr = PetscInfo2(A,"Error: %D-th MatMult() %G\n",k,r1);CHKERRQ(ierr); break; } } ierr = PetscRandomDestroy(&rctx);CHKERRQ(ierr); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&s1);CHKERRQ(ierr); ierr = VecDestroy(&s2);CHKERRQ(ierr); PetscFunctionReturn(0); }
void MultigridSolver_UpdateWorkVectors( MultigridSolver* self ) { MultigridSolver_Level* level; //unsigned rowSize, colSize; PetscInt rowSize, colSize, vecSize; unsigned l_i; assert( self && Stg_CheckType( self, MultigridSolver ) ); for( l_i = 0; l_i < self->nLevels - 1; l_i++ ) { level = self->levels + l_i; //Matrix_GetLocalSize( MatrixSolver_GetMatrix( level->downSolver ), &rowSize, &colSize ); MatGetLocalSize( level->downSolver->matrix, &rowSize, &colSize ); VecGetLocalSize( level->workSol, &vecSize ); //if( !level->workSol || Vector_GetLocalSize( level->workSol ) != rowSize ) { if( !level->workSol || vecSize != rowSize ) { //if( level->workSol ) // Stg_Class_RemoveRef( level->workSol ); //Vector_Duplicate( self->curSolution, (void**)&level->workSol ); //Vector_SetLocalSize( level->workSol, rowSize ); if( level->workSol != PETSC_NULL ) Stg_VecDestroy(&level->workSol ); VecCreate( self->mgData->comm, &level->workSol ); VecSetSizes( level->workSol, rowSize, PETSC_DECIDE ); VecSetFromOptions( level->workSol ); #if( PETSC_VERSION_MAJOR <= 2 && PETSC_VERSION_MINOR >= 3 && PETSC_VERSION_SUBMINOR >= 3 ) VecSetOption( level->workSol, VEC_IGNORE_NEGATIVE_INDICES ); #elif( PETSC_VERSION_MAJOR >= 3 ) VecSetOption( level->workSol, VEC_IGNORE_NEGATIVE_INDICES, PETSC_TRUE ); #endif } VecGetLocalSize( level->workRHS, &vecSize ); if( !level->workRHS || /*Vector_GetLocalSize( level->workRHS )*/vecSize != rowSize ) { //if( level->workRHS ) // Stg_Class_RemoveRef( level->workRHS ); //Vector_Duplicate( self->curSolution, (void**)&level->workRHS ); //Vector_SetLocalSize( level->workRHS, rowSize ); if( level->workRHS != PETSC_NULL ) Stg_VecDestroy(&level->workRHS ); VecCreate( self->mgData->comm, &level->workRHS ); VecSetSizes( level->workRHS, rowSize, PETSC_DECIDE ); VecSetFromOptions( level->workRHS ); #if( PETSC_VERSION_MAJOR <= 2 && PETSC_VERSION_MINOR >= 3 && PETSC_VERSION_SUBMINOR >= 3 ) VecSetOption( level->workRHS, VEC_IGNORE_NEGATIVE_INDICES ); #elif( PETSC_VERSION_MAJOR >= 3 ) VecSetOption( level->workRHS, VEC_IGNORE_NEGATIVE_INDICES, PETSC_TRUE ); #endif } } }
int main(int argc,char **argv) { PetscErrorCode ierr; Vec v,s; /* vectors */ PetscInt n = 20; PetscScalar one = 1.0; PetscInitialize(&argc,&argv,(char*)0,help); ierr = PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);CHKERRQ(ierr); /* Create multi-component vector with 2 components */ ierr = VecCreate(PETSC_COMM_WORLD,&v);CHKERRQ(ierr); ierr = VecSetSizes(v,PETSC_DECIDE,n);CHKERRQ(ierr); ierr = VecSetBlockSize(v,2);CHKERRQ(ierr); ierr = VecSetFromOptions(v);CHKERRQ(ierr); /* Create single-component vector */ ierr = VecCreate(PETSC_COMM_WORLD,&s);CHKERRQ(ierr); ierr = VecSetSizes(s,PETSC_DECIDE,n/2);CHKERRQ(ierr); ierr = VecSetFromOptions(s);CHKERRQ(ierr); /* Set the vectors to entries to a constant value. */ ierr = VecSet(v,one);CHKERRQ(ierr); /* Get the first component from the multi-component vector to the single vector */ ierr = VecStrideGather(v,0,s,INSERT_VALUES);CHKERRQ(ierr); ierr = VecView(s,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); /* Put the values back into the second component */ ierr = VecStrideScatter(s,1,v,ADD_VALUES);CHKERRQ(ierr); ierr = VecView(v,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); /* Free work space. All PETSc objects should be destroyed when they are no longer needed. */ ierr = VecDestroy(&v);CHKERRQ(ierr); ierr = VecDestroy(&s);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
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; }
int main(int argc,char **args) { KSP ksp; /* linear solver context */ Mat A; /* linear system matrix */ Vec x,b; /* approx solution, RHS */ PetscInt Ii,Istart,Iend; PetscErrorCode ierr; PetscScalar v[3] = {-1./2., 1., -1./2.}; PetscInt j[3]; PetscInt k=15; PetscInt M,m=420; ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; ierr = PetscOptionsGetInt(NULL,NULL,"-k",&k,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL);CHKERRQ(ierr); ierr = KSPCreate(PETSC_COMM_WORLD,&ksp);CHKERRQ(ierr); ierr = KSPSetFromOptions(ksp);CHKERRQ(ierr); ierr = KSPGetOperators(ksp,&A,NULL);CHKERRQ(ierr); ierr = MatSetSizes(A,m,m,PETSC_DETERMINE,PETSC_DETERMINE);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); ierr = MatSetUp(A);CHKERRQ(ierr); ierr = MatGetOwnershipRange(A,&Istart,&Iend);CHKERRQ(ierr); ierr = MatGetSize(A,&M,NULL);CHKERRQ(ierr); for (Ii=Istart; Ii<Iend; Ii++) { j[0] = Ii - k; j[1] = Ii; j[2] = (Ii + k) < M ? (Ii + k) : -1; ierr = MatSetValues(A,1,&Ii,3,j,v,INSERT_VALUES);CHKERRQ(ierr); } ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatCreateVecs(A,&x,&b);CHKERRQ(ierr); ierr = VecSetFromOptions(b);CHKERRQ(ierr); ierr = VecSet(b,1.0);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); ierr = VecSet(x,2.0);CHKERRQ(ierr); ierr = KSPSolve(ksp,b,x);CHKERRQ(ierr); ierr = VecDestroy(&b);CHKERRQ(ierr); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = KSPDestroy(&ksp);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
void operator| (PUP::er& p, Vec& v) { PetscInt sz; if (!p.isUnpacking()) { VecGetSize(v, &sz); } p | sz; if(p.isUnpacking()) { VecCreateSeq(PETSC_COMM_WORLD, sz, &v); VecSetFromOptions(v); VecGetSize(v, &sz); for (int i = 0; i < sz; i++) { PetscScalar d; p | d; VecSetValue(v, i, d, INSERT_VALUES); } VecAssemblyBegin(v); VecAssemblyEnd(v); } else { for (int i = 0; i < sz; i++) { PetscScalar d; VecGetValues(v, 1, &i, &d); p | d; } } }
int main(int argc,char **args) { PetscErrorCode ierr; PetscInt m = 10; int fcomm; Vec vec; ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; /* This function should be called to be able to use PETSc routines from the FORTRAN subroutines needed by this program */ PetscInitializeFortran(); ierr = VecCreate(PETSC_COMM_WORLD,&vec);CHKERRQ(ierr); ierr = VecSetSizes(vec,PETSC_DECIDE,m);CHKERRQ(ierr); ierr = VecSetFromOptions(vec);CHKERRQ(ierr); /* Call Fortran routine - the use of MPI_Comm_c2f() allows translation of the MPI_Comm from C so that it can be properly interpreted from Fortran. */ fcomm = MPI_Comm_c2f(PETSC_COMM_WORLD); ex7f_(&vec,&fcomm); ierr = VecView(vec,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = VecDestroy(&vec);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
int main(int argc,char **argv) { PetscErrorCode ierr; SNES snes; // nonlinear solver context Vec x, r; // solution, residual vectors PetscReal x0 = 2.0; PetscInitialize(&argc,&argv,(char*)0,help); ierr = PetscOptionsBegin(PETSC_COMM_WORLD,"","options to atan","");CHKERRQ(ierr); ierr = PetscOptionsReal("-x0","initial value","atan.c",x0,&x0,NULL); CHKERRQ(ierr); ierr = PetscOptionsEnd();CHKERRQ(ierr); ierr = VecCreate(PETSC_COMM_WORLD,&x); CHKERRQ(ierr); ierr = VecSetSizes(x,PETSC_DECIDE,1); CHKERRQ(ierr); ierr = VecSetFromOptions(x); CHKERRQ(ierr); ierr = VecSet(x,x0); CHKERRQ(ierr); ierr = VecDuplicate(x,&r); CHKERRQ(ierr); ierr = SNESCreate(PETSC_COMM_WORLD,&snes); CHKERRQ(ierr); ierr = SNESSetFunction(snes,r,FormFunction,NULL); CHKERRQ(ierr); ierr = SNESSetFromOptions(snes); CHKERRQ(ierr); ierr = SNESSolve(snes,NULL,x); CHKERRQ(ierr); ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD); CHKERRQ(ierr); VecDestroy(&x); VecDestroy(&r); SNESDestroy(&snes); PetscFinalize(); return 0; }
PetscErrorCode DistributeCoordinates(DM dm, PetscSF pointSF, DM parallelDM) { PetscSF coordSF; PetscSection originalCoordSection, newCoordSection; Vec coordinates, newCoordinates; PetscScalar *coords, *newCoords; PetscInt *remoteOffsets, coordSize; PetscErrorCode ierr; PetscFunctionBegin; ierr = DMMeshGetCoordinateSection(dm, &originalCoordSection);CHKERRQ(ierr); ierr = DMMeshGetCoordinateSection(parallelDM, &newCoordSection);CHKERRQ(ierr); ierr = PetscSFDistributeSection(pointSF, originalCoordSection, &remoteOffsets, newCoordSection);CHKERRQ(ierr); ierr = DMMeshGetCoordinateVec(dm, &coordinates);CHKERRQ(ierr); ierr = DMMeshGetCoordinateVec(parallelDM, &newCoordinates);CHKERRQ(ierr); ierr = PetscSectionGetStorageSize(newCoordSection, &coordSize);CHKERRQ(ierr); ierr = VecSetSizes(newCoordinates, coordSize, PETSC_DETERMINE);CHKERRQ(ierr); ierr = VecSetFromOptions(newCoordinates);CHKERRQ(ierr); ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr); ierr = VecGetArray(newCoordinates, &newCoords);CHKERRQ(ierr); ierr = PetscSFCreateSectionSF(pointSF, originalCoordSection, remoteOffsets, newCoordSection, &coordSF);CHKERRQ(ierr); ierr = PetscSFBcastBegin(coordSF, MPIU_SCALAR, coords, newCoords);CHKERRQ(ierr); ierr = PetscSFBcastEnd(coordSF, MPIU_SCALAR, coords, newCoords);CHKERRQ(ierr); ierr = PetscSFDestroy(&coordSF);CHKERRQ(ierr); ierr = VecRestoreArray(newCoordinates, &newCoords);CHKERRQ(ierr); ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr); PetscFunctionReturn(0); }
SparseGp * SparseGp_create (AcfrKern *kern, int rank, gsl_matrix *trainObs, gsl_vector *trainLabels, gsl_matrix *testObs, gsl_vector *testLabels) { PetscErrorCode ierr; /* not used here - not returning int */ (void) ierr; SparseGp *gp = calloc (1, sizeof (*gp)); gp->kern = kern; gp->trainObs = trainObs; gp->trainLabels = trainLabels; gp->testObs = testObs; gp->testLabels = testLabels; PetscInt N = gp->trainLabels->size; ierr = VecCreate (PETSC_COMM_WORLD, &(gp->_trainLabels)); /* CHKERRQ (ierr); */ ierr = VecSetSizes (gp->_trainLabels, PETSC_DECIDE, N); /* CHKERRQ (ierr); */ ierr = VecSetFromOptions (gp->_trainLabels); /* CHKERRQ (ierr); */ ierr = VecGetOwnershipRange (gp->_trainLabels, &(gp->rstart), &(gp->rend)); /* CHKERRQ (ierr); */ ierr = VecGetLocalSize (gp->_trainLabels, &(gp->nlocal)); /* CHKERRQ (ierr); */ petsc_util_fillVec (gp->trainLabels, &gp->_trainLabels, gp->rstart, gp->rend); gp->rank = rank; return gp; }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscMPIInt rank; PetscInt n = 5; char *output; Vec x; PetscInitialize(&argc,&argv,(char *)0,0); ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr); ierr = VecSetSizes(x,PETSC_DECIDE,n);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank); ierr = PetscMatlabEngineGetOutput(PETSC_MATLAB_ENGINE_WORLD,&output); ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_WORLD,"MPI_Comm_rank"); ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d]Processor rank is %s",rank,output);CHKERRQ(ierr); ierr = PetscSynchronizedFlush(PETSC_COMM_WORLD);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject)x,"x");CHKERRQ(ierr); ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_WORLD,(PetscObject)x);CHKERRQ(ierr); ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_WORLD,"x = x + MPI_Comm_rank;\n"); ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_WORLD,(PetscObject)x);CHKERRQ(ierr); ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_WORLD,"whos\n"); ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d]The result is %s",rank,output);CHKERRQ(ierr); ierr = PetscSynchronizedFlush(PETSC_COMM_WORLD);CHKERRQ(ierr); ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = VecDestroy(x);CHKERRQ(ierr); ierr = PetscFinalize();CHKERRQ(ierr); return 0; }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscInt n = 5,N,low,high,iglobal,i; PetscMPIInt size,rank; PetscScalar value,zero = 0.0; Vec x,y; IS is1,is2; VecScatter ctx; 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,PETSC_DECIDE,N);CHKERRQ(ierr); ierr = VecSetFromOptions(y);CHKERRQ(ierr); if (!rank) { ierr = VecCreateSeq(PETSC_COMM_SELF,N,&x);CHKERRQ(ierr); } else { ierr = VecCreateSeq(PETSC_COMM_SELF,0,&x);CHKERRQ(ierr); } /* create two index sets */ if (!rank) { ierr = ISCreateStride(PETSC_COMM_SELF,N,0,1,&is1);CHKERRQ(ierr); ierr = ISCreateStride(PETSC_COMM_SELF,N,0,1,&is2);CHKERRQ(ierr); } else { ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is1);CHKERRQ(ierr); ierr = ISCreateStride(PETSC_COMM_SELF,0,0,1,&is2);CHKERRQ(ierr); } ierr = VecSet(x,zero);CHKERRQ(ierr); ierr = VecGetOwnershipRange(y,&low,&high);CHKERRQ(ierr); for (i=0; i<n; i++) { iglobal = i + low; value = (PetscScalar) (i + 10*rank); ierr = VecSetValues(y,1,&iglobal,&value,INSERT_VALUES);CHKERRQ(ierr); } ierr = VecAssemblyBegin(y);CHKERRQ(ierr); ierr = VecAssemblyEnd(y);CHKERRQ(ierr); ierr = VecView(y,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = VecScatterCreate(y,is2,x,is1,&ctx);CHKERRQ(ierr); ierr = VecScatterBegin(ctx,y,x,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterEnd(ctx,y,x,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterDestroy(&ctx);CHKERRQ(ierr); if (!rank) {printf("----\n"); ierr = VecView(x,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 0; }
/* This takes as input the coordinates for each vertex */ PetscErrorCode DMPlexBuildCoordinates_Private(DM dm, PetscInt spaceDim, PetscInt numCells, PetscInt numVertices, const double vertexCoords[]) { PetscSection coordSection; Vec coordinates; PetscScalar *coords; PetscInt coordSize, v, d; PetscErrorCode ierr; PetscFunctionBegin; ierr = DMPlexGetCoordinateSection(dm, &coordSection);CHKERRQ(ierr); ierr = PetscSectionSetNumFields(coordSection, 1);CHKERRQ(ierr); ierr = PetscSectionSetFieldComponents(coordSection, 0, spaceDim);CHKERRQ(ierr); ierr = PetscSectionSetChart(coordSection, numCells, numCells + numVertices);CHKERRQ(ierr); for (v = numCells; v < numCells+numVertices; ++v) { ierr = PetscSectionSetDof(coordSection, v, spaceDim);CHKERRQ(ierr); ierr = PetscSectionSetFieldDof(coordSection, v, 0, spaceDim);CHKERRQ(ierr); } ierr = PetscSectionSetUp(coordSection);CHKERRQ(ierr); ierr = PetscSectionGetStorageSize(coordSection, &coordSize);CHKERRQ(ierr); ierr = VecCreate(PetscObjectComm((PetscObject)dm), &coordinates);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) coordinates, "coordinates");CHKERRQ(ierr); ierr = VecSetSizes(coordinates, coordSize, PETSC_DETERMINE);CHKERRQ(ierr); ierr = VecSetFromOptions(coordinates);CHKERRQ(ierr); ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr); for (v = 0; v < numVertices; ++v) { for (d = 0; d < spaceDim; ++d) { coords[v*spaceDim+d] = vertexCoords[v*spaceDim+d]; } } ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr); ierr = DMSetCoordinatesLocal(dm, coordinates);CHKERRQ(ierr); ierr = VecDestroy(&coordinates);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode MatSetLocalToGlobalMapping_IS(Mat A,ISLocalToGlobalMapping rmapping,ISLocalToGlobalMapping cmapping) { PetscErrorCode ierr; PetscInt n,bs; Mat_IS *is = (Mat_IS*)A->data; IS from,to; Vec global; PetscFunctionBegin; PetscCheckSameComm(A,1,rmapping,2); if (rmapping != cmapping) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_INCOMP,"MATIS requires the row and column mappings to be identical"); if (is->mapping) { /* Currenly destroys the objects that will be created by this routine. Is there anything else that should be checked? */ ierr = ISLocalToGlobalMappingDestroy(&is->mapping);CHKERRQ(ierr); ierr = VecDestroy(&is->x);CHKERRQ(ierr); ierr = VecDestroy(&is->y);CHKERRQ(ierr); ierr = VecScatterDestroy(&is->ctx);CHKERRQ(ierr); ierr = MatDestroy(&is->A);CHKERRQ(ierr); } ierr = PetscObjectReference((PetscObject)rmapping);CHKERRQ(ierr); ierr = ISLocalToGlobalMappingDestroy(&is->mapping);CHKERRQ(ierr); is->mapping = rmapping; /* ierr = PetscLayoutSetISLocalToGlobalMapping(A->rmap,rmapping);CHKERRQ(ierr); ierr = PetscLayoutSetISLocalToGlobalMapping(A->cmap,cmapping);CHKERRQ(ierr); */ /* Create the local matrix A */ ierr = ISLocalToGlobalMappingGetSize(rmapping,&n);CHKERRQ(ierr); ierr = ISLocalToGlobalMappingGetBlockSize(rmapping,&bs);CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_SELF,&is->A);CHKERRQ(ierr); if (bs > 1) { ierr = MatSetType(is->A,MATSEQBAIJ);CHKERRQ(ierr); } else { ierr = MatSetType(is->A,MATSEQAIJ);CHKERRQ(ierr); } ierr = MatSetSizes(is->A,n,n,n,n);CHKERRQ(ierr); ierr = MatSetBlockSize(is->A,bs);CHKERRQ(ierr); ierr = MatSetOptionsPrefix(is->A,((PetscObject)A)->prefix);CHKERRQ(ierr); ierr = MatAppendOptionsPrefix(is->A,"is_");CHKERRQ(ierr); ierr = MatSetFromOptions(is->A);CHKERRQ(ierr); /* Create the local work vectors */ ierr = VecCreate(PETSC_COMM_SELF,&is->x);CHKERRQ(ierr); ierr = VecSetBlockSize(is->x,bs);CHKERRQ(ierr); ierr = VecSetSizes(is->x,n,n);CHKERRQ(ierr); ierr = VecSetOptionsPrefix(is->x,((PetscObject)A)->prefix);CHKERRQ(ierr); ierr = VecAppendOptionsPrefix(is->x,"is_");CHKERRQ(ierr); ierr = VecSetFromOptions(is->x);CHKERRQ(ierr); ierr = VecDuplicate(is->x,&is->y);CHKERRQ(ierr); /* setup the global to local scatter */ ierr = ISCreateStride(PETSC_COMM_SELF,n,0,1,&to);CHKERRQ(ierr); ierr = ISLocalToGlobalMappingApplyIS(rmapping,to,&from);CHKERRQ(ierr); ierr = MatCreateVecs(A,&global,NULL);CHKERRQ(ierr); ierr = VecScatterCreate(global,from,is->x,to,&is->ctx);CHKERRQ(ierr); ierr = VecDestroy(&global);CHKERRQ(ierr); ierr = ISDestroy(&to);CHKERRQ(ierr); ierr = ISDestroy(&from);CHKERRQ(ierr); PetscFunctionReturn(0); }
void FETI_Operations::set_jacobi_precond_vector() { homemade_assert_msg(m_bC_RR_MatrixSet,"Preconditioner matrix not set yet!"); // Create and set the vector VecCreate(m_comm.get(),&m_coupling_jacobi_precond_vec); VecSetSizes(m_coupling_jacobi_precond_vec,m_C_RR_M_local,m_C_RR_M); VecSetFromOptions(m_coupling_jacobi_precond_vec); // Get the diagonal MatGetDiagonal(m_C_RR,m_coupling_jacobi_precond_vec); // Calculate the reciprocal VecReciprocal(m_coupling_jacobi_precond_vec); // Export it write_PETSC_vector(m_coupling_jacobi_precond_vec,m_scratch_folder_path + "/precond_Jacobi_vector.petscvec",m_comm.rank(),m_comm.get()); // Print MatLab debugging output? Variable defined at "carl_headers.h" #ifdef PRINT_MATLAB_DEBUG write_PETSC_vector_MATLAB(m_coupling_jacobi_precond_vec,m_scratch_folder_path + "/precond_Jacobi_vector.m",m_comm.get()); #endif // Set flag m_bCreatedPrecondJacobiVec = true; }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscInt time_steps = 100,steps; PetscMPIInt size; Vec global; PetscReal dt,ftime; TS ts; MatStructure A_structure; Mat A = 0; ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,"-time",&time_steps,NULL);CHKERRQ(ierr); /* set initial conditions */ ierr = VecCreate(PETSC_COMM_WORLD,&global);CHKERRQ(ierr); ierr = VecSetSizes(global,PETSC_DECIDE,3);CHKERRQ(ierr); ierr = VecSetFromOptions(global);CHKERRQ(ierr); ierr = Initial(global,NULL);CHKERRQ(ierr); /* make timestep context */ ierr = TSCreate(PETSC_COMM_WORLD,&ts);CHKERRQ(ierr); ierr = TSSetProblemType(ts,TS_NONLINEAR);CHKERRQ(ierr); ierr = TSMonitorSet(ts,Monitor,NULL,NULL);CHKERRQ(ierr); dt = 0.1; /* The user provides the RHS and Jacobian */ ierr = TSSetRHSFunction(ts,NULL,RHSFunction,NULL);CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,3,3);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); ierr = MatSetUp(A);CHKERRQ(ierr); ierr = RHSJacobian(ts,0.0,global,&A,&A,&A_structure,NULL);CHKERRQ(ierr); ierr = TSSetRHSJacobian(ts,A,A,RHSJacobian,NULL);CHKERRQ(ierr); ierr = TSSetFromOptions(ts);CHKERRQ(ierr); ierr = TSSetInitialTimeStep(ts,0.0,dt);CHKERRQ(ierr); ierr = TSSetDuration(ts,time_steps,1);CHKERRQ(ierr); ierr = TSSetSolution(ts,global);CHKERRQ(ierr); ierr = TSSolve(ts,global);CHKERRQ(ierr); ierr = TSGetSolveTime(ts,&ftime);CHKERRQ(ierr); ierr = TSGetTimeStepNumber(ts,&steps);CHKERRQ(ierr); /* free the memories */ ierr = TSDestroy(&ts);CHKERRQ(ierr); ierr = VecDestroy(&global);CHKERRQ(ierr); ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
PetscErrorCode DMCreateGlobalVector_DA(DM da,Vec* g) { PetscErrorCode ierr; DM_DA *dd = (DM_DA*)da->data; PetscFunctionBegin; PetscValidHeaderSpecific(da,DM_CLASSID,1); PetscValidPointer(g,2); if (da->defaultSection) { ierr = DMCreateGlobalVector_Section_Private(da,g);CHKERRQ(ierr); } else { ierr = VecCreate(((PetscObject)da)->comm,g);CHKERRQ(ierr); ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr); ierr = VecSetBlockSize(*g,dd->w);CHKERRQ(ierr); ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr); ierr = VecSetFromOptions(*g);CHKERRQ(ierr); ierr = VecSetDM(*g, da);CHKERRQ(ierr); ierr = VecSetLocalToGlobalMapping(*g,da->ltogmap);CHKERRQ(ierr); ierr = VecSetLocalToGlobalMappingBlock(*g,da->ltogmapb);CHKERRQ(ierr); } ierr = VecSetOperation(*g,VECOP_VIEW,(void(*)(void))VecView_MPI_DA);CHKERRQ(ierr); ierr = VecSetOperation(*g,VECOP_LOAD,(void(*)(void))VecLoad_Default_DA);CHKERRQ(ierr); ierr = VecSetOperation(*g,VECOP_DUPLICATE,(void(*)(void))VecDuplicate_MPI_DA);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode MatWrapML_SHELL(ML_Operator *mlmat,MatReuse reuse,Mat *newmat) { PetscErrorCode ierr; PetscInt m,n; ML_Comm *MLcomm; Mat_MLShell *shellctx; PetscFunctionBegin; m = mlmat->outvec_leng; n = mlmat->invec_leng; if (reuse){ ierr = MatShellGetContext(*newmat,(void **)&shellctx);CHKERRQ(ierr); shellctx->mlmat = mlmat; PetscFunctionReturn(0); } MLcomm = mlmat->comm; ierr = PetscNew(Mat_MLShell,&shellctx);CHKERRQ(ierr); ierr = MatCreateShell(MLcomm->USR_comm,m,n,PETSC_DETERMINE,PETSC_DETERMINE,shellctx,newmat);CHKERRQ(ierr); ierr = MatShellSetOperation(*newmat,MATOP_MULT,(void(*)(void))MatMult_ML);CHKERRQ(ierr); ierr = MatShellSetOperation(*newmat,MATOP_MULT_ADD,(void(*)(void))MatMultAdd_ML);CHKERRQ(ierr); shellctx->A = *newmat; shellctx->mlmat = mlmat; shellctx->work = PETSC_NULL; ierr = VecCreate(MLcomm->USR_comm,&shellctx->y);CHKERRQ(ierr); ierr = VecSetSizes(shellctx->y,m,PETSC_DECIDE);CHKERRQ(ierr); ierr = VecSetFromOptions(shellctx->y);CHKERRQ(ierr); (*newmat)->ops->destroy = MatDestroy_ML; PetscFunctionReturn(0); }
void linearSystemPETSc<scalar>::allocate(int nbRows) { int commSize; MPI_Comm_size(_comm, &commSize); int blockSize = _getBlockSizeFromParameters(); clear(); _try(MatCreate(_comm, &_a)); _try(MatSetSizes(_a, blockSize * nbRows, blockSize * nbRows, PETSC_DETERMINE, PETSC_DETERMINE)); if (blockSize > 1) { if (commSize > 1) { _try(MatSetType(_a, MATMPIBAIJ)); } else { _try(MatSetType(_a, MATSEQBAIJ)); } } // override the default options with the ones from the option // database (if any) if (this->_parameters.count("petscOptions")) _try(PetscOptionsInsertString(this->_parameters["petscOptions"].c_str())); if (this->_parameters.count("petscPrefix")) _try(MatAppendOptionsPrefix(_a, this->_parameters["petscPrefix"].c_str())); _try(MatSetFromOptions(_a)); //since PETSc 3.3 GetOwnershipRange and MatGetSize cannot be called before MatXXXSetPreallocation _localSize = nbRows; #ifdef HAVE_MPI if (commSize>1){ _localRowStart = 0; if (Msg::GetCommRank() != 0) { MPI_Status status; MPI_Recv((void*)&_localRowStart, 1, MPI_INT, Msg::GetCommRank() - 1, 1, MPI_COMM_WORLD, &status); } _localRowEnd = _localRowStart + nbRows; if (Msg::GetCommRank() != Msg::GetCommSize() - 1) { MPI_Send((void*)&_localRowEnd, 1, MPI_INT, Msg::GetCommRank() + 1, 1, MPI_COMM_WORLD); } MPI_Allreduce((void*)&_localSize, (void*)&_globalSize, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD); } else{ _localRowStart = 0; _localRowEnd = nbRows; _globalSize = _localSize; } #else _localRowStart = 0; _localRowEnd = nbRows; _globalSize = _localSize; #endif // preallocation option must be set after other options _try(VecCreate(_comm, &_x)); _try(VecSetSizes(_x, blockSize * nbRows, PETSC_DETERMINE)); // override the default options with the ones from the option // database (if any) if (this->_parameters.count("petscPrefix")) _try(VecAppendOptionsPrefix(_x, this->_parameters["petscPrefix"].c_str())); _try(VecSetFromOptions(_x)); _try(VecDuplicate(_x, &_b)); _isAllocated = true; _entriesPreAllocated = false; }
Real SAMpatchPETSc::normL2(const Vector& x, char dofType) const { #ifdef HAVE_MPI if (adm.isParallel()) { if (dofIS.find(dofType) == dofIS.end()) setupIS(dofType); Vec lx; VecCreateSeqWithArray(PETSC_COMM_SELF, 1, x.size(), x.data(), &lx); Vec gx; VecCreate(*adm.getCommunicator(), &gx); VecSetSizes(gx, dofIS[dofType].nDofs, PETSC_DETERMINE); VecSetFromOptions(gx); PetscInt n; VecGetSize(gx, &n); if (!dofIS[dofType].scatterCreated) { VecScatterCreate(lx, dofIS[dofType].local, gx, dofIS[dofType].global, &dofIS[dofType].ctx); dofIS[dofType].scatterCreated = true; } VecScatterBegin(dofIS[dofType].ctx, lx, gx, INSERT_VALUES, SCATTER_FORWARD); VecScatterEnd(dofIS[dofType].ctx, lx, gx, INSERT_VALUES, SCATTER_FORWARD); PetscReal d; VecNorm(gx, NORM_2, &d); VecDestroy(&lx); VecDestroy(&gx); return d / sqrt(double(n)); } #endif return this->SAM::normL2(x, dofType); }
long initialize(long numele) { initialized = true; n = numele; neg_one = -1.0; one = 1.0; argc = 0; args = 0; // ------------------- PetscInitialize(&argc,&args,(char *)0,help); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); if (size != 1) SETERRQ(1,"This is a uniprocessor example only!"); ierr = PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Compute the matrix and right-hand-side vector that define the linear system, Ax = b. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) x, "Solution");CHKERRQ(ierr); ierr = VecSetSizes(x,PETSC_DECIDE,n);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); ierr = VecDuplicate(x,&b);CHKERRQ(ierr); // ierr = VecDuplicate(x,&u);CHKERRQ(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); VecCreate(PETSC_COMM_WORLD,&temp_input); ierr = PetscObjectSetName((PetscObject) temp_input, "Tempinput");CHKERRQ(ierr); VecSetSizes(temp_input,PETSC_DECIDE,n); ierr = VecSetFromOptions(temp_input);CHKERRQ(ierr); VecCreate(PETSC_COMM_WORLD,&temp_output); ierr = PetscObjectSetName((PetscObject) temp_output, "Tempoutput");CHKERRQ(ierr); VecSetSizes(temp_output,PETSC_DECIDE,n); ierr = VecSetFromOptions(temp_output);CHKERRQ(ierr); return 0; }
void Field_solver::alloc_petsc_vector( Vec *x, int size, const char *name ) { PetscErrorCode ierr; ierr = VecCreate( PETSC_COMM_WORLD, x ); CHKERRXX( ierr ); ierr = PetscObjectSetName( (PetscObject) *x, name ); CHKERRXX( ierr ); ierr = VecSetSizes( *x, PETSC_DECIDE, size ); CHKERRXX( ierr ); ierr = VecSetFromOptions( *x ); CHKERRXX( ierr ); return; }
PetscErrorCode loadVec(const char *path, Vec* v, MPI_Comm comm, PetscViewer* fd){ PetscErrorCode err; err = PetscViewerBinaryOpen(comm, path, FILE_MODE_READ, fd); CHKERRQ(err); err = VecCreate(comm, v); CHKERRQ(err); err = VecSetFromOptions(*v); CHKERRQ(err); err = VecLoad(*v, *fd); CHKERRQ(err); err = PetscViewerDestroy(fd); CHKERRQ(err); return err; }
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; }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscMPIInt rank; PetscInt i,N; PetscScalar one = 1.0; Vec x; PetscInitialize(&argc,&argv,(char *)0,help); ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); /* Create a parallel vector. - In this case, we specify the size of each processor's local portion, and PETSc computes the global size. Alternatively, if we pass the global size and use PETSC_DECIDE for the local size PETSc will choose a reasonable partition trying to put nearly an equal number of elements on each processor. */ ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr); ierr = VecSetSizes(x,rank+1,PETSC_DECIDE);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); ierr = VecGetSize(x,&N);CHKERRQ(ierr); ierr = VecSet(x,one);CHKERRQ(ierr); /* Set the vector elements. - Always specify global locations of vector entries. - Each processor can contribute any vector entries, regardless of which processor "owns" them; any nonlocal contributions will be transferred to the appropriate processor during the assembly process. - In this example, the flag ADD_VALUES indicates that all contributions will be added together. */ for (i=0; i<N-rank; i++) { ierr = VecSetValues(x,1,&i,&one,ADD_VALUES);CHKERRQ(ierr); } /* Assemble vector, using the 2-step process: VecAssemblyBegin(), VecAssemblyEnd() Computations can be done while messages are in transition by placing code between these two statements. */ ierr = VecAssemblyBegin(x);CHKERRQ(ierr); ierr = VecAssemblyEnd(x);CHKERRQ(ierr); /* View the vector; then destroy it. */ ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = VecDestroy(x);CHKERRQ(ierr); ierr = PetscFinalize();CHKERRQ(ierr); return 0; }
PetscErrorCode generateVector(int size, Vec * v){ PetscErrorCode ierr; ierr=VecCreate(PETSC_COMM_WORLD,v);CHKERRQ(ierr); ierr=VecSetSizes(*v,PETSC_DECIDE,size);CHKERRQ(ierr); ierr=VecSetFromOptions(*v);CHKERRQ(ierr); /*initiate the vector to its norm*/ return 0; }