123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !
- ! This module is a dynamic I/O unit manager. It keeps track of
- ! which units are in use and reserves units for stdin, stdout, and
- ! stderr.
- !
- !-----------------------------------------------------------------------
- !
- ! CVS:$Id: iounits.f,v 1.2 2000/04/19 21:56:25 pwjones Exp $
- !
- ! Copyright (c) 1997, 1998 the Regents of the University of
- ! California.
- !
- ! This software and ancillary information (herein called software)
- ! called SCRIP is made available under the terms described here.
- ! The software has been approved for release with associated
- ! LA-CC Number 98-45.
- !
- ! Unless otherwise indicated, this software has been authored
- ! by an employee or employees of the University of California,
- ! operator of the Los Alamos National Laboratory under Contract
- ! No. W-7405-ENG-36 with the U.S. Department of Energy. The U.S.
- ! Government has rights to use, reproduce, and distribute this
- ! software. The public may copy and use this software without
- ! charge, provided that this Notice and any statement of authorship
- ! are reproduced on all copies. Neither the Government nor the
- ! University makes any warranty, express or implied, or assumes
- ! any liability or responsibility for the use of this software.
- !
- ! If software is modified to produce derivative works, such modified
- ! software should be clearly marked, so as not to confuse it with
- ! the version available from Los Alamos National Laboratory.
- !
- !***********************************************************************
- module iounits
- !-----------------------------------------------------------------------
- use kinds_mod ! defines data types
- implicit none
- !-----------------------------------------------------------------------
- logical (kind=log_kind), dimension(99), save ::
- & unit_free ! flags to determine whether unit is free for use
- integer (kind=int_kind), parameter ::
- & stdin = 5, ! reserves unit for standard input
- & stdout = 6, ! reserves unit for standard output
- & stderr = 6 ! reserves unit for standard error
- !***********************************************************************
- contains
- !***********************************************************************
- subroutine get_unit(iunit)
- !-----------------------------------------------------------------------
- !
- ! This routine returns the next available I/O unit number.
- !
- !-----------------------------------------------------------------------
- !-----------------------------------------------------------------------
- !
- ! output variables
- !
- !-----------------------------------------------------------------------
- integer (kind=int_kind), intent(out) ::
- & iunit ! next free I/O unit
- !-----------------------------------------------------------------------
- !
- ! local variables
- !
- !-----------------------------------------------------------------------
- integer (kind=int_kind) :: n
- logical (kind=log_kind), save :: first_call = .true.
- !-----------------------------------------------------------------------
- !
- ! if this is the first call, reserve stdout, stdin and stderr
- !
- !-----------------------------------------------------------------------
- if (first_call) then
- unit_free = .true.
- unit_free(stdin) = .false.
- unit_free(stdout) = .false.
- unit_free(stderr) = .false.
- first_call = .false.
- endif
- !-----------------------------------------------------------------------
- !
- ! search for next available unit
- !
- !-----------------------------------------------------------------------
- srch_unit: do n=1,99
- if (unit_free(n)) then
- iunit = n
- unit_free(n) = .false.
- exit srch_unit
- endif
- end do srch_unit
- !-----------------------------------------------------------------------
- end subroutine get_unit
- !***********************************************************************
- subroutine release_unit(iunit)
- !-----------------------------------------------------------------------
- !
- ! This routine releases the specified unit and closes the file.
- !
- !-----------------------------------------------------------------------
- !-----------------------------------------------------------------------
- !
- ! input variables
- !
- !-----------------------------------------------------------------------
- integer (kind=int_kind), intent(in) ::
- & iunit ! I/O unit to release
- !-----------------------------------------------------------------------
- !
- ! closes I/O unit and declares it free
- !
- !-----------------------------------------------------------------------
- unit_free(iunit) = .true.
- close(iunit)
- !-----------------------------------------------------------------------
- end subroutine release_unit
- !***********************************************************************
- end module iounits
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|