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 802c639afSMartin Diehlsubroutine 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 2002c639afSMartin Diehl type(C_Ptr), dimension(:), pointer :: CArray 216dd63270SBarry Smith character(kind=c_char), pointer :: nullc => null() 226dd63270SBarry Smith PetscInt :: i, Len 2302c639afSMartin Diehl character(kind=C_char, len=99), dimension(:), pointer::list1 246dd63270SBarry Smith 256dd63270SBarry Smith Len = 0 266dd63270SBarry Smith do i = 1, 100 274820e4eaSBarry Smith if (len_trim(Farray(i)) == 0) then 286dd63270SBarry Smith Len = i - 1 29*057526baSMartin Diehl exit 306dd63270SBarry Smith end if 316dd63270SBarry Smith end do 326dd63270SBarry Smith 3302c639afSMartin Diehl allocate (list1(Len), stat=ierr) 344820e4eaSBarry Smith if (ierr /= 0) return 3502c639afSMartin Diehl allocate (CArray(Len + 1), stat=ierr) 364820e4eaSBarry Smith if (ierr /= 0) return 376dd63270SBarry Smith do i = 1, Len 386dd63270SBarry Smith list1(i) = trim(FArray(i))//C_NULL_CHAR 396dd63270SBarry Smith CArray(i) = c_loc(list1(i)) 406dd63270SBarry Smith end do 416dd63270SBarry Smith 426dd63270SBarry Smith CArray(Len + 1) = c_loc(nullc) 436dd63270SBarry Smith call PetscOptionsGetEnumPrivate(po, pre, name, CArray, opt, set, ierr) 4402c639afSMartin Diehl deallocate (CArray) 4502c639afSMartin Diehl deallocate (list1) 4602c639afSMartin Diehlend subroutine 476dd63270SBarry Smith 4802c639afSMartin Diehlsubroutine PetscOptionsEnum(opt, text, man, Flist, curr, ivalue, set, ierr) 496dd63270SBarry Smith use, intrinsic :: iso_c_binding 506dd63270SBarry Smith use petscsysdef 516dd63270SBarry Smith implicit none 526dd63270SBarry Smith 536dd63270SBarry Smith character(*) opt, text, man 546dd63270SBarry Smith character(*) Flist(*) 556dd63270SBarry Smith PetscEnum :: curr, ivalue 566dd63270SBarry Smith PetscBool :: set 576dd63270SBarry Smith PetscErrorCode, intent(out) :: ierr 586dd63270SBarry Smith 5902c639afSMartin Diehl type(C_Ptr), dimension(:), pointer :: CArray 606dd63270SBarry Smith character(kind=c_char), pointer :: nullc => null() 616dd63270SBarry Smith PetscInt :: i, Len 6202c639afSMartin Diehl character(kind=C_char, len=99), dimension(:), pointer::list1 636dd63270SBarry Smith 646dd63270SBarry Smith Len = 0 656dd63270SBarry Smith do i = 1, 100 664820e4eaSBarry Smith if (len_trim(Flist(i)) == 0) then 676dd63270SBarry Smith Len = i - 1 68*057526baSMartin Diehl exit 696dd63270SBarry Smith end if 706dd63270SBarry Smith end do 716dd63270SBarry Smith 7202c639afSMartin Diehl allocate (list1(Len), stat=ierr) 734820e4eaSBarry Smith if (ierr /= 0) return 7402c639afSMartin Diehl allocate (CArray(Len + 1), stat=ierr) 754820e4eaSBarry Smith if (ierr /= 0) return 766dd63270SBarry Smith do i = 1, Len 776dd63270SBarry Smith list1(i) = trim(Flist(i))//C_NULL_CHAR 786dd63270SBarry Smith CArray(i) = c_loc(list1(i)) 796dd63270SBarry Smith end do 806dd63270SBarry Smith 816dd63270SBarry Smith CArray(Len + 1) = c_loc(nullc) 826dd63270SBarry Smith call PetscOptionsEnumPrivate(opt, text, man, CArray, curr, ivalue, set, ierr) 836dd63270SBarry Smith 8402c639afSMartin Diehl deallocate (CArray) 8502c639afSMartin Diehl deallocate (list1) 8602c639afSMartin Diehlend subroutine PetscOptionsEnum 87