Source code for PseudoNetCDF.camxfiles.wind.Write

__all__ = ['write_wind']
__doc__ = """
.. _Write
:mod:`Write` -- CAMx wind writer
============================================

.. module:: Write
   :platform: Unix, Windows
   :synopsis: Provides :ref:`PseudoNetCDF` writer for CAMx
              wind files.  See PseudoNetCDF.sci_var.PseudoNetCDFFile
              for interface details
.. moduleauthor:: Barron Henderson <barronh@unc.edu>
"""

import numpy as np

# This Package modules
from PseudoNetCDF.camxfiles.timetuple import timeadd, timerange
from PseudoNetCDF.camxfiles.FortranFileUtil import writeline
from PseudoNetCDF._getwriter import registerwriter

"""
hour,idate,lstagger
Loop from 1 to nlay layers:
    ((uwind(i,j,k),i=1,nx),j=1,ny)
    ((vwind(i,j,k),i=1,nx),j=1,ny)
((dummy,i=1,nx),j=1,ny)
"""


[docs] def ncf2wind(ncffile, outpath, tflag='TFLAG'): outfile = open(outpath, 'wb') varkeys = [vk for vk in ['U', 'V'] if vk in ncffile.variables.keys()] nzcl = len(ncffile.dimensions['LAY']) for di, (d, t) in enumerate(ncffile.variables[tflag][:, 0, :]): t = np.array(t // 100, ndmin=1).astype('>f') d = np.array(d, ndmin=1).astype('>i') d = (d % (d // 100000 * 100000)).astype('>i') lstag = ncffile.LSTAGGER buf = np.array([12], dtype='>i').tobytes() outfile.write(buf + t.tobytes() + d.tobytes() + lstag.tobytes() + buf) for zi in range(nzcl): for varkey in varkeys: vals = ncffile.variables[varkey][di, zi].astype('>f') buf = np.array([(vals.size) * 4], ndmin=1).astype('>i').tobytes() outfile.write(buf) vals.tofile(outfile) outfile.write(buf) vals = np.array(0, dtype='>i') buf = np.array([(vals.size) * 4], ndmin=1).astype('>i').tobytes() outfile.write(buf) vals.astype('>f').tofile(outfile) outfile.write(buf) outfile.flush() return outfile
registerwriter('camxfiles.wind', ncf2wind) registerwriter('wind', ncf2wind)
[docs] def write_wind(sdate, stime, time_step, vals, lstagger=None): """ Takes an iterable and some defining information and creates a CAMx read wind file sdate - integer start date stime - float start time time_step - float increment between times vals - array axes time,uv,xy,z """ wind_string = "" edate, etime = timeadd((sdate, stime), (0, vals.shape[0] * time_step)) for i, (d, t) in enumerate(timerange((sdate, stime), (edate, etime), time_step)): if lstagger is not None: wind_string += writeline((t, d, lstagger), "fii") else: wind_string += writeline((t, d), "fi") for k in range(vals.shape[-1]): for uv in range(2): wind_string += writeline(vals[i, uv, ..., k], "f" * vals.shape[-2]) wind_string += writeline((0,), "i") return wind_string