MODFLOW 6  version 6.8.0.dev0
USGS Modular Hydrologic Model
BaseSolution.f90
Go to the documentation of this file.
1 ! -- A solution contains a list of models, packages, and exchanges
3 
4  use kindmodule, only: dp, i4b
8  use listmodule, only: listtype
9  implicit none
10 
11  private
13  private :: castasbasesolutionclass
14 
15  type, abstract :: basesolutiontype
16  character(len=LENSOLUTIONNAME) :: name
17  contains
18  procedure(sln_df), deferred :: sln_df
19  procedure(sln_ar), deferred :: sln_ar
20  procedure(sln_dt), deferred :: sln_dt
21  procedure(sln_ad), deferred :: sln_ad
22  procedure(sln_ca), deferred :: sln_ca
23  procedure(sln_ot), deferred :: sln_ot
24  procedure(sln_fp), deferred :: sln_fp
25  procedure(sln_da), deferred :: sln_da
26  procedure(slnsave), deferred :: save
27  procedure(slnaddmodel), deferred :: add_model
28  procedure(slnaddexchange), deferred :: add_exchange
29  procedure(slngetmodels), deferred :: get_models
30  procedure(slngetexchanges), deferred :: get_exchanges
31 
32  ! Expose these for use through the BMI/XMI:
33  procedure(preparesolve), deferred :: preparesolve
34  procedure(solve), deferred :: solve
35  procedure(finalizesolve), deferred :: finalizesolve
36  end type basesolutiontype
37 
38  abstract interface
39 
40  subroutine sln_df(this)
41  import basesolutiontype
42  class(basesolutiontype) :: this
43  end subroutine
44 
45  subroutine slnaddexchange(this, exchange)
46  import basesolutiontype
47  import baseexchangetype
48  class(basesolutiontype) :: this
49  class(baseexchangetype), pointer, intent(in) :: exchange
50  end subroutine
51 
52  subroutine assignconnectionsiface(this)
53  import basesolutiontype
54  class(basesolutiontype) :: this
55  end subroutine
56 
57  subroutine sln_ar(this)
58  import basesolutiontype
59  class(basesolutiontype) :: this
60  end subroutine
61 
62  subroutine sln_rp(this)
63  import basesolutiontype
64  class(basesolutiontype) :: this
65  end subroutine
66 
67  subroutine sln_dt(this)
68  import basesolutiontype
69  class(basesolutiontype) :: this
70  end subroutine
71 
72  subroutine sln_ad(this)
73  import basesolutiontype
74  class(basesolutiontype) :: this
75  end subroutine
76 
77  subroutine sln_ot(this)
78  import basesolutiontype
79  class(basesolutiontype) :: this
80  end subroutine
81 
82  subroutine sln_ca(this, isgcnvg, isuppress_output)
83  use kindmodule, only: dp, i4b
84  import basesolutiontype
85  class(basesolutiontype) :: this
86  integer(I4B), intent(in) :: isuppress_output
87  integer(I4B), intent(inout) :: isgcnvg
88  end subroutine
89 
90  subroutine slnsave(this, filename)
91  import basesolutiontype
92  class(basesolutiontype) :: this
93  character(len=*), intent(in) :: filename
94  end subroutine
95 
96  subroutine slnaddmodel(this, mp)
97  import basesolutiontype
98  import basemodeltype
99  class(basesolutiontype) :: this
100  class(basemodeltype), pointer, intent(in) :: mp
101  end subroutine
102 
103  function slngetmodels(this) result(models)
104  import basesolutiontype
105  import listtype
106  class(basesolutiontype) :: this
107  type(listtype), pointer :: models
108  end function
109 
110  function slngetexchanges(this) result(models)
111  import basesolutiontype
112  import listtype
113  class(basesolutiontype) :: this
114  type(listtype), pointer :: models
115  end function
116 
117  subroutine sln_fp(this)
118  import basesolutiontype
119  class(basesolutiontype) :: this
120  end subroutine
121 
122  subroutine sln_da(this)
123  import basesolutiontype
124  class(basesolutiontype) :: this
125  end subroutine
126 
127  subroutine preparesolve(this)
128  import basesolutiontype
129  class(basesolutiontype) :: this
130  end subroutine preparesolve
131 
132  subroutine solve(this, kiter, isuppress_output)
133  use kindmodule, only: i4b
134  import basesolutiontype
135  class(basesolutiontype) :: this
136  integer(I4B), intent(in) :: kiter
137  integer(I4B), intent(in) :: isuppress_output
138  end subroutine solve
139 
140  subroutine finalizesolve(this, kiter, isgcnvg, isuppress_output)
141  use kindmodule, only: i4b
142  import basesolutiontype
143  class(basesolutiontype) :: this
144  integer(I4B), intent(in) :: kiter
145  integer(I4B), intent(inout) :: isgcnvg
146  integer(I4B), intent(in) :: isuppress_output
147  end subroutine finalizesolve
148 
149  end interface
150 
151 contains
152 
153  function castasbasesolutionclass(obj) result(res)
154  implicit none
155  class(*), pointer, intent(inout) :: obj
156  class(basesolutiontype), pointer :: res
157  !
158  res => null()
159  if (.not. associated(obj)) return
160  !
161  select type (obj)
162  class is (basesolutiontype)
163  res => obj
164  end select
165  end function castasbasesolutionclass
166 
167  subroutine addbasesolutiontolist(list, solution)
168  implicit none
169  ! -- dummy
170  type(listtype), intent(inout) :: list
171  class(basesolutiontype), pointer, intent(in) :: solution
172  ! -- local
173  class(*), pointer :: obj
174  !
175  obj => solution
176  call list%Add(obj)
177  end subroutine addbasesolutiontolist
178 
179  function getbasesolutionfromlist(list, idx) result(res)
180  implicit none
181  ! -- dummy
182  type(listtype), intent(inout) :: list
183  integer(I4B), intent(in) :: idx
184  class(basesolutiontype), pointer :: res
185  ! -- local
186  class(*), pointer :: obj
187  !
188  obj => list%GetItem(idx)
189  res => castasbasesolutionclass(obj)
190  end function getbasesolutionfromlist
191 
192 end module basesolutionmodule
subroutine, public addbasesolutiontolist(list, solution)
class(basesolutiontype) function, pointer, public getbasesolutionfromlist(list, idx)
class(basesolutiontype) function, pointer, private castasbasesolutionclass(obj)
This module contains simulation constants.
Definition: Constants.f90:9
integer(i4b), parameter lensolutionname
maximum length of the solution name
Definition: Constants.f90:21
This module defines variable data types.
Definition: kind.f90:8
Highest level model type. All models extend this parent type.
Definition: BaseModel.f90:16
A generic heterogeneous doubly-linked list.
Definition: List.f90:14