Actual source code: ex54f.F90
1: ! test verifies DMShellSetCreateFieldDecomposition interface in Fortran
2: #include "petsc/finclude/petsc.h"
3: program main
4: use petsc
5: implicit none
6: type(tDM) :: dm
7: PetscErrorCode :: ierr
8: interface
9: subroutine myFieldDecomp(dm, nfields, fieldNames, isFields, subDms, ierr)
10: use petsc
11: implicit none
12: type(tDM), intent(in) :: dm
13: PetscInt, intent(out) :: nfields
14: character(len=30), allocatable, intent(out) :: fieldNames(:)
15: type(tIS), allocatable, intent(out) :: isFields(:)
16: type(tDM), allocatable, intent(out) :: subDms(:)
17: PetscErrorCode, intent(out) :: ierr
18: end subroutine myFieldDecomp
19: end interface
20: ! initializing PETSc
21: PetscCallA(PetscInitialize(PETSC_NULL_CHARACTER, ierr))
22: ! creating a DMShell object
23: PetscCallA(DMShellCreate(PETSC_COMM_WORLD, dm, ierr))
24: ! registering the Fortran field decomposition callback
25: PetscCallA(DMShellSetCreateFieldDecomposition(dm, myFieldDecomp, ierr))
26: ! for this minimal test, we simply print a success message to the console
27: print *, 'DMShellSetCreateFieldDecomposition set successfully.'
28: ! cleanup
29: PetscCallA(DMDestroy(dm, ierr))
30: PetscCallA(PetscFinalize(ierr))
31: end program main
33: ! a simple Fortran callback for field decomposition.
34: subroutine myFieldDecomp(dm, nfields, fieldNames, isFields, subDms, ierr)
35: use petsc
36: implicit none
37: type(tDM), intent(in) :: dm
38: PetscInt, intent(out) :: nfields
39: character(len=30), allocatable, intent(out) :: fieldNames(:)
40: type(tIS), allocatable, intent(out) :: isFields(:)
41: type(tDM), allocatable, intent(out) :: subDms(:)
42: PetscErrorCode, intent(out) :: ierr
43: PetscInt :: i
44: ! defining a simple decomposition with two fields
45: nfields = 2
46: allocate (fieldNames(nfields))
47: allocate (isFields(nfields))
48: allocate (subDms(nfields))
49: fieldNames(1) = 'field1'
50: fieldNames(2) = 'field2'
51: ! set the pointer arrays to NULL (using pointer assignment)
52: do i = 1, nfields
53: isFields(i) = PETSC_NULL_IS
54: subDms(i) = PETSC_NULL_DM
55: end do
56: ierr = 0
57: print *, 'myFieldDecomp callback invoked.'
58: end subroutine myFieldDecomp
59: !/*TEST
60: !
61: ! test:
62: !TEST*/