#include "petscsolver.h" PETScSolver::PETScSolver(int argc,char **argv,int g_Ni,int g_Nj,int g_Nk,int *dims,int *l_Ni,int *l_Nj,int *l_Nk,int _Nall,double h) { MPI_Comm_rank(MPI_COMM_WORLD,&rank); Nall = _Nall; ih = 1./h; iepsilon0 = 1./8.854187817E-12; bound = NULL; PetscInitialize(&argc,&argv,(char*)0,(char*)0); KSPCreate(PETSC_COMM_WORLD,&ksp); DMDACreate3d(PETSC_COMM_WORLD,DM_BOUNDARY_GHOSTED,DM_BOUNDARY_GHOSTED,DM_BOUNDARY_GHOSTED, DMDA_STENCIL_BOX,g_Ni,g_Nj,g_Nk,dims[0],dims[1],dims[2],1,1,l_Ni,l_Nj,l_Nk,&da); KSPSetDM(ksp,da); DMCreateGlobalVector(da,&b); VecDuplicate(b,&x); VecSet(x,0); VecSet(b,0); } PETScSolver::~PETScSolver() { VecDestroy(&x); VecDestroy(&b); DMDestroy(&da); KSPDestroy(&ksp); PetscFinalize(); } /* Needs to be called before initsolve() or solve() */ void PETScSolver::init(int *_bound) { bound = _bound; KSPSetComputeOperators(ksp,ComputeMatrix,(void*)bound); } void PETScSolver::initsolve(double *phi,double *charge,double reltol) { KSPSetInitialGuessNonzero(ksp,PETSC_TRUE); KSPSetFromOptions(ksp); KSPSetTolerances(ksp,reltol,PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT); PetscScalar *xarray; VecGetArray(x,&xarray); for (int i=0; i