mesa-reader 0.3.4__tar.gz → 0.3.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mesa_reader-0.3.4 → mesa_reader-0.3.5}/PKG-INFO +1 -1
- {mesa_reader-0.3.4 → mesa_reader-0.3.5}/mesa_reader/__init__.py +115 -85
- {mesa_reader-0.3.4 → mesa_reader-0.3.5}/mesa_reader.egg-info/PKG-INFO +1 -1
- {mesa_reader-0.3.4 → mesa_reader-0.3.5}/setup.py +1 -1
- {mesa_reader-0.3.4 → mesa_reader-0.3.5}/README.md +0 -0
- {mesa_reader-0.3.4 → mesa_reader-0.3.5}/mesa_reader.egg-info/SOURCES.txt +0 -0
- {mesa_reader-0.3.4 → mesa_reader-0.3.5}/mesa_reader.egg-info/dependency_links.txt +0 -0
- {mesa_reader-0.3.4 → mesa_reader-0.3.5}/mesa_reader.egg-info/requires.txt +0 -0
- {mesa_reader-0.3.4 → mesa_reader-0.3.5}/mesa_reader.egg-info/top_level.txt +0 -0
- {mesa_reader-0.3.4 → mesa_reader-0.3.5}/setup.cfg +0 -0
|
@@ -8,35 +8,34 @@ import numpy as np
|
|
|
8
8
|
class ProfileError(Exception):
|
|
9
9
|
|
|
10
10
|
def __init__(self, msg):
|
|
11
|
-
|
|
11
|
+
super().__init__(self, msg)
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class HistoryError(Exception):
|
|
15
15
|
|
|
16
16
|
def __init__(self, msg):
|
|
17
|
-
|
|
17
|
+
super().__init__(self, msg)
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
class ModelNumberError(Exception):
|
|
21
21
|
|
|
22
22
|
def __init__(self, msg):
|
|
23
|
-
|
|
23
|
+
super().__init__(self, msg)
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
class BadPathError(Exception):
|
|
27
27
|
|
|
28
28
|
def __init__(self, msg):
|
|
29
|
-
|
|
29
|
+
super().__init__(self, msg)
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
class UnknownFileTypeError(Exception):
|
|
33
33
|
|
|
34
34
|
def __init__(self, msg):
|
|
35
|
-
|
|
35
|
+
super().__init__(self, msg)
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
class MesaData:
|
|
39
|
-
|
|
40
39
|
"""Structure containing data from a Mesa output file.
|
|
41
40
|
|
|
42
41
|
Reads a profile or history output file from mesa. Assumes a file with
|
|
@@ -88,14 +87,25 @@ class MesaData:
|
|
|
88
87
|
|
|
89
88
|
# For pickle support
|
|
90
89
|
def __getstate__(self):
|
|
91
|
-
return (
|
|
90
|
+
return (
|
|
91
|
+
self.file_name,
|
|
92
|
+
self.bulk_data,
|
|
93
|
+
self.bulk_names,
|
|
94
|
+
self.header_data,
|
|
95
|
+
self.header_names,
|
|
96
|
+
)
|
|
92
97
|
|
|
93
98
|
# For pickle support
|
|
94
99
|
def __setstate__(self, state):
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
100
|
+
(
|
|
101
|
+
self.file_name,
|
|
102
|
+
self.bulk_data,
|
|
103
|
+
self.bulk_names,
|
|
104
|
+
self.header_data,
|
|
105
|
+
self.header_names,
|
|
106
|
+
) = state
|
|
107
|
+
|
|
108
|
+
def __init__(self, file_name=join(".", "LOGS", "history.data"), file_type=None):
|
|
99
109
|
"""Make a MesaData object from a Mesa output file.
|
|
100
110
|
|
|
101
111
|
Reads a profile or history output file from mesa. Assumes a file with
|
|
@@ -163,21 +173,21 @@ class MesaData:
|
|
|
163
173
|
# attempt auto-detection of file_type (if not supplied)
|
|
164
174
|
if self.file_type is None:
|
|
165
175
|
if self.file_name.endswith((".data", ".log")):
|
|
166
|
-
self.file_type =
|
|
176
|
+
self.file_type = "log"
|
|
167
177
|
elif self.file_name.endswith(".mod"):
|
|
168
|
-
self.file_type =
|
|
178
|
+
self.file_type = "model"
|
|
169
179
|
else:
|
|
170
|
-
raise UnknownFileTypeError(
|
|
171
|
-
self.file_name)
|
|
180
|
+
raise UnknownFileTypeError(
|
|
181
|
+
"Unknown file type for file {}".format(self.file_name)
|
|
182
|
+
)
|
|
172
183
|
|
|
173
184
|
# punt to reading method appropriate for each file type
|
|
174
|
-
if self.file_type ==
|
|
185
|
+
if self.file_type == "model":
|
|
175
186
|
self.read_model_data()
|
|
176
|
-
elif self.file_type ==
|
|
187
|
+
elif self.file_type == "log":
|
|
177
188
|
self.read_log_data()
|
|
178
189
|
else:
|
|
179
|
-
raise UnknownFileTypeError("Unknown file type {}".format(
|
|
180
|
-
self.file_type))
|
|
190
|
+
raise UnknownFileTypeError("Unknown file type {}".format(self.file_type))
|
|
181
191
|
|
|
182
192
|
def read_log_data(self):
|
|
183
193
|
"""Reads in or update data from the original log (.data or .log) file.
|
|
@@ -192,8 +202,11 @@ class MesaData:
|
|
|
192
202
|
None
|
|
193
203
|
"""
|
|
194
204
|
self.bulk_data = np.genfromtxt(
|
|
195
|
-
self.file_name,
|
|
196
|
-
|
|
205
|
+
self.file_name,
|
|
206
|
+
skip_header=MesaData.bulk_names_line - 1,
|
|
207
|
+
names=True,
|
|
208
|
+
dtype=None,
|
|
209
|
+
)
|
|
197
210
|
self.bulk_names = self.bulk_data.dtype.names
|
|
198
211
|
header_data = []
|
|
199
212
|
with open(self.file_name) as f:
|
|
@@ -231,30 +244,30 @@ class MesaData:
|
|
|
231
244
|
"""
|
|
232
245
|
|
|
233
246
|
def pythonize_number(num_string):
|
|
234
|
-
"""Convert
|
|
247
|
+
"""Convert fortran double [string] to python readable number [string].
|
|
235
248
|
|
|
236
249
|
Converts numbers with exponential notation of D+, D-, d+, or d-
|
|
237
250
|
to E+ or E- so that a python interpreter properly understands them.
|
|
238
251
|
Leaves all other strings the untouched.
|
|
239
252
|
"""
|
|
240
|
-
num_string = re.sub(
|
|
241
|
-
return re.sub(
|
|
253
|
+
num_string = re.sub(r"(d|D)\+", "E+", num_string)
|
|
254
|
+
return re.sub(r"(d|D)-", "E-", num_string)
|
|
242
255
|
|
|
243
|
-
with open(self.file_name,
|
|
256
|
+
with open(self.file_name, "r") as f:
|
|
244
257
|
lines = f.readlines()
|
|
245
258
|
# Walk through file until we get to the last blank line, saving
|
|
246
259
|
# relevant data as we go.
|
|
247
|
-
blank_line_matcher = re.compile(
|
|
260
|
+
blank_line_matcher = re.compile(r"^\s*$")
|
|
248
261
|
i = 0
|
|
249
262
|
found_blank_line = False
|
|
250
263
|
while not found_blank_line:
|
|
251
264
|
i += 1
|
|
252
|
-
found_blank_line =
|
|
265
|
+
found_blank_line = blank_line_matcher.match(lines[i]) is not None
|
|
253
266
|
# now on blank line 1, advance through one or more lines to get to
|
|
254
267
|
# header data
|
|
255
268
|
while found_blank_line:
|
|
256
269
|
i += 1
|
|
257
|
-
found_blank_line =
|
|
270
|
+
found_blank_line = blank_line_matcher.match(lines[i]) is not None
|
|
258
271
|
# now done with blank lines and on to header data
|
|
259
272
|
self.header_names = []
|
|
260
273
|
self.header_data = {}
|
|
@@ -263,22 +276,23 @@ class MesaData:
|
|
|
263
276
|
self.header_data[name] = eval(pythonize_number(val))
|
|
264
277
|
self.header_names.append(name)
|
|
265
278
|
i += 1
|
|
266
|
-
found_blank_line =
|
|
279
|
+
found_blank_line = blank_line_matcher.match(lines[i]) is not None
|
|
267
280
|
# now on blank line 2, advance until we get to column names
|
|
268
281
|
while found_blank_line:
|
|
269
282
|
i += 1
|
|
270
|
-
found_blank_line =
|
|
271
|
-
self.bulk_names = [
|
|
283
|
+
found_blank_line = blank_line_matcher.match(lines[i]) is not None
|
|
284
|
+
self.bulk_names = ["zone"]
|
|
272
285
|
self.bulk_names += lines[i].split()
|
|
273
286
|
i += 1
|
|
274
287
|
self.bulk_data = {}
|
|
275
288
|
temp_data = []
|
|
276
289
|
found_blank_line = False
|
|
277
290
|
while not found_blank_line:
|
|
278
|
-
temp_data.append(
|
|
279
|
-
|
|
291
|
+
temp_data.append(
|
|
292
|
+
[eval(pythonize_number(datum)) for datum in lines[i].split()]
|
|
293
|
+
)
|
|
280
294
|
i += 1
|
|
281
|
-
found_blank_line =
|
|
295
|
+
found_blank_line = blank_line_matcher.match(lines[i]) is not None
|
|
282
296
|
temp_data = np.array(temp_data).T
|
|
283
297
|
for i in range(len(self.bulk_names)):
|
|
284
298
|
self.bulk_data[self.bulk_names[i]] = temp_data[i]
|
|
@@ -352,7 +366,7 @@ class MesaData:
|
|
|
352
366
|
if self.in_data(key):
|
|
353
367
|
return self.bulk_data[key]
|
|
354
368
|
elif self._log_version(key) is not None:
|
|
355
|
-
return 10**self.bulk_data[self._log_version(key)]
|
|
369
|
+
return 10 ** self.bulk_data[self._log_version(key)]
|
|
356
370
|
elif self._ln_version(key) is not None:
|
|
357
371
|
return np.exp(self.bulk_data[self._ln_version(key)])
|
|
358
372
|
elif self._exp10_version(key) is not None:
|
|
@@ -418,7 +432,7 @@ class MesaData:
|
|
|
418
432
|
bool
|
|
419
433
|
True if file is a history file, otherwise False
|
|
420
434
|
"""
|
|
421
|
-
return
|
|
435
|
+
return "model_number" in self.bulk_names
|
|
422
436
|
|
|
423
437
|
def in_header(self, key):
|
|
424
438
|
"""Determine if `key` is an available header data category.
|
|
@@ -486,7 +500,7 @@ class MesaData:
|
|
|
486
500
|
The "logified" version of the key, if available. If unavailable,
|
|
487
501
|
`None`.
|
|
488
502
|
"""
|
|
489
|
-
log_prefixes = [
|
|
503
|
+
log_prefixes = ["log_", "log", "lg_", "lg"]
|
|
490
504
|
for prefix in log_prefixes:
|
|
491
505
|
if self.in_data(prefix + key):
|
|
492
506
|
return prefix + key
|
|
@@ -509,7 +523,7 @@ class MesaData:
|
|
|
509
523
|
The "ln-ified" version of the key, if available. If unavailable,
|
|
510
524
|
`None`.
|
|
511
525
|
"""
|
|
512
|
-
log_prefixes = [
|
|
526
|
+
log_prefixes = ["ln_", "ln"]
|
|
513
527
|
for prefix in log_prefixes:
|
|
514
528
|
if self.in_data(prefix + key):
|
|
515
529
|
return prefix + key
|
|
@@ -531,7 +545,7 @@ class MesaData:
|
|
|
531
545
|
str or `None`
|
|
532
546
|
The linear version of the key, if available. If unavailable, `None`.
|
|
533
547
|
"""
|
|
534
|
-
log_matcher = re.compile(
|
|
548
|
+
log_matcher = re.compile(r"^lo?g_?(.+)")
|
|
535
549
|
matches = log_matcher.match(key)
|
|
536
550
|
if matches is not None:
|
|
537
551
|
groups = matches.groups()
|
|
@@ -555,7 +569,7 @@ class MesaData:
|
|
|
555
569
|
str or `None`
|
|
556
570
|
The linear version of the key, if available. If unavailable, `None`.
|
|
557
571
|
"""
|
|
558
|
-
log_matcher = re.compile(
|
|
572
|
+
log_matcher = re.compile(r"^ln_?(.+)")
|
|
559
573
|
matches = log_matcher.match(key)
|
|
560
574
|
if matches is not None:
|
|
561
575
|
groups = matches.groups()
|
|
@@ -577,9 +591,13 @@ class MesaData:
|
|
|
577
591
|
True if `key` can be mapped to a data type either directly or by
|
|
578
592
|
exponentiating/taking logarithms of existing data types
|
|
579
593
|
"""
|
|
580
|
-
return bool(
|
|
581
|
-
|
|
582
|
-
|
|
594
|
+
return bool(
|
|
595
|
+
self.in_data(key)
|
|
596
|
+
or self._log_version(key)
|
|
597
|
+
or self._ln_version(key)
|
|
598
|
+
or self._exp_version(key)
|
|
599
|
+
or self._exp10_version(key)
|
|
600
|
+
)
|
|
583
601
|
|
|
584
602
|
def data_at_model_number(self, key, m_num):
|
|
585
603
|
"""Return main data at a specific model number (for history files).
|
|
@@ -636,16 +654,23 @@ class MesaData:
|
|
|
636
654
|
data_at_model_number : returns the datum of a specific key a model no.
|
|
637
655
|
"""
|
|
638
656
|
if not self.is_history():
|
|
639
|
-
raise HistoryError(
|
|
640
|
-
|
|
641
|
-
|
|
657
|
+
raise HistoryError(
|
|
658
|
+
"Can't get data at model number " + "because this isn't a history file"
|
|
659
|
+
)
|
|
660
|
+
index = np.where(self.data("model_number") == m_num)[0]
|
|
642
661
|
if len(index) > 1:
|
|
643
|
-
raise ModelNumberError(
|
|
644
|
-
|
|
645
|
-
|
|
662
|
+
raise ModelNumberError(
|
|
663
|
+
"Found more than one entry where model "
|
|
664
|
+
+ "number is "
|
|
665
|
+
+ str(m_num)
|
|
666
|
+
+ " in "
|
|
667
|
+
+ self.file_name
|
|
668
|
+
+ ". Report this."
|
|
669
|
+
)
|
|
646
670
|
elif len(index) == 0:
|
|
647
|
-
raise ModelNumberError(
|
|
648
|
-
|
|
671
|
+
raise ModelNumberError(
|
|
672
|
+
"Couldn't find any entries with model " + "number " + str(m_num) + "."
|
|
673
|
+
)
|
|
649
674
|
elif len(index) == 1:
|
|
650
675
|
return index[0]
|
|
651
676
|
|
|
@@ -670,9 +695,9 @@ class MesaData:
|
|
|
670
695
|
if dbg:
|
|
671
696
|
print("Scrubbing history...")
|
|
672
697
|
to_remove = []
|
|
673
|
-
for i in range(len(self.data(
|
|
674
|
-
smallest_future = np.min(self.data(
|
|
675
|
-
if self.data(
|
|
698
|
+
for i in range(len(self.data("model_number")) - 1):
|
|
699
|
+
smallest_future = np.min(self.data("model_number")[i + 1 :])
|
|
700
|
+
if self.data("model_number")[i] >= smallest_future:
|
|
676
701
|
to_remove.append(i)
|
|
677
702
|
if len(to_remove) == 0:
|
|
678
703
|
if dbg:
|
|
@@ -692,7 +717,6 @@ class MesaData:
|
|
|
692
717
|
|
|
693
718
|
|
|
694
719
|
class MesaProfileIndex:
|
|
695
|
-
|
|
696
720
|
"""Structure containing data from the profile index from MESA output.
|
|
697
721
|
|
|
698
722
|
Reads in data from profile index file from MESA, allowing a mapping from
|
|
@@ -726,7 +750,7 @@ class MesaProfileIndex:
|
|
|
726
750
|
|
|
727
751
|
index_start_line = 2
|
|
728
752
|
index_end = None
|
|
729
|
-
index_names = [
|
|
753
|
+
index_names = ["model_numbers", "priorities", "profile_numbers"]
|
|
730
754
|
|
|
731
755
|
@classmethod
|
|
732
756
|
def set_index_rows(cls, index_start=2, index_end=None):
|
|
@@ -739,11 +763,11 @@ class MesaProfileIndex:
|
|
|
739
763
|
cls.index_names = name_arr
|
|
740
764
|
return name_arr
|
|
741
765
|
|
|
742
|
-
def __init__(self, file_name=join(
|
|
766
|
+
def __init__(self, file_name=join(".", "LOGS", "profiles.index")):
|
|
743
767
|
self.file_name = file_name
|
|
744
768
|
self.index_data = None
|
|
745
|
-
self.model_number_string =
|
|
746
|
-
self.profile_number_string =
|
|
769
|
+
self.model_number_string = ""
|
|
770
|
+
self.profile_number_string = ""
|
|
747
771
|
self.profile_numbers = None
|
|
748
772
|
self.model_numbers = None
|
|
749
773
|
self.read_index()
|
|
@@ -762,13 +786,14 @@ class MesaProfileIndex:
|
|
|
762
786
|
None
|
|
763
787
|
"""
|
|
764
788
|
temp_index_data = np.genfromtxt(
|
|
765
|
-
self.file_name,
|
|
766
|
-
|
|
789
|
+
self.file_name,
|
|
790
|
+
skip_header=MesaProfileIndex.index_start_line - 1,
|
|
791
|
+
dtype=None,
|
|
792
|
+
)
|
|
767
793
|
self.model_number_string = MesaProfileIndex.index_names[0]
|
|
768
794
|
self.profile_number_string = MesaProfileIndex.index_names[-1]
|
|
769
795
|
self.index_data = temp_index_data[np.argsort(temp_index_data[:, 0])]
|
|
770
|
-
self.index_data = dict(zip(MesaProfileIndex.index_names,
|
|
771
|
-
temp_index_data.T))
|
|
796
|
+
self.index_data = dict(zip(MesaProfileIndex.index_names, temp_index_data.T))
|
|
772
797
|
self.profile_numbers = self.data(self.profile_number_string)
|
|
773
798
|
self.model_numbers = self.data(self.model_number_string)
|
|
774
799
|
|
|
@@ -792,8 +817,7 @@ class MesaProfileIndex:
|
|
|
792
817
|
If input key is not a valid column header name.
|
|
793
818
|
"""
|
|
794
819
|
if key not in self.index_names:
|
|
795
|
-
raise KeyError("'" + str(key) + "' is not a column in " +
|
|
796
|
-
self.file_name)
|
|
820
|
+
raise KeyError("'" + str(key) + "' is not a column in " + self.file_name)
|
|
797
821
|
return np.array(self.index_data[key])
|
|
798
822
|
|
|
799
823
|
def have_profile_with_model_number(self, model_number):
|
|
@@ -851,8 +875,9 @@ class MesaProfileIndex:
|
|
|
851
875
|
`model_number`
|
|
852
876
|
"""
|
|
853
877
|
if not (self.have_profile_with_model_number(model_number)):
|
|
854
|
-
raise ProfileError(
|
|
855
|
-
|
|
878
|
+
raise ProfileError(
|
|
879
|
+
"No profile with model number " + str(model_number) + "."
|
|
880
|
+
)
|
|
856
881
|
indices = np.where(self.data(self.model_number_string) == model_number)
|
|
857
882
|
return np.take(self.data(self.profile_number_string), indices[0])[0]
|
|
858
883
|
|
|
@@ -879,10 +904,10 @@ class MesaProfileIndex:
|
|
|
879
904
|
`profile_number`
|
|
880
905
|
"""
|
|
881
906
|
if not (self.have_profile_with_profile_number(profile_number)):
|
|
882
|
-
raise ProfileError(
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
907
|
+
raise ProfileError(
|
|
908
|
+
"No Profile with profile number " + str(profile_number) + "."
|
|
909
|
+
)
|
|
910
|
+
indices = np.where(self.data(self.profile_number_string) == profile_number)
|
|
886
911
|
return np.take(self.data(self.model_number_string), indices[0])[0]
|
|
887
912
|
|
|
888
913
|
def __getattr__(self, method_name):
|
|
@@ -893,7 +918,6 @@ class MesaProfileIndex:
|
|
|
893
918
|
|
|
894
919
|
|
|
895
920
|
class MesaLogDir:
|
|
896
|
-
|
|
897
921
|
"""Structure providing access to both history and profile output from MESA
|
|
898
922
|
|
|
899
923
|
Provides access for accessing the history and profile data of a MESA run
|
|
@@ -963,9 +987,15 @@ class MesaLogDir:
|
|
|
963
987
|
empty if memoization is shut off.
|
|
964
988
|
"""
|
|
965
989
|
|
|
966
|
-
def __init__(
|
|
967
|
-
|
|
968
|
-
|
|
990
|
+
def __init__(
|
|
991
|
+
self,
|
|
992
|
+
log_path="LOGS",
|
|
993
|
+
profile_prefix="profile",
|
|
994
|
+
profile_suffix="data",
|
|
995
|
+
history_file="history.data",
|
|
996
|
+
index_file="profiles.index",
|
|
997
|
+
memoize_profiles=True,
|
|
998
|
+
):
|
|
969
999
|
self.log_path = log_path
|
|
970
1000
|
self.profile_prefix = profile_prefix
|
|
971
1001
|
self.profile_suffix = profile_suffix
|
|
@@ -974,17 +1004,17 @@ class MesaLogDir:
|
|
|
974
1004
|
|
|
975
1005
|
# Check if log_path and files are dir/files.
|
|
976
1006
|
if not os.path.isdir(self.log_path):
|
|
977
|
-
raise BadPathError(self.log_path +
|
|
1007
|
+
raise BadPathError(self.log_path + " is not a valid directory.")
|
|
978
1008
|
|
|
979
1009
|
self.history_path = os.path.join(self.log_path, self.history_file)
|
|
980
1010
|
if not os.path.isfile(self.history_path):
|
|
981
|
-
raise BadPathError(
|
|
982
|
-
|
|
1011
|
+
raise BadPathError(
|
|
1012
|
+
self.history_file + " not found in " + self.log_path + "."
|
|
1013
|
+
)
|
|
983
1014
|
|
|
984
1015
|
self.index_path = os.path.join(self.log_path, self.index_file)
|
|
985
1016
|
if not os.path.isfile(self.index_path):
|
|
986
|
-
raise BadPathError(self.index_file +
|
|
987
|
-
self.log_path + '.')
|
|
1017
|
+
raise BadPathError(self.index_file + " not found in " + self.log_path + ".")
|
|
988
1018
|
|
|
989
1019
|
self.memoize_profiles = memoize_profiles
|
|
990
1020
|
|
|
@@ -1120,9 +1150,10 @@ class MesaLogDir:
|
|
|
1120
1150
|
if to_use in self.profile_dict:
|
|
1121
1151
|
return self.profile_dict[to_use]
|
|
1122
1152
|
|
|
1123
|
-
file_name = join(
|
|
1124
|
-
|
|
1125
|
-
|
|
1153
|
+
file_name = join(
|
|
1154
|
+
self.log_path,
|
|
1155
|
+
(self.profile_prefix + str(to_use) + "." + self.profile_suffix),
|
|
1156
|
+
)
|
|
1126
1157
|
p = MesaData(file_name)
|
|
1127
1158
|
if self.memoize_profiles:
|
|
1128
1159
|
self.profile_dict[to_use] = p
|
|
@@ -1178,8 +1209,7 @@ class MesaLogDir:
|
|
|
1178
1209
|
for m_num in self.model_numbers:
|
|
1179
1210
|
this_input = []
|
|
1180
1211
|
for key in keys:
|
|
1181
|
-
this_input.append(
|
|
1182
|
-
self.history.data_at_model_number(key, m_num))
|
|
1212
|
+
this_input.append(self.history.data_at_model_number(key, m_num))
|
|
1183
1213
|
inputs[m_num] = this_input
|
|
1184
1214
|
mask = np.array([f(*inputs[m_num]) for m_num in self.model_numbers])
|
|
1185
1215
|
return self.model_numbers[mask]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from setuptools import setup
|
|
2
2
|
|
|
3
3
|
setup(name='mesa_reader',
|
|
4
|
-
version='0.3.
|
|
4
|
+
version='0.3.5',
|
|
5
5
|
description='Tools for interacting with output from MESA star and MESA binary',
|
|
6
6
|
long_description=open('README.md').read(),
|
|
7
7
|
long_description_content_type='text/markdown',
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|