MODFLOW 6  version 6.7.0.dev0
USGS Modular Hydrologic Model
Iunit.f90
Go to the documentation of this file.
1 !> @brief
2 !! -- Module to manage unit numbers. Allows for multiple unit numbers
3 !! -- assigned to a single package type, as shown below.
4 !! -- row(i) cunit(i) iunit(i)%nval iunit(i)%iunit iunit(i)%ipos
5 !! -- 1 BCF6 1 (1000) (1)
6 !! -- 2 WEL 3 (1001,1003,1005) (2,5,7)
7 !! -- 3 GHB 1 (1002) (4)
8 !! -- 4 EVT 2 (1004,1006) (6,10)
9 !! -- 5 RIV 0 () ()
10 !! -- ...
11 !<
12 
14 
15  use kindmodule, only: dp, i4b
18  implicit none
19  private
20  public :: iunittype
21 
22  type :: iunitrowtype
23  integer(I4B) :: nval = 0
24  integer(I4B), allocatable, dimension(:) :: iunit ! unit numbers for this row
25  integer(I4B), allocatable, dimension(:) :: ipos ! position in the input files character array
26  end type iunitrowtype
27 
28  type :: iunittype
29  integer(I4B) :: niunit = 0
30  character(len=LENFTYPE), allocatable, dimension(:) :: cunit
31  type(iunitrowtype), allocatable, dimension(:) :: iunit
32  contains
33  procedure :: init
34  procedure :: addfile
35  procedure :: getunitnumber
36  end type iunittype
37 
38 contains
39 
40  !> @brief Allocate the cunit and iunit entries of this object, and copy cunit
41  !! into the object
42  !<
43  subroutine init(this, niunit, cunit)
44  ! -- dummy
45  class(iunittype), intent(inout) :: this
46  integer(I4B), intent(in) :: niunit
47  character(len=*), dimension(niunit), intent(in) :: cunit
48  ! -- local
49  integer(I4B) :: i
50  !
51  allocate (this%cunit(niunit))
52  allocate (this%iunit(niunit))
53  this%niunit = niunit
54  do i = 1, niunit
55  this%cunit(i) = cunit(i)
56  end do
57  end subroutine init
58 
59  !> @brief Add an ftyp and unit number
60  !!
61  !! Find the row for the ftyp and store another iunit value.
62  !<
63  subroutine addfile(this, ftyp, iunit, ipos, namefilename)
64  ! -- dummy
65  class(iunittype), intent(inout) :: this
66  character(len=*), intent(in) :: ftyp
67  integer(I4B), intent(in) :: iunit
68  integer(I4B), intent(in) :: ipos
69  character(len=*), intent(in) :: namefilename
70  ! -- local
71  character(len=LINELENGTH) :: errmsg
72  integer(I4B), allocatable, dimension(:) :: itemp
73  integer(I4B) :: i, irow
74  !
75  ! -- Find the row containing ftyp
76  irow = 0
77  do i = 1, this%niunit
78  if (this%cunit(i) == ftyp) then
79  irow = i
80  exit
81  end if
82  end do
83  if (irow == 0) then
84  write (errmsg, '(a,a)') 'Package type not supported: ', ftyp
85  call store_error(errmsg)
86  call store_error_filename(namefilename, terminate=.true.)
87  end if
88  !
89  ! -- Store the iunit number for this ftyp
90  if (this%iunit(irow)%nval == 0) then
91  allocate (this%iunit(irow)%iunit(1))
92  allocate (this%iunit(irow)%ipos(1))
93  this%iunit(irow)%nval = 1
94  else
95  !
96  ! -- Increase size of iunit
97  allocate (itemp(this%iunit(irow)%nval))
98  itemp(:) = this%iunit(irow)%iunit(:)
99  deallocate (this%iunit(irow)%iunit)
100  this%iunit(irow)%nval = this%iunit(irow)%nval + 1
101  allocate (this%iunit(irow)%iunit(this%iunit(irow)%nval))
102  this%iunit(irow)%iunit(1:this%iunit(irow)%nval - 1) = itemp(:)
103  !
104  ! -- Increase size of ipos
105  itemp(:) = this%iunit(irow)%ipos(:)
106  deallocate (this%iunit(irow)%ipos)
107  allocate (this%iunit(irow)%ipos(this%iunit(irow)%nval))
108  this%iunit(irow)%ipos(1:this%iunit(irow)%nval - 1) = itemp(:)
109  !
110  ! -- Cleanup temp
111  deallocate (itemp)
112  end if
113  this%iunit(irow)%iunit(this%iunit(irow)%nval) = iunit
114  this%iunit(irow)%ipos(this%iunit(irow)%nval) = ipos
115  end subroutine
116 
117  !> @brief Get the last unit number for type ftyp or return 0 for iunit.
118  !!
119  !! If iremove is 1, then remove this unit number. Similar to a list.pop().
120  !<
121  subroutine getunitnumber(this, ftyp, iunit, iremove)
122  ! -- dummy
123  class(iunittype), intent(inout) :: this
124  character(len=*), intent(in) :: ftyp
125  integer(I4B), intent(inout) :: iunit
126  integer(I4B), intent(in) :: iremove
127  ! -- local
128  integer(I4B) :: i, irow, nval
129  !
130  ! -- Find the row
131  irow = 0
132  do i = 1, this%niunit
133  if (this%cunit(i) == ftyp) then
134  irow = i
135  exit
136  end if
137  end do
138  !
139  ! -- Find the unit number
140  iunit = 0
141  if (irow > 0) then
142  nval = this%iunit(irow)%nval
143  if (nval > 0) then
144  iunit = this%iunit(irow)%iunit(nval)
145  if (iremove > 0) then
146  this%iunit(irow)%iunit(nval) = 0
147  this%iunit(irow)%nval = nval - 1
148  end if
149  else
150  iunit = 0
151  end if
152  end if
153  end subroutine getunitnumber
154 
155 end module iunitmodule
subroutine init()
Definition: GridSorting.f90:24
This module contains simulation constants.
Definition: Constants.f90:9
integer(i4b), parameter linelength
maximum length of a standard line
Definition: Constants.f90:45
integer(i4b), parameter lenftype
maximum length of a package type (DIS, WEL, OC, etc.)
Definition: Constants.f90:39
– Module to manage unit numbers. Allows for multiple unit numbers – assigned to a single package type...
Definition: Iunit.f90:13
subroutine getunitnumber(this, ftyp, iunit, iremove)
Get the last unit number for type ftyp or return 0 for iunit.
Definition: Iunit.f90:122
subroutine addfile(this, ftyp, iunit, ipos, namefilename)
Add an ftyp and unit number.
Definition: Iunit.f90:64
This module defines variable data types.
Definition: kind.f90:8
This module contains simulation methods.
Definition: Sim.f90:10
subroutine, public store_error(msg, terminate)
Store an error message.
Definition: Sim.f90:92
subroutine, public store_error_filename(filename, terminate)
Store the erroring file name.
Definition: Sim.f90:203