Actual source code: ex40f90.F90
petsc-3.13.6 2020-09-29
Report Typos and Errors

      1: !
      2: !  Demonstrates use of DMDASNESSetFunctionLocal() from Fortran
      3: !
      4: !    Note: the access to the entries of the local arrays below use the Fortran
      5: !   convention of starting at zero. However calls to MatSetValues()  start at 0.
      6: !   Also note that you will have to map the i,j,k coordinates to the local PETSc ordering
      7: !   before calling MatSetValuesLocal(). Often you will find that using PETSc's default
      8: !   code for computing the Jacobian works fine and you will not need to implement
      9: !   your own FormJacobianLocal().

     11:       program ex40f90

     13:  #include <petsc/finclude/petscsnes.h>
     14:  #include <petsc/finclude/petscdmda.h>
     15:       use petscsnes
     16:       use petscdmda
     17:       implicit none

     19:       SNES             snes
     20:       PetscErrorCode   ierr
     21:       DM               da
     22:       PetscInt         ten,two,one
     23:       external         FormFunctionLocal

     26:       call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
     27:       if (ierr .ne. 0) then
     28:          print*,'PetscInitialize failed'
     29:          stop
     30:       endif

     32:       ten = 10
     33:       one = 1
     34:       two = 2

     36:       call DMDACreate2d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DMDA_STENCIL_BOX,ten,ten,PETSC_DECIDE,PETSC_DECIDE,two,one, &
     37:      &     PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,da,ierr);CHKERRA(ierr)
     38:       call DMSetFromOptions(da,ierr)
     39:       call DMSetUp(da,ierr)

     41: !       Create solver object and associate it with the unknowns (on the grid)

     43:       call SNESCreate(PETSC_COMM_WORLD,snes,ierr);CHKERRA(ierr)
     44:       call SNESSetDM(snes,da,ierr);CHKERRA(ierr)

     46:       call DMDASNESSetFunctionLocal(da,INSERT_VALUES,FormFunctionLocal,0,ierr);CHKERRA(ierr)
     47:       call SNESSetFromOptions(snes,ierr);CHKERRA(ierr)

     49: !      Solve the nonlinear system
     50: !
     51:       call SNESSolve(snes,PETSC_NULL_VEC,PETSC_NULL_VEC,ierr);CHKERRA(ierr)

     53:       call SNESDestroy(snes,ierr);CHKERRA(ierr)
     54:       call DMDestroy(da,ierr);CHKERRA(ierr)
     55:       call PetscFinalize(ierr)
     56:       end

     59:       subroutine FormFunctionLocal(in,x,f,dummy,ierr)
     60:       implicit none
     61:       PetscInt i,j,k,dummy
     62:       DMDALocalInfo in(DMDA_LOCAL_INFO_SIZE)
     63:       PetscScalar x(in(DMDA_LOCAL_INFO_DOF),XG_RANGE,YG_RANGE)
     64:       PetscScalar f(in(DMDA_LOCAL_INFO_DOF),X_RANGE,Y_RANGE)
     65:       PetscErrorCode ierr

     67:       do i=in(DMDA_LOCAL_INFO_XS)+1,in(DMDA_LOCAL_INFO_XS)+in(DMDA_LOCAL_INFO_XM)
     68:          do j=in(DMDA_LOCAL_INFO_YS)+1,in(DMDA_LOCAL_INFO_YS)+in(DMDA_LOCAL_INFO_YM)
     69:             do k=1,in(DMDA_LOCAL_INFO_DOF)
     70:                f(k,i,j) = x(k,i,j)*x(k,i,j) - 2.0
     71:             enddo
     72:          enddo
     73:       enddo

     75:       return
     76:       end

     78: !/*TEST
     79: !
     80: !   test:
     81: !     args: -snes_monitor_short -snes_view -da_refine 1 -pc_type mg -pc_mg_type full -ksp_type fgmres -pc_mg_galerkin pmat
     82: !     requires: !single
     83: !
     84: !TEST*/