Пример #1
0
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;
}
Пример #2
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);
}
Пример #3
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;
}
Пример #4
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;
}
Пример #5
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;
}
Пример #6
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);
}
Пример #7
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;
}
Пример #8
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);
}
Пример #9
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);
}
Пример #10
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);
}
Пример #11
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;
}
Пример #12
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);
}
Пример #13
0
PetscErrorCode PotSetHarm(Pot self, PetscScalar a) {
  Harm *ctx; PetscNew(&ctx);
  ctx->a = a;
  PFSet(self, HarmApply, NULL, HarmView, HarmDestroy, ctx);
  return 0;
}
Пример #14
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;
}
Пример #15
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;
}
Пример #16
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;
}
Пример #17
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;
}