MODFLOW 6  version 6.7.0.dev3
USGS Modular Hydrologic Model
outputcontrolmodule Module Reference

Model output control.

Data Types

type  outputcontroltype
 @ brief Controls model output. Overridden for each model type. More...
 

Functions/Subroutines

subroutine, public oc_cr (oc, name_model, input_mempath, inunit, iout)
 Create a new output control object. More...
 
subroutine oc_df (this)
 @ brief Define the output control type. Placeholder routine. More...
 
subroutine oc_rp (this)
 @ brief Read period block options and prepare the output control type. More...
 
subroutine oc_ot (this, ipflg)
 @ brief Write output. More...
 
subroutine oc_da (this)
 @ brief Deallocate method for OutputControlType More...
 
subroutine allocate (this, name_model, input_mempath)
 @ brief Allocate variables for the output control object More...
 
subroutine source_options (this)
 @ brief Read the output control options block More...
 
subroutine set_ocfile (this, cname, ocfile, iout)
 
logical function oc_save (this, cname)
 @ brief Determine if it is time to save. More...
 
logical function oc_print (this, cname)
 @ brief Determine if it is time to print. More...
 
integer(i4b) function oc_save_unit (this, cname)
 @ brief Determine unit number for saving More...
 
integer(i4b) function set_print_flag (this, cname, icnvg, endofperiod)
 @ brief Set the print flag based on convergence and other parameters More...
 

Function/Subroutine Documentation

◆ allocate()

subroutine outputcontrolmodule::allocate ( class(outputcontroltype this,
character(len=*), intent(in)  name_model,
character(len=*), intent(in)  input_mempath 
)
Parameters
thisthis instance
[in]name_modelname of model
[in]input_mempathinput mempath of the package

Definition at line 191 of file OutputControl.f90.

192  ! modules
196  ! dummy
197  class(OutputControlType) :: this !< this instance
198  character(len=*), intent(in) :: name_model !< name of model
199  character(len=*), intent(in) :: input_mempath !< input mempath of the package
200  logical(LGP) :: found
201 
202  this%memoryPath = create_mem_path(name_model, 'OC')
203 
204  allocate (this%name_model)
205  allocate (this%input_fname)
206  call mem_allocate(this%inunit, 'INUNIT', this%memoryPath)
207  call mem_allocate(this%iout, 'IOUT', this%memoryPath)
208  call mem_allocate(this%ibudcsv, 'IBUDCSV', this%memoryPath)
209  call mem_allocate(this%iperoc, 'IPEROC', this%memoryPath)
210  call mem_allocate(this%iocrep, 'IOCREP', this%memoryPath)
211 
212  this%name_model = name_model
213  this%input_mempath = input_mempath
214  this%input_fname = ''
215  this%inunit = 0
216  this%iout = 0
217  this%ibudcsv = 0
218  this%iperoc = 0
219  this%iocrep = 0
220 
221  if (this%input_mempath /= '') then
222  call mem_set_value(this%input_fname, 'INPUT_FNAME', &
223  this%input_mempath, found)
224  end if
character(len=lenmempath) function create_mem_path(component, subcomponent, context)
returns the path to the memory object
Here is the call graph for this function:

◆ oc_cr()

subroutine, public outputcontrolmodule::oc_cr ( type(outputcontroltype), pointer  oc,
character(len=*), intent(in)  name_model,
character(len=*), intent(in)  input_mempath,
integer(i4b), intent(in)  inunit,
integer(i4b), intent(in)  iout 
)
Parameters
ocOutputControlType object
[in]name_modelname of the model
[in]input_mempathinput mempath of the package
[in]inunitunit number for input
[in]ioutunit number for output

Definition at line 43 of file OutputControl.f90.

44  type(OutputControlType), pointer :: oc !< OutputControlType object
45  character(len=*), intent(in) :: name_model !< name of the model
46  character(len=*), intent(in) :: input_mempath !< input mempath of the package
47  integer(I4B), intent(in) :: inunit !< unit number for input
48  integer(I4B), intent(in) :: iout !< unit number for output
49 
50  allocate (oc)
51  call oc%allocate_scalars(name_model, input_mempath)
52  oc%inunit = inunit
53  oc%iout = iout

◆ oc_da()

subroutine outputcontrolmodule::oc_da ( class(outputcontroltype this)

Deallocate member variables.

Parameters
thisOutputControlType object

Definition at line 168 of file OutputControl.f90.

169  ! modules
171  ! dummy
172  class(OutputControlType) :: this !< OutputControlType object
173  ! local
174  integer(I4B) :: i
175 
176  do i = 1, size(this%ocds)
177  call this%ocds(i)%ocd_da()
178  end do
179  deallocate (this%ocds)
180 
181  deallocate (this%name_model)
182  deallocate (this%input_fname)
183  call mem_deallocate(this%inunit)
184  call mem_deallocate(this%iout)
185  call mem_deallocate(this%ibudcsv)
186  call mem_deallocate(this%iperoc)
187  call mem_deallocate(this%iocrep)

◆ oc_df()

subroutine outputcontrolmodule::oc_df ( class(outputcontroltype this)
private
Parameters
thisthis instance

Definition at line 57 of file OutputControl.f90.

58  class(OutputControlType) :: this !< this instance

◆ oc_ot()

subroutine outputcontrolmodule::oc_ot ( class(outputcontroltype this,
integer(i4b), intent(inout)  ipflg 
)

Go through each output control data type and print and/or save data based on user-specified controls.

Parameters
thisOutputControlType object
[in,out]ipflgflag indicating if data was printed

Definition at line 143 of file OutputControl.f90.

144  ! modules
145  use tdismodule, only: kstp, endofperiod
146  ! dummy
147  class(OutputControlType) :: this !< OutputControlType object
148  integer(I4B), intent(inout) :: ipflg !< flag indicating if data was printed
149  ! local
150  integer(I4B) :: ipos
151  type(OutputControlDataType), pointer :: ocdobjptr
152 
153  ! Clear printout flag(ipflg). This flag indicates that an array was
154  ! printed to the listing file.
155  ipflg = 0
156 
157  do ipos = 1, size(this%ocds)
158  ocdobjptr => this%ocds(ipos)
159  call ocdobjptr%ocd_ot(ipflg, kstp, endofperiod, this%iout)
160  end do
logical(lgp), pointer, public endofperiod
flag indicating end of stress period
Definition: tdis.f90:27
integer(i4b), pointer, public kstp
current time step number
Definition: tdis.f90:24

◆ oc_print()

logical function outputcontrolmodule::oc_print ( class(outputcontroltype this,
character(len=*), intent(in)  cname 
)
Parameters
thisOutputControlType object
[in]cnamecharacter string for data name

Definition at line 341 of file OutputControl.f90.

342  ! modules
343  use tdismodule, only: kstp, endofperiod
344  ! dummy
345  class(OutputControlType) :: this !< OutputControlType object
346  character(len=*), intent(in) :: cname !< character string for data name
347  ! local
348  integer(I4B) :: ipos
349  logical(LGP) :: found
350  class(OutputControlDataType), pointer :: ocdobjptr
351 
352  oc_print = .false.
353  found = .false.
354  do ipos = 1, size(this%ocds)
355  ocdobjptr => this%ocds(ipos)
356  if (cname == trim(ocdobjptr%cname)) then
357  found = .true.
358  exit
359  end if
360  end do
361  if (found) then
362  oc_print = ocdobjptr%psm%should_print(kstp, endofperiod)
363  end if

◆ oc_rp()

subroutine outputcontrolmodule::oc_rp ( class(outputcontroltype this)
private
Parameters
thisthis instance

Definition at line 62 of file OutputControl.f90.

63  ! modules
64  use tdismodule, only: kper
68  ! dummy
69  class(OutputControlType) :: this !< this instance
70  ! local
71  class(OutputControlDataType), pointer :: ocdobjptr
72  integer(I4B), pointer :: iper
73  type(CharacterStringType), dimension(:), &
74  pointer, contiguous :: ocactions
75  type(CharacterStringType), dimension(:), &
76  pointer, contiguous :: rtypes
77  type(CharacterStringType), dimension(:), &
78  pointer, contiguous :: ocsettings
79  integer(I4B), pointer :: nlist
80  integer(I4B) :: n, ipos
81  character(len=LINELENGTH) :: ocaction, rtype, ocsetting
82  logical(LGP) :: found_rtype
83  ! formats
84  character(len=*), parameter :: fmtboc = &
85  &"(1X,/1X,'BEGIN READING OUTPUT CONTROL FOR STRESS PERIOD ',I0)"
86  character(len=*), parameter :: fmteoc = &
87  &"(/,1X,'END READING OUTPUT CONTROL FOR STRESS PERIOD ',I0)"
88  character(len=*), parameter :: fmtroc = &
89  "(1X,/1X,'OUTPUT CONTROL FOR STRESS PERIOD ',I0, &
90  &' IS REPEATED USING SETTINGS FROM A PREVIOUS STRESS PERIOD.')"
91 
92  if (this%input_mempath == '') return
93  call mem_setptr(iper, 'IPER', this%input_mempath)
94  if (iper /= kper) then
95  ! previous output control settings are still active
96  write (this%iout, fmtroc) kper
97  return
98  else
99  this%iperoc = iper
100  write (this%iout, fmtboc) this%iperoc
101  end if
102 
103  ! Clear io flags
104  do ipos = 1, size(this%ocds)
105  ocdobjptr => this%ocds(ipos)
106  call ocdobjptr%psm%init()
107  end do
108 
109  call mem_setptr(nlist, 'NBOUND', this%input_mempath)
110  call mem_setptr(ocactions, 'OCACTION', this%input_mempath)
111  call mem_setptr(rtypes, 'RTYPE', this%input_mempath)
112  call mem_setptr(ocsettings, 'SETTING', this%input_mempath)
113 
114  do n = 1, nlist
115  ocaction = ocactions(n)
116  rtype = rtypes(n)
117  ocsetting = ocsettings(n)
118 
119  found_rtype = .false.
120  do ipos = 1, size(this%ocds)
121  ocdobjptr => this%ocds(ipos)
122  if (rtype == trim(ocdobjptr%cname)) then
123  found_rtype = .true.
124  call ocdobjptr%psm%set(ocaction, ocsetting, this%iout)
125  call ocdobjptr%ocd_rp_check(this%input_fname)
126  end if
127  end do
128  if (.not. found_rtype) then
129  call store_error('Input OC period block rtype not found: "'// &
130  trim(rtype)//'".')
131  call store_error_filename(this%input_fname)
132  end if
133  end do
134 
135  write (this%iout, fmteoc) this%iperoc
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
integer(i4b), pointer, public kper
current stress period number
Definition: tdis.f90:23
This class is used to store a single deferred-length character string. It was designed to work in an ...
Definition: CharString.f90:23
Here is the call graph for this function:

◆ oc_save()

logical function outputcontrolmodule::oc_save ( class(outputcontroltype this,
character(len=*), intent(in)  cname 
)
Parameters
thisOutputControlType object
[in]cnamecharacter string for data name

Definition at line 315 of file OutputControl.f90.

316  ! modules
317  use tdismodule, only: kstp, endofperiod
318  ! dummy
319  class(OutputControlType) :: this !< OutputControlType object
320  character(len=*), intent(in) :: cname !< character string for data name
321  ! local
322  integer(I4B) :: ipos
323  logical(LGP) :: found
324  class(OutputControlDataType), pointer :: ocdobjptr
325  !
326  oc_save = .false.
327  found = .false.
328  do ipos = 1, size(this%ocds)
329  ocdobjptr => this%ocds(ipos)
330  if (cname == trim(ocdobjptr%cname)) then
331  found = .true.
332  exit
333  end if
334  end do
335  if (found) then
336  oc_save = ocdobjptr%psm%should_save(kstp, endofperiod)
337  end if

◆ oc_save_unit()

integer(i4b) function outputcontrolmodule::oc_save_unit ( class(outputcontroltype this,
character(len=*), intent(in)  cname 
)
Parameters
thisOutputControlType object
[in]cnamecharacter string for data name

Definition at line 367 of file OutputControl.f90.

368  ! -- modules
369  ! -- return
370  integer(I4B) :: oc_save_unit
371  ! -- dummy
372  class(OutputControlType) :: this !< OutputControlType object
373  character(len=*), intent(in) :: cname !< character string for data name
374  ! -- local
375  integer(I4B) :: ipos
376  logical(LGP) :: found
377  class(OutputControlDataType), pointer :: ocdobjptr
378  !
379  oc_save_unit = 0
380  found = .false.
381  do ipos = 1, size(this%ocds)
382  ocdobjptr => this%ocds(ipos)
383  if (cname == trim(ocdobjptr%cname)) then
384  found = .true.
385  exit
386  end if
387  end do
388  if (found) then
389  oc_save_unit = ocdobjptr%idataun
390  end if

◆ set_ocfile()

subroutine outputcontrolmodule::set_ocfile ( class(outputcontroltype this,
character(len=*), intent(in)  cname,
character(len=*), intent(in)  ocfile,
integer(i4b), intent(in)  iout 
)
Parameters
thisOutputControlDataType object
[in]cnamedata object cname
[in]ocfileOC output filename
[in]ioutUnit number for output

Definition at line 288 of file OutputControl.f90.

289  ! modules
291  ! dummy
292  class(OutputControlType) :: this !< OutputControlDataType object
293  character(len=*), intent(in) :: cname !< data object cname
294  character(len=*), intent(in) :: ocfile !< OC output filename
295  integer(I4B), intent(in) :: iout !< Unit number for output
296  type(OutputControlDataType), pointer :: ocdobjptr
297  integer(I4B) :: ipos
298  logical(LGP) :: found
299  found = .false.
300  do ipos = 1, size(this%ocds)
301  ocdobjptr => this%ocds(ipos)
302  if (cname == trim(ocdobjptr%cname)) then
303  found = .true.
304  call ocdobjptr%set_ocfile(ocfile, iout)
305  end if
306  end do
307  if (.not. found) then
308  call store_error('OC internal error: oc data type not found for name "'// &
309  trim(cname)//'".')
310  call store_error_filename(this%input_fname)
311  end if
Here is the call graph for this function:

◆ set_print_flag()

integer(i4b) function outputcontrolmodule::set_print_flag ( class(outputcontroltype this,
character(len=*), intent(in)  cname,
integer(i4b), intent(in)  icnvg,
logical, intent(in)  endofperiod 
)
private
Parameters
thisOutputControlType object
[in]cnamecharacter string for data name
[in]icnvgconvergence flag
[in]endofperiodend of period logical flag

Definition at line 394 of file OutputControl.f90.

395  ! -- modules
397  ! -- return
398  integer(I4B) :: iprint_flag
399  ! -- dummy
400  class(OutputControlType) :: this !< OutputControlType object
401  character(len=*), intent(in) :: cname !< character string for data name
402  integer(I4B), intent(in) :: icnvg !< convergence flag
403  logical, intent(in) :: endofperiod !< end of period logical flag
404  ! -- local
405  !
406  ! -- default is to not print
407  iprint_flag = 0
408  !
409  ! -- if the output control file indicates that cname should be printed
410  if (this%oc_print(cname)) iprint_flag = 1
411  !
412  ! -- if it is not a CONTINUE run, then set to print if not converged
413  if (isimcontinue == 0) then
414  if (icnvg == 0) iprint_flag = 1
415  end if
416  !
417  ! -- if it's the end of the period, then set flag to print
418  if (endofperiod) iprint_flag = 1
This module contains simulation variables.
Definition: SimVariables.f90:9
integer(i4b) isimcontinue
simulation continue flag (1) to continue if isimcnvg = 0, (0) to terminate

◆ source_options()

subroutine outputcontrolmodule::source_options ( class(outputcontroltype this)
Parameters
thisthis instance

Definition at line 228 of file OutputControl.f90.

229  ! modules
231  ! dummy
232  class(OutputControlType) :: this !< this instance
233  type(OutputControlDataType), pointer :: ocdobjptr
234  character(len=LINELENGTH) :: budgetfn, budgetcsv
235  character(len=LINELENGTH) :: prnfmt, print_format
236  logical(LGP) :: found_budcsv, found_budget
237  logical(LGP), dimension(4) :: found_format
238  integer(I4B), pointer :: columns, width, ndigits
239  integer(I4B) :: ipos
240 
241  found_format = .false.
242  allocate (columns)
243  allocate (width)
244  allocate (ndigits)
245 
246  call mem_set_value(columns, 'COLUMNS', this%input_mempath, &
247  found_format(1))
248  call mem_set_value(width, 'WIDTH', this%input_mempath, &
249  found_format(2))
250  call mem_set_value(ndigits, 'DIGITS', this%input_mempath, &
251  found_format(3))
252  call mem_set_value(prnfmt, 'FORMAT', this%input_mempath, &
253  found_format(4))
254  call mem_set_value(budgetcsv, 'BUDGETCSVFILE', this%input_mempath, &
255  found_budcsv)
256  call mem_set_value(budgetfn, 'BUDGETFILE', this%input_mempath, &
257  found_budget)
258 
259  if (found_budcsv) then
260  this%ibudcsv = getunit()
261  call openfile(this%ibudcsv, this%iout, budgetcsv, 'CSV', &
262  filstat_opt='REPLACE')
263  end if
264 
265  if (found_budget) then
266  call this%set_ocfile('BUDGET', budgetfn, this%iout)
267  end if
268 
269  if (found_format(1) .and. &
270  found_format(2) .and. &
271  found_format(3) .and. &
272  found_format(4)) then
273  write (print_format, '(a,i0,a,i0,a,i0,a)') 'COLUMNS ', columns, &
274  ' WIDTH ', width, ' DIGITS ', ndigits, ' '//trim(prnfmt)//' '
275  do ipos = 1, size(this%ocds)
276  ocdobjptr => this%ocds(ipos)
277  if (ocdobjptr%cname /= 'BUDGET') then
278  call ocdobjptr%set_prnfmt(print_format, 0)
279  end if
280  end do
281  end if
282 
283  deallocate (columns)
284  deallocate (width)
285  deallocate (ndigits)
Here is the call graph for this function: