diff --git a/include/petscsys.h b/include/petscsys.h --- a/include/petscsys.h +++ b/include/petscsys.h @@ -2130,7 +2130,7 @@ PETSC_EXTERN PetscErrorCode MPIU_File_re We recommend either 2 or 3. Approaches 2 and 3 provide type checking for most PETSc function calls; 4 has type checking for only a few PETSc functions. - Fortran type checking with interfaces is strick, this means you cannot pass a scalar value when an array value + Fortran type checking with interfaces is strict, this means you cannot pass a scalar value when an array value is expected (even though it is legal Fortran). For example when setting a single value in a matrix with MatSetValues() you cannot have something like $ PetscInt row,col diff --git a/src/sys/bag/f2003-src/fsrc/bagenum.F b/src/sys/bag/f2003-src/fsrc/bagenum.F --- a/src/sys/bag/f2003-src/fsrc/bagenum.F +++ b/src/sys/bag/f2003-src/fsrc/bagenum.F @@ -5,33 +5,27 @@ use,intrinsic :: iso_c_binding implicit none - PetscBag bag - character(*) n,h - character(*) FArray(*) - PetscEnum :: def - PetscErrorCode,intent(out) :: ierr - PetscReal addr(*) + PetscBag,intent(in) :: bag + character(len=*) :: n,h + character(len=*),dimension(:) :: Farray + PetscEnum,intent(in) :: def + PetscErrorCode,intent(out) :: ierr + PetscEnum,intent(in) :: addr Type(C_Ptr),Dimension(:),Pointer :: CArray character(kind=c_char),pointer :: nullc => null() - PetscInt :: i,Len - Character(kind=C_char,len=99),Dimension(:),Pointer::list1 + PetscInt :: i=0 + PetscInt :: Len + Integer,Parameter :: MAX_ENAME_LEN = 80 + Character(kind=C_char,len=MAX_ENAME_LEN),allocatable,target:: & + & list1(:) - do i=1,100 - if (len_trim(Farray(i)) .eq. 0) then - Len = i-1 - goto 100 - endif - enddo - 100 continue - + len = size(farray) Allocate(list1(Len),stat=ierr); Allocate(CArray(Len+1),stat=ierr) - do i=1,Len - list1(i) = trim(FArray(i))//C_NULL_CHAR - enddo - CArray = (/(c_loc(list1(i)),i=1,Len),c_loc(nullc)/) + list1 = (/ (trim(FArray(i))//C_NULL_CHAR,i = 1,Len) /) + CArray = (/ (c_loc(list1(i)),i=1,Len),c_loc(nullc)/) call PetscBagRegisterEnumPrivate(bag,addr,CArray,def,n,h,ierr) DeAllocate(CArray) DeAllocate(list1) diff --git a/src/sys/examples/tutorials/ex5f90.F90 b/src/sys/examples/tutorials/ex5f90.F90 --- a/src/sys/examples/tutorials/ex5f90.F90 +++ b/src/sys/examples/tutorials/ex5f90.F90 @@ -16,7 +16,7 @@ PetscReal :: y PetscInt :: nxc PetscReal :: rarray(3) - PetscBool :: t + PetscBool :: t PetscEnum :: enum character*(80) :: c type(tuple) :: pos @@ -26,12 +26,23 @@ module Bag_interface_module use Bag_data_module + interface PetscBagRegisterEnum + Subroutine PetscBagRegisterEnum(bag,addr,FArray,def,n,h,ierr) + PetscBag,intent(in) :: bag + character(len=*) :: n,h + character(len=*),dimension(:) :: Farray + PetscEnum,intent(in) :: def + PetscErrorCode,intent(out) :: ierr + PetscEnum,intent(in) :: addr + end Subroutine PetscBagRegisterEnum + end interface + interface PetscBagGetData subroutine PetscBagGetData(bag,data,ierr) use Bag_data_module - PetscBag bag + PetscBag :: bag type(bag_data_type),pointer :: data - PetscErrorCode ierr + PetscErrorCode :: ierr end subroutine PetscBagGetData end interface end module Bag_interface_module @@ -46,11 +57,18 @@ type(bag_data_type), pointer :: data type(bag_data_type) :: dummydata character(len=1),pointer :: dummychar(:) - PetscViewer viewer - PetscSizeT sizeofbag,sizeofint - PetscSizeT sizeofscalar,sizeoftruth - PetscSizeT sizeofchar,sizeofreal - Character(len=99) list(6) +#if defined(PETSC_USE_FORTRAN_DATATYPES) + Type(PetscViewer) :: viewer +#else + PetscViewer :: viewer +#endif + PetscSizeT :: sizeofbag,sizeofint + PetscSizeT :: sizeofscalar,sizeoftruth + PetscSizeT :: sizeofchar,sizeofreal + Integer, Parameter :: MAX_ENAME_LEN=80 + Character(len=MAX_ENAME_LEN) :: list(6) + + Call PetscInitialize(PETSC_NULL_CHARACTER,ierr) list(1) = 'a123' @@ -102,16 +120,17 @@ call PetscBagRegisterReal(bag,data%pos%x2 ,2.0d0,'pos_x2', & & 'tuple value 2 help message',ierr) call PetscBagRegisterEnum(bag,data%enum ,list,1,'enum', & - & 'tuple value 2 help message',ierr) + & 'enum value help message',ierr) call PetscBagView(bag,PETSC_VIEWER_STDOUT_WORLD,ierr) data%nxc = 23 data%rarray(1) = -1.0 data%rarray(2) = -2.0 data%rarray(3) = -3.0 - data%x = 155.4 - data%c = 'a whole new string' - data%t = PETSC_TRUE + data%x = 155.4 + data%c = 'a whole new string' + data%t = PETSC_TRUE + data%enum = 0 call PetscBagView(bag,PETSC_VIEWER_BINARY_WORLD,ierr) call PetscViewerBinaryOpen(PETSC_COMM_WORLD,'binaryoutput', &