예제 #1
0
static PetscErrorCode TSEIMEXGetVecs(TS ts,DM dm,Vec *Z,Vec *Ydot,Vec *YdotI, Vec *YdotRHS)
{
  TS_EIMEX       *ext = (TS_EIMEX*)ts->data;
  PetscErrorCode ierr;

  PetscFunctionBegin;
  if (Z) {
    if (dm && dm != ts->dm) {
      ierr = DMGetNamedGlobalVector(dm,"TSEIMEX_Z",Z);CHKERRQ(ierr);
    } else *Z = ext->Z;
  }
  if (Ydot) {
    if (dm && dm != ts->dm) {
      ierr = DMGetNamedGlobalVector(dm,"TSEIMEX_Ydot",Ydot);CHKERRQ(ierr);
    } else *Ydot = ext->Ydot;
  }
  if (YdotI) {
    if (dm && dm != ts->dm) {
      ierr = DMGetNamedGlobalVector(dm,"TSEIMEX_YdotI",YdotI);CHKERRQ(ierr);
    } else *YdotI = ext->YdotI;
  }
  if (YdotRHS) {
    if (dm && dm != ts->dm) {
      ierr = DMGetNamedGlobalVector(dm,"TSEIMEX_YdotRHS",YdotRHS);CHKERRQ(ierr);
    } else *YdotRHS = ext->YdotRHS;
  }
  PetscFunctionReturn(0);
}
예제 #2
0
파일: ex29.c 프로젝트: erdc-cm/petsc-dev
/* This could restrict auxiliary information to the coarse level.
 */
static PetscErrorCode CoefficientSubDomainRestrictHook(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx)
{
  Vec            c,cc;
  PetscErrorCode ierr;
  PetscFunctionBegin;
  ierr = DMGetNamedGlobalVector(dm,"coefficient",&c);CHKERRQ(ierr);
  ierr = DMGetNamedGlobalVector(subdm,"coefficient",&cc);CHKERRQ(ierr);

  ierr = VecScatterBegin(gscat,c,cc,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
  ierr = VecScatterEnd(gscat,c,cc,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);

  ierr = DMRestoreNamedGlobalVector(dm,"coefficient",&c);CHKERRQ(ierr);
  ierr = DMRestoreNamedGlobalVector(subdm,"coefficient",&cc);CHKERRQ(ierr);

  PetscFunctionReturn(0);
}
예제 #3
0
파일: ex29.c 프로젝트: erdc-cm/petsc-dev
/* This could restrict auxiliary information to the coarse level.
 */
static PetscErrorCode CoefficientRestrictHook(DM dm,Mat restrct,Vec rscale,Mat Inject,DM dmc,void *ctx)
{
  Vec            c,cc;
  PetscErrorCode ierr;
  PetscFunctionBegin;
  ierr = DMGetNamedGlobalVector(dm,"coefficient",&c);CHKERRQ(ierr);
  ierr = DMGetNamedGlobalVector(dmc,"coefficient",&cc);CHKERRQ(ierr);

  /* restrict the coefficient rather than injecting it */
  ierr = MatRestrict(restrct,c,cc);CHKERRQ(ierr);

  ierr = DMRestoreNamedGlobalVector(dm,"coefficient",&c);CHKERRQ(ierr);
  ierr = DMRestoreNamedGlobalVector(dmc,"coefficient",&cc);CHKERRQ(ierr);

  PetscFunctionReturn(0);
}
예제 #4
0
 static PetscErrorCode TSThetaGetX0AndXdot(TS ts,DM dm,Vec *X0,Vec *Xdot)
 {
   TS_Theta       *th = (TS_Theta*)ts->data;
   PetscErrorCode ierr;

   PetscFunctionBegin;
   if (X0) {
     if (dm && dm != ts->dm) {
       ierr = DMGetNamedGlobalVector(dm,"TSTheta_X0",X0);CHKERRQ(ierr);
     } else *X0 = ts->vec_sol;
   }
   if (Xdot) {
     if (dm && dm != ts->dm) {
       ierr = DMGetNamedGlobalVector(dm,"TSTheta_Xdot",Xdot);CHKERRQ(ierr);
     } else *Xdot = th->Xdot;
   }
   PetscFunctionReturn(0);
 }
예제 #5
0
파일: ex29.c 프로젝트: erdc-cm/petsc-dev
PetscErrorCode FormIFunctionLocal(DMDALocalInfo *info,PetscScalar ptime,PetscScalar **x,PetscScalar **xt,PetscScalar **f,void *ctx)
{
  PetscErrorCode ierr;
  PetscInt       i,j;
  PetscReal      hx,hy,hxdhy,hydhx,scale;
  PetscScalar    u,uxx,uyy;
  Vec            C;
  PetscScalar    **c;

  PetscFunctionBeginUser;

  ierr = DMGetNamedGlobalVector(info->da,"coefficient",&C);CHKERRQ(ierr);
  ierr = DMDAVecGetArray(info->da,C,&c);CHKERRQ(ierr);

  hx     = 10.0/((PetscReal)(info->mx-1));
  hy     = 10.0/((PetscReal)(info->my-1));

  /*
  dhx =     1. / hx;
  dhy =     1. / hy;
   */
  hxdhy  =  hx/hy;
  hydhx  =  hy/hx;
  scale =   hx*hy;

  for (j=info->ys; j<info->ys+info->ym; j++) {
    for (i=info->xs; i<info->xs+info->xm; i++) {
      f[j][i] = xt[j][i]*scale;
      if (i == 0) {
        /* f[j][i] += (x[j][i] - x[j][i+1])*dhx; */
      } else if (i == info->mx-1) {
        /* f[j][i] += (x[j][i] - x[j][i-1])*dhx; */
      } else if (j == 0) {
        /* f[j][i] += (x[j][i] - x[j+1][i])*dhy; */
      } else if (j == info->my-1) {
        /* f[j][i] += (x[j][i] - x[j-1][i])*dhy; */
      } else {
        u       = x[j][i];
        uyy     = (2.0*u - x[j-1][i] - x[j+1][i])*hxdhy;
        uxx     = (2.0*u - x[j][i-1] - x[j][i+1])*hydhx;
        f[j][i] += c[j][i]*(uxx + uyy);
      }
    }
  }
  ierr = PetscLogFlops(11.*info->ym*info->xm);CHKERRQ(ierr);

  ierr = DMDAVecRestoreArray(info->da,C,&c);CHKERRQ(ierr);
  ierr = DMRestoreNamedGlobalVector(info->da,"coefficient",&C);CHKERRQ(ierr);

  PetscFunctionReturn(0);
}
예제 #6
0
파일: ex29.c 프로젝트: erdc-cm/petsc-dev
int main(int argc,char **argv)
{
  TS                     ts;
  Vec                    x,c;
  PetscErrorCode         ierr;
  DM                     da;

  PetscInitialize(&argc,&argv,(char *)0,help);
  ierr = TSCreate(PETSC_COMM_WORLD, &ts);CHKERRQ(ierr);
  ierr = TSSetType(ts,TSCN);CHKERRQ(ierr);
  ierr = TSSetProblemType(ts,TS_NONLINEAR);CHKERRQ(ierr);
  ierr = DMDACreate2d(PETSC_COMM_WORLD, DMDA_BOUNDARY_NONE, DMDA_BOUNDARY_NONE,DMDA_STENCIL_STAR,-4,-4,PETSC_DECIDE,PETSC_DECIDE,1,1,PETSC_NULL,PETSC_NULL,&da);CHKERRQ(ierr);
  ierr = DMDASetUniformCoordinates(da, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0);CHKERRQ(ierr);

  ierr = DMDASetFieldName(da,0,"Heat");CHKERRQ(ierr);
  ierr = DMCreateGlobalVector(da,&x);CHKERRQ(ierr);
  ierr = FormInitialGuess(da,PETSC_NULL,x);CHKERRQ(ierr);
  ierr = DMDATSSetIFunctionLocal(da,INSERT_VALUES,(PetscErrorCode (*)(DMDALocalInfo*,PetscReal,void*,void*,void*,void*))FormIFunctionLocal,PETSC_NULL);CHKERRQ(ierr);

  /* set up the coefficient */
  ierr = DMGetNamedGlobalVector(da,"coefficient",&c);CHKERRQ(ierr);
  ierr = FormDiffusionCoefficient(da,PETSC_NULL,c);CHKERRQ(ierr);
  ierr = DMRestoreNamedGlobalVector(da,"coefficient",&c);CHKERRQ(ierr);

  ierr = DMCoarsenHookAdd(da,PETSC_NULL,CoefficientRestrictHook,ts);CHKERRQ(ierr);
  ierr = DMSubDomainHookAdd(da,PETSC_NULL,CoefficientSubDomainRestrictHook,ts);CHKERRQ(ierr);

  ierr = TSSetDM(ts, da);CHKERRQ(ierr);
  ierr = TSSetDuration(ts,10000,1000.0);CHKERRQ(ierr);
  ierr = TSSetInitialTimeStep(ts,0.0,0.05);CHKERRQ(ierr);
  ierr = TSSetSolution(ts,x);CHKERRQ(ierr);
  ierr = TSSetFromOptions(ts);CHKERRQ(ierr);

  ierr = TSSolve(ts,x);CHKERRQ(ierr);

  ierr = VecDestroy(&x);CHKERRQ(ierr);
  ierr = TSDestroy(&ts);CHKERRQ(ierr);
  ierr = DMDestroy(&da);CHKERRQ(ierr);
  ierr = PetscFinalize();

  PetscFunctionReturn(0);
}
예제 #7
0
#include <petsc/private/fortranimpl.h>
#include <petscdm.h>

#if defined(PETSC_HAVE_FORTRAN_CAPS)
#define dmgetnamedglobalvector_           DMGETNAMEDGLOBALVECTOR
#define dmrestorenamedglobalvector_       DMRESTORENAMEDGLOBALVECTOR
#elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
#define dmgetnamedglobalvector_           dmgetnamedglobalvector
#define dmrestorenamedglobalvector_       dmrestorenamedglobalvector
#endif

PETSC_EXTERN void PETSC_STDCALL dmgetnamedglobalvector_(DM *dm,CHAR name PETSC_MIXED_LEN(len),Vec *X,PetscErrorCode *ierr PETSC_END_LEN(len))
{
  char *t;

  FIXCHAR(name,len,t);
  *ierr = DMGetNamedGlobalVector(*dm,t,X);
  FREECHAR(name,t);
}

PETSC_EXTERN void PETSC_STDCALL dmrestorenamedglobalvector_(DM *dm,CHAR name PETSC_MIXED_LEN(len),Vec *X,PetscErrorCode *ierr PETSC_END_LEN(len))
{
  char *t;

  FIXCHAR(name,len,t);
  *ierr = DMRestoreNamedGlobalVector(*dm,t,X);
  FREECHAR(name,t);
}