|
|
@ -14,6 +14,63 @@ import sys |
|
|
|
|
|
|
|
|
|
|
|
from wpylib.sugar import ifelse |
|
|
|
from wpylib.sugar import ifelse |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class fortran_types(object): |
|
|
|
|
|
|
|
"""A description of Fortran data types. |
|
|
|
|
|
|
|
Useful for estimating memory use, file sizes, etc.""" |
|
|
|
|
|
|
|
desc = { |
|
|
|
|
|
|
|
numpy.int32: dict( |
|
|
|
|
|
|
|
size=4, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
numpy.int64: dict( |
|
|
|
|
|
|
|
size=8, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
numpy.float32: dict( # IEEE single precision |
|
|
|
|
|
|
|
size=4, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
numpy.float64: dict( # IEEE double precision |
|
|
|
|
|
|
|
size=8, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
numpy.complex64: dict( # Fortran 90 complex(4) |
|
|
|
|
|
|
|
size=8, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
numpy.complex128: dict( # Fortran 90 complex(8) |
|
|
|
|
|
|
|
size=16, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
# defaults: ok for "LP64" systems or typical 32-bit systems |
|
|
|
|
|
|
|
desc[int] = desc[numpy.int32] |
|
|
|
|
|
|
|
desc[float] = desc[numpy.float64] |
|
|
|
|
|
|
|
desc[complex] = desc[numpy.complex128] |
|
|
|
|
|
|
|
record_marker_size = 4 # size for a record marker (2x this for a record) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# special data types |
|
|
|
|
|
|
|
class fortran_dtype(object): |
|
|
|
|
|
|
|
"""Base class for all special Fortran data types.""" |
|
|
|
|
|
|
|
pass |
|
|
|
|
|
|
|
class character(object): |
|
|
|
|
|
|
|
"""Fortran fixed-width character string.""" |
|
|
|
|
|
|
|
def __init__(self, len): |
|
|
|
|
|
|
|
self.len = len |
|
|
|
|
|
|
|
@property |
|
|
|
|
|
|
|
def size(self): |
|
|
|
|
|
|
|
return self.len |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def size(self, dtype): |
|
|
|
|
|
|
|
"""Computes the size of a single datatype.""" |
|
|
|
|
|
|
|
if isinstance(dtype, self.fortran_dtype): |
|
|
|
|
|
|
|
return dtype.size() |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
return self.desc[dtype]['size'] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def file_rec_size(self, dtypes): |
|
|
|
|
|
|
|
"""Computes the size of a record on disk.""" |
|
|
|
|
|
|
|
return sum([ self.size(d) for d in dtypes ]) + 2 * self.record_marker_size |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def file_data_size(self, recs): |
|
|
|
|
|
|
|
"""Computes the size of a sequence of records on disk.""" |
|
|
|
|
|
|
|
return sum([ self.file_rec_size(r) for r in recs ]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class fortran_bin_file(object): |
|
|
|
class fortran_bin_file(object): |
|
|
|
"""A tool for reading and writing Fortran binary files. |
|
|
|
"""A tool for reading and writing Fortran binary files. |
|
|
|
|
|
|
|
|
|
|
|