readers.py Source File


Contents

Source Code


Source Code

#
#  readers.py
#  This file is part of ISOFT.
#  
#  Copyright 2017 Chris MacMackin <cmacmackin@gmail.com>
#  
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 3 of the License, or
#  (at your option) any later version.
#  
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#  
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#  

'''
Contains classes for reading simulation data from HDF5 files.
'''

import h5py
import numpy as np

class Glacier(object):
    '''A class which reads glacier data from HDF5 output. It presents
    the data in a convenient manner for plotting.

    hdf_obj
        An HDF5 file or group.
    hdf_group
        The name of the group in `hdf_obj` which contains the ice shelf 
        data.
    '''

    def __init__(self, hdf_obj, hdf_group):
        self.groupname = hdf_group
        self.data = hdf_obj[hdf_group]
    
    @property
    def grid(self):
        return self.data[self.data['thickness'].attrs['gridpoints_dim1']][...]

    @property
    def h(self):
        return self.data['thickness'][...]

    @property
    def uvec(self):
        return self.data['velocity'][...].T

    @property
    def u(self):
        return self.uvec[0,...]

    @property
    def v(self):
        return self.uvec[1,...]

    @property
    def kappa(self):
        n = self.data.attrs['num_kappas']
        kap = np.empty((n, self.data['thickness'].len()))
        for i in range(n):
            kap[i,:] = self.data['kappa_{0:04d}'.format(i+1)][...]
        return kap

    @property
    def glacier_type(self):
        return self.data.attrs['glacier_type']

    @property
    def lambd(self):
        return self.data.attrs['lambda'][0]

    @property
    def chi(self):
        return self.data.attrs['chi'][0]


class Plume(object):
    '''A class which reads Plume data from HDF5 output. It presents
    the data in a convenient manner for plotting.

    hdf_obj
        An HDF5 file or group.
    hdf_group
        The name of the group in `hdf_obj` which contains the ice shelf 
        data.
    '''

    def __init__(self, hdf_obj, hdf_group):
        self.groupname = hdf_group
        self.data = hdf_obj[hdf_group]
    
    @property
    def grid(self):
        return self.data[self.data['thickness'].attrs['gridpoints_dim1']][...]

    @property
    def D(self):
        return self.data['thickness'][...]

    @property
    def Uvec(self):
        return self.data['velocity'][...].T

    @property
    def U(self):
        return self.Uvec[...,0]

    @property
    def V(self):
        return self.Uvec[...,1]

    @property
    def S(self):
        return self.data['salinity'][...]

    @property
    def T(self):
        return self.data['temperature'][...]

    @property
    def basal_surface_type(self):
        return self.data.attrs['basal_type']

    @property
    def delta(self):
        return self.data.attrs['delta'][0]

    @property
    def mu(self):
        return self.data.attrs['mu'][0]

    @property
    def nu(self):
        return self.data.attrs['nu'][0]

    @property
    def r(self):
        return self.data.attrs['r_val'][0]

    @property
    def phi(self):
        return self.data.attrs['phi'][0]


class ShelfPlumeCryosphere(object):
    '''An abstract class which represents a Cryosphere object containing
    at least one glacier and one basal surface.
    
    hdf_file
        The HDF5 file containing the ice shelf/plume data.
    '''
    def __init__(self, hdf_file):
        self.filename = hdf_file
        self.data = h5py.File(hdf_file, 'r')
        self.shelf = Glacier(self.data, 'glacier')
        self.plume = Plume(self.data, 'basal_surface')

    @property
    def isoft_version(self):
        return self.data.attrs['isoft_version']

    @property
    def compilation_time(self):
        return self.data.attrs['binary_compilation_time']

    @property
    def output_time(self):
        return self.data.attrs['data_output_time']

    @property
    def time(self):
        return self.data.attrs['simulation_time'][0]

    @property
    def grid(self):
        return self.shelf.grid

    @property
    def h(self):
        return self.shelf.h

    @property
    def uvec(self):
        return self.shelf.uvec

    @property
    def u(self):
        return self.shelf.u

    @property
    def v(self):
        return self.shelf.v

    @property
    def kappa(self):
        return self.shelf.kappa

    @property
    def glacier_type(self):
        return self.shelf.glacier_type
    
    @property
    def lambd(self):
        return self.shelf.lambd

    @property
    def chi(self):
        return self.shelf.chi

    @property
    def s(self):
        return self.h*(1.0 - 1.0/self.r)

    @property
    def b(self):
        return -self.h/self.r

    @property
    def D(self):
        return self.plume.D

    @property
    def Uvec(self):
        return self.plume.Uvec

    @property
    def U(self):
        return self.plume.U

    @property
    def V(self):
        return self.plume.V

    @property
    def S(self):
        return self.plume.S

    @property
    def T(self):
        return self.plume.T

    @property
    def basal_surface_type(self):
        return self.plume.basal_surface_type

    @property
    def delta(self):
        return self.plume.delta

    @property
    def mu(self):
        return self.plume.mu

    @property
    def nu(self):
        return self.plume.nu

    @property
    def r(self):
        return self.plume.r

    @property
    def phi(self):
        return self.plume.phi