static char help[] = "Solving swift hohenberg equation in 1D \n\ u_t=(r-1)u-2u_xx+u_xxxx in 2D.\n"; #include #include #include extern PetscErrorCode RHSFunction(TS, PetscReal, Vec, Vec, void*); extern PetscErrorCode InitialValues(DM, Vec, void*); extern PetscErrorCode RHSJacobian(TS, PetscReal, Vec, Mat, Mat, void*); extern PetscErrorCode Monitor(TS,PetscInt,PetscReal,Vec,void*); int main(int argc, char **argv) { Vec x; Mat J; TS ts; PetscReal a,b,c,h,ftime, dt; DM da; PetscErrorCode ierr; PetscInt steps, maxsteps=100; PetscInitialize(&argc, &argv, (char*)0,help); /*================================================================== Create 1D distributed array for managing parallel grid and vectors ==================================================================*/ ierr = DMDACreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, 15, 1, 1, NULL, &da); CHKERRQ(ierr); /*================================================================== Let DMDA create vector ==================================================================*/ ierr = DMCreateGlobalVector(da, &x);CHKERRQ(ierr); /*================================================================== Create timestepper context to use Euler Method ==================================================================*/ ierr = TSCreate(PETSC_COMM_WORLD,&ts);CHKERRQ(ierr); ierr = TSSetDM(ts, da);CHKERRQ(ierr); ierr = TSSetType(ts, TSEULER);CHKERRQ(ierr); ierr = TSMonitorSet(ts, Monitor, NULL, NULL); ierr = TSSetRHSFunction(ts, x, RHSFunction, NULL);CHKERRQ(ierr); /*================================================================= Create Jacobian for Euler Method =================================================================*/ ierr = DMSetMatType(da, MATAIJ);CHKERRQ(ierr); ierr = DMCreateMatrix(da,&J);CHKERRQ(ierr); ierr = TSSetRHSJacobian(ts,J,J,RHSJacobian,NULL); CHKERRQ(ierr); ftime = 1.0; ierr = TSSetDuration(ts, maxsteps, ftime);CHKERRQ(ierr); ierr = TSSetExactFinalTime(ts, TS_EXACTFINALTIME_STEPOVER);CHKERRQ(ierr); /*================================================================== Set initial conditions (see user function InitialValues();) ==================================================================*/ ierr = InitialValues(da, x, NULL);CHKERRQ(ierr); // ierr = VecView(x, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); dt = 0.0001; ierr = TSSetInitialTimeStep(ts, 0.0, dt); CHKERRQ(ierr); /*================================================================== Set runtime options for TS ==================================================================*/ ierr = TSSetFromOptions(ts);CHKERRQ(ierr); //ierr = MatView(J, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); /*================================================================== Solve PDE at each time step ==================================================================*/ ierr = PetscPrintf(PETSC_COMM_WORLD, "time stepping\n\n");CHKERRQ(ierr); ierr = TSSolve(ts, x);CHKERRQ(ierr); ierr = TSGetSolveTime(ts, &ftime);CHKERRQ(ierr); ierr = TSGetTimeStepNumber(ts, &steps);CHKERRQ(ierr); ierr = MatView(J, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); /*================================================================== Clean up created objects ==================================================================*/ ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = MatDestroy(&J);CHKERRQ(ierr); ierr = TSDestroy(&ts);CHKERRQ(ierr); ierr = DMDestroy(&da);CHKERRQ(ierr); PetscFinalize(); PetscFunctionReturn(0); } /*================================================================== Function to evaluate RHS of each time step ==================================================================*/ #undef __FUNCT__ #define __FUNCT__ "RHSFunction" PetscErrorCode RHSFunction(TS ts, PetscReal ftime, Vec X, Vec F, void *unused) { DM da; PetscErrorCode ierr; PetscInt i, Mx, xs, xm; PetscReal h; PetscScalar u, uxx, uxxxx, *uarray, *f; Vec localX; /* Always begin user defined functions with this call */ PetscFunctionBeginUser; /* Access DM for TS */ ierr = TSGetDM(ts, &da); CHKERRQ(ierr); /* Get a local part of the vecor x */ ierr = DMGetLocalVector(da, &localX);CHKERRQ(ierr); /* Access info about da */ ierr = DMDAGetInfo(da, PETSC_IGNORE, &Mx, PETSC_IGNORE, PETSC_IGNORE, PETSC_IGNORE, PETSC_IGNORE, PETSC_IGNORE, PETSC_IGNORE, PETSC_IGNORE, PETSC_IGNORE, PETSC_IGNORE, PETSC_IGNORE, PETSC_IGNORE); CHKERRQ(ierr); /* Scatter ghost points */ ierr = DMGlobalToLocalBegin(da, X, INSERT_VALUES, localX);CHKERRQ(ierr); ierr = DMGlobalToLocalEnd(da, X, INSERT_VALUES, localX);CHKERRQ(ierr); /* Give local DM access to local vector data */ ierr = DMDAVecGetArrayRead(da, localX, &uarray);CHKERRQ(ierr); ierr = DMDAVecGetArray(da, F, &f);CHKERRQ(ierr); /* Get where the local grid boundaries are */ ierr = DMDAGetCorners(da, &xs, NULL, NULL, &xm, NULL, NULL);CHKERRQ(ierr); /* Compute point separation in discretization */ h = 1/(Mx-1); // ierr = PetscPrintf(PETSC_COMM_WORLD, "Calculating RHS Functino\n\n");CHKERRQ(ierr); /* Compute the function over the local grid points */ for (i=xs; i