예제 #1
0
def get_plot_data(filename, value_min = None, value_max = None):
    ncf = scipy.io.netcdf.netcdf_file(filename, 'r')
    particles = partmc.aero_particle_array_t(ncf)
    env_state = partmc.env_state_t(ncf)
    ncf.close()

    diameters = particles.dry_diameters() * 1e6
    comp_frac_soa = particles.masses(include = ["ARO1", "ARO2", "ALK1", "OLE1", "API1"]) \
        / particles.masses(exclude = ["H2O"]) * 100
    comp_frac_ocbc = particles.masses(include = ["BC", "OC"]) \
        / particles.masses(exclude = ["H2O"]) * 100
    # hack to avoid landing just around the integer boundaries
    comp_frac_soa *= (1.0 + 1e-12)
    comp_frac_ocbc *= (1.0 + 1e-12)
    h2o = particles.masses(include = ["H2O"])

    x_axis = partmc.linear_grid(min = soa_axis_min, max = soa_axis_max,
                                n_bin = num_soa_bins * 2)
    y_axis = partmc.linear_grid(min = oc_axis_min, max = oc_axis_max,
                                n_bin = num_oc_bins * 2)

    value = partmc.multival_2d(comp_frac_soa, comp_frac_ocbc, diameters, x_axis, y_axis)
    if value_max == None:
        value_max = value.max()
    if value_min == None:
        maxed_value = np.where(value > 0.0, value, value_max)
        value_min = maxed_value.min()
    #if value_max > 0.0:
    #    value = (log(value) - log(value_min)) \
    #            / (log(value_max) - log(value_min))
    #value = value.clip(0.0, 1.0)

    return (value, x_axis.edges(), y_axis.edges(),
            env_state, value_min, value_max)
예제 #2
0
def make_plot(in_filename, out_filename, time, title):
    ncf = scipy.io.netcdf.netcdf_file(in_filename, 'r')
    particles = partmc.aero_particle_array_t(ncf)
    env_state = partmc.env_state_t(ncf)
    ncf.close()

    age = abs(particles.least_create_times / 3600. - time)
    dry_diameters = particles.dry_diameters()
    s_crit = (particles.critical_rel_humids(env_state) - 1) * 100

    x_axis = partmc.log_grid(min=1e-8, max=1e-6, n_bin=140)
    y_axis = partmc.linear_grid(min=0, max=48, n_bin=96)

    vals2d = partmc.multival_2d(dry_diameters, age, s_crit, x_axis, y_axis)

    plt.clf()
    plt.pcolor(x_axis.edges(),
               y_axis.edges(),
               vals2d.transpose(),
               norm=matplotlib.colors.LogNorm(),
               linewidths=0.1)
    a = plt.gca()
    a.set_xscale("log")
    a.set_yscale("linear")
    plt.axis([x_axis.min, x_axis.max, y_axis.min, y_axis.max])
    plt.xlabel("dry diameter (m)")
    plt.ylabel("age (h)")
    cbar = plt.colorbar()
    cbar.set_label("S_crit (%)")
    plt.title(title)
    fig = plt.gcf()
    fig.savefig(out_filename)
예제 #3
0
def make_plot(in_filename,out_filename,time,title):
    ncf = scipy.io.netcdf.netcdf_file(in_filename, 'r')
    particles = partmc.aero_particle_array_t(ncf)
    ncf.close()

    age = abs(particles.least_create_times / 3600. - time)
    dry_diameters = particles.dry_diameters()

    x_axis = partmc.log_grid(min=1e-8,max=1e-6,n_bin=70)
    y_axis = partmc.linear_grid(min=0, max = 48, n_bin=49)

    hist2d = partmc.histogram_2d(dry_diameters, age, x_axis, y_axis, weights = 1/particles.comp_vols)

    plt.clf()
    plt.pcolor(x_axis.edges(), y_axis.edges(), hist2d.transpose(),norm = matplotlib.colors.LogNorm(), linewidths = 0.1)
    a = plt.gca()
    a.set_xscale("log")
    a.set_yscale("linear")
    plt.axis([x_axis.min, x_axis.max, y_axis.min, y_axis.max])
    plt.xlabel("dry diameter (m)")
    plt.ylabel("age (h)")
    cbar = plt.colorbar()
    cbar.set_label("number density (m^{-3})")
    plt.title(title)
    fig = plt.gcf()
    fig.savefig(out_filename)
예제 #4
0
def make_plot(in_filename,out_filename,title):
    ncf = scipy.io.netcdf.netcdf_file(in_filename, 'r')
    particles = partmc.aero_particle_array_t(ncf)
    ncf.close()

    bc = particles.masses(include = ["BC"])
    dry_mass = particles.masses(exclude = ["H2O"])
    bc_frac = bc / dry_mass

    dry_diameters = particles.dry_diameters()

    x_axis = partmc.log_grid(min=1e-8,max=1e-6,n_bin=70)
    y_axis = partmc.linear_grid(min=0,max=0.8,n_bin=40)

    hist2d = partmc.histogram_2d(dry_diameters, bc_frac, x_axis, y_axis, weights = 1/particles.comp_vols)
    plt.clf()
    plt.pcolor(x_axis.edges(), y_axis.edges(), hist2d.transpose(),norm = matplotlib.colors.LogNorm(), linewidths = 0.1)
    a = plt.gca()
    a.set_xscale("log")
    a.set_yscale("linear")
    plt.axis([x_axis.min, x_axis.max, y_axis.min, y_axis.max])
    plt.xlabel("dry diameter (m)")
    plt.ylabel("BC mass fraction")
    cbar = plt.colorbar()
    cbar.set_label("number density (m^{-3})")
    plt.title(title)
    fig = plt.gcf()
    fig.savefig(out_filename)
예제 #5
0
def make_plot(dir_name, in_filename, out_filename):
    ncf = scipy.io.netcdf.netcdf_file(dir_name + in_filename, 'r')
    particles = partmc.aero_particle_array_t(ncf)
    ncf.close()

    bc = particles.masses(include=["BC"])
    dry_mass = particles.masses(exclude=["H2O"])
    bc_frac = bc / dry_mass

    dry_diameters = particles.dry_diameters() * 1e6

    x_axis = partmc.log_grid(min=1e-3, max=1e1, n_bin=100)
    y_axis = partmc.linear_grid(min=0, max=0.8, n_bin=40)

    hist2d = partmc.histogram_2d(dry_diameters,
                                 bc_frac,
                                 x_axis,
                                 y_axis,
                                 weights=1 / particles.comp_vols)

    hist2d = hist2d * 1e-6
    print hist2d[36, :]
    (figure, axes_array,
     cbar_axes_array) = mpl_helper.make_fig_array(1,
                                                  1,
                                                  figure_width=5,
                                                  top_margin=0.5,
                                                  bottom_margin=0.45,
                                                  left_margin=0.65,
                                                  right_margin=1,
                                                  vert_sep=0.3,
                                                  horiz_sep=0.3,
                                                  colorbar="shared",
                                                  colorbar_location="right")

    axes = axes_array[0][0]
    cbar_axes = cbar_axes_array[0]
    p = axes.pcolor(x_axis.edges(),
                    y_axis.edges(),
                    hist2d.transpose(),
                    norm=matplotlib.colors.LogNorm(vmin=1e3, vmax=1e5),
                    linewidths=0.1)
    axes.set_xscale("log")
    axes.set_yscale("linear")
    axes.set_ylabel(r"BC mass fraction $w_{\rm BC}$")
    axes.set_xlabel(r"dry diameter $D$/ $\rm \mu m$")
    axes.set_ylim(0, 0.8)
    axes.set_xlim(5e-3, 1e0)
    axes.grid(True)
    cbar = figure.colorbar(p,
                           cax=cbar_axes,
                           format=matplotlib.ticker.LogFormatterMathtext(),
                           orientation='vertical')
    cbar_axes.xaxis.set_label_position('top')
    cbar.set_label(r"number conc. $n(D,w_{\rm BC})$ / $\rm cm^{-3}$")

    mpl_helper.remove_fig_array_axes(axes_array)
    figure.savefig(out_filename)
예제 #6
0
def make_plot(in_filename, out_filename, title):
    ncf = scipy.io.netcdf.netcdf_file(in_filename, 'r')
    particles = partmc.aero_particle_array_t(ncf)
    ncf.close()

    so4 = particles.masses(
        include=["SO4"]) / particles.aero_data.molec_weights[0]
    nh4 = particles.masses(
        include=["NH4"]) / particles.aero_data.molec_weights[3]
    no3 = particles.masses(
        include=["NO3"]) / particles.aero_data.molec_weights[1]

    dry_mass = particles.masses(exclude=["H2O"])
    so4_frac = so4 / dry_mass
    ion_ratio = (2 * so4 + no3) / nh4

    is_neutral = (ion_ratio < 2)
    print 'neutral ', sum(is_neutral), ion_ratio[is_neutral]

    dry_diameters = particles.dry_diameters()

    x_axis = partmc.log_grid(min=1e-8, max=1e-6, n_bin=70)
    y_axis = partmc.linear_grid(min=0, max=1.0, n_bin=50)

    hist2d = partmc.histogram_2d(dry_diameters,
                                 so4_frac,
                                 x_axis,
                                 y_axis,
                                 weights=1 / particles.comp_vols)

    plt.clf()
    plt.semilogx(dry_diameters, ion_ratio, 'rx')
    fig = plt.gcf()
    fig.savefig('figs/t.pdf')

    plt.clf()
    plt.pcolor(x_axis.edges(),
               y_axis.edges(),
               hist2d.transpose(),
               norm=matplotlib.colors.LogNorm(),
               linewidths=0.1)
    a = plt.gca()
    a.set_xscale("log")
    a.set_yscale("linear")
    plt.axis([x_axis.min, x_axis.max, y_axis.min, y_axis.max])
    plt.xlabel("dry diameter (m)")
    plt.ylabel("SO4 mass fraction")
    cbar = plt.colorbar()
    cbar.set_label("number density (m^{-3})")
    plt.title(title)
    fig = plt.gcf()
    fig.savefig(out_filename)
예제 #7
0
def make_plot(in_files, f1, f2, f3, f4, f5, f6):
    x_axis = partmc.log_grid(min=1e-10,max=1e-4,n_bin=100)
    y_axis = partmc.linear_grid(min=0,max=1.,n_bin=50)
    x_centers = x_axis.centers()
    y_centers = y_axis.centers()
    counter = 0
    hist_array_num = np.zeros([len(x_centers),len(y_centers),config.i_loop_max])
    hist_average_num = np.zeros([len(x_centers), len(y_centers)])
    hist_std_num = np.zeros([len(x_centers), len(y_centers)])
    hist_std_norm_num = np.zeros([len(x_centers), len(y_centers)])

    hist_array_mass = np.zeros([len(x_centers),len(y_centers),config.i_loop_max])
    hist_average_num = np.zeros([len(x_centers), len(y_centers)])
    hist_std_num = np.zeros([len(x_centers), len(y_centers)])
    hist_std_norm_num = np.zeros([len(x_centers), len(y_centers)])
    for file in in_files:
        ncf = scipy.io.netcdf.netcdf_file(config.netcdf_dir+'/'+file, 'r')
        particles = partmc.aero_particle_array_t(ncf)
        ncf.close()

        bc = particles.masses(include = ["BC"])
        dry_mass = particles.masses(exclude = ["H2O"])
        bc_frac = bc / dry_mass

        dry_diameters = particles.dry_diameters()
        hist2d = partmc.histogram_2d(dry_diameters, bc_frac, x_axis, y_axis, weights = 1 / particles.comp_vols)
        hist_array_num[:,:,counter] = hist2d
        hist2d = partmc.histogram_2d(dry_diameters, bc_frac, x_axis, y_axis, weights = particles.masses(include=["BC"])  / particles.comp_vols)
        hist_array_mass[:,:,counter] = hist2d

        counter = counter+1

    hist_average_num = np.average(hist_array_num, axis = 2)
    hist_std_num = np.std(hist_array_num, axis = 2)
    hist_std_norm_num = hist_std_num / hist_average_num
    hist_std_norm_num = np.ma.masked_invalid(hist_std_norm_num)

    hist_average_mass = np.average(hist_array_mass, axis = 2)
    hist_std_mass = np.std(hist_array_mass, axis = 2)
    hist_std_norm_mass = hist_std_mass / hist_average_mass
    hist_std_norm_mass = np.ma.masked_invalid(hist_std_norm_mass)

    np.savetxt(f1, x_axis.edges())
    np.savetxt(f2, y_axis.edges())
    np.savetxt(f3, hist_average_num)
    np.savetxt(f4, hist_std_norm_num)
    np.savetxt(f5, hist_average_mass)
    np.savetxt(f6, hist_std_norm_mass)
예제 #8
0
def make_plot(in_filename,out_filename):
    ncf = scipy.io.netcdf.netcdf_file(in_filename, 'r')
    particles = partmc.aero_particle_array_t(ncf)
    env_state = partmc.env_state_t(ncf)
    ncf.close()

    bc = particles.masses(include = ["BC"])
    dry_mass = particles.masses(exclude = ["H2O"])
    bc_frac = bc / dry_mass

    so4 = particles.masses(include = ["SO4"])
    inorg = particles.masses(include = ["SO4", "NO3", "NH4"])
    inorg_frac = inorg / dry_mass 

    kappas = particles.kappas()
 
    wet_diameters = particles.diameters()
    dry_diameters = particles.dry_diameters() * 1e6

    x_axis = partmc.log_grid(min=1e-2,max=1e0,n_bin=90)
    y_axis = partmc.linear_grid(min=0,max=0.8,n_bin=40)

    vals = partmc.multival_2d(dry_diameters, bc_frac, kappas, x_axis, y_axis, rand_arrange=False)

    vals_pos = np.ma.masked_less_equal(vals, 0)
    vals_zero = np.ma.masked_not_equal(vals, 0)
    
    plt.clf()
    if vals_zero.count() > 0:
       plt.pcolor(x_axis.edges(), y_axis.edges(), vals_zero.transpose(), cmap=matplotlib.cm.gray, linewidths = 0.1)
    
    if vals_pos.count() > 0:
       plt.pcolor(x_axis.edges(), y_axis.edges(), vals_pos.transpose(), linewidths = 0.1)

    title = partmc.time_of_day_string(env_state)
    a = plt.gca()
    a.set_xscale("log")
    a.set_yscale("linear")
    plt.axis([x_axis.min, x_axis.max, y_axis.min, y_axis.max])
    plt.xlabel("dry diameter (\mu m)")
    plt.ylabel("BC dry mass fraction")
    cbar = plt.colorbar()
    plt.clim(0, 0.6)
    cbar.set_label("kappa")
    plt.title(title)
    fig = plt.gcf()
    fig.savefig(out_filename)
예제 #9
0
def get_plot_data_bc(filename, value_min=None, value_max=None):
    ncf = scipy.io.netcdf.netcdf_file(filename, 'r')
    particles = partmc.aero_particle_array_t(ncf)
    env_state = partmc.env_state_t(ncf)
    ncf.close()

    diameters = particles.dry_diameters() * 1e6
    comp_frac = particles.masses(include = ["BC"]) \
                / particles.masses(exclude = ["H2O"]) * 100

    x_axis = partmc.log_grid(min=diameter_axis_min,
                             max=diameter_axis_max,
                             n_bin=num_diameter_bins)
    y_axis = partmc.linear_grid(min=bc_axis_min,
                                max=bc_axis_max,
                                n_bin=num_bc_bins)
    # hack to avoid landing just around the integer boundaries
    comp_frac *= (1.0 + 1e-12)

    value = partmc.histogram_2d(diameters,
                                comp_frac,
                                x_axis,
                                y_axis,
                                weights=1 / particles.comp_vols)
    value *= 100
    value /= 1e6
    if value_max == None:
        value_max = value.max()
    if value_min == None:
        maxed_value = np.where(value > 0.0, value, value_max)
        value_min = maxed_value.min()
    #if value_max > 0.0:
    #    value = (log(value) - log(value_min)) \
    #            / (log(value_max) - log(value_min))
    #value = value.clip(0.0, 1.0)

    return (value, x_axis.edges(), y_axis.edges(), env_state, value_min,
            value_max)
예제 #10
0
def make_plot(in_filename, out_filename, title):
    ncf = scipy.io.netcdf.netcdf_file(in_filename, 'r')
    particles = partmc.aero_particle_array_t(ncf)
    ncf.close()

    bc_volume = particles.volumes(include=["BC"])
    bc = particles.masses(include=["BC"])
    dry_mass = particles.masses(exclude=["H2O"])
    bc_frac = bc / dry_mass
    coat_frac = 1 - bc / dry_mass

    is_bc = (bc_frac > 0.05)
    dry_diameters = particles.dry_diameters()

    core_diameters = (6 / math.pi * bc_volume)**(1. / 3.)
    coating_thickness = (dry_diameters - core_diameters) / 2.
    ratio = coating_thickness / dry_diameters

    print ratio.max()
    x_axis = partmc.linear_grid(min=0, max=ratio.max(), n_bin=50)

    hist1d = partmc.histogram_1d(coating_thickness[is_bc] /
                                 dry_diameters[is_bc],
                                 x_axis,
                                 weights=1 / particles.comp_vols[is_bc])
    print hist1d
    plt.clf()
    a = plt.gca()
    a.set_xscale("linear")
    a.set_yscale("log")
    plt.plot(x_axis.centers(), hist1d)
    plt.axis([x_axis.min, x_axis.max, 1e8, 1e12])
    plt.grid(True)
    plt.xlabel("coating thickness / dry diameter")
    plt.ylabel("number concentration (m^{-3})")
    plt.title(title)
    fig = plt.gcf()
    fig.savefig(out_filename)
예제 #11
0
def get_plot_data(filename, value_min=None, value_max=None):
    ncf = scipy.io.netcdf.netcdf_file(filename, 'r')
    particles = partmc.aero_particle_array_t(ncf)
    env_state = partmc.env_state_t(ncf)
    ncf.close()

    diameters = particles.dry_diameters() * 1e6
    comp_frac = particles.masses(include = ["BC"]) \
                / particles.masses(exclude = ["H2O"]) * 100
    # hack to avoid landing just around the integer boundaries
    comp_frac *= (1.0 + 1e-12)
    h2o = particles.masses(include=["H2O"]) * 1e18  # kg to fg

    x_axis = partmc.log_grid(min=diameter_axis_min,
                             max=diameter_axis_max,
                             n_bin=num_diameter_bins * 2)
    y_axis = partmc.linear_grid(min=bc_axis_min,
                                max=bc_axis_max,
                                n_bin=num_bc_bins * 2)

    value = partmc.multival_2d(diameters, comp_frac, h2o, x_axis, y_axis)

    return (value, x_axis.edges(), y_axis.edges(), env_state)
예제 #12
0
def make_plot(dir_name, in_files, out_filename1, out_filename2):
    x_axis = partmc.log_grid(min=1e-9, max=1e-5, n_bin=70)
    y_axis = partmc.linear_grid(min=0, max=1., n_bin=50)
    x_centers = x_axis.centers()
    y_centers = y_axis.centers()
    counter = 0
    hist_array = np.zeros([len(x_centers), len(y_centers), config.i_loop_max])
    hist_average = np.zeros([len(x_centers), len(y_centers)])
    hist_std = np.zeros([len(x_centers), len(y_centers)])
    hist_std_norm = np.zeros([len(x_centers), len(y_centers)])

    for file in in_files:
        ncf = scipy.io.netcdf.netcdf_file(dir_name + file, 'r')
        particles = partmc.aero_particle_array_t(ncf)
        ncf.close()

        bc = particles.masses(include=["BC"])
        dry_mass = particles.masses(exclude=["H2O"])
        bc_frac = bc / dry_mass

        dry_diameters = particles.dry_diameters()

        hist2d = partmc.histogram_2d(dry_diameters,
                                     bc_frac,
                                     x_axis,
                                     y_axis,
                                     weights=1 / particles.comp_vols)
        hist_array[:, :, counter] = hist2d
        counter = counter + 1

    hist_average = np.average(hist_array, axis=2)
    hist_std = np.std(hist_array, axis=2)
    hist_std_norm = hist_std / hist_average
    hist_std_norm = np.ma.masked_invalid(hist_std_norm)

    print 'hist_std ', hist_average[35, :], hist_std[35, :], hist_std_norm[
        35, :]

    plt.clf()
    plt.pcolor(x_axis.edges(),
               y_axis.edges(),
               hist_average.transpose(),
               norm=matplotlib.colors.LogNorm(),
               linewidths=0.1)
    a = plt.gca()
    a.set_xscale("log")
    a.set_yscale("linear")
    plt.axis([5e-9, 5e-6, 0, 0.8])
    plt.xlabel("dry diameter (m)")
    plt.ylabel("BC mass fraction")
    plt.grid(True)
    plt.clim(1e8, 5e11)
    cbar = plt.colorbar()
    cbar.set_label("number density (m^{-3})")
    fig = plt.gcf()
    fig.savefig(out_filename1)

    plt.clf()
    plt.pcolor(x_axis.edges(),
               y_axis.edges(),
               hist_std_norm.transpose(),
               norm=matplotlib.colors.LogNorm(vmin=1e-1, vmax=10),
               linewidths=0.1)
    a = plt.gca()
    a.set_xscale("log")
    a.set_yscale("linear")
    plt.axis([5e-9, 5e-6, 0, 0.8])
    plt.xlabel("dry diameter (m)")
    plt.ylabel("BC mass fraction")
    plt.grid(True)
    cbar = plt.colorbar()
    cbar.set_label("CV")
    fig = plt.gcf()
    fig.savefig(out_filename2)
예제 #13
0
def make_plot(in_filename, out_filename):
    ncf = scipy.io.netcdf.netcdf_file(in_filename, 'r')
    particles = partmc.aero_particle_array_t(ncf)
    env_state = partmc.env_state_t(ncf)
    ncf.close()

    bc = particles.masses(include=["BC"])
    dry_mass = particles.masses(exclude=["H2O"])
    bc_frac = bc / dry_mass

    wet_diameters = particles.diameters()
    dry_diameters = particles.dry_diameters() * 1e6

    x_axis = partmc.log_grid(min=1e-2, max=1e0, n_bin=90)
    y_axis = partmc.linear_grid(min=0, max=0.8, n_bin=40)

    (figure, axes, cbar_axes) = config_matplotlib.make_fig(colorbar=True,
                                                           right_margin=1,
                                                           top_margin=0.3)

    axes.grid(True)
    axes.grid(True, which='minor')
    axes.minorticks_on()
    axes.set_xscale('log')

    axes.set_xbound(x_axis.min, x_axis.max)
    axes.set_ybound(y_axis.min, y_axis.max)

    xaxis = axes.get_xaxis()
    yaxis = axes.get_yaxis()
    xaxis.labelpad = 8
    yaxis.labelpad = 8
    #xaxis.set_major_formatter(matplotlib.ticker.LogFormatter())
    #yaxis.set_major_locator(matplotlib.ticker.MaxNLocator(5))
    #yaxis.set_minor_locator(matplotlib.ticker.MaxNLocator(8))

    axes.set_xlabel(r"dry diameter $D\ (\rm\mu m)$")
    axes.set_ylabel(r"BC dry mass frac. $w_{{\rm BC},{\rm dry}}$")

    hist2d = partmc.histogram_2d(dry_diameters,
                                 bc_frac,
                                 x_axis,
                                 y_axis,
                                 weights=1 / particles.comp_vols)
    #    plt.clf()

    axes.set_xbound(x_axis.min, x_axis.max)
    axes.set_ybound(y_axis.min, y_axis.max)

    p = axes.pcolor(x_axis.edges(),
                    y_axis.edges(),
                    hist2d.transpose(),
                    norm=matplotlib.colors.LogNorm(vmin=1e8, vmax=1e11),
                    linewidths=0.1)
    title = partmc.time_of_day_string(env_state)
    axes.set_xbound(x_axis.min, x_axis.max)
    axes.set_ybound(y_axis.min, y_axis.max)
    axes.set_title(title)
    figure.colorbar(p,
                    cax=cbar_axes,
                    format=matplotlib.ticker.LogFormatterMathtext())
    cbar_axes.set_ylabel(r"number conc. $(\rm m^{-3})$")
    #cbar_axes.set_ylim([1e8, 1e11])
    #plt.title(title)
    axes.set_xbound(x_axis.min, x_axis.max)
    axes.set_ybound(y_axis.min, y_axis.max)
    fig = plt.gcf()
    fig.savefig(out_filename)
예제 #14
0
    if particle_set[id].aging_time != -1:
        time_for_aging[i_counter] = (particle_set[id].aging_time -
                                     particle_set[id].emit_time) / 3600.
    else:
        time_for_aging[i_counter] = -1
    i_counter = i_counter + 1

emit_morning = ((emit_time < 6.) & (bc_frac_emit > 0))
emit_afternoon = (((emit_time > 11.) & (emit_time < 12.)) & (bc_frac_emit > 0))
emit_night = ((emit_time > 12) & (bc_frac_emit > 0))

bc_containing = (bc_frac_emit > 0)

# 2D Histogram plot
x_axis = partmc.log_grid(min=1e-3, max=1e1, n_bin=70)
y_axis = partmc.linear_grid(min=0, max=48, n_bin=48)

hist2d = partmc.histogram_2d(emit_diam[bc_containing],
                             time_for_aging[bc_containing],
                             x_axis,
                             y_axis,
                             weights=1 / emit_comp_vols[bc_containing])

hist2d_morning = partmc.histogram_2d(emit_diam[emit_morning],
                                     time_for_aging[emit_morning],
                                     x_axis,
                                     y_axis,
                                     weights=1 / emit_comp_vols[emit_morning])

hist2d_afternoon = partmc.histogram_2d(emit_diam[emit_afternoon],
                                       time_for_aging[emit_afternoon],
예제 #15
0
	if particle_set[id].aging_time != -1:
		time_for_aging[i_counter] = (particle_set[id].aging_time - particle_set[id].emit_time) / 3600.	
	else:
		time_for_aging[i_counter] = -1
	i_counter = i_counter + 1

emit_morning = ((emit_time < 6.) & (bc_frac_emit > 0))
emit_afternoon = (((emit_time > 6.) & (emit_time < 12.)) & (bc_frac_emit > 0))
emit_night = ((emit_time > 12) & (bc_frac_emit > 0 ))

bc_containing = (bc_frac_emit > 0)

# 2D Histogram plot
x_axis = partmc.log_grid(min=1e-3,max=1e1,n_bin=70)
y_axis = partmc.linear_grid(min=0,max=1,n_bin=50)

hist2d = partmc.histogram_2d(emit_diam[bc_containing], aging_solute_fraction[bc_containing], 
			     x_axis, y_axis, weights = 1 / emit_comp_vols[bc_containing])

hist2d_morning = partmc.histogram_2d(emit_diam[emit_morning], aging_solute_fraction[emit_morning], 
			     x_axis, y_axis, weights = 1 / emit_comp_vols[emit_morning])

hist2d_afternoon = partmc.histogram_2d(emit_diam[emit_afternoon], aging_solute_fraction[emit_afternoon], 
			     x_axis, y_axis, weights = 1 / emit_comp_vols[emit_afternoon])

hist2d = hist2d * 1e-6
hist2d_morning = hist2d_morning * 1e-6
hist2d_afternoon = hist2d_afternoon * 1e-6

(figure, axes_array, cbar_axes_array) = mpl_helper.make_fig_array(1,1, figure_width=5,
예제 #16
0
def make_plot(hour, f1, f2, f3, f4):
    x_axis = partmc.log_grid(
        min=1e-9, max=1e-5,
        n_bin=80)  # n_bin changed to 80. was 70 for the submitted paper
    y_axis = partmc.linear_grid(min=0, max=1., n_bin=50)
    x_centers = x_axis.centers()
    y_centers = y_axis.centers()

    hist_array_num = np.zeros([
        len(x_centers),
        len(y_centers), config.i_weighting_schemes, config.i_loop_max
    ])
    hist_array_mass = np.zeros([
        len(x_centers),
        len(y_centers), config.i_weighting_schemes, config.i_loop_max
    ])
    hist_array_pnum = np.zeros([
        len(x_centers),
        len(y_centers), config.i_weighting_schemes, config.i_loop_max
    ])

    hist_average_num = np.zeros(
        [len(x_centers),
         len(y_centers), config.i_weighting_schemes])
    hist_average_mass = np.zeros(
        [len(x_centers),
         len(y_centers), config.i_weighting_schemes])
    hist_average_pnum = np.zeros(
        [len(x_centers),
         len(y_centers), config.i_weighting_schemes])

    hist_var_num = np.zeros(
        [len(x_centers),
         len(y_centers), config.i_weighting_schemes])
    hist_var_mass = np.zeros(
        [len(x_centers),
         len(y_centers), config.i_weighting_schemes])

    weighting_factor_num = np.zeros(
        [len(x_centers),
         len(y_centers), config.i_weighting_schemes])
    weighting_factor_mass = np.zeros(
        [len(x_centers),
         len(y_centers), config.i_weighting_schemes])

    for (counter_weighting, counter) in enumerate([
            "1K_wei+1", "1K_flat", "1K_wei-1", "1K_wei-2", "1K_wei-3",
            "1K_wei-4"
    ]):
        print "I'm doing ", counter
        files = []
        for i_loop in range(0, config.i_loop_max):
            filename_in = config.netcdf_dir + "/urban_plume_wc_%s_0%03d_000000%02d.nc" % (
                counter, i_loop + 1, hour)
            files.append(filename_in)

        for (counter_i_loop, file) in enumerate(files):
            print "file ", file
            ncf = scipy.io.netcdf.netcdf_file(file, 'r')
            particles = partmc.aero_particle_array_t(ncf)
            env_state = partmc.env_state_t(ncf)
            ncf.close()

            dry_diameters = particles.dry_diameters()
            bc = particles.masses(include=["BC"])
            dry_mass = particles.masses(exclude=["H2O"])
            bc_frac = bc / dry_mass

            hist2d = partmc.histogram_2d(dry_diameters,
                                         bc_frac,
                                         x_axis,
                                         y_axis,
                                         weights=1 / particles.comp_vols)
            hist_array_num[:, :, counter_weighting, counter_i_loop] = hist2d
            hist2d = partmc.histogram_2d(
                dry_diameters,
                bc_frac,
                x_axis,
                y_axis,
                weights=particles.masses(include=["BC"]) / particles.comp_vols)
            hist_array_mass[:, :, counter_weighting, counter_i_loop] = hist2d
            hist2d = partmc.histogram_2d(dry_diameters, bc_frac, x_axis,
                                         y_axis)
            hist_array_pnum[:, :, counter_weighting, counter_i_loop] = hist2d

    hist_array_num = np.ma.masked_less_equal(hist_array_num, 0)
    hist_array_mass = np.ma.masked_less_equal(hist_array_mass, 0)
    hist_array_pnum = np.ma.masked_less_equal(hist_array_pnum, 0)

    hist_average_num = np.average(hist_array_num, axis=3)
    hist_average_mass = np.average(hist_array_mass, axis=3)
    hist_average_pnum = np.average(hist_array_pnum, axis=3)

    hist_var_num = np.var(hist_array_num, axis=3)
    hist_var_mass = np.var(hist_array_mass, axis=3)

    print "Calculated average and variance", counter

    #    weighting_factor_num = 1 / (hist_var_num / hist_average_pnum)
    #    weighting_factor_mass = 1 / (hist_var_mass / hist_average_pnum)
    #    new way of calculating weighting_factor after Matt discovered error, 6/25/2011
    #    weighting_factor_num = 1 / hist_var_num
    #    weighting_factor_mass = 1 / hist_var_mass
    # TEST: weighting directly proportional to N_p
    weighting_factor_num = hist_average_pnum
    weighting_factor_mass = hist_average_pnum

    weighting_factor_num_sum = np.sum(weighting_factor_num, axis=2)
    weighting_factor_mass_sum = np.sum(weighting_factor_mass, axis=2)

    hist_composite_num = np.zeros([len(x_centers), len(y_centers)])
    hist_composite_mass = np.zeros([len(x_centers), len(y_centers)])

    for i in range(0, config.i_weighting_schemes):
        increment = weighting_factor_num[:, :,
                                         i] / weighting_factor_num_sum * hist_average_num[:, :,
                                                                                          i]
        #        increment = increment.filled(0)
        hist_composite_num += increment
    print "hist_composite_num ", hist_composite_num
    hist_composite_num = np.nan_to_num(hist_composite_num)

    for i in range(0, config.i_weighting_schemes):
        increment = weighting_factor_mass[:, :,
                                          i] / weighting_factor_mass_sum * hist_average_mass[:, :,
                                                                                             i]
        #        increment = increment.filled(0)
        hist_composite_mass += increment
    hist_composite_mass = np.nan_to_num(hist_composite_mass)

    np.savetxt(f1, x_axis.edges())
    np.savetxt(f2, y_axis.edges())
    np.savetxt(f3, hist_composite_num)
    np.savetxt(f4, hist_composite_mass)
def grid_box_histogram(time):

    # filename prefix
    dir = config.data_dir
    prefix = config.file_prefix
    filename =  '%s_%08i.nc' %(prefix,time)

    # make grids
    diam_axis = partmc.log_grid(min=1e-9,max=1e-6,n_bin=60)
    bc_axis = partmc.linear_grid(min=0,max=1.,n_bin=50)

    # load the file
    ncf = scipy.io.netcdf.netcdf_file(config.data_dir+'/'+filename, 'r')
    particles = partmc.aero_particle_array_t(ncf)
    ncf.close()

    # compute the values
    bc = particles.masses(include = ["BC"])
    dry_mass = particles.masses(exclude = ["H2O"])
    bc_frac = bc / dry_mass
    dry_diameters = particles.dry_diameters()

    # 2D histogram
    hist_2d_bc = partmc.histogram_2d(dry_diameters, bc_frac, diam_axis, bc_axis,
         weights = 1 / particles.comp_vols)
    # convert
    hist_2d_bc /= 1e6

    # create the figure
    width_in = 4.0 
    (figure, axes, cbar_axes) = mpl_helper.make_fig(figure_width=width_in,
        colorbar=True,left_margin=.7,right_margin=1.1, top_margin=0.3,
        bottom_margin=.65, colorbar_height_fraction=0.8)

    # Data min and max
    # we want this to be fixed for all time
    data_min = 10**2 #min(data_mins)
    data_max = 10**6 #max(data_maxes)

    norm = matplotlib.colors.LogNorm(vmin=data_min, vmax=data_max)
    p = axes.pcolormesh(diam_axis.edges()/1e-6, bc_axis.edges()*100, 
        hist_2d_bc.transpose(),norm = norm, linewidths = 0.1, edgecolors='None')

    # make the plot pretty
    axes.set_xscale('log')
    axes.set_yscale('linear')
    xlabel = r'diameter $(\mu \rm m)$'
    ylabel = r'BC mass fraction'
    axes.set_xlabel(xlabel)
    axes.set_ylabel(ylabel)
    axes.set_xlim(.005,1)
    axes.set_ylim(0,80)
    axes.set_yticks([0,20,40,60,80])
    axes.grid(True)

    # colorbar
    cbar = figure.colorbar(p, cax=cbar_axes,
                format=matplotlib.ticker.LogFormatterMathtext(),
                orientation='vertical')
    kwargs = {}
    kwargs["format"] = matplotlib.ticker.LogFormatterMathtext()
    cmappable = matplotlib.cm.ScalarMappable(norm=norm)
    cmappable.set_array(numpy.array([hist_2d_bc.min(), hist_2d_bc.max()]))
    cbar_label = r"num. conc. $(\rm cm^{-3})$"
    cbar.set_label(cbar_label)
    cbar.solids.set_edgecolor("face")

    # Save figure and print name
    fig_name = '%s/bc_plot_%08i.pdf' % \
         (config.fig_dir, time)
    figure.savefig(fig_name)

    # print name in case we need it
    print fig_name

    return
예제 #18
0
import matplotlib.pyplot as plt
import numpy as np
import scipy.io

sys.path.append("../../tool")
import partmc

fig_base_dir = "figs"
data_base_dir = "data"
data_type = "diam_bc_num"

x_axis = partmc.log_grid(min=config.diameter_axis_min,
                         max=config.diameter_axis_max,
                         n_bin=config.num_diameter_bins)
y_axis = partmc.linear_grid(min=config.bc_axis_min,
                            max=config.bc_axis_max,
                            n_bin=config.num_bc_bins)


def compute_error(value, true_value, out_filename):
    error = (value - true_value) * x_axis.grid_size(0) * y_axis.grid_size(0)
    error_norm = np.sqrt((error**2).sum())
    np.savetxt(out_filename, np.array([error_norm]))


if __name__ == "__main__":
    true_run = config_filelist.true_run
    for run in config_filelist.runs:
        data_dir = os.path.join(data_base_dir, run["name"])
        true_data_dir = os.path.join(data_base_dir, true_run["name"])
        fig_dir = os.path.join(fig_base_dir, run["name"])
예제 #19
0
def make_plot(in_filename,out_filename,title):
    ncf = scipy.io.netcdf.netcdf_file(in_filename, 'r')
    particles = partmc.aero_particle_array_t(ncf)
    ncf.close()

    so4 = particles.masses(include = ["SO4"])/particles.aero_data.molec_weights[0]
    nh4 =  particles.masses(include = ["NH4"])/particles.aero_data.molec_weights[3]
    no3 =  particles.masses(include = ["NO3"])/particles.aero_data.molec_weights[1]
    bc =  particles.masses(include = ["BC"])/particles.aero_data.molec_weights[18]
    oc =  particles.masses(include = ["OC"])/particles.aero_data.molec_weights[17]

    print 'min nh4 ', min(particles.masses(include = ["NH4"])), max(nh4), min(no3), max(no3)

    ion_ratio = (2*so4 + no3) / nh4

    is_neutral = (ion_ratio < 2)
    dry_diameters = particles.dry_diameters()

    x_axis = partmc.log_grid(min=1e-8,max=1e-6,n_bin=70)
    y_axis = partmc.linear_grid(min=0,max=30.0,n_bin=100)
    x_centers = x_axis.centers()

    bin_so4 = partmc.histogram_1d(dry_diameters, x_axis, weights = so4)
    bin_nh4 = partmc.histogram_1d(dry_diameters, x_axis, weights = nh4)
    bin_no3 = partmc.histogram_1d(dry_diameters, x_axis, weights = no3)
    
    print 'bin_so4 ', bin_so4[40]
    print 'bin_nh4 ', bin_nh4[40]
    print 'bin_no3 ', bin_no3[40]

    bin_ratio = (2*bin_so4 + bin_no3)/ bin_nh4
    np.isnan(bin_ratio) # checks which elements in c are NaN (produces array with True and False)
    bin_ratio[np.isnan(bin_ratio)] = 0 # replaces NaN with 0. useful for plotting
    print 'bin_ratio ', bin_ratio[40]

    diameter_bins = x_axis.find(dry_diameters)
    print 'diameter_bins ', diameter_bins
    is_40 = (diameter_bins == 40)
#    for i in range(len(dry_diameters)):
#        if diameter_bins[i] == 40:
#            print 'particle info', so4[i], nh4[i], no3[i], ion_ratio[i]
    so4_40 = so4[is_40]
    nh4_40 = nh4[is_40]
    no3_40 = no3[is_40]
    bc_40 = bc[is_40]
    oc_40 = oc[is_40]

    ion_ratio_40 = ion_ratio[is_40]
#    data = [(so4_40[i],nh4_40[i], no3_40[i], ion_ratio_40[i]) for i in range(len(so4_40)
    data = zip(so4_40, nh4_40, no3_40, bc_40, oc_40, ion_ratio_40)
    data.sort(key = lambda x: x[5])
    for (so,nh,no,bc,oc,ir) in data:
        print so,nh,no,bc,oc,ir

    print 'sums ', sum(so4[is_40]), sum(nh4[is_40]), sum(no3[is_40]), (2*sum(so4[is_40])+ sum(no3[is_40])) / sum(nh4[is_40])
    print 'sums/number ',  sum(so4[is_40])/len(so4_40), sum(nh4[is_40])/len(nh4_40), sum(no3[is_40])/len(no3_40)
    
    
    hist2d = partmc.histogram_2d(dry_diameters, ion_ratio, x_axis, y_axis, weights = 1/particles.comp_vols)

    plt.clf()
    plt.pcolor(x_axis.edges(), y_axis.edges(), hist2d.transpose(),norm = matplotlib.colors.LogNorm(), linewidths = 0.1)
    a = plt.gca()
    plt.semilogx(x_centers, bin_ratio, 'w-', linewidth = 3)
    plt.semilogx(x_centers, bin_ratio, 'k-', linewidth = 1)
    a.set_xscale("log")
    a.set_yscale("linear")
    plt.axis([x_axis.min, x_axis.max, y_axis.min, y_axis.max])
    plt.xlabel("dry diameter (m)")
    plt.ylabel("ion ratio")
    cbar = plt.colorbar()
    cbar.set_label("number density (m^{-3})")
    plt.title(title)
    fig = plt.gcf()
    fig.savefig(out_filename)