/*@ DMShellSetLocalToGlobalVecScatter - Sets a VecScatter context for local to global communication Logically Collective on DM Input Arguments + dm - the shell DM - ltog - the local to global VecScatter context Level: advanced .seealso: DMShellSetLocalToGlobal() @*/ PetscErrorCode DMShellSetLocalToGlobalVecScatter(DM dm, VecScatter ltog) { DM_Shell *shell = (DM_Shell*)dm->data; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscObjectReference((PetscObject)ltog);CHKERRQ(ierr); /* Call VecScatterDestroy() to avoid a memory leak in case of re-setting. */ ierr = VecScatterDestroy(&shell->ltog);CHKERRQ(ierr); shell->ltog = ltog; PetscFunctionReturn(0); }
PetscErrorCode MatDestroy_Scatter(Mat mat) { PetscErrorCode ierr; Mat_Scatter *scatter = (Mat_Scatter*)mat->data; PetscFunctionBegin; ierr = VecScatterDestroy(&scatter->scatter); CHKERRQ(ierr); ierr = PetscFree(mat->data); CHKERRQ(ierr); PetscFunctionReturn(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 **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; }
PetscErrorCode PCISDestroy(PC pc) { PC_IS *pcis = (PC_IS*)(pc->data); PetscErrorCode ierr; PetscFunctionBegin; ierr = ISDestroy(&pcis->is_B_local);CHKERRQ(ierr); ierr = ISDestroy(&pcis->is_I_local);CHKERRQ(ierr); ierr = ISDestroy(&pcis->is_B_global);CHKERRQ(ierr); ierr = ISDestroy(&pcis->is_I_global);CHKERRQ(ierr); ierr = MatDestroy(&pcis->A_II);CHKERRQ(ierr); ierr = MatDestroy(&pcis->A_IB);CHKERRQ(ierr); ierr = MatDestroy(&pcis->A_BI);CHKERRQ(ierr); ierr = MatDestroy(&pcis->A_BB);CHKERRQ(ierr); ierr = VecDestroy(&pcis->D);CHKERRQ(ierr); ierr = KSPDestroy(&pcis->ksp_N);CHKERRQ(ierr); ierr = KSPDestroy(&pcis->ksp_D);CHKERRQ(ierr); ierr = VecDestroy(&pcis->vec1_N);CHKERRQ(ierr); ierr = VecDestroy(&pcis->vec2_N);CHKERRQ(ierr); ierr = VecDestroy(&pcis->vec1_D);CHKERRQ(ierr); ierr = VecDestroy(&pcis->vec2_D);CHKERRQ(ierr); ierr = VecDestroy(&pcis->vec3_D);CHKERRQ(ierr); ierr = VecDestroy(&pcis->vec4_D);CHKERRQ(ierr); ierr = VecDestroy(&pcis->vec1_B);CHKERRQ(ierr); ierr = VecDestroy(&pcis->vec2_B);CHKERRQ(ierr); ierr = VecDestroy(&pcis->vec3_B);CHKERRQ(ierr); ierr = VecDestroy(&pcis->vec1_global);CHKERRQ(ierr); ierr = VecScatterDestroy(&pcis->global_to_D);CHKERRQ(ierr); ierr = VecScatterDestroy(&pcis->N_to_B);CHKERRQ(ierr); ierr = VecScatterDestroy(&pcis->global_to_B);CHKERRQ(ierr); ierr = PetscFree(pcis->work_N);CHKERRQ(ierr); if (pcis->n_neigh > -1) { ierr = ISLocalToGlobalMappingRestoreInfo(pcis->mapping,&(pcis->n_neigh),&(pcis->neigh),&(pcis->n_shared),&(pcis->shared));CHKERRQ(ierr); } ierr = ISLocalToGlobalMappingDestroy(&pcis->mapping);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCISSetUseStiffnessScaling_C",NULL);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCISSetSubdomainScalingFactor_C",NULL);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)pc,"PCISSetSubdomainDiagonalScaling_C",NULL);CHKERRQ(ierr); PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscMPIInt rank,size; Vec x,y; IS is1,is2; PetscInt n,N,ix[2],iy[2]; VecScatter ctx; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); if (size < 3) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"This example needs at least 3 processes"); /* create two vectors */ n = 2; N = 2*size; ierr = VecCreateMPI(PETSC_COMM_WORLD,n,N,&x);CHKERRQ(ierr); ierr = VecDuplicate(x,&y);CHKERRQ(ierr); /* Specify indices to send from the next process in the ring */ ix[0] = ((rank+1)*n+0) % N; ix[1] = ((rank+1)*n+1) % N; /* And put them on the process after that in the ring */ iy[0] = ((rank+2)*n+0) % N; iy[1] = ((rank+2)*n+1) % N; /* create two index sets */ ierr = ISCreateGeneral(PETSC_COMM_WORLD,n,ix,PETSC_USE_POINTER,&is1);CHKERRQ(ierr); ierr = ISCreateGeneral(PETSC_COMM_WORLD,n,iy,PETSC_USE_POINTER,&is2);CHKERRQ(ierr); ierr = VecSetValue(x,rank*n,rank*n,INSERT_VALUES);CHKERRQ(ierr); ierr = VecSetValue(x,rank*n+1,rank*n+1,INSERT_VALUES);CHKERRQ(ierr); ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"----\n");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_WORLD);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; }
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; }
PetscErrorCode TSMonitorDMDARayDestroy(void **mctx) { TSMonitorDMDARayCtx *rayctx = (TSMonitorDMDARayCtx *) *mctx; PetscErrorCode ierr; PetscFunctionBegin; if (rayctx->lgctx) {ierr = TSMonitorLGCtxDestroy(&rayctx->lgctx);CHKERRQ(ierr);} ierr = VecDestroy(&rayctx->ray);CHKERRQ(ierr); ierr = VecScatterDestroy(&rayctx->scatter);CHKERRQ(ierr); ierr = PetscViewerDestroy(&rayctx->viewer);CHKERRQ(ierr); ierr = PetscFree(rayctx);CHKERRQ(ierr); PetscFunctionReturn(0); }
/* Frees all data structures associated with the monitor */ PetscErrorCode MyMonitorDestroy(void **ictx) { MyMonitorCtx **ctx = (MyMonitorCtx**)ictx; PetscErrorCode ierr; PetscFunctionBeginUser; ierr = VecScatterDestroy(&(*ctx)->scatter);CHKERRQ(ierr); ierr = VecDestroy(&(*ctx)->He);CHKERRQ(ierr); ierr = DMDestroy(&(*ctx)->da);CHKERRQ(ierr); ierr = PetscViewerDestroy(&(*ctx)->viewer);CHKERRQ(ierr); ierr = PetscFree(*ctx);CHKERRQ(ierr); PetscFunctionReturn(0); }
SAMpatchPETSc::~SAMpatchPETSc() { for (auto& it : dofIS) { if (it.second.scatterCreated) VecScatterDestroy(&it.second.ctx); ISDestroy(&it.second.local); ISDestroy(&it.second.global); } dofIS.clear(); if (glob2LocEq) ISDestroy(&glob2LocEq); LinAlgInit::decrefs(); }
static PetscErrorCode DMDestroy_Shell(DM dm) { PetscErrorCode ierr; DM_Shell *shell = (DM_Shell*)dm->data; PetscFunctionBegin; ierr = MatDestroy(&shell->A); CHKERRQ(ierr); ierr = VecDestroy(&shell->Xglobal); CHKERRQ(ierr); ierr = VecDestroy(&shell->Xlocal); CHKERRQ(ierr); ierr = VecScatterDestroy(&shell->gtol); CHKERRQ(ierr); ierr = VecScatterDestroy(&shell->ltog); CHKERRQ(ierr); ierr = VecScatterDestroy(&shell->ltol); CHKERRQ(ierr); /* This was originally freed in DMDestroy(), but that prevents reference counting of backend objects */ ierr = PetscFree(shell); CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode PCBDDCScalingReset_Deluxe_Solvers(PCBDDCDeluxeScaling deluxe_ctx) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscFree(deluxe_ctx->idx_simple_B);CHKERRQ(ierr); deluxe_ctx->n_simple = 0; ierr = VecScatterDestroy(&deluxe_ctx->seq_scctx);CHKERRQ(ierr); ierr = VecDestroy(&deluxe_ctx->seq_work1);CHKERRQ(ierr); ierr = VecDestroy(&deluxe_ctx->seq_work2);CHKERRQ(ierr); ierr = MatDestroy(&deluxe_ctx->seq_mat);CHKERRQ(ierr); ierr = KSPDestroy(&deluxe_ctx->seq_ksp);CHKERRQ(ierr); PetscFunctionReturn(0); }
-n <length> : vector length\n\n"; #include <petscvec.h> #undef __FUNCT__ #define __FUNCT__ "main" int main(int argc,char **argv) { PetscErrorCode ierr; PetscInt n = 5,idx1[2] = {0,3},idx2[2] = {1,4}; PetscScalar one = 1.0,two = 2.0; Vec x,y; IS is1,is2; VecScatter ctx = 0; ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr); ierr = PetscOptionsGetInt(NULL,"-n",&n,NULL);CHKERRQ(ierr); /* create two vector */ ierr = VecCreateSeq(PETSC_COMM_SELF,n,&x);CHKERRQ(ierr); ierr = VecDuplicate(x,&y);CHKERRQ(ierr); /* create two index sets */ ierr = ISCreateGeneral(PETSC_COMM_SELF,2,idx1,PETSC_COPY_VALUES,&is1);CHKERRQ(ierr); ierr = ISCreateGeneral(PETSC_COMM_SELF,2,idx2,PETSC_COPY_VALUES,&is2);CHKERRQ(ierr); ierr = VecSet(x,one);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 = VecView(y,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr); ierr = VecScatterBegin(ctx,y,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterEnd(ctx,y,x,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterDestroy(&ctx);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_SELF,"-------\n");CHKERRQ(ierr); ierr = VecView(x,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; }
PetscErrorCode PCBDDCDestroyFETIDPPC(PC pc) { FETIDPPC_ctx pc_ctx; PetscErrorCode ierr; PetscFunctionBegin; ierr = PCShellGetContext(pc,(void**)&pc_ctx);CHKERRQ(ierr); ierr = VecDestroy(&pc_ctx->lambda_local);CHKERRQ(ierr); ierr = MatDestroy(&pc_ctx->B_Ddelta);CHKERRQ(ierr); ierr = VecScatterDestroy(&pc_ctx->l2g_lambda);CHKERRQ(ierr); ierr = MatDestroy(&pc_ctx->S_j);CHKERRQ(ierr); ierr = PCDestroy(&pc_ctx->pc);CHKERRQ(ierr); /* decrease PCBDDC reference count */ ierr = PetscFree(pc_ctx);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode Monitor(TS ts,PetscInt step,PetscReal time,Vec global,void *ctx) { VecScatter scatter; IS from,to; PetscInt i,n,*idx,nsteps,maxsteps; Vec tmp_vec; PetscErrorCode ierr; PetscScalar *tmp; PetscReal maxtime; Data *data = (Data*)ctx; PetscReal tfinal = data->tfinal; PetscFunctionBeginUser; if (time > tfinal) PetscFunctionReturn(0); ierr = TSGetTimeStepNumber(ts,&nsteps);CHKERRQ(ierr); /* display output at selected time steps */ ierr = TSGetDuration(ts, &maxsteps, &maxtime);CHKERRQ(ierr); if (nsteps % 10 != 0 && time < maxtime) PetscFunctionReturn(0); /* Get the size of the vector */ ierr = VecGetSize(global,&n);CHKERRQ(ierr); /* Set the index sets */ ierr = PetscMalloc1(n,&idx);CHKERRQ(ierr); for (i=0; i<n; i++) idx[i]=i; /* Create local sequential vectors */ ierr = VecCreateSeq(PETSC_COMM_SELF,n,&tmp_vec);CHKERRQ(ierr); /* Create scatter context */ ierr = ISCreateGeneral(PETSC_COMM_SELF,n,idx,PETSC_COPY_VALUES,&from);CHKERRQ(ierr); ierr = ISCreateGeneral(PETSC_COMM_SELF,n,idx,PETSC_COPY_VALUES,&to);CHKERRQ(ierr); ierr = VecScatterCreate(global,from,tmp_vec,to,&scatter);CHKERRQ(ierr); ierr = VecScatterBegin(scatter,global,tmp_vec,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterEnd(scatter,global,tmp_vec,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecGetArray(tmp_vec,&tmp);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"At t[%D] =%14.2e u= %14.2e at the center \n",nsteps,(double)time,(double)PetscRealPart(tmp[n/2]));CHKERRQ(ierr); ierr = VecRestoreArray(tmp_vec,&tmp);CHKERRQ(ierr); ierr = PetscFree(idx);CHKERRQ(ierr); ierr = ISDestroy(&from);CHKERRQ(ierr); ierr = ISDestroy(&to);CHKERRQ(ierr); ierr = VecScatterDestroy(&scatter);CHKERRQ(ierr); ierr = VecDestroy(&tmp_vec);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode MatDestroy_IS(Mat A) { PetscErrorCode ierr; Mat_IS *b = (Mat_IS*)A->data; PetscFunctionBegin; ierr = MatDestroy(&b->A);CHKERRQ(ierr); ierr = VecScatterDestroy(&b->ctx);CHKERRQ(ierr); ierr = VecDestroy(&b->x);CHKERRQ(ierr); ierr = VecDestroy(&b->y);CHKERRQ(ierr); ierr = ISLocalToGlobalMappingDestroy(&b->mapping);CHKERRQ(ierr); ierr = PetscFree(A->data);CHKERRQ(ierr); ierr = PetscObjectChangeTypeName((PetscObject)A,0);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)A,"MatISGetLocalMat_C",NULL);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode PCBDDCDestroyFETIDPMat(Mat A) { FETIDPMat_ctx mat_ctx; PetscErrorCode ierr; PetscFunctionBegin; ierr = MatShellGetContext(A,(void**)&mat_ctx);CHKERRQ(ierr); ierr = VecDestroy(&mat_ctx->lambda_local);CHKERRQ(ierr); ierr = VecDestroy(&mat_ctx->temp_solution_D);CHKERRQ(ierr); ierr = VecDestroy(&mat_ctx->temp_solution_B);CHKERRQ(ierr); ierr = MatDestroy(&mat_ctx->B_delta);CHKERRQ(ierr); ierr = MatDestroy(&mat_ctx->B_Ddelta);CHKERRQ(ierr); ierr = VecScatterDestroy(&mat_ctx->l2g_lambda);CHKERRQ(ierr); ierr = PCDestroy(&mat_ctx->pc);CHKERRQ(ierr); /* decrease PCBDDC reference count */ ierr = PetscFree(mat_ctx);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@ MatScatterSetVecScatter - sets that scatter that the matrix is to apply as its linear operator Collective on Mat Input Parameters: + mat - the scatter matrix - scatter - the scatter context create with VecScatterCreate() Level: advanced .seealso: MatCreateScatter(), MATSCATTER @*/ PetscErrorCode PETSCMAT_DLLEXPORT MatScatterSetVecScatter(Mat mat,VecScatter scatter) { Mat_Scatter *mscatter = (Mat_Scatter*)mat->data; PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(mat,MAT_COOKIE,1); PetscValidHeaderSpecific(scatter,VEC_SCATTER_COOKIE,2); PetscCheckSameComm((PetscObject)scatter,1,(PetscObject)mat,2); if (mat->rmap->n != scatter->to_n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Number of local rows in matrix %D not equal local scatter size %D",mat->rmap->n,scatter->to_n); if (mat->cmap->n != scatter->from_n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Number of local columns in matrix %D not equal local scatter size %D",mat->cmap->n,scatter->from_n); ierr = PetscObjectReference((PetscObject)scatter);CHKERRQ(ierr); if (mscatter->scatter) {ierr = VecScatterDestroy(mscatter->scatter);CHKERRQ(ierr);} mscatter->scatter = scatter; PetscFunctionReturn(0); }
static PetscErrorCode PCDestroy_Redistribute(PC pc) { PC_Redistribute *red = (PC_Redistribute*)pc->data; PetscErrorCode ierr; PetscFunctionBegin; ierr = VecScatterDestroy(&red->scatter);CHKERRQ(ierr); ierr = ISDestroy(&red->is);CHKERRQ(ierr); ierr = VecDestroy(&red->b);CHKERRQ(ierr); ierr = VecDestroy(&red->x);CHKERRQ(ierr); ierr = KSPDestroy(&red->ksp);CHKERRQ(ierr); ierr = VecDestroy(&red->work);CHKERRQ(ierr); ierr = PetscFree(red->drows);CHKERRQ(ierr); ierr = PetscFree(red->diag);CHKERRQ(ierr); ierr = PetscFree(pc->data);CHKERRQ(ierr); PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscInt n = 5,N; 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,PETSC_DECIDE,N);CHKERRQ(ierr); ierr = VecSetFromOptions(y);CHKERRQ(ierr); ierr = VecCreateSeq(PETSC_COMM_SELF,N,&x);CHKERRQ(ierr); /* create two index sets */ ierr = ISCreateStride(PETSC_COMM_SELF,n,0,1,&is1);CHKERRQ(ierr); ierr = ISCreateStride(PETSC_COMM_SELF,n,rank,1,&is2);CHKERRQ(ierr); value = rank+1; ierr = VecSet(x,value);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(); return 0; }
static PetscErrorCode TaoDestroy_TRON(Tao tao) { TAO_TRON *tron = (TAO_TRON *)tao->data; PetscErrorCode ierr; PetscFunctionBegin; ierr = VecDestroy(&tron->X_New);CHKERRQ(ierr); ierr = VecDestroy(&tron->G_New);CHKERRQ(ierr); ierr = VecDestroy(&tron->Work);CHKERRQ(ierr); ierr = VecDestroy(&tron->DXFree);CHKERRQ(ierr); ierr = VecDestroy(&tron->R);CHKERRQ(ierr); ierr = VecDestroy(&tron->diag);CHKERRQ(ierr); ierr = VecScatterDestroy(&tron->scatter);CHKERRQ(ierr); ierr = ISDestroy(&tron->Free_Local);CHKERRQ(ierr); ierr = MatDestroy(&tron->H_sub);CHKERRQ(ierr); ierr = MatDestroy(&tron->Hpre_sub);CHKERRQ(ierr); ierr = PetscFree(tao->data);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode SNESReset_Multiblock(SNES snes) { SNES_Multiblock *mb = (SNES_Multiblock *) snes->data; BlockDesc blocks = mb->blocks, next; PetscErrorCode ierr; PetscFunctionBegin; while (blocks) { ierr = SNESReset(blocks->snes);CHKERRQ(ierr); #if 0 ierr = VecDestroy(&blocks->x);CHKERRQ(ierr); #endif ierr = VecScatterDestroy(&blocks->sctx);CHKERRQ(ierr); ierr = ISDestroy(&blocks->is);CHKERRQ(ierr); next = blocks->next; blocks = next; } PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscMPIInt rank; PetscInt n = 5,idx1[2] = {0,3},idx2[2] = {1,4}; PetscScalar one = 1.0,two = 2.0; Vec x,y; IS is1,is2; VecScatter ctx = 0; ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr); ierr = PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);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,n,PETSC_DECIDE);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,2,idx1,PETSC_COPY_VALUES,&is1);CHKERRQ(ierr); ierr = ISCreateGeneral(PETSC_COMM_SELF,2,idx2,PETSC_COPY_VALUES,&is2);CHKERRQ(ierr); ierr = VecSet(x,one);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); if (!rank) {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; }
PetscErrorCode DiffIE(Vec originalVec, Vec reducedVec, Vec Distance, Vec nParticlePerCube) { // Find the distance between 2 solutions originalVec and reducedVec PetscInt s,t; PetscInt n,xstart,xend; PetscScalar tmp,v,diff; Vec vec; VecScatter scat; IS is; PetscFunctionBegin; VecGetOwnershipRange(originalVec,&xstart,&xend); VecGetSize(reducedVec,&n); VecCreate(PETSC_COMM_SELF,&vec); VecSetSizes(vec,PETSC_DECIDE,n); VecSetFromOptions(vec); ISCreateStride(PETSC_COMM_WORLD,n,0,1,&is); VecScatterCreate(reducedVec,PETSC_NULL,vec,is,&scat); //VecScatterCreateToAll(reducedVec,&scat,&vec); VecScatterBegin(scat,reducedVec,vec,INSERT_VALUES,SCATTER_FORWARD); VecScatterEnd(scat,reducedVec,vec,INSERT_VALUES,SCATTER_FORWARD); for(s=xstart;s<xend;s++) { t = ScatIE.FindCube(s); VecGetValues(vec,1,&t,&tmp); VecGetValues(originalVec,1,&s,&v); diff = cabs(v - tmp); VecSetValues(Distance,1,&t,&diff,ADD_VALUES); tmp = 1; VecSetValues(nParticlePerCube,1,&t,&tmp,ADD_VALUES); } VecDestroy(&vec); VecScatterDestroy(&scat); ISDestroy(&is); PetscFunctionReturn(0); }
static PetscErrorCode PCBDDCScalingReset_Deluxe_Solvers(PCBDDCDeluxeScaling deluxe_ctx) { PetscInt i; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscFree(deluxe_ctx->idx_simple_B);CHKERRQ(ierr); deluxe_ctx->n_simple = 0; for (i=0;i<deluxe_ctx->seq_n;i++) { ierr = VecScatterDestroy(&deluxe_ctx->seq_scctx[i]);CHKERRQ(ierr); ierr = VecDestroy(&deluxe_ctx->seq_work1[i]);CHKERRQ(ierr); ierr = VecDestroy(&deluxe_ctx->seq_work2[i]);CHKERRQ(ierr); ierr = MatDestroy(&deluxe_ctx->seq_mat[i]);CHKERRQ(ierr); ierr = MatDestroy(&deluxe_ctx->seq_mat_inv_sum[i]);CHKERRQ(ierr); } ierr = PetscFree5(deluxe_ctx->seq_scctx,deluxe_ctx->seq_work1,deluxe_ctx->seq_work2,deluxe_ctx->seq_mat,deluxe_ctx->seq_mat_inv_sum);CHKERRQ(ierr); ierr = PetscFree(deluxe_ctx->workspace);CHKERRQ(ierr); deluxe_ctx->seq_n = 0; PetscFunctionReturn(0); }
void ReplicatableVector::RemovePetscContext() { if (mToAll != NULL) { VecScatterDestroy(PETSC_DESTROY_PARAM(mToAll)); mToAll = NULL; } if (mReplicated != NULL) { PetscTools::Destroy(mReplicated); mReplicated = NULL; } if (mpData != NULL) { delete[] mpData; mpData = NULL; } }
void PetscVector::copyFromArray( char v[] ) { int ierr; Vec sv; IS is; VecScatter ctx; ierr = VecCreateSeq(PETSC_COMM_SELF, n, &sv); assert(ierr == 0); { double * a; ierr = VecGetArray( sv, &a ); assert( ierr == 0); int i; for( i = 0; i < n; i++ ) { a[i] = v[i]; } ierr = VecRestoreArray( sv, &a ); assert( ierr == 0); } ierr = ISCreateStride(PETSC_COMM_WORLD, n, 0, 1, &is); assert( ierr == 0); ierr = VecScatterCreate( sv, is, pv, is, &ctx); assert( ierr == 0); ierr = VecScatterBegin( sv, pv,INSERT_VALUES,SCATTER_FORWARD, ctx); assert( ierr == 0); ierr = VecScatterEnd( sv, pv,INSERT_VALUES,SCATTER_FORWARD, ctx); assert( ierr == 0); ierr = VecScatterDestroy(ctx); assert( ierr == 0); ierr = ISDestroy( is ); assert(ierr == 0); ierr = VecDestroy( sv ); assert(ierr == 0); }
bool SAMpatchPETSc::expandSolution(const SystemVector& solVec, Vector& dofVec, Real scaleSD) const { PETScVector* Bptr = const_cast<PETScVector*>(dynamic_cast<const PETScVector*>(&solVec)); if (!Bptr) return false; #ifdef HAVE_MPI if (adm.isParallel()) { if (!glob2LocEq) { std::vector<int> mlgeq(adm.dd.getMLGEQ()); for (auto& it : mlgeq) --it; ISCreateGeneral(*adm.getCommunicator(),adm.dd.getMLGEQ().size(), mlgeq.data(), PETSC_COPY_VALUES, &glob2LocEq); } Vec solution; VecCreateSeq(PETSC_COMM_SELF, Bptr->dim(), &solution); VecScatter ctx; VecScatterCreate(Bptr->getVector(), glob2LocEq, solution, nullptr, &ctx); VecScatterBegin(ctx, Bptr->getVector(), solution, INSERT_VALUES, SCATTER_FORWARD); VecScatterEnd(ctx, Bptr->getVector(),solution,INSERT_VALUES,SCATTER_FORWARD); VecScatterDestroy(&ctx); PetscScalar* data; VecGetArray(solution, &data); std::copy(data, data + Bptr->dim(), Bptr->getPtr()); VecDestroy(&solution); } else #endif { PetscScalar* data; VecGetArray(Bptr->getVector(), &data); std::copy(data, data + Bptr->dim(), Bptr->getPtr()); VecRestoreArray(Bptr->getVector(), &data); } return this->SAMpatch::expandSolution(solVec, dofVec, scaleSD); }
PetscErrorCode Monitor(TS ts,PetscInt step,PetscReal time,Vec global,void *ctx) { VecScatter scatter; IS from,to; PetscInt i,n,*idx; Vec tmp_vec; PetscErrorCode ierr; PetscScalar *tmp; /* Get the size of the vector */ ierr = VecGetSize(global,&n);CHKERRQ(ierr); /* Set the index sets */ ierr = PetscMalloc(n*sizeof(PetscInt),&idx);CHKERRQ(ierr); for(i=0; i<n; i++) idx[i]=i; /* Create local sequential vectors */ ierr = VecCreateSeq(PETSC_COMM_SELF,n,&tmp_vec);CHKERRQ(ierr); /* Create scatter context */ ierr = ISCreateGeneral(PETSC_COMM_SELF,n,idx,PETSC_COPY_VALUES,&from);CHKERRQ(ierr); ierr = ISCreateGeneral(PETSC_COMM_SELF,n,idx,PETSC_COPY_VALUES,&to);CHKERRQ(ierr); ierr = VecScatterCreate(global,from,tmp_vec,to,&scatter);CHKERRQ(ierr); ierr = VecScatterBegin(scatter,global,tmp_vec,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterEnd(scatter,global,tmp_vec,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecGetArray(tmp_vec,&tmp);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"At t =%14.6e u = %14.6e %14.6e %14.6e \n", time,PetscRealPart(tmp[0]),PetscRealPart(tmp[1]),PetscRealPart(tmp[2]));CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"At t =%14.6e errors = %14.6e %14.6e %14.6e \n", time,PetscRealPart(tmp[0]-solx(time)),PetscRealPart(tmp[1]-soly(time)),PetscRealPart(tmp[2]-solz(time)));CHKERRQ(ierr); ierr = VecRestoreArray(tmp_vec,&tmp);CHKERRQ(ierr); ierr = VecScatterDestroy(&scatter);CHKERRQ(ierr); ierr = ISDestroy(&from);CHKERRQ(ierr); ierr = ISDestroy(&to);CHKERRQ(ierr); ierr = PetscFree(idx);CHKERRQ(ierr); ierr = VecDestroy(&tmp_vec);CHKERRQ(ierr); return 0; }
//------------------------------------------------------------------------------ // Save solution to file //------------------------------------------------------------------------------ PetscErrorCode savesol(int nx, double dx, Vec ug) { int i, rank; static int count = 0; PetscErrorCode ierr; MPI_Comm_rank(PETSC_COMM_WORLD, &rank); // Gather entire solution on rank=0 process. This is bad thing to do // in a real application. VecScatter ctx; Vec uall; ierr = VecScatterCreateToZero(ug,&ctx,&uall); CHKERRQ(ierr); // scatter as many times as you need ierr = VecScatterBegin(ctx,ug,uall,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(ierr); ierr = VecScatterEnd(ctx,ug,uall,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(ierr); // destroy scatter context and local vector when no longer needed ierr = VecScatterDestroy(&ctx); CHKERRQ(ierr); if(rank==0) { PetscScalar *uarray; ierr = VecGetArray(uall, &uarray); CHKERRQ(ierr); FILE *f; f = fopen("sol.dat","w"); for(i=0; i<nx; ++i) fprintf(f, "%e %e\n", xmin+i*dx, uarray[i]); fclose(f); printf("Wrote solution into sol.dat\n"); ierr = VecRestoreArray(uall, &uarray); CHKERRQ(ierr); if(count==0) { // Initial solution is copied to sol0.dat system("cp sol.dat sol0.dat"); count = 1; } } ierr = VecDestroy(&uall); CHKERRQ(ierr); return(0); }