~/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 <[email protected]> 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. >
