MODFLOW 6  version 6.5.0.dev2
MODFLOW 6 Code Documentation
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  return
80  end subroutine initialize
81 
82  !> @ brief Set names for this PackageBudgetType object
83  !!
84  !! Set the name of the package and the name of the of budget text
85  !!
86  !<
87  subroutine set_name(this, name, budtxt)
88  class(packagebudgettype) :: this !< PackageBudgetType object
89  character(len=LENPACKAGENAME) :: name !< name of the package (WEL-1, DRN-4, etc.)
90  character(len=LENPACKAGENAME) :: budtxt !< name of budget term (CHD, RCH, EVT, DRN-TO-MVR, etc.)
91  this%name = name
92  this%budtxt = budtxt
93  return
94  end subroutine set_name
95 
96  !> @ brief Set aux names for this PackageBudgetType object
97  !!
98  !! Set the number of auxiliary variables and the names of the
99  !! auxiliary variables
100  !!
101  !<
102  subroutine set_auxname(this, naux, auxname)
103  class(packagebudgettype) :: this !< PackageBudgetType object
104  integer(I4B), intent(in) :: naux !< number of auxiliary variables
105  character(len=LENAUXNAME), contiguous, &
106  dimension(:), intent(in) :: auxname !< array of names for auxiliary variables
107  this%naux = naux
108  call mem_reallocate(this%auxname, lenauxname, naux, 'AUXNAME', &
109  this%memoryPath)
110  this%auxname(:) = auxname(:)
111  return
112  end subroutine set_auxname
113 
114  !> @ brief Point members of this class to data stored in GWF packages
115  !!
116  !! The routine is called when a GWF model is being run concurrently with
117  !! a GWT model. In this situation, the member variables NBOUND, NODELIST,
118  !! FLOW, and AUXVAR are pointed into member variables of the individual
119  !! GWF Package members stored in BndType.
120  !!
121  !<
122  subroutine set_pointers(this, flowvarname, mem_path_target, input_mempath)
123  use constantsmodule, only: lenvarname
124  class(packagebudgettype) :: this !< PackageBudgetType object
125  character(len=*), intent(in) :: flowvarname !< name of variable storing flow (SIMVALS, SIMTOMVR)
126  character(len=*), intent(in) :: mem_path_target !< path where target variable is stored
127  character(len=*), intent(in) :: input_mempath
128  character(len=LENVARNAME) :: auxvarname
129  !
130  ! -- set memory manager aux varname
131  if (input_mempath /= '') then
132  auxvarname = 'AUXVAR_IDM'
133  else
134  auxvarname = 'AUXVAR'
135  end if
136  !
137  ! -- Reassign pointers to variables in the flow model
138  call mem_reassignptr(this%nbound, 'NBOUND', this%memoryPath, &
139  'NBOUND', mem_path_target)
140  call mem_reassignptr(this%nodelist, 'NODELIST', this%memoryPath, &
141  'NODELIST', mem_path_target)
142  call mem_reassignptr(this%flow, 'FLOW', this%memoryPath, &
143  flowvarname, mem_path_target)
144  call mem_reassignptr(this%auxvar, 'AUXVAR', this%memoryPath, &
145  auxvarname, mem_path_target)
146  !
147  return
148  end subroutine set_pointers
149 
150  !> @ brief Copy data read from a budget file into this object
151  !!
152  !! The routine is called when GWF flows are read from a budget file
153  !! created from a previous GWF simulation. Arrays here must be
154  !! dynamically resized because maxbound is not known unless the
155  !! entire budget file was read first.
156  !!
157  !<
158  subroutine copy_values(this, nbound, nodelist, flow, auxvar)
159  class(packagebudgettype) :: this !< PackageBudgetType object
160  integer(I4B), intent(in) :: nbound !< number of entries
161  integer(I4B), dimension(:), contiguous, intent(in) :: nodelist !< array of GWT node numbers
162  real(DP), dimension(:), contiguous, intent(in) :: flow !< array of flow rates
163  real(DP), dimension(:, :), contiguous, intent(in) :: auxvar !< array of auxiliary variables
164  integer(I4B) :: i
165  !
166  ! -- Assign variables
167  this%nbound = nbound
168  !
169  ! -- Lists are not large enough (maxbound is not known), so need to
170  ! reallocate based on size in binary budget file.
171  if (size(this%nodelist) < nbound) then
172  call mem_reallocate(this%nodelist, nbound, 'NODELIST', this%memoryPath)
173  call mem_reallocate(this%flow, nbound, 'FLOW', this%memoryPath)
174  call mem_reallocate(this%auxvar, this%naux, nbound, 'AUXVAR', &
175  this%memoryPath)
176  end if
177  !
178  ! -- Copy values into member variables
179  do i = 1, nbound
180  this%nodelist(i) = nodelist(i)
181  this%flow(i) = flow(i)
182  this%auxvar(:, i) = auxvar(:, i)
183  end do
184  end subroutine copy_values
185 
186  !> @ brief Get flow rate for specified entry
187  !!
188  !! Return the flow rate for the specified entry
189  !!
190  !<
191  function get_flow(this, i) result(flow)
192  class(packagebudgettype) :: this !< PackageBudgetType object
193  integer(I4B), intent(in) :: i !< entry number
194  real(dp) :: flow
195  flow = this%flow(i)
196  return
197  end function get_flow
198 
199  !> @ brief Deallocate
200  !!
201  !! Free any memory associated with this object
202  !!
203  !<
204  subroutine da(this)
205  class(packagebudgettype) :: this
206  call mem_deallocate(this%name, 'NAME', this%memoryPath)
207  call mem_deallocate(this%budtxt, 'BUDTXT', this%memoryPath)
208  call mem_deallocate(this%naux)
209  call mem_deallocate(this%auxname, 'AUXNAME', this%memoryPath)
210  call mem_deallocate(this%nbound)
211  call mem_deallocate(this%nodelist, 'NODELIST', this%memoryPath)
212  call mem_deallocate(this%flow, 'FLOW', this%memoryPath)
213  call mem_deallocate(this%auxvar, 'AUXVAR', this%memoryPath)
214  return
215  end subroutine da
216 
217 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:22
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:34
integer(i4b), parameter lenmempath
maximum length of the memory path
Definition: Constants.f90:26
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.