tutil.py - pism - [fork] customized build of PISM, the parallel ice sheet model (tillflux branch)
 (HTM) git clone git://src.adamsgaard.dk/pism
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
       tutil.py (3290B)
       ---
            1 # Copyright (C) 2011, 2012, 2013, 2015, 2016, 2018, 2019 David Maxwell and Constantine Khroulev
            2 #
            3 # This file is part of PISM.
            4 #
            5 # PISM is free software; you can redistribute it and/or modify it under the
            6 # terms of the GNU General Public License as published by the Free Software
            7 # Foundation; either version 3 of the License, or (at your option) any later
            8 # version.
            9 #
           10 # PISM is distributed in the hope that it will be useful, but WITHOUT ANY
           11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
           12 # FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
           13 # details.
           14 #
           15 # You should have received a copy of the GNU General Public License
           16 # along with PISM; if not, write to the Free Software
           17 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
           18 
           19 """Utility functions/objects that don't have a good home elsewhere."""
           20 
           21 import PISM
           22 import time
           23 import sys
           24 
           25 def convert(value, u1, u2):
           26     "Convert value from units u1 to u2."
           27     unit_system = PISM.Context().unit_system
           28     return PISM.convert(unit_system, value, u1, u2)
           29 
           30 def prepare_output(filename, append_time=True):
           31     "Create an output file and prepare it for writing."
           32     ctx = PISM.Context()
           33     output = PISM.File(ctx.com,
           34                        filename,
           35                        PISM.string_to_backend(ctx.config.get_string("output.format")),
           36                        PISM.PISM_READWRITE_MOVE,
           37                        ctx.ctx.pio_iosys_id())
           38     PISM.define_time(output,
           39                      ctx.config.get_string("time.dimension_name"),
           40                      ctx.config.get_string("time.calendar"),
           41                      ctx.time.units_string(),
           42                      ctx.unit_system)
           43     if append_time:
           44         PISM.append_time(output,
           45                          ctx.config.get_string("time.dimension_name"),
           46                          ctx.time.current())
           47 
           48     return output
           49 
           50 def writeProvenance(outfile, message=None):
           51     """Saves the time and command line arguments (or the provided `message`) to
           52     the ``history`` attribute of the :file:`.nc` file `outfile`"""
           53 
           54     com = PISM.Context().com
           55 
           56     ds = PISM.File(com, outfile, PISM.PISM_NETCDF3, PISM.PISM_READWRITE)
           57 
           58     if message is None:
           59         message = PISM.timestamp(com) + ": " + PISM.args_string()
           60     ds.append_history(message)
           61     ds.write_attribute("PISM_GLOBAL", "source", "PISM " + PISM.revision)
           62 
           63     ds.close()
           64 
           65 
           66 def fileHasVariable(filename, varname):
           67     """Returns ``True`` if the :file:`.nc` file `filename` contains an variable named `varname`."""
           68 
           69     return PISM.File(PISM.Context().com, filename,
           70                      PISM.PISM_NETCDF3, PISM.PISM_READONLY).find_variable(varname)
           71 
           72 # The following was copied from matplotlib, which copied a python recipe.
           73 
           74 
           75 class Bunch(dict):
           76 
           77     """
           78     Often we want to just collect a bunch of stuff together, naming each
           79     item of the bunch; a dictionary's OK for that, but a small do- nothing
           80     class is even handier, and prettier to use.  Whenever you want to
           81     group a few variables:
           82 
           83       >>> point = Bunch(datum=2, squared=4, coord=12)
           84       >>> point.datum
           85       By: Alex Martelli
           86       From: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52308"""
           87 
           88     def __init__(self,**kw):
           89         dict.__init__(self,kw)
           90         self.__dict__ = self