[petsc-users] Finite difference Jacobian in TS context
Smith, Barry F.
bsmith at mcs.anl.gov
Sat Apr 28 20:20:27 CDT 2018
~/Src/petsc/src/ts/examples/tutorials
$ grep SNESComputeJacobianDefaultColor *.c
ex10.c: ierr = SNESSetJacobian(snes,A,B,SNESComputeJacobianDefaultColor,0);CHKERRQ(ierr);
ex15.c: ierr = SNESSetJacobian(snes,Jmf,J,SNESComputeJacobianDefaultColor,0);CHKERRQ(ierr);
ex17.c: ierr = SNESSetJacobian(snes,J,J,SNESComputeJacobianDefaultColor,0);CHKERRQ(ierr);
I don't think you need to explicitly create the MatFDColoring object.
Please take a look at ex15.c and see if you can get it working like that example. If that doesn't work let us know and we can take a closer look at it.
Barry
> On Apr 28, 2018, at 8:05 PM, Oleksandr Koshkarov <olk548 at mail.usask.ca> wrote:
>
> Hello All,
>
> I hope someone can help :) I think I am doing something wrong, but cannot understand what. I have a huge time dependent system with 3d DMDA data structure and I am evolving it with explicit Runge-Kutta by using TS and basically only using "TSSetRHSFunction". Now I want to repeat it with implicit time stepper (for now Crank-Nicolson) and I am trying to provide finite difference Jacobian and I am failing miserably. I also cannot find appropriate example in PETSc tutorial (if you can point me to working example, it would be great).
>
> Here is my best attempt (what wrong with it?):
>
> DMDACreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC,
> DMDA_STENCIL_STAR,
> NX, NY, NZ,
> PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE,
> 2*3+NC*NS,
> 1,
> NULL, NULL, NULL, &da);
> DMSetUp(da);
> DMCreateGlobalVector(da,&x);
> TSCreate(PETSC_COMM_WORLD,&ts);
> TSSetProblemType(ts,TS_NONLINEAR);
> TSSetRHSFunction(ts,NULL,compute_RHS,NULL);
> TSSetMaxTime(ts,T_FINAL);
> TSSetExactFinalTime(ts,TS_EXACTFINALTIME_STEPOVER);
> TSSetDM(ts,da);
> TSSetType(ts,TSCN); //it works with: TSSetType(ts,TSRK);
> set_IC(da,x);
> TSSetTimeStep(ts,DT);
> TSSetSolution(ts,x);
>
> TSGetSNES(ts,&snes);
> SNESGetKSP(snes,&ksp);
> KSPGetPC(ksp,&pc);
> PCSetType(pc,PCNONE);
>
> DMSetMatType(da,MATAIJ);
> DMCreateMatrix(da,&J);
> ISColoring iscoloring;
> MatFDColoring matfdcoloring;
> DMCreateColoring(da,IS_COLORING_GLOBAL,&iscoloring);
> MatFDColoringCreate(J,iscoloring,&matfdcoloring);
>
> MatFDColoringSetType(matfdcoloring,MATMFFD_DS);
>
> // I think I do something wrong in the following 3 lines
>
> PetscErrorCode (*temp_f)(SNES,Vec,Vec,void*);
> SNESGetFunction(snes,NULL,&temp_f,NULL);
> MatFDColoringSetFunction(matfdcoloring,(PetscErrorCode (*)(void))temp_f,NULL);
>
> MatFDColoringSetUp(J,iscoloring,matfdcoloring);
>
> SNESSetJacobian(snes,J,J,SNESComputeJacobianDefaultColor,matfdcoloring);
> ISColoringDestroy(&iscoloring);
>
> TSSolve(ts,x);
>
> Thank you,
>
> Oleksandr Koshkarov.
>
More information about the petsc-users
mailing list