Hello all,

Sorry for stupid question, but do "SNESComputeJacobianDefault" or "SNESComputeJacobianDefaultColor" make Jacobian matrix free? (I was thinking so from the start... but now it seems I am totally wrong)

Best regards,

Oleksandr.


On 04/28/2018 07:20 PM, Smith, Barry F. wrote:
~/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.


Reply via email to