int main(int argc,char **argv) { Vec u,xy; DA da; PetscErrorCode ierr; PetscInt m = 10, n = 10, dof = 2; PF pf; ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr); ierr = DACreate2d(PETSC_COMM_WORLD,DA_NONPERIODIC,DA_STENCIL_BOX,m,n,PETSC_DECIDE,PETSC_DECIDE,dof,1,0,0,&da);CHKERRQ(ierr); ierr = DASetUniformCoordinates(da,0.0,1.0,0.0,1.0,0.0,1.0);CHKERRQ(ierr); ierr = DACreateGlobalVector(da,&u);CHKERRQ(ierr); ierr = DAGetCoordinates(da,&xy);CHKERRQ(ierr); ierr = DACreatePF(da,&pf);CHKERRQ(ierr); ierr = PFSet(pf,myfunction,0,0,0,0);CHKERRQ(ierr); ierr = PFSetFromOptions(pf);CHKERRQ(ierr); ierr = PFApplyVec(pf,xy,u);CHKERRQ(ierr); ierr = VecView(u,PETSC_VIEWER_DRAW_WORLD);CHKERRQ(ierr); /* Free work space. All PETSc objects should be destroyed when they are no longer needed. */ ierr = VecDestroy(xy);CHKERRQ(ierr); ierr = PFDestroy(pf);CHKERRQ(ierr); ierr = DADestroy(da);CHKERRQ(ierr); ierr = PetscFinalize();CHKERRQ(ierr); return 0; }
PETSC_EXTERN PetscErrorCode PFCreate_Quick(PF pf,PetscErrorCode (*function)(void*,PetscInt,const PetscScalar*,PetscScalar*)) { PetscErrorCode ierr; PetscFunctionBegin; ierr = PFSet(pf,function,0,0,0,0);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode PotSetProduct(Pot self, int num, Pot *pfs) { Product *ctx; PetscNew(&ctx); ctx->num = num; PetscMalloc1(num, &ctx->pfs); for(int i = 0; i < num; i++) ctx->pfs[i] = pfs[i]; PFSet(self, ProductApply, NULL, ProductView, ProductDestroy, ctx); return 0; }
PetscErrorCode PotSetCombination(Pot self, int num, Pot *pfs) { Combination *ctx; PetscNew(&ctx); ctx->num = num; PetscMalloc1(num, &ctx->pfs); for(int i = 0; i < num; i++) ctx->pfs[i] = pfs[i]; PFSet(self, CombinationApply, NULL, CombinationView, CombinationDestroy, ctx); return 0; }
PetscErrorCode PotSetRBessel(Pot self, int L, double k) { MPI_Comm comm; PetscObjectGetComm((PetscObject)self, &comm); if(L != 0) { SETERRQ(comm, 1, "now only L = 0 is supported"); } RBessel *ctx; PetscNew(&ctx); ctx->L = L; ctx->k = k; PFSet(self, RBesselApply, NULL, RBesselView, RBesselDestroy, ctx); return 0; }
PETSC_EXTERN PetscErrorCode PFCreate_Identity(PF pf,void *value) { PetscErrorCode ierr; PetscInt *loc; PetscFunctionBegin; if (pf->dimout != pf->dimin) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Input dimension must match output dimension for Identity function, dimin = %D dimout = %D\n",pf->dimin,pf->dimout); ierr = PetscMalloc(sizeof(PetscInt),&loc);CHKERRQ(ierr); loc[0] = pf->dimout; ierr = PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode WaveFuncSetHEig(WaveFunc self, int n, int L, PetscScalar z) { MPI_Comm comm; PetscObjectGetComm((PetscObject)self, &comm); if(n != 1 || L != 0) SETERRQ(comm, 1, "not implemented yet"); HEig *ctx; PetscNew(&ctx); ctx->n = n; ctx->L = L; ctx->z = z; PFSet(self, HEigApply, 0, HEigView, HEigDestroy, ctx); return 0; }
PETSC_EXTERN PetscErrorCode PFCreate_Constant(PF pf,void *value) { PetscErrorCode ierr; PetscScalar *loc; PetscFunctionBegin; ierr = PetscMalloc(2*sizeof(PetscScalar),&loc);CHKERRQ(ierr); if (value) loc[0] = *(PetscScalar*)value; else loc[0] = 0.0; loc[1] = pf->dimout; ierr = PFSet(pf,PFApply_Constant,PFApplyVec_Constant,PFView_Constant,PFDestroy_Constant,loc);CHKERRQ(ierr); pf->ops->setfromoptions = PFSetFromOptions_Constant; PetscFunctionReturn(0); }
/* load the apply function from the dynamic library */ ierr = PetscGetUserName(username,64);CHKERRQ(ierr); sprintf(lib,"%s/%s/libpetscdlib",tmp,username); ierr = PetscDLLibrarySym(comm,PETSC_NULL,lib,"PFApply_String",f);CHKERRQ(ierr); #endif PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "PFSetFromOptions_String" PetscErrorCode PFSetFromOptions_String(PF pf) { PetscErrorCode ierr; PetscTruth flag; char value[PETSC_MAX_PATH_LEN]; PetscErrorCode (*f)(void*,PetscInt,PetscScalar*,PetscScalar*) = 0; PetscFunctionBegin; ierr = PetscOptionsHead("String function options");CHKERRQ(ierr); ierr = PetscOptionsString("-pf_string","Enter the function","PFStringCreateFunction","",value,PETSC_MAX_PATH_LEN,&flag);CHKERRQ(ierr); if (flag) { ierr = PFStringCreateFunction(pf,value,(void**)&f);CHKERRQ(ierr); pf->ops->apply = f; } ierr = PetscOptionsTail();CHKERRQ(ierr); PetscFunctionReturn(0); } typedef PetscErrorCode (*FCN)(void*,PetscInt,PetscScalar*,PetscScalar*); /* force argument to next function to not be extern C*/ EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "PFCreate_String" PetscErrorCode PETSCVEC_DLLEXPORT PFCreate_String(PF pf,void *value) { PetscErrorCode ierr; FCN f = 0; PetscFunctionBegin; if (value) { ierr = PFStringCreateFunction(pf,(char*)value,(void**)&f);CHKERRQ(ierr); } ierr = PFSet(pf,f,PETSC_NULL,PFView_String,PFDestroy_String,PETSC_NULL);CHKERRQ(ierr); pf->ops->setfromoptions = PFSetFromOptions_String; PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode PFCreate_Matlab(PF pf,void *value) { PetscErrorCode ierr; PF_Matlab *matlab; PetscFunctionBegin; ierr = PetscNewLog(pf,&matlab);CHKERRQ(ierr); matlab->dimin = pf->dimin; matlab->dimout = pf->dimout; ierr = PetscMatlabEngineCreate(PetscObjectComm((PetscObject)pf),NULL,&matlab->mengine);CHKERRQ(ierr); if (value) { ierr = PetscStrallocpy((char*)value,&matlab->string);CHKERRQ(ierr); } ierr = PFSet(pf,PFApply_Matlab,NULL,PFView_Matlab,PFDestroy_Matlab,matlab);CHKERRQ(ierr); pf->ops->setfromoptions = PFSetFromOptions_Matlab; PetscFunctionReturn(0); }
int main(int argc,char **argv) { PetscErrorCode ierr; DM da; Vec global; PF pf; ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr); ierr = DMDACreate1d(PETSC_COMM_WORLD,DMDA_BOUNDARY_NONE,10,3,1,PETSC_NULL,&da);CHKERRQ(ierr); ierr = DMCreateGlobalVector(da,&global);CHKERRQ(ierr); ierr = PFCreate(PETSC_COMM_WORLD,1,3,&pf);CHKERRQ(ierr); ierr = PFSet(pf,apply,PETSC_NULL,PETSC_NULL,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); ierr = PFApplyVec(pf,PETSC_NULL,global);CHKERRQ(ierr); ierr = PFDestroy(&pf);CHKERRQ(ierr); ierr = VecView(global,PETSC_VIEWER_DRAW_WORLD);CHKERRQ(ierr); ierr = VecDestroy(&global);CHKERRQ(ierr); ierr = DMDestroy(&da);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "PFCreate_Matlab" PetscErrorCode PETSCVEC_DLLEXPORT PFCreate_Matlab(PF pf,void *value) { PetscErrorCode ierr; PF_Matlab *matlab; PetscFunctionBegin; ierr = PetscNewLog(pf,PF_Matlab,&matlab);CHKERRQ(ierr); matlab->dimin = pf->dimin; matlab->dimout = pf->dimout; ierr = PetscMatlabEngineCreate(((PetscObject)pf)->comm,PETSC_NULL,&matlab->mengine);CHKERRQ(ierr); if (value) { ierr = PetscStrallocpy((char*)value,&matlab->string);CHKERRQ(ierr); } ierr = PFSet(pf,PFApply_Matlab,PETSC_NULL,PFView_Matlab,PFDestroy_Matlab,matlab);CHKERRQ(ierr); pf->ops->setfromoptions = PFSetFromOptions_Matlab; PetscFunctionReturn(0); }
PetscErrorCode PotSetHarm(Pot self, PetscScalar a) { Harm *ctx; PetscNew(&ctx); ctx->a = a; PFSet(self, HarmApply, NULL, HarmView, HarmDestroy, ctx); return 0; }
PetscErrorCode PotSetCoulombNE(Pot self, int q, PetscScalar a, PetscScalar zz) { CoulombNE *ctx; PetscNew(&ctx); ctx->q = q; ctx->a = a; ctx->zz=zz; PFSet(self, CoulombNEApply, NULL, CoulombNEView, CoulombNEDestroy, ctx); return 0; }
PetscErrorCode PotSetMorse(Pot self, PetscScalar D0, PetscScalar a, PetscScalar Re){ Morse *ctx; PetscNew(&ctx); ctx->D0 = D0; ctx->a = a; ctx->Re = Re; PFSet(self, MorseApply, NULL, MorseView, MorseDestroy, ctx); return 0; }
PetscErrorCode PotSetSlater(Pot self, PetscScalar a, int n, PetscScalar z) { Slater *ctx; PetscNew(&ctx); ctx->a = a; ctx->n = n; ctx->z = z; PFSet(self, SlaterApply, NULL, SlaterView, SlaterDestroy, ctx); return 0; }
PetscErrorCode PotSetPower(Pot self, PetscScalar a, PetscInt n) { Power *ctx; PetscNew(&ctx); ctx->a = a; ctx->n = n; PFSet(self, PowerApply, NULL, PowerView, PowerDestroy, ctx); return 0; }