Beispiel #1
0
def generate_pism_input(x, y, xx, yy):
    stderr.write("calling exactP_list() ...\n")

    EPS_ABS = 1.0e-12
    EPS_REL = 1.0e-15

    # Wrapping r[:]['r'] in np.array() forces NumPy to make a C-contiguous copy.
    h_r, magvb_r, _, W_r, P_r = exactP_list(np.array(r[:]['r']), EPS_ABS, EPS_REL, 1)

    stderr.write("creating gridded variables ...\n")
    # put on grid
    h = np.zeros_like(xx)
    W = np.zeros_like(xx)
    P = np.zeros_like(xx)

    magvb = np.zeros_like(xx)
    ussa = np.zeros_like(xx)
    vssa = np.zeros_like(xx)

    for n, pt in enumerate(r):
        j = pt['j']
        k = pt['k']
        h[j, k] = h_r[n]         # ice thickness in m
        magvb[j, k] = magvb_r[n]  # sliding speed in m s-1
        ussa[j, k], vssa[j, k] = radially_outward(magvb[j, k], xx[j, k], yy[j, k])
        W[j, k] = W_r[n]         # water thickness in m
        P[j, k] = P_r[n]         # water pressure in Pa

    stderr.write("creating inputforP.nc ...\n")

    nc = PISMDataset("inputforP.nc", 'w')
    nc.create_dimensions(x, y, time_dependent=True, use_time_bounds=True)

    nc.define_2d_field("thk", time_dependent=False,
                       attrs={"long_name": "ice thickness",
                              "units": "m",
                              "valid_min": 0.0,
                              "standard_name": "land_ice_thickness"})
    nc.define_2d_field("topg", time_dependent=False,
                       attrs={"long_name": "bedrock topography",
                              "units": "m",
                              "standard_name": "bedrock_altitude"})
    nc.define_2d_field("climatic_mass_balance", time_dependent=False,
                       attrs={"long_name": "climatic mass balance for -surface given",
                              "units": "kg m-2 year-1",
                              "standard_name": "land_ice_surface_specific_mass_balance"})
    nc.define_2d_field("ice_surface_temp", time_dependent=False,
                       attrs={"long_name": "ice surface temp (K) for -surface given",
                              "units": "Kelvin",
                              "valid_min": 0.0})
    nc.define_2d_field("bmelt", time_dependent=False,
                       attrs={"long_name": "basal melt rate",
                              "units": "m year-1",
                              "standard_name": "land_ice_basal_melt_rate"})

    nc.define_2d_field("bwat", time_dependent=False,
                       attrs={"long_name": "thickness of basal water layer",
                              "units": "m",
                              "valid_min": 0.0})
    nc.define_2d_field("bwp", time_dependent=False,
                       attrs={"long_name": "water pressure in basal water layer",
                              "units": "Pa",
                              "valid_min": 0.0})

    nc.define_2d_field("bc_mask", time_dependent=False,
                       attrs={"long_name": "if =1, apply u_ssa_bc and v_ssa_bc as sliding velocity"})
    nc.define_2d_field("u_ssa_bc", time_dependent=False,
                       attrs={"long_name": "x-component of prescribed sliding velocity",
                              "units": "m s-1"})
    nc.define_2d_field("v_ssa_bc", time_dependent=False,
                       attrs={"long_name": "y-component of prescribed sliding velocity",
                              "units": "m s-1"})

    Phi0 = 0.20                           # 20 cm/year basal melt rate
    T_surface = 260                       # ice surface temperature, K

    variables = {"topg": np.zeros_like(xx),
                 "climatic_mass_balance": np.zeros_like(xx),
                 "ice_surface_temp": np.ones_like(xx) + T_surface,
                 "bmelt": np.zeros_like(xx) + Phi0,
                 "thk": h,
                 "bwat": W,
                 "bwp": P,
                 "bc_mask": np.ones_like(xx),
                 "u_ssa_bc": ussa,
                 "v_ssa_bc": vssa}

    for name in variables.keys():
        nc.write(name, variables[name])

    nc.history = subprocess.list2cmdline(argv)
    nc.close()
    stderr.write("NetCDF file %s written\n" % "inputforP.nc")
Beispiel #2
0
def generate_pism_input(x, y, xx, yy):
    stderr.write("calling exactP() ...\n")

    EPS_ABS = 1.0e-12
    EPS_REL = 1.0e-15

    p = exactP(r[:]['r'], EPS_ABS, EPS_REL, 1)
    h_r, magvb_r, W_r, P_r = p.h, p.magvb, p.W, p.P

    stderr.write("creating gridded variables ...\n")
    # put on grid
    h = np.zeros_like(xx)
    W = np.zeros_like(xx)
    P = np.zeros_like(xx)

    magvb = np.zeros_like(xx)
    ussa = np.zeros_like(xx)
    vssa = np.zeros_like(xx)

    for n, pt in enumerate(r):
        j = pt['j']
        k = pt['k']
        h[j, k] = h_r[n]  # ice thickness in m
        magvb[j, k] = magvb_r[n]  # sliding speed in m s-1
        ussa[j, k], vssa[j, k] = radially_outward(magvb[j, k], xx[j, k], yy[j,
                                                                            k])
        W[j, k] = W_r[n]  # water thickness in m
        P[j, k] = P_r[n]  # water pressure in Pa

    stderr.write("creating inputforP.nc ...\n")

    nc = PISMDataset("inputforP.nc", 'w')
    nc.create_dimensions(x, y, time_dependent=True, use_time_bounds=True)

    nc.define_2d_field("thk",
                       time_dependent=False,
                       attrs={
                           "long_name": "ice thickness",
                           "units": "m",
                           "valid_min": 0.0,
                           "standard_name": "land_ice_thickness"
                       })
    nc.define_2d_field("topg",
                       time_dependent=False,
                       attrs={
                           "long_name": "bedrock topography",
                           "units": "m",
                           "standard_name": "bedrock_altitude"
                       })
    nc.define_2d_field("climatic_mass_balance",
                       time_dependent=False,
                       attrs={
                           "long_name":
                           "climatic mass balance for -surface given",
                           "units":
                           "kg m-2 year-1",
                           "standard_name":
                           "land_ice_surface_specific_mass_balance"
                       })
    nc.define_2d_field("ice_surface_temp",
                       time_dependent=False,
                       attrs={
                           "long_name":
                           "ice surface temp (K) for -surface given",
                           "units": "Kelvin",
                           "valid_min": 0.0
                       })
    nc.define_2d_field("bmelt",
                       time_dependent=False,
                       attrs={
                           "long_name": "basal melt rate",
                           "units": "m year-1",
                           "standard_name": "land_ice_basal_melt_rate"
                       })

    nc.define_2d_field("bwat",
                       time_dependent=False,
                       attrs={
                           "long_name": "thickness of basal water layer",
                           "units": "m",
                           "valid_min": 0.0
                       })
    nc.define_2d_field("bwp",
                       time_dependent=False,
                       attrs={
                           "long_name": "water pressure in basal water layer",
                           "units": "Pa",
                           "valid_min": 0.0
                       })

    nc.define_2d_field(
        "vel_bc_mask",
        time_dependent=False,
        attrs={"long_name": "if =1, apply u_bc and v_bc as sliding velocity"})
    nc.define_2d_field("u_bc",
                       time_dependent=False,
                       attrs={
                           "long_name":
                           "x-component of prescribed sliding velocity",
                           "units": "m s-1"
                       })
    nc.define_2d_field("v_bc",
                       time_dependent=False,
                       attrs={
                           "long_name":
                           "y-component of prescribed sliding velocity",
                           "units": "m s-1"
                       })

    Phi0 = 0.20  # 20 cm/year basal melt rate
    T_surface = 260  # ice surface temperature, K

    variables = {
        "topg": np.zeros_like(xx),
        "climatic_mass_balance": np.zeros_like(xx),
        "ice_surface_temp": np.ones_like(xx) + T_surface,
        "bmelt": np.zeros_like(xx) + Phi0,
        "thk": h,
        "bwat": W,
        "bwp": P,
        "vel_bc_mask": np.ones_like(xx),
        "u_bc": ussa,
        "v_bc": vssa
    }

    for name in list(variables.keys()):
        nc.write(name, variables[name])

    nc.history = subprocess.list2cmdline(argv)
    nc.close()
    stderr.write("NetCDF file %s written\n" % "inputforP.nc")
Beispiel #3
0
# make the bed deep everywhere except in icy areas, where it is barely
# grounded
z = np.zeros_like(xx) - 1000.0
z[thk > 0] = -(910.0 / 1028.0) * 100.0 + 1

# Velocity Dirichlet B.C.:
ubar = np.zeros_like(thk)
vbar = np.zeros_like(thk)
vbar[bc_mask == 1] = 100.0

try:
    nc = NC(options.output, 'w')

    nc.create_dimensions(x, y, time_dependent=False)

    nc.define_2d_field("topg", attrs={"units": "m",
                                      "long_name": "bedrock topography"})
    nc.define_2d_field("thk", attrs={"units": "m",
                                     "long_name": "ice thickness"})

    nc.define_2d_field("climatic_mass_balance", attrs={"units": "kg m-2 year-1"})
    nc.define_2d_field("ice_surface_temp", attrs={"units": "Celsius"})

    nc.define_2d_field("u_ssa_bc", attrs={"units": "m/year"})
    nc.define_2d_field("v_ssa_bc", attrs={"units": "m/year"})
except:
    nc = NC(options.output, 'a')

nc.write("topg", z)
nc.write("thk", thk)
nc.write("climatic_mass_balance", np.zeros_like(xx))
nc.write("ice_surface_temp", np.zeros_like(xx) - 30.0)  # irrelevant
Beispiel #4
0
def vel_mosaic2netcdf(filename_base, output_filename):
    files = []
    for (short_name, long_name) in [("vx", "ice surface velocity in the X direction"),
                                    ("vy", "ice surface velocity in the Y direction"),
                                    ("ex",
                                     "error estimates for the X-component of the ice surface velocity"),
                                    ("ey",
                                     "error estimates for the Y-component of the ice surface velocity"),
                                    ]:

        try:
            os.stat(filename_base + "." + short_name)
            entry = ("%s.%s" %(filename_base,short_name), short_name, long_name)
            files.append(entry)
        except:
            print "Missing %s.%s. If this file ends with ex or ey the script will work just fine" %(filename_base, short_name)

    grid = np.loadtxt(filename_base + ".vx.geodat", skiprows=1, comments="&")
    
    shape = (int(grid[0,1]), int(grid[0,0]))
    x0 = grid[2,0] * 1e3
    y0 = grid[2,1] * 1e3
    dx = grid[1,0]
    dy = grid[1,1]
    x1 = x0 + (shape[1] - 1) * dx
    y1 = y0 + (shape[0] - 1) * dx
    x = np.linspace(x0, x1, shape[1])
    y = np.linspace(y0, y1, shape[0])
    
    nc = NC("%s.nc" % output_filename, 'w')
    nc.create_dimensions(x, y)
    
    for (filename, short_name, long_name) in files:
        
        nc.define_2d_field(short_name, time_dependent = False, nc_type='f4',
                           attrs = {"long_name"   : long_name,
                                    "comment"     : "Downloaded from %s" % (ftp_url + filename),
                                    "units"       : "m / year",
                                    "mapping"     : "mapping",
                                    "_FillValue"  : -2e+9})
        
        var = np.fromfile(filename, dtype=">f4", count=-1)
        
        nc.write_2d_field(short_name, var)
        
    # Add a mask that shows where observations are present 
    if options.add_mask == True:
        nc.define_2d_field("vel_surface_mask", time_dependent = False, nc_type='i',
                           attrs = {"long_name"   : "Mask observations; 1 where surface vel. available",
                                    "comment"     : "Used as vel_misfit_weight in inversion for tauc",
                                    "units"       : "",
                                    "mapping"     : "mapping",
                                    "_FillValue"  : 0})
        var = np.fromfile(filename_base + ".vx", dtype=">f4", count=-1)
        mask = var/var
        mask[var == -2e9] = 0.
        nc.write_2d_field("vel_surface_mask", mask)

    mapping = nc.createVariable("mapping", 'c')
    mapping.grid_mapping_name = "polar_stereographic"
    mapping.standard_parallel = 70.0
    mapping.latitude_of_projection_origin = 90.0
    mapping.straight_vertical_longitude_from_pole = -45.0
    mapping.ellipsoid = "WGS84"
    
    nc.Conventions = "CF-1.4"
    nc.projection = "+proj=stere +ellps=WGS84 +datum=WGS84 +lon_0=-45 +lat_0=90 +lat_ts=70 +units=m"
    nc.reference  = "Joughin, I., B. Smith, I. Howat, and T. Scambos. 2010. MEaSUREs Greenland Ice Velocity Map from InSAR Data. Boulder, Colorado, USA: National Snow and Ice Data Center. Digital media."
    nc.title      = "MEaSUREs Greenland Ice Velocity Map from InSAR Data"
    
    from time import asctime
    import sys
    separator = ' '
    historystr = "%s: %s\n" % (asctime(), separator.join(sys.argv))
    nc.history = historystr
    
    nc.close()
Beispiel #5
0
    for j in xrange(1,shape[0]-1):
        for i in xrange(1,shape[1]-1):
            if data[j,i] == fill_value:
                data[j,i] = fix_a_hole(i, j)

fill_holes(usurf)

x = np.linspace(-890500., 1720500., shape[1])
y = np.linspace(-628500., -3410500., shape[0])

nc = NC("NSIDC_Greenland_1km.nc", 'w')
nc.create_dimensions(x, y)
nc.define_2d_field("usurf", time_dependent = False, nc_type='i',
                   attrs = {"long_name"   : "upper surface elevation DEM",
                            "comment"     : "Downloaded from %s" % (ftp_url),
                            "units"       : "cm",
                            "valid_min"   : 0.0,
                            "mapping"     : "mapping",
                            "_FillValue"   : -1})
nc.write_2d_field("usurf", usurf)

nc.define_2d_field("dist", time_dependent = False, nc_type='i',
                   attrs = {"long_name"   : "Mean distance from contributing GLAS data for each grid cell",
                            "comment"     : "Downloaded from %s" % (ftp_url),
                            "units"       : "mm",
                            "valid_min"   : 0.0,
                            "mapping"     : "mapping"})
nc.write_2d_field("dist", dist)

mapping = nc.createVariable("mapping", 'c')
mapping.grid_mapping_name = "polar_stereographic"
Beispiel #6
0
shape = (1740, 1860)

x0 = -2443456.992
y0 = -2493592.067
dx = 1250.0
dy = 1250.0
x1 = x0 + (shape[1] - 1) * dx
y1 = y0 + (shape[0] - 1) * dx
x = np.linspace(x0, x1, shape[1])
y = np.linspace(y1, y0, shape[0])

nc = NC("Greenland_Land_Surface_Mask.nc", 'w')
nc.create_dimensions(x, y)
nc.define_2d_field("mask", time_dependent = False, nc_type='f',
                   attrs = {"long_name"   : "land surface classification mask",
                            "comment"     : "Downloaded from %s" % (http_url + filename),
                            "mapping"     : "mapping"})
nc.write_2d_field("mask", mask)

mapping = nc.createVariable("mapping", 'c')
mapping.grid_mapping_name = "lambert_azimuthal_equal_area"
mapping.longitude_of_projection_origin = 0.0
mapping.latitude_of_projection_origin = 90.0
mapping.false_easting = 0.0
mapping.false_northing = 0.0
mapping.ellipsoid = "sphere"

nc.Conventions = "CF-1.4"
nc.title = "Greenland Land Surface Classification Mask"
nc.source = "J. Box and others, Byrd Polar Research Center, http://bprc.osu.edu/wiki/Jason_Box_Datasets#Greenland_Land_Surface_Classification_Mask"
nc.projection = "+proj=laea +ellps=sphere +lon_0=0 +lat_0=90.0 +x_0=0.0 +y_0=0.0 +units=m"
Beispiel #7
0
dy = grid[1,1]
x1 = x0 + (shape[1] - 1) * dx
y1 = y0 + (shape[0] - 1) * dx
x = np.linspace(x0, x1, shape[1])
y = np.linspace(y0, y1, shape[0])

nc = NC("%Greenland_Average_%s.nc" % (output_dir,years), 'w')
nc.create_dimensions(x, y)

for (filename, short_name, long_name) in [(vx_filename, "vx", "ice surface velocity in the X direction"),
                                          (vy_filename, "vy", "ice surface velocity in the Y direction"),
                                          ]:

    nc.define_2d_field(short_name, time_dependent = False, nc_type='f4',
                       attrs = {"long_name"   : long_name,
                                "comment"     : "Data directly received from Ian Joughin stored on marmaduke.gi.alaska.edu",
                                "units"       : "m / year",
                                "mapping"     : "mapping",
                                "_FillValue"  : -2e+9})

    var = np.fromfile(filename, dtype=">f4", count=-1)

    nc.write_2d_field(short_name, var)

# Add a mask that shows where observations are present 
if options.add_mask == True:
    nc.define_2d_field("vel_surface_mask", time_dependent = False, nc_type='i',
                       attrs = {"long_name"   : "Mask observations; 1 where surface vel. available",
                                "comment"     : "Used as vel_misfit_weight in inversion for tauc",
                                "units"       : "",
                                "mapping"     : "mapping",
                                "_FillValue"  : 0})
Beispiel #8
0
except:
    print("can't open file %s for writing" % outname)
    exit(1)

print("  writing x,y ...")
dx = 1000.0
dy = 1000.0
x = np.linspace(0.0, (N - 1) * dx, N)
y = np.linspace(0.0, (N - 1) * dy, N)
nc.create_dimensions(x, y, time_dependent=False)

print("  writing topg ...")
nc.define_2d_field("topg",
                   time_dependent=False,
                   attrs={
                       "long_name": "elevation of bedrock",
                       "valid_range": (-9000.0, 9000.0),
                       "standard_name": "bedrock_altitude",
                       "units": "meters"
                   })
nc.write_2d_field("topg", bed)

print("  writing thk ...")
nc.define_2d_field("thk",
                   time_dependent=False,
                   attrs={
                       "long_name": "thickness of ice sheet or ice shelf",
                       "valid_range": (0.0, 9000.0),
                       "standard_name": "land_ice_thickness",
                       "units": "meters"
                   })
nc.write_2d_field("thk", thk)
Beispiel #9
0
    nc = PNC(outname, 'w', format='NETCDF3_CLASSIC')
except:
    print("can't open file %s for writing" % outname)
    exit(1)

print("  writing x,y ...")
dx = 1000.0
dy = 1000.0
x = np.linspace(0.0, (N - 1) * dx, N)
y = np.linspace(0.0, (N - 1) * dy, N)
nc.create_dimensions(x, y, time_dependent=False)

print("  writing topg ...")
nc.define_2d_field("topg", time_dependent=False,
                   attrs={"long_name": "elevation of bedrock",
                          "valid_range": (-9000.0, 9000.0),
                          "standard_name": "bedrock_altitude",
                          "units": "meters"})
nc.write_2d_field("topg", bed)

print("  writing thk ...")
nc.define_2d_field("thk", time_dependent=False,
                   attrs={"long_name": "thickness of ice sheet or ice shelf",
                          "valid_range": (0.0, 9000.0),
                          "standard_name": "land_ice_thickness",
                          "units": "meters"})
nc.write_2d_field("thk", thk)

nc.close()
print("done")
Beispiel #10
0
z = np.zeros_like(xx) - 1000.0
z[thk > 0] = -(910.0 / 1028.0) * 100.0 + 1

# Velocity Dirichlet B.C.:
ubar = np.zeros_like(thk)
vbar = np.zeros_like(thk)
vbar[bc_mask == 1] = 100.0

try:
    nc = NC(options.output, 'w')

    nc.create_dimensions(x, y, time_dependent=False)

    nc.define_2d_field("topg",
                       attrs={
                           "units": "m",
                           "long_name": "bedrock topography"
                       })
    nc.define_2d_field("thk",
                       attrs={
                           "units": "m",
                           "long_name": "ice thickness"
                       })

    nc.define_2d_field("climatic_mass_balance",
                       attrs={"units": "kg m-2 year-1"})
    nc.define_2d_field("ice_surface_temp", attrs={"units": "Celsius"})

    nc.define_2d_field("u_ssa_bc", attrs={"units": "m/year"})
    nc.define_2d_field("v_ssa_bc", attrs={"units": "m/year"})
except:
Beispiel #11
0
def grid2netcdf(filename_base, output_filename):
    print "Reading txt files with data ..."
    x, y, topg, fill_value = readComposite("%sbottom.txt" % filename_base)
    x, y, thk, fill_value = readComposite("%sthickness.txt" % filename_base)
    x, y, usurf, fill_value = readComposite("%ssurface.txt" % filename_base)

    nc = NC("%s.nc" % output_filename, "w")
    nc.create_dimensions(x, y)

    names = []
    for (short_name, long_name) in [
        ("topg", "bedrock surface elevation"),
        ("thk", "land ice thickness"),
        ("usurf", "ice upper surface elevation"),
    ]:
        entry = (short_name, long_name)
        names.append(entry)

    var = [topg, thk, usurf]
    for i, (short_name, long_name) in enumerate(names):
        nc.define_2d_field(
            short_name,
            time_dependent=False,
            nc_type="f4",
            attrs={
                "long_name": long_name,
                "comment": "Downloaded from ftp://data.cresis.ku.edu/data/grids/Jakobshavn_2006_2012_Composite.zip",
                "units": "m",
                "mapping": "mapping",
                "_FillValue": fill_value,
            },
        )

        nc.write_2d_field(short_name, var[i])

    # Add a mask that shows where observations are present
    nc.define_2d_field(
        "obs_mask",
        time_dependent=False,
        nc_type="i",
        attrs={
            "long_name": "Mask observations; 1 where observations available",
            "units": "",
            "mapping": "mapping",
            "_FillValue": 0,
        },
    )
    mask = np.ones(thk.shape)
    mask[thk == fill_value] = 0.0
    nc.write_2d_field("obs_mask", mask)

    mapping = nc.createVariable("mapping", "c")
    mapping.grid_mapping_name = "polar_stereographic"
    mapping.standard_parallel = 70.0
    mapping.latitude_of_projection_origin = 90.0
    mapping.straight_vertical_longitude_from_pole = -45.0
    mapping.ellipsoid = "WGS84"

    nc.Conventions = "CF-1.4"
    nc.projection = "+proj=stere +ellps=WGS84 +datum=WGS84 +lon_0=-45 +lat_0=90 +lat_ts=70 +units=m"
    nc.reference = "Gogineni, Prasad. 2012. CReSIS Radar Depth Sounder Data, Lawrence, Kansas, USA. Digital Media. http://data.cresis.ku.edu"
    nc.title = "CReSIS Gridded Depth Sounder Data for Jakobshavn, Greenland"
    nc.acknowledgement = "We acknowledge the use of data and/or data products from CReSIS generated with support from NSF grant ANT-0424589 and NASA grant NNX10AT68G"

    from time import asctime
    import sys

    separator = " "
    historystr = "%s: %s\n" % (asctime(), separator.join(sys.argv))
    nc.history = historystr
    print "Done writing %s.nc ..." % output_filename

    nc.close()

    # Run nc2cdo to add lat/lon
    print "Adding lat/lon by running nc2cdo.py ..."
    os.system("nc2cdo.py %s.nc" % output_filename)
Beispiel #12
0
else:
    print "Please select --antarctica or --greenland."
    import sys
    sys.exit(1)

p = Proj(projection)

ee,nn   = np.meshgrid(x,y)
lon,lat = p(ee, nn, inverse=True)

nc = NC(options.output[0], 'w')

nc.create_dimensions(x, y, time_dependent = False)

nc.define_2d_field("lon",
                   attrs={"long_name" : "longitude",
                          "standard_name" : "longitude",
                          "units" : "degreesE"})
nc.define_2d_field("lat",
                   attrs={"long_name" : "latitude",
                          "standard_name" : "latitude",
                          "units" : "degreesN"})

nc.write("lon", lon)
nc.write("lat", lat)

topg = nc.write("topg", np.zeros_like(lon))
topg.standard_name = "bedrock_altitude"
topg.units = "m"

thk = nc.write("thk", np.zeros_like(lon) + 2000)
thk.standard_name = "land_ice_thickness"