MODFLOW 6  version 6.7.0.dev0
USGS Modular Hydrologic Model
PackageBudget.f90
Go to the documentation of this file.
1 !> @brief This module contains the PackageBudgetModule Module
2 !!
3 !! The PackageBudgetType object defined here provides flows to the GWT
4 !! model. The PackageBudgetType can be filled with flows from a budget
5 !! object that was written from a previous GWF simulation, or its
6 !! individual members can be pointed to flows that are being calculated
7 !! by a GWF model that is running as part of this simulation.
8 !<
10 
11  use kindmodule
15 
16  implicit none
17 
18  private
19  public :: packagebudgettype
20 
21  !> @brief Derived type for storing flows
22  !!
23  !! This derived type stores flows and provides them through the FMI
24  !! package to other parts of GWT.
25  !!
26  !<
28 
29  character(len=LENMEMPATH) :: memorypath = '' !< the location in the memory manager where the variables are stored
30  character(len=LENPACKAGENAME), pointer :: name => null() !< name of the package
31  character(len=LENPACKAGENAME), pointer :: budtxt => null() !< type of flow (CHD, RCH, RCHA, ...)
32  character(len=LENAUXNAME), dimension(:), pointer, &
33  contiguous :: auxname => null() !< vector of auxname
34  integer(I4B), pointer :: naux => null() !< number of auxiliary variables
35  integer(I4B), pointer :: nbound => null() !< number of boundaries for current stress period
36  integer(I4B), dimension(:), pointer, contiguous :: nodelist => null() !< vector of reduced node numbers
37  real(dp), dimension(:), pointer, contiguous :: flow => null() !< calculated flow
38  real(dp), dimension(:, :), pointer, contiguous :: auxvar => null() !< auxiliary variable array
39 
40  contains
41 
42  procedure :: initialize
43  procedure :: set_name
44  procedure :: set_auxname
45  procedure :: set_pointers
46  procedure :: copy_values
47  procedure :: get_flow
48  procedure :: da
49 
50  end type packagebudgettype
51 
52 contains
53 
54  !> @ brief Initialize a PackageBudgetType object
55  !!
56  !! Establish the memory path and allocate and initialize member variables.
57  !!
58  !<
59  subroutine initialize(this, mempath)
60  class(packagebudgettype) :: this !< PackageBudgetType object
61  character(len=*), intent(in) :: mempath !< memory path in memory manager
62  this%memoryPath = mempath
63  !
64  ! -- allocate member variables in memory manager
65  call mem_allocate(this%name, lenpackagename, 'NAME', mempath)
66  call mem_allocate(this%budtxt, lenpackagename, 'BUDTXT', mempath)
67  call mem_allocate(this%naux, 'NAUX', mempath)
68  call mem_allocate(this%auxname, lenauxname, 0, 'AUXNAME', this%memoryPath)
69  call mem_allocate(this%nbound, 'NBOUND', mempath)
70  call mem_allocate(this%nodelist, 0, 'NODELIST', mempath)
71  call mem_allocate(this%flow, 0, 'FLOW', mempath)
72  call mem_allocate(this%auxvar, 0, 0, 'AUXVAR', mempath)
73  !
74  ! -- initialize
75  this%name = ''
76  this%budtxt = ''
77  this%naux = 0
78  this%nbound = 0
79  end subroutine initialize
80 
81  !> @ brief Set names for this PackageBudgetType object
82  !!
83  !! Set the name of the package and the name of the of budget text
84  !!
85  !<
86  subroutine set_name(this, name, budtxt)
87  class(packagebudgettype) :: this !< PackageBudgetType object
88  character(len=LENPACKAGENAME) :: name !< name of the package (WEL-1, DRN-4, etc.)
89  character(len=LENPACKAGENAME) :: budtxt !< name of budget term (CHD, RCH, EVT, DRN-TO-MVR, etc.)
90  this%name = name
91  this%budtxt = budtxt
92  end subroutine set_name
93 
94  !> @ brief Set aux names for this PackageBudgetType object
95  !!
96  !! Set the number of auxiliary variables and the names of the
97  !! auxiliary variables
98  !!
99  !<
100  subroutine set_auxname(this, naux, auxname)
101  class(packagebudgettype) :: this !< PackageBudgetType object
102  integer(I4B), intent(in) :: naux !< number of auxiliary variables
103  character(len=LENAUXNAME), contiguous, &
104  dimension(:), intent(in) :: auxname !< array of names for auxiliary variables
105  this%naux = naux
106  call mem_reallocate(this%auxname, lenauxname, naux, 'AUXNAME', &
107  this%memoryPath)
108  this%auxname(:) = auxname(:)
109  end subroutine set_auxname
110 
111  !> @ brief Point members of this class to data stored in GWF packages
112  !!
113  !! The routine is called when a GWF model is being run concurrently with
114  !! a GWT model. In this situation, the member variables NBOUND, NODELIST,
115  !! FLOW, and AUXVAR are pointed into member variables of the individual
116  !! GWF Package members stored in BndType.
117  !!
118  !<
119  subroutine set_pointers(this, flowvarname, mem_path_target, input_mempath)
120  use constantsmodule, only: lenvarname
121  class(packagebudgettype) :: this !< PackageBudgetType object
122  character(len=*), intent(in) :: flowvarname !< name of variable storing flow (SIMVALS, SIMTOMVR)
123  character(len=*), intent(in) :: mem_path_target !< path where target variable is stored
124  character(len=*), intent(in) :: input_mempath
125  character(len=LENVARNAME) :: auxvarname
126  !
127  ! -- set memory manager aux varname
128  if (input_mempath /= '') then
129  auxvarname = 'AUXVAR_IDM'
130  else
131  auxvarname = 'AUXVAR'
132  end if
133  !
134  ! -- Reassign pointers to variables in the flow model
135  call mem_reassignptr(this%nbound, 'NBOUND', this%memoryPath, &
136  'NBOUND', mem_path_target)
137  call mem_reassignptr(this%nodelist, 'NODELIST', this%memoryPath, &
138  'NODELIST', mem_path_target)
139  call mem_reassignptr(this%flow, 'FLOW', this%memoryPath, &
140  flowvarname, mem_path_target)
141  call mem_reassignptr(this%auxvar, 'AUXVAR', this%memoryPath, &
142  auxvarname, mem_path_target)
143  end subroutine set_pointers
144 
145  !> @ brief Copy data read from a budget file into this object
146  !!
147  !! The routine is called when GWF flows are read from a budget file
148  !! created from a previous GWF simulation. Arrays here must be
149  !! dynamically resized because maxbound is not known unless the
150  !! entire budget file was read first.
151  !!
152  !<
153  subroutine copy_values(this, nbound, nodelist, flow, auxvar)
154  class(packagebudgettype) :: this !< PackageBudgetType object
155  integer(I4B), intent(in) :: nbound !< number of entries
156  integer(I4B), dimension(:), contiguous, intent(in) :: nodelist !< array of GWT node numbers
157  real(DP), dimension(:), contiguous, intent(in) :: flow !< array of flow rates
158  real(DP), dimension(:, :), contiguous, intent(in) :: auxvar !< array of auxiliary variables
159  integer(I4B) :: i
160  !
161  ! -- Assign variables
162  this%nbound = nbound
163  !
164  ! -- Lists are not large enough (maxbound is not known), so need to
165  ! reallocate based on size in binary budget file.
166  if (size(this%nodelist) < nbound) then
167  call mem_reallocate(this%nodelist, nbound, 'NODELIST', this%memoryPath)
168  call mem_reallocate(this%flow, nbound, 'FLOW', this%memoryPath)
169  call mem_reallocate(this%auxvar, this%naux, nbound, 'AUXVAR', &
170  this%memoryPath)
171  end if
172  !
173  ! -- Copy values into member variables
174  do i = 1, nbound
175  this%nodelist(i) = nodelist(i)
176  this%flow(i) = flow(i)
177  this%auxvar(:, i) = auxvar(:, i)
178  end do
179  end subroutine copy_values
180 
181  !> @ brief Get flow rate for specified entry
182  !!
183  !! Return the flow rate for the specified entry
184  !!
185  !<
186  function get_flow(this, i) result(flow)
187  class(packagebudgettype) :: this !< PackageBudgetType object
188  integer(I4B), intent(in) :: i !< entry number
189  real(dp) :: flow
190  flow = this%flow(i)
191  end function get_flow
192 
193  !> @ brief Deallocate
194  !!
195  !! Free any memory associated with this object
196  !!
197  !<
198  subroutine da(this)
199  class(packagebudgettype) :: this
200  call mem_deallocate(this%name, 'NAME', this%memoryPath)
201  call mem_deallocate(this%budtxt, 'BUDTXT', this%memoryPath)
202  call mem_deallocate(this%naux)
203  call mem_deallocate(this%auxname, 'AUXNAME', this%memoryPath)
204  call mem_deallocate(this%nbound)
205  call mem_deallocate(this%nodelist, 'NODELIST', this%memoryPath)
206  call mem_deallocate(this%flow, 'FLOW', this%memoryPath)
207  call mem_deallocate(this%auxvar, 'AUXVAR', this%memoryPath)
208  end subroutine da
209 
210 end module packagebudgetmodule
This module contains simulation constants.
Definition: Constants.f90:9
integer(i4b), parameter lenpackagename
maximum length of the package name
Definition: Constants.f90:23
integer(i4b), parameter lenvarname
maximum length of a variable name
Definition: Constants.f90:17
integer(i4b), parameter lenauxname
maximum length of a aux variable
Definition: Constants.f90:35
integer(i4b), parameter lenmempath
maximum length of the memory path
Definition: Constants.f90:27
This module defines variable data types.
Definition: kind.f90:8
This module contains the PackageBudgetModule Module.
subroutine set_pointers(this, flowvarname, mem_path_target, input_mempath)
@ brief Point members of this class to data stored in GWF packages
subroutine copy_values(this, nbound, nodelist, flow, auxvar)
@ brief Copy data read from a budget file into this object
subroutine set_auxname(this, naux, auxname)
@ brief Set aux names for this PackageBudgetType object
subroutine initialize(this, mempath)
@ brief Initialize a PackageBudgetType object
real(dp) function get_flow(this, i)
@ brief Get flow rate for specified entry
subroutine set_name(this, name, budtxt)
@ brief Set names for this PackageBudgetType object
subroutine da(this)
@ brief Deallocate
Derived type for storing flows.