1
1
#! /usr/bin/env python
2
2
"""Basic Model Interface implementation for the 2D heat model."""
3
3
4
+ from typing import Any
5
+
4
6
import numpy as np
5
7
from bmipy import Bmi
8
+ from numpy .typing import NDArray
6
9
7
10
from .heat import Heat
8
11
@@ -14,20 +17,21 @@ class BmiHeat(Bmi):
14
17
_input_var_names = ("plate_surface__temperature" ,)
15
18
_output_var_names = ("plate_surface__temperature" ,)
16
19
17
- def __init__ (self ):
20
+ def __init__ (self ) -> None :
18
21
"""Create a BmiHeat model that is ready for initialization."""
19
- self ._model = None
20
- self ._values = {}
21
- self ._var_units = {}
22
- self ._var_loc = {}
23
- self ._grids = {}
24
- self ._grid_type = {}
22
+ # self._model: Heat | None = None
23
+ self ._model : Heat
24
+ self ._values : dict [str , NDArray [Any ]] = {}
25
+ self ._var_units : dict [str , str ] = {}
26
+ self ._var_loc : dict [str , str ] = {}
27
+ self ._grids : dict [int , list [str ]] = {}
28
+ self ._grid_type : dict [int , str ] = {}
25
29
26
30
self ._start_time = 0.0
27
- self ._end_time = np .finfo ("d" ).max
31
+ self ._end_time = float ( np .finfo ("d" ).max )
28
32
self ._time_units = "s"
29
33
30
- def initialize (self , filename = None ):
34
+ def initialize (self , filename : str | None = None ) -> None :
31
35
"""Initialize the Heat model.
32
36
33
37
Parameters
@@ -39,7 +43,7 @@ def initialize(self, filename=None):
39
43
self ._model = Heat ()
40
44
elif isinstance (filename , str ):
41
45
with open (filename ) as file_obj :
42
- self ._model = Heat .from_file_like (file_obj . read () )
46
+ self ._model = Heat .from_file_like (file_obj )
43
47
else :
44
48
self ._model = Heat .from_file_like (filename )
45
49
@@ -49,11 +53,11 @@ def initialize(self, filename=None):
49
53
self ._grids = {0 : ["plate_surface__temperature" ]}
50
54
self ._grid_type = {0 : "uniform_rectilinear" }
51
55
52
- def update (self ):
56
+ def update (self ) -> None :
53
57
"""Advance model by one time step."""
54
58
self ._model .advance_in_time ()
55
59
56
- def update_frac (self , time_frac ) :
60
+ def update_frac (self , time_frac : float ) -> None :
57
61
"""Update model by a fraction of a time step.
58
62
59
63
Parameters
@@ -66,7 +70,7 @@ def update_frac(self, time_frac):
66
70
self .update ()
67
71
self ._model .time_step = time_step
68
72
69
- def update_until (self , then ) :
73
+ def update_until (self , then : float ) -> None :
70
74
"""Update model until a particular time.
71
75
72
76
Parameters
@@ -80,11 +84,12 @@ def update_until(self, then):
80
84
self .update ()
81
85
self .update_frac (n_steps - int (n_steps ))
82
86
83
- def finalize (self ):
87
+ def finalize (self ) -> None :
84
88
"""Finalize model."""
85
- self ._model = None
89
+ del self ._model
90
+ # self._model = None
86
91
87
- def get_var_type (self , var_name ) :
92
+ def get_var_type (self , var_name : str ) -> str :
88
93
"""Data type of variable.
89
94
90
95
Parameters
@@ -99,7 +104,7 @@ def get_var_type(self, var_name):
99
104
"""
100
105
return str (self .get_value_ptr (var_name ).dtype )
101
106
102
- def get_var_units (self , var_name ) :
107
+ def get_var_units (self , var_name : str ) -> str :
103
108
"""Get units of variable.
104
109
105
110
Parameters
@@ -114,7 +119,7 @@ def get_var_units(self, var_name):
114
119
"""
115
120
return self ._var_units [var_name ]
116
121
117
- def get_var_nbytes (self , var_name ) :
122
+ def get_var_nbytes (self , var_name : str ) -> int :
118
123
"""Get units of variable.
119
124
120
125
Parameters
@@ -129,13 +134,13 @@ def get_var_nbytes(self, var_name):
129
134
"""
130
135
return self .get_value_ptr (var_name ).nbytes
131
136
132
- def get_var_itemsize (self , name ) :
137
+ def get_var_itemsize (self , name : str ) -> int :
133
138
return np .dtype (self .get_var_type (name )).itemsize
134
139
135
- def get_var_location (self , name ) :
140
+ def get_var_location (self , name : str ) -> str :
136
141
return self ._var_loc [name ]
137
142
138
- def get_var_grid (self , var_name ) :
143
+ def get_var_grid (self , var_name : str ) -> int | None :
139
144
"""Grid id for a variable.
140
145
141
146
Parameters
@@ -151,8 +156,9 @@ def get_var_grid(self, var_name):
151
156
for grid_id , var_name_list in self ._grids .items ():
152
157
if var_name in var_name_list :
153
158
return grid_id
159
+ return None
154
160
155
- def get_grid_rank (self , grid_id ) :
161
+ def get_grid_rank (self , grid_id : int ) -> int :
156
162
"""Rank of grid.
157
163
158
164
Parameters
@@ -167,7 +173,7 @@ def get_grid_rank(self, grid_id):
167
173
"""
168
174
return len (self ._model .shape )
169
175
170
- def get_grid_size (self , grid_id ) :
176
+ def get_grid_size (self , grid_id : int ) -> int :
171
177
"""Size of grid.
172
178
173
179
Parameters
@@ -182,7 +188,7 @@ def get_grid_size(self, grid_id):
182
188
"""
183
189
return int (np .prod (self ._model .shape ))
184
190
185
- def get_value_ptr (self , var_name ) :
191
+ def get_value_ptr (self , var_name : str ) -> NDArray [ Any ] :
186
192
"""Reference to values.
187
193
188
194
Parameters
@@ -197,7 +203,7 @@ def get_value_ptr(self, var_name):
197
203
"""
198
204
return self ._values [var_name ]
199
205
200
- def get_value (self , var_name , dest ) :
206
+ def get_value (self , var_name : str , dest : NDArray [ Any ]) -> NDArray [ Any ] :
201
207
"""Copy of values.
202
208
203
209
Parameters
@@ -215,7 +221,9 @@ def get_value(self, var_name, dest):
215
221
dest [:] = self .get_value_ptr (var_name ).flatten ()
216
222
return dest
217
223
218
- def get_value_at_indices (self , var_name , dest , indices ):
224
+ def get_value_at_indices (
225
+ self , var_name : str , dest : NDArray [Any ], indices : NDArray [np .int_ ]
226
+ ) -> NDArray [Any ]:
219
227
"""Get values at particular indices.
220
228
221
229
Parameters
@@ -235,7 +243,7 @@ def get_value_at_indices(self, var_name, dest, indices):
235
243
dest [:] = self .get_value_ptr (var_name ).take (indices )
236
244
return dest
237
245
238
- def set_value (self , var_name , src ) :
246
+ def set_value (self , var_name : str , src : NDArray [ Any ]) -> None :
239
247
"""Set model values.
240
248
241
249
Parameters
@@ -248,7 +256,9 @@ def set_value(self, var_name, src):
248
256
val = self .get_value_ptr (var_name )
249
257
val [:] = src .reshape (val .shape )
250
258
251
- def set_value_at_indices (self , name , inds , src ):
259
+ def set_value_at_indices (
260
+ self , name : str , inds : NDArray [np .int_ ], src : NDArray [Any ]
261
+ ) -> None :
252
262
"""Set model values at particular indices.
253
263
254
264
Parameters
@@ -263,76 +273,80 @@ def set_value_at_indices(self, name, inds, src):
263
273
val = self .get_value_ptr (name )
264
274
val .flat [inds ] = src
265
275
266
- def get_component_name (self ):
276
+ def get_component_name (self ) -> str :
267
277
"""Name of the component."""
268
278
return self ._name
269
279
270
- def get_input_item_count (self ):
280
+ def get_input_item_count (self ) -> int :
271
281
"""Get names of input variables."""
272
282
return len (self ._input_var_names )
273
283
274
- def get_output_item_count (self ):
284
+ def get_output_item_count (self ) -> int :
275
285
"""Get names of output variables."""
276
286
return len (self ._output_var_names )
277
287
278
- def get_input_var_names (self ):
288
+ def get_input_var_names (self ) -> tuple [ str , ...] :
279
289
"""Get names of input variables."""
280
290
return self ._input_var_names
281
291
282
- def get_output_var_names (self ):
292
+ def get_output_var_names (self ) -> tuple [ str , ...] :
283
293
"""Get names of output variables."""
284
294
return self ._output_var_names
285
295
286
- def get_grid_shape (self , grid_id , shape ) :
296
+ def get_grid_shape (self , grid_id : int , shape : NDArray [ np . int_ ]) -> NDArray [ np . int_ ] :
287
297
"""Number of rows and columns of uniform rectilinear grid."""
288
298
var_name = self ._grids [grid_id ][0 ]
289
299
shape [:] = self .get_value_ptr (var_name ).shape
290
300
return shape
291
301
292
- def get_grid_spacing (self , grid_id , spacing ):
302
+ def get_grid_spacing (
303
+ self , grid_id : int , spacing : NDArray [np .float64 ]
304
+ ) -> NDArray [np .float64 ]:
293
305
"""Spacing of rows and columns of uniform rectilinear grid."""
294
306
spacing [:] = self ._model .spacing
295
307
return spacing
296
308
297
- def get_grid_origin (self , grid_id , origin ):
309
+ def get_grid_origin (
310
+ self , grid_id : int , origin : NDArray [np .float64 ]
311
+ ) -> NDArray [np .float64 ]:
298
312
"""Origin of uniform rectilinear grid."""
299
313
origin [:] = self ._model .origin
300
314
return origin
301
315
302
- def get_grid_type (self , grid_id ) :
316
+ def get_grid_type (self , grid_id : int ) -> str :
303
317
"""Type of grid."""
304
318
return self ._grid_type [grid_id ]
305
319
306
- def get_start_time (self ):
320
+ def get_start_time (self ) -> float :
307
321
"""Start time of model."""
308
322
return self ._start_time
309
323
310
- def get_end_time (self ):
324
+ def get_end_time (self ) -> float :
311
325
"""End time of model."""
312
326
return self ._end_time
313
327
314
- def get_current_time (self ):
328
+ def get_current_time (self ) -> float :
315
329
return self ._model .time
316
330
317
- def get_time_step (self ):
331
+ def get_time_step (self ) -> float :
318
332
return self ._model .time_step
319
333
320
- def get_time_units (self ):
334
+ def get_time_units (self ) -> str :
321
335
return self ._time_units
322
336
323
- def get_grid_edge_count (self , grid ) :
337
+ def get_grid_edge_count (self , grid : int ) -> int :
324
338
raise NotImplementedError ("get_grid_edge_count" )
325
339
326
- def get_grid_edge_nodes (self , grid , edge_nodes ) :
340
+ def get_grid_edge_nodes (self , grid : int , edge_nodes : NDArray [ np . int_ ]) -> None :
327
341
raise NotImplementedError ("get_grid_edge_nodes" )
328
342
329
- def get_grid_face_count (self , grid ) :
343
+ def get_grid_face_count (self , grid : int ) -> None :
330
344
raise NotImplementedError ("get_grid_face_count" )
331
345
332
- def get_grid_face_nodes (self , grid , face_nodes ) :
346
+ def get_grid_face_nodes (self , grid : int , face_nodes : NDArray [ np . int_ ]) -> None :
333
347
raise NotImplementedError ("get_grid_face_nodes" )
334
348
335
- def get_grid_node_count (self , grid ) :
349
+ def get_grid_node_count (self , grid : int ) -> int :
336
350
"""Number of grid nodes.
337
351
338
352
Parameters
@@ -347,17 +361,19 @@ def get_grid_node_count(self, grid):
347
361
"""
348
362
return self .get_grid_size (grid )
349
363
350
- def get_grid_nodes_per_face (self , grid , nodes_per_face ):
364
+ def get_grid_nodes_per_face (
365
+ self , grid : int , nodes_per_face : NDArray [np .int_ ]
366
+ ) -> None :
351
367
raise NotImplementedError ("get_grid_nodes_per_face" )
352
368
353
- def get_grid_face_edges (self , grid , face_edges ) :
369
+ def get_grid_face_edges (self , grid : int , face_edges : NDArray [ np . int_ ]) -> None :
354
370
raise NotImplementedError ("get_grid_face_edges" )
355
371
356
- def get_grid_x (self , grid , x ) :
372
+ def get_grid_x (self , grid : int , x : NDArray [ np . float64 ]) -> None :
357
373
raise NotImplementedError ("get_grid_x" )
358
374
359
- def get_grid_y (self , grid , y ) :
375
+ def get_grid_y (self , grid : int , y : NDArray [ np . float64 ]) -> None :
360
376
raise NotImplementedError ("get_grid_y" )
361
377
362
- def get_grid_z (self , grid , z ) :
378
+ def get_grid_z (self , grid : int , z : NDArray [ np . float64 ]) -> None :
363
379
raise NotImplementedError ("get_grid_z" )
0 commit comments