PETSC_EXTERN void PETSC_STDCALL dmdasetblockfills_(DM da, PetscInt *dfill, PetscInt *ofill, int *__ierr ){ *__ierr = DMDASetBlockFills( (DM)PetscToPointer((da) ),dfill,ofill); }
int main(int argc,char **argv) { TS ts; /* nonlinear solver */ Vec C; /* solution */ PetscErrorCode ierr; DM da; /* manages the grid data */ AppCtx ctx; /* holds problem specific paramters */ PetscInt He,dof = 3*N+N*N,*ofill; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Initialize program - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ PetscInitialize(&argc,&argv,(char *)0,help); PetscFunctionBeginUser; ctx.noreactions = PETSC_FALSE; ctx.nodissociations = PETSC_FALSE; ierr = PetscOptionsHasName(PETSC_NULL,"-noreactions",&ctx.noreactions);CHKERRQ(ierr); ierr = PetscOptionsHasName(PETSC_NULL,"-nodissociations",&ctx.nodissociations);CHKERRQ(ierr); ctx.HeDiffusion[1] = 1000*2.95e-4; /* From Tibo's notes times 1,000 */ ctx.HeDiffusion[2] = 1000*3.24e-4; ctx.HeDiffusion[3] = 1000*2.26e-4; ctx.HeDiffusion[4] = 1000*1.68e-4; ctx.HeDiffusion[5] = 1000*5.20e-5; ctx.VDiffusion[1] = 1000*2.71e-3; ctx.IDiffusion[1] = 1000*2.13e-4; ctx.forcingScale = 100.; /* made up numbers */ ctx.reactionScale = .001; ctx.dissociationScale = .0001; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create distributed array (DMDA) to manage parallel grid and vectors - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = DMDACreate1d(PETSC_COMM_WORLD, DMDA_BOUNDARY_MIRROR,-8,dof,1,PETSC_NULL,&da);CHKERRQ(ierr); /* The only spatial coupling in the Jacobian (diffusion) is for the first 5 He, the first V, and the first I. The ofill (thought of as a dof by dof 2d (row-oriented) array represents the nonzero coupling between degrees of freedom at one point with degrees of freedom on the adjacent point to the left or right. A 1 at i,j in the ofill array indicates that the degree of freedom i at a point is coupled to degree of freedom j at the adjacent point. In this case ofill has only a few diagonal entries since the only spatial coupling is regular diffusion. */ ierr = PetscMalloc(dof*dof*sizeof(PetscInt),&ofill);CHKERRQ(ierr); ierr = PetscMemzero(ofill,dof*dof*sizeof(PetscInt));CHKERRQ(ierr); for (He=0; He<PetscMin(N,5); He++) ofill[He*dof + He] = 1; ofill[N*dof + N] = ofill[2*N*dof + 2*N] = 1; ierr = DMDASetBlockFills(da,PETSC_NULL,ofill);CHKERRQ(ierr); ierr = PetscFree(ofill);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Extract global vector from DMDA to hold solution - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = DMCreateGlobalVector(da,&C);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create timestepping solver context - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = TSCreate(PETSC_COMM_WORLD,&ts);CHKERRQ(ierr); ierr = TSSetType(ts,TSARKIMEX);CHKERRQ(ierr); ierr = TSSetDM(ts,da);CHKERRQ(ierr); ierr = TSSetProblemType(ts,TS_NONLINEAR);CHKERRQ(ierr); ierr = TSSetIFunction(ts,PETSC_NULL,IFunction,&ctx);CHKERRQ(ierr); ierr = TSSetSolution(ts,C);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Set solver options - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = TSSetInitialTimeStep(ts,0.0,.001);CHKERRQ(ierr); ierr = TSSetDuration(ts,100,50.0);CHKERRQ(ierr); ierr = TSSetFromOptions(ts);CHKERRQ(ierr); ierr = MyMonitorSetUp(ts);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Set initial conditions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = InitialConditions(da,C);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Solve the ODE system - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = TSSolve(ts,C);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Free work space. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = VecDestroy(&C);CHKERRQ(ierr); ierr = TSDestroy(&ts);CHKERRQ(ierr); ierr = DMDestroy(&da);CHKERRQ(ierr); ierr = PetscFinalize(); PetscFunctionReturn(0); }