MODULE module_filehand
IMPLICIT NONE
TYPE :: filehand_t
PRIVATE
CHARACTER(len=64) :: filename
INTEGER :: fnunit
CONTAINS
PROCEDURE :: set_filehand => set_filehand_sub
PROCEDURE :: set_filename => set_filename_sub
PROCEDURE :: set_unit => set_unit_sub
PROCEDURE :: get_filename => get_filename_fun
PROCEDURE :: get_unit => get_unit_fun
PROCEDURE :: open_filehand => open_filehand_sub
PROCEDURE :: close_filehand => close_filehand_sub
END TYPE filehand_t
CONTAINS
!******************************************************************************
!==============================================================================
SUBROUTINE set_filehand_sub(this, fn, un)
! Initialize filehand data
CLASS(filehand_t) :: this
CHARACTER(len=*) :: fn
INTEGER :: un
this%filename = fn
this%fnunit = un
END SUBROUTINE set_filehand_sub
!==============================================================================
SUBROUTINE set_filename_sub(this, fn)
! Initialize filename
CLASS(filehand_t) :: this
CHARACTER(len=*) :: fn
this%filename = fn
END SUBROUTINE set_filename_sub
!==============================================================================
SUBROUTINE set_unit_sub(this, un)
! Initialize unit
CLASS(filehand_t) :: this
INTEGER :: un
this%fnunit = un
END SUBROUTINE set_unit_sub
!==============================================================================
CHARACTER(len=64) FUNCTION get_filename_fun(this)
! Function to get filename
CLASS(filehand_t) :: this
get_filename_fun = this%filename
END FUNCTION get_filename_fun
!==============================================================================
INTEGER FUNCTION get_unit_fun(this)
! Function to get unit
CLASS(filehand_t) :: this
get_unit_fun = this%fnunit
END FUNCTION get_unit_fun
!==============================================================================
SUBROUTINE open_filehand_sub(this, fn, un)
! Open a file
CLASS(filehand_t) :: this
CHARACTER(len=*) :: fn
INTEGER :: un, ios
un = this%get_unit(); fn = this%get_filename()
OPEN(unit=un, file=fn, action='read', status='old', iostat=ios)
IF (ios == 0) print *, 'File opened succesfully'
END SUBROUTINE open_filehand_sub
!==============================================================================
SUBROUTINE close_filehand_sub(this, un)
! Close a file
CLASS(filehand_t) :: this
INTEGER :: un, ios
un = this%get_unit()
close(unit=un, iostat=ios)
IF (ios == 0) print *, 'File closed succesfully'
END SUBROUTINE close_filehand_sub
!==============================================================================
!******************************************************************************
END MODULE module_filehand
program filehand
use module_filehand
implicit none
TYPE(filehand_t) :: meshfile!, filename2
call meshfile%set_filehand('Naca0009.geo', 10)
call meshfile%open_filehand(meshfile%get_filename(), meshfile%get_unit())
call meshfile%close_filehand(meshfile%get_unit())
end program filehand