Skip to content

Commit d7bb65a

Browse files
committed
v0.9.3: close logger after execution; improve file handling during inputprocessing; handle some new matplotlib warnings
1 parent e7f461c commit d7bb65a

File tree

5 files changed

+72
-29
lines changed

5 files changed

+72
-29
lines changed

dassh/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# permissions and limitations under the License.
1515
########################################################################
1616
"""
17-
date: 2021-12-01
17+
date: 2021-12-06
1818
author: Milos Atz, Micheal Smith
1919
"""
2020
########################################################################
@@ -45,4 +45,4 @@
4545
np.set_printoptions(threshold=sys.maxsize, linewidth=500)
4646

4747

48-
__version__ = '0.9.2'
48+
__version__ = '0.9.3'

dassh/__main__.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# permissions and limitations under the License.
1515
########################################################################
1616
"""
17-
date: 2021-12-01
17+
date: 2021-12-06
1818
author: matz
1919
Main DASSH calculation procedure
2020
"""
@@ -24,6 +24,7 @@
2424
import dassh
2525
import argparse
2626
import cProfile
27+
import logging
2728
_log_info = 20 # logging levels must be int
2829

2930

@@ -89,6 +90,9 @@ def main(args=None):
8990
pr.disable()
9091
pr.dump_stats('dassh_profile.out')
9192

93+
# Shutdown logger by removing file handlers
94+
dassh.logged_class.shutdown_logger('dassh')
95+
9296

9397
def check_version(dassh_inp, dassh_log, save_reactor):
9498
"""Check for DASSH limitations depending on Python version;

dassh/logged_class.py

+39-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# permissions and limitations under the License.
1515
########################################################################
1616
"""
17-
date: 2021-11-24
17+
date: 2021-12-06
1818
author: matz (inherited from Dr. A. Nelson)
1919
Log messages, warnings, and errors produced by each class in DASSH
2020
"""
@@ -111,6 +111,15 @@ def change_log_level_console(logger, new_level):
111111
return logger
112112

113113

114+
def shutdown_logger(name):
115+
logger = logging.getLogger(name)
116+
handlers = logger.handlers[:]
117+
for handler in handlers:
118+
handler.close()
119+
logger.removeHandler(handler)
120+
del logger
121+
122+
114123
class LoggedClass(object):
115124
"""This class provides a consistent logger interface across
116125
classes.
@@ -199,3 +208,32 @@ def __exit__(self, et, ev, tb):
199208
if self.level is not None:
200209
self.logger.handlers[1].setLevel(self.old_level)
201210
# implicit return of None => don't swallow exceptions
211+
212+
213+
class CloseLogStreams(object):
214+
"""Temporarily redirect all logging messages to stdout and stderr
215+
when pickling in Python < 3.7."""
216+
def __init__(self, logger):
217+
self.logger = logger
218+
219+
def __enter__(self):
220+
if sys.version_info < (3, 7):
221+
self.handler_info = []
222+
handlers = self.logger.handlers[:]
223+
for handler in handlers:
224+
self.handler_info.append(
225+
[type(handler),
226+
handler.baseFilename,
227+
handler.mode,
228+
handler.level,
229+
handler.formatter])
230+
handler.close()
231+
self.logger.removeHandler(handler)
232+
233+
def __exit__(self):
234+
if sys.version_info < (3, 7):
235+
for h_info in self.handler_info:
236+
handler = h_info[0](h_info[1], h_info[2])
237+
handler.setLevel(h_info[3])
238+
handler.setFormatter(h_info[4])
239+
del self.handler_info

dassh/plot.py

+21-22
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# permissions and limitations under the License.
1515
########################################################################
1616
"""
17-
date: 2021-12-01
17+
date: 2021-12-06
1818
author: matz
1919
Methods to plot DASSH objects (such as hexagonal fuel assemblies and
2020
the pins and subchannels that comprise them).
@@ -132,8 +132,7 @@ def make_SubchannelPlot(dassh_reactor, plot_data):
132132
f'z={z_str}'])
133133
fname += '.png'
134134
fname = os.path.join(dassh_reactor.path, fname)
135-
plt.savefig(fname, bbox_inches='tight', dpi=_data['dpi'])
136-
plt.close()
135+
_save_and_close(fname, _data['dpi'])
137136

138137

139138
def make_PinPlot(dassh_reactor, plot_data):
@@ -178,8 +177,7 @@ def make_PinPlot(dassh_reactor, plot_data):
178177
value, f'z={z_str}'])
179178
fname += '.png'
180179
fname = os.path.join(dassh_reactor.path, fname)
181-
plt.savefig(fname, bbox_inches='tight', dpi=_data['dpi'])
182-
plt.close()
180+
_save_and_close(fname, _data['dpi'])
183181

184182

185183
def make_CoreSubchannelPlot(dassh_reactor, plot_data):
@@ -205,8 +203,7 @@ def make_CoreSubchannelPlot(dassh_reactor, plot_data):
205203
fname = '_'.join(['CoreSubchannelPlot', f'z={z_str}'])
206204
fname += '.png'
207205
fname = os.path.join(dassh_reactor.path, fname)
208-
plt.savefig(fname, bbox_inches='tight', dpi=_data['dpi'])
209-
plt.close()
206+
_save_and_close(fname, _data['dpi'])
210207

211208

212209
def make_CorePinPlot(dassh_reactor, plot_data):
@@ -232,8 +229,7 @@ def make_CorePinPlot(dassh_reactor, plot_data):
232229
fname = '_'.join(['CorePinPlot', v, f'z={z_str}'])
233230
fname += '.png'
234231
fname = os.path.join(dassh_reactor.path, fname)
235-
plt.savefig(fname, bbox_inches='tight', dpi=_data['dpi'])
236-
plt.close()
232+
_save_and_close(fname, _data['dpi'])
237233

238234

239235
def make_CoreHexPlot(dassh_reactor, plot_data):
@@ -1734,10 +1730,9 @@ def make_power(self, dassh_reactor, plot_data):
17341730
cmap=plot_data['cmap'],
17351731
cbar_label=cbl,
17361732
data_label=plot_data['data_label'])
1737-
fname = os.path.join(dassh_reactor.path,
1738-
'CoreHexPlot_total_power.png')
1739-
plt.savefig(fname, bbox_inches='tight', dpi=plot_data['dpi'])
1740-
plt.close()
1733+
fname = 'CoreHexPlot_total_power.png'
1734+
fname = os.path.join(dassh_reactor.path, fname)
1735+
_save_and_close(fname, plot_data['dpi'])
17411736

17421737
def make_axial_peak(self, dassh_reactor, plot_data, value):
17431738
"""Generate CoreHexPlot figure containing maximum temperature
@@ -1772,10 +1767,9 @@ def make_axial_peak(self, dassh_reactor, plot_data, value):
17721767
cbar_label=cbar_lab,
17731768
data_label=plot_data['data_label'],
17741769
omit_nonvalue_rings=plot_data['omit_nonvalue_rings'])
1775-
fname = os.path.join(dassh_reactor.path,
1776-
f'CoreHexPlot_{value}.png',)
1777-
plt.savefig(fname, bbox_inches='tight', dpi=plot_data['dpi'])
1778-
plt.close()
1770+
fname = f'CoreHexPlot_{value}.png'
1771+
fname = os.path.join(dassh_reactor.path, fname)
1772+
_save_and_close(fname, plot_data['dpi'])
17791773

17801774
def make_radial_peak_or_avg(self, dassh_reactor, plot_data, value):
17811775
"""Generate CoreHexPlot figure containing maximum temperature
@@ -1827,9 +1821,7 @@ def make_radial_peak_or_avg(self, dassh_reactor, plot_data, value):
18271821
value,
18281822
f'z={z_str}.png'])
18291823
fname = os.path.join(dassh_reactor.path, fname)
1830-
plt.savefig(fname, bbox_inches='tight',
1831-
dpi=plot_data['dpi'])
1832-
plt.close()
1824+
_save_and_close(fname, plot_data['dpi'])
18331825

18341826
def _get_cbar_label(self, plot_data, value):
18351827
"""If no colorbar label is provided, generate one based on
@@ -2285,6 +2277,14 @@ def plot_FH(self, data, lbnd=None, ubnd=None, middle=None,
22852277
########################################################################
22862278

22872279

2280+
def _save_and_close(plot_file_path, dpi):
2281+
l = logging.getLogger('matplotlib.text')
2282+
l.setLevel(40)
2283+
plt.savefig(plot_file_path, bbox_inches='tight', dpi=dpi)
2284+
l.setLevel(30)
2285+
plt.close()
2286+
2287+
22882288
def _prepare_input(dassh_reactor, plot_data, file_to_load):
22892289
"""Prepare and store data necessary to make any figure
22902290
@@ -2386,8 +2386,7 @@ def _add_colorbar(ax, text, cmap, norm):
23862386
"""
23872387
divider = make_axes_locatable(ax)
23882388
color_axis = divider.append_axes("right", size="5%", pad=0.1)
2389-
cbar_colors = mpl.cm.ScalarMappable(norm=norm,
2390-
cmap=cmap)
2389+
cbar_colors = mpl.cm.ScalarMappable(norm=norm, cmap=cmap)
23912390
cbar = plt.colorbar(cbar_colors, cax=color_axis)
23922391
cbar.set_label(text, fontsize=11)
23932392
return ax

dassh/read_input.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# permissions and limitations under the License.
1515
########################################################################
1616
"""
17-
date: 2021-11-24
17+
date: 2021-12-06
1818
author: Milos Atz
1919
This module defines the object that reads the DASSH input file
2020
into Python data structures.
@@ -612,7 +612,8 @@ def get_input(self, infile):
612612
self.data = inp
613613

614614
def get_timepoints(self, infile):
615-
txt = open(infile).read().splitlines()
615+
with open(infile, 'r') as f:
616+
txt = f.read().splitlines()
616617
if self._cccc_power:
617618
tpts_cccc = self._get_cccc_timepoints(txt)
618619
else:
@@ -679,7 +680,8 @@ def check_inputfile_sections(self, inputfile):
679680
"""Check that mandatory sections are present in the input.
680681
Note: RegionList is optional."""
681682
# Read from the input file
682-
txt = open(inputfile).read()
683+
with open(inputfile, 'r') as f:
684+
txt = f.read()
683685
txtlines = txt.splitlines()
684686
for sec in ['Assembly', 'Core', 'Assignment', 'Power']:
685687
tmp = [i for i, s in enumerate(txtlines) if f'[{sec}]' in s]

0 commit comments

Comments
 (0)