Actual source code: ex21f90.F

petsc-dev 2014-08-28
Report Typos and Errors
  1: !
  2: !
  3: !    Demonstrates how one may access entries of a PETSc Vec as if it was an array of Fortran derived types
  4: !
  5: !
  6: ! -----------------------------------------------------------------------
  7: #include <finclude/petscsysdef.h>
  8: #include <finclude/petscvecdef.h>

 10:       module mymodule
 11:       type MyStruct
 12:         sequence
 13:         PetscScalar :: a,b,c
 14:       end type MyStruct
 15:       end module

 17: !
 18: !  These routines are used internally by the C functions VecGetArrayMyStruct() and VecRestoreArrayMyStruct()
 19: !  Because Fortran requires "knowing" exactly what derived types the pointers to point too, these have to be
 20: !  customized for exactly the derived type in question
 21: !
 22:       subroutine F90Array1dCreateMyStruct(array,start,len,ptr)
 23:       use mymodule
 24:       implicit none
 25: #include <finclude/petscsys.h>
 26:       PetscInt start,len
 27:       type(MyStruct), target ::                                               &
 28:      &             array(start:start+len-1)
 29:       type(MyStruct), pointer :: ptr(:)

 31:       ptr => array
 32:       end subroutine

 34:       subroutine F90Array1dAccessMyStruct(ptr,address)
 35:       use mymodule
 36:       implicit none
 37: #include <finclude/petscsys.h>
 38:       type(MyStruct), pointer :: ptr(:)
 39:       PetscFortranAddr address
 40:       PetscInt start

 42:       start = lbound(ptr,1)
 43:       call F90Array1dGetAddrMyStruct(ptr(start),address)
 44:       end subroutine

 46:       subroutine F90Array1dDestroyMyStruct(ptr)
 47:       use mymodule
 48:       implicit none
 49: #include <finclude/petscsys.h>
 50:       type(MyStruct), pointer :: ptr(:)

 52:       nullify(ptr)
 53:       end subroutine


 56:       program main
 57:       use mymodule
 58:       implicit none

 60: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 61: !                    Include files
 62: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 63: !
 64: !  The following include statements are required for Fortran programs
 65: !  that use PETSc vectors:
 66: !     petscsys.h       - base PETSc routines
 67: !     petscvec.h    - vectors
 68: !     petscvec.h90  - to allow access to Fortran90 features of vectors
 69: !
 70: !  Additional include statements may be needed if using additional
 71: !  PETSc routines in a Fortran program, e.g.,
 72: !     petscviewer.h - viewers
 73: !     petscis.h     - index sets
 74: !
 75: #include <finclude/petscsys.h>
 76: #include <finclude/petscviewer.h>
 77: #include <finclude/petscvec.h>
 78: #include <finclude/petscvec.h90>

 80: !
 81: !   These two routines are defined in ex21.c they create the Fortran pointer to the derived type
 82: !
 83:       Interface
 84:         Subroutine VecGetArrayMyStruct(v,array,ierr)
 85:           use mymodule
 86:           type(MyStruct), pointer :: array(:)
 87:           PetscErrorCode ierr
 88:           Vec     v
 89:         End Subroutine
 90:       End Interface

 92:       Interface
 93:         Subroutine VecRestoreArrayMyStruct(v,array,ierr)
 94:           use mymodule
 95:           type(MyStruct), pointer :: array(:)
 96:           PetscErrorCode ierr
 97:           Vec     v
 98:         End Subroutine
 99:       End Interface

101: !
102: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
103: !                   Variable declarations
104: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
105: !
106: !  Variables:
107: !     x, y, w - vectors
108: !     z       - array of vectors
109: !
110:       Vec              x,y
111:       type(MyStruct),  pointer :: xarray(:)
112:       PetscInt         n
113:       PetscErrorCode   ierr
114:       PetscBool        flg
115:       integer          i

117: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
118: !                 Beginning of program
119: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

121:       call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
122:       n     = 30

124:       call PetscOptionsGetInt(PETSC_NULL_CHARACTER,'-n',n,flg,ierr)
125:       call VecCreate(PETSC_COMM_WORLD,x,ierr)
126:       call VecSetSizes(x,PETSC_DECIDE,n,ierr)
127:       call VecSetFromOptions(x,ierr)
128:       call VecDuplicate(x,y,ierr)

130:       call VecGetArrayMyStruct(x,xarray,ierr)
131:       do i=1,10
132:       xarray(i)%a = i
133:       xarray(i)%b = 100*i
134:       xarray(i)%c = 10000*i
135:       enddo

137:       call VecRestoreArrayMyStruct(x,xarray,ierr)
138:       call VecView(x,PETSC_VIEWER_STDOUT_SELF,ierr)
139:       call VecGetArrayMyStruct(x,xarray,ierr)
140:       do i = 1 , 10
141:         write(*,*) xarray(i)%a,xarray(i)%b,xarray(i)%c
142:       end do
143:       call VecRestoreArrayMyStruct(x,xarray,ierr)


146:       call VecDestroy(x,ierr)
147:       call VecDestroy(y,ierr)
148:       call PetscFinalize(ierr)

150:       end