16dd63270SBarry Smith#include "petsc/finclude/petscsys.h" 26dd63270SBarry Smith 36dd63270SBarry Smith#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES) 46dd63270SBarry Smith!DEC$ ATTRIBUTES DLLEXPORT::PetscOptionsGetEnum 56dd63270SBarry Smith!DEC$ ATTRIBUTES DLLEXPORT::PetscOptionsEnum 66dd63270SBarry Smith#endif 76dd63270SBarry Smith 86dd63270SBarry SmithSubroutine PetscOptionsGetEnum(po, pre, name, FArray, opt, set, ierr) 96dd63270SBarry Smith use, intrinsic :: iso_c_binding 106dd63270SBarry Smith use petscsysdef 116dd63270SBarry Smith implicit none 126dd63270SBarry Smith 136dd63270SBarry Smith character(*) pre, name 146dd63270SBarry Smith character(*) FArray(*) 156dd63270SBarry Smith PetscEnum :: opt 166dd63270SBarry Smith PetscBool :: set 176dd63270SBarry Smith PetscOptions :: po 186dd63270SBarry Smith PetscErrorCode, intent(out) :: ierr 196dd63270SBarry Smith 206dd63270SBarry Smith Type(C_Ptr), Dimension(:), Pointer :: CArray 216dd63270SBarry Smith character(kind=c_char), pointer :: nullc => null() 226dd63270SBarry Smith PetscInt :: i, Len 236dd63270SBarry Smith Character(kind=C_char, len=99), Dimension(:), Pointer::list1 246dd63270SBarry Smith 256dd63270SBarry Smith Len = 0 266dd63270SBarry Smith do i = 1, 100 27*4820e4eaSBarry Smith if (len_trim(Farray(i)) == 0) then 286dd63270SBarry Smith Len = i - 1 296dd63270SBarry Smith goto 100 306dd63270SBarry Smith end if 316dd63270SBarry Smith end do 326dd63270SBarry Smith100 continue 336dd63270SBarry Smith 346dd63270SBarry Smith Allocate (list1(Len), stat=ierr) 35*4820e4eaSBarry Smith if (ierr /= 0) return 366dd63270SBarry Smith Allocate (CArray(Len + 1), stat=ierr) 37*4820e4eaSBarry Smith if (ierr /= 0) return 386dd63270SBarry Smith do i = 1, Len 396dd63270SBarry Smith list1(i) = trim(FArray(i))//C_NULL_CHAR 406dd63270SBarry Smith CArray(i) = c_loc(list1(i)) 416dd63270SBarry Smith end do 426dd63270SBarry Smith 436dd63270SBarry Smith CArray(Len + 1) = c_loc(nullc) 446dd63270SBarry Smith call PetscOptionsGetEnumPrivate(po, pre, name, CArray, opt, set, ierr) 456dd63270SBarry Smith DeAllocate (CArray) 466dd63270SBarry Smith DeAllocate (list1) 476dd63270SBarry SmithEnd Subroutine 486dd63270SBarry Smith 496dd63270SBarry SmithSubroutine PetscOptionsEnum(opt, text, man, Flist, curr, ivalue, set, ierr) 506dd63270SBarry Smith use, intrinsic :: iso_c_binding 516dd63270SBarry Smith use petscsysdef 526dd63270SBarry Smith implicit none 536dd63270SBarry Smith 546dd63270SBarry Smith character(*) opt, text, man 556dd63270SBarry Smith character(*) Flist(*) 566dd63270SBarry Smith PetscEnum :: curr, ivalue 576dd63270SBarry Smith PetscBool :: set 586dd63270SBarry Smith PetscErrorCode, intent(out) :: ierr 596dd63270SBarry Smith 606dd63270SBarry Smith Type(C_Ptr), Dimension(:), Pointer :: CArray 616dd63270SBarry Smith character(kind=c_char), pointer :: nullc => null() 626dd63270SBarry Smith PetscInt :: i, Len 636dd63270SBarry Smith Character(kind=C_char, len=99), Dimension(:), Pointer::list1 646dd63270SBarry Smith 656dd63270SBarry Smith Len = 0 666dd63270SBarry Smith do i = 1, 100 67*4820e4eaSBarry Smith if (len_trim(Flist(i)) == 0) then 686dd63270SBarry Smith Len = i - 1 696dd63270SBarry Smith goto 100 706dd63270SBarry Smith end if 716dd63270SBarry Smith end do 726dd63270SBarry Smith100 continue 736dd63270SBarry Smith 746dd63270SBarry Smith Allocate (list1(Len), stat=ierr) 75*4820e4eaSBarry Smith if (ierr /= 0) return 766dd63270SBarry Smith Allocate (CArray(Len + 1), stat=ierr) 77*4820e4eaSBarry Smith if (ierr /= 0) return 786dd63270SBarry Smith do i = 1, Len 796dd63270SBarry Smith list1(i) = trim(Flist(i))//C_NULL_CHAR 806dd63270SBarry Smith CArray(i) = c_loc(list1(i)) 816dd63270SBarry Smith end do 826dd63270SBarry Smith 836dd63270SBarry Smith CArray(Len + 1) = c_loc(nullc) 846dd63270SBarry Smith call PetscOptionsEnumPrivate(opt, text, man, CArray, curr, ivalue, set, ierr) 856dd63270SBarry Smith 866dd63270SBarry Smith DeAllocate (CArray) 876dd63270SBarry Smith DeAllocate (list1) 886dd63270SBarry SmithEnd Subroutine PetscOptionsEnum 89