Ejemplo n.º 1
0
def mocsy_3d_getOmA(tsal, ttemp, tdic, tta):
    tsra = np.ravel(tsal)
    ttera = np.ravel(ttemp)
    ttara = np.ravel(tta) * 1e-3
    tdra = np.ravel(tdic) * 1e-3
    tzero = np.zeros_like(tsra)
    tpressure = np.zeros_like(tsra)
    tpressure[:] = 1
    tzero = tpressure * 0

    tsra_psu = tsra * 35 / 35.16504
    ttera_is = gsw.t_from_CT(tsra, ttera, tzero)

    response_tup = mocsy.mvars(temp=ttera_is,
                               sal=tsra_psu,
                               alk=ttara,
                               dic=tdra,
                               sil=tzero,
                               phos=tzero,
                               patm=tpressure,
                               depth=tzero,
                               lat=tzero,
                               optcon='mol/m3',
                               optt='Tinsitu',
                               optp='m',
                               optb='l10',
                               optk1k2='m10',
                               optkf='dg',
                               optgas='Pinsitu')
    pH, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, DENis, p, Tis = response_tup

    OmegaAR = OmegaA.reshape(40, 898, 398)
    return OmegaAR
Ejemplo n.º 2
0
def OmA_2D(grid,carp):
    tsal = grid['vosaline'][0,0,:,:]
    ttemp = grid['votemper'][0,0,:,:]
    tdic = carp['dissolved_inorganic_carbon'][0,0,:,:]
    tta = carp['total_alkalinity'][0,0,:,:]

    tsra = np.ravel(tsal)
    ttera = np.ravel(ttemp)
    ttara = np.ravel(tta) * 1e-3
    tdra = np.ravel(tdic) * 1e-3
    tzero = np.zeros_like(tsra)
    tpressure = np.zeros_like(tsra)
    tpressure[:] =1
    tzero = tpressure * 0 
        
    tsra_psu = tsra*35/35.16504
    ttera_is = gsw.t_from_CT(tsra,ttera,tzero)

    response_tup = mocsy.mvars(temp=ttera_is, sal=tsra_psu, alk=ttara, dic=tdra, 
                       sil=tzero, phos=tzero, patm=tpressure, depth=tzero, lat=tzero, 
                        optcon='mol/m3', optt='Tinsitu', optp='m',
                        optb = 'l10', optk1k2='m10', optkf = 'dg', optgas = 'Pinsitu')
    pH,pco2,fco2,co2,hco3,co3,OmegaA,OmegaC,BetaD,DENis,p,Tis = response_tup

    pHr = pH.reshape(898,398)
    OmAr = OmegaA.reshape(898,398)
    OmCr = OmegaC.reshape(898,398)
    pco2r = pco2.reshape(898,398)
    
    return pHr, OmAr, OmCr, pco2r
Ejemplo n.º 3
0
def oned_moxy(tsal, ttemp, tdic, tta, pres_atm, depth_this):

    size_box = np.shape(tdic)
    size_0 = size_box[0]
    size_1= size_box[1]
    size_2 = size_box[2]


    tsra = np.ravel(tsal)
    ttera = np.ravel(ttemp)
    ttara = np.ravel(tta) * 1e-3
    tdra = np.ravel(tdic) * 1e-3
    tzero = np.zeros_like(tsra)
    tpressure = np.zeros_like(tsra)
    tpressure[:] = pres_atm
    tdepth = np.ravel(depth_this)
    tzero = tpressure * 0 
        
    tsra_psu = tsra*35/35.16504
    ttera_is = gsw.t_from_CT(tsra,ttera,tzero)
    print('beginning mocsy')
    response_tup = mocsy.mvars(temp=ttera_is, sal=tsra_psu, alk=ttara, dic=tdra, 
                       sil=tzero, phos=tzero, patm=tpressure, depth=tdepth, lat=tzero, 
                        optcon='mol/m3', optt='Tinsitu', optp='m',
                        optb = 'l10', optk1k2='m10', optkf = 'dg', optgas = 'Pinsitu')
    pH,pco2,fco2,co2,hco3,co3,OmegaA,OmegaC,BetaD,DENis,p,Tis = response_tup
    print('finished mocsy')

    pHr = pH.reshape(size_0,size_1,size_2)
    OmAr = OmegaA.reshape(size_0,size_1,size_2)
    pco2r = pco2.reshape(size_0,size_1,size_2)
    
    return pHr, OmAr, pco2r
Ejemplo n.º 4
0
def calc_carb_dat(conc_DIC, conc_ALK, T):
    if (conc_DIC < 1 / 100000) or (conc_ALK < 1 / 100000):
        conc_DIC = 1e-6
    with suppress_stdout_stderr():
        carb_dat = np.dstack(
            mocsy.mvars(temp=T,
                        sal=0,
                        alk=conc_ALK / 12,
                        dic=conc_DIC / 12,
                        sil=0,
                        phos=0,
                        patm=1.,
                        depth=1,
                        lat=0,
                        optcon='mol/m3',
                        optt='Tinsitu',
                        optp='db',
                        optb="u74",
                        optk1k2='l',
                        optkf="dg",
                        optgas='Pinsitu'))[0][0]
    pH, pCO2 = operator.itemgetter(0, 1)(carb_dat)
    if pH > 14:
        pH = -999999999
    if pCO2 > 1e6:
        pCO2 = -999999999
    return pCO2, pH
Ejemplo n.º 5
0
def find_DIC_corresp_to_pco2(tsal, ttemp, tpco2, tta, pres_atm, depth_this):

    import numpy as np
    import mocsy

    steps = 10000
    tsal_r = np.zeros([steps])
    tsal_r[:] = tsal
    ttemp_r = np.zeros([steps])
    ttemp_r[:] = ttemp
    tta_r = np.zeros([steps])
    tta_r[:] = tta * 1e-3
    tpres_r = np.zeros([steps])
    tpres_r[:] = pres_atm
    depth_r = np.zeros([steps])
    depth_r[:] = depth_this
    tzero = np.zeros([steps])

    end_d = 2400
    start_d = 600
    intvl = (end_d - start_d) / steps
    tdic_r = np.arange(start_d, end_d - 0.1, intvl) * 1e-3

    response_tup = mocsy.mvars(temp=ttemp_r,
                               sal=tsal_r,
                               alk=tta_r,
                               dic=tdic_r,
                               sil=tzero,
                               phos=tzero,
                               patm=tpres_r,
                               depth=depth_r,
                               lat=tzero,
                               optcon='mol/m3',
                               optt='Tinsitu',
                               optp='m',
                               optb='l10',
                               optk1k2='m10',
                               optkf='dg',
                               optgas='Pinsitu')
    pH, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, DENis, p, Tis = response_tup

    diffmat = pco2 - tpco2
    idx, ans = find_nearest(diffmat, 0)

    if ans > 2:
        print('Danger, pco2 found >2 uatm from pco2 given')


#     print(idx)
#     print('difference between real pco2 and pco2 from calc. dic: ',ans)
#     print('DIC found this way:', tdic_r[idx]*1e3)
    fin_dic = tdic_r[idx] * 1e3

    return fin_dic
Ejemplo n.º 6
0
def OmA_3D(grid, carp):
    tsal = grid['model_output']['SAL'][:, :, :]
    ttemp = grid['model_output']['TEMP'][:, :, :]
    tdic = carp['model_output']['DIC'][:, :, :]
    tta = carp['model_output']['TA'][:, :, :]

    test_LO = nc.Dataset(
        '/results/forcing/LiveOcean/boundary_conditions/LiveOcean_v201905_y2018m01d01.nc'
    )
    zlevels = (test_LO['deptht'][:])

    depths = np.zeros([40, 898, 398])

    for j in range(0, 898):
        for i in range(0, 398):
            depths[:, j, i] = zlevels

    tdepths = np.ravel(depths)
    tsra = np.ravel(tsal)
    ttera = np.ravel(ttemp)
    ttara = np.ravel(tta) * 1e-3
    tdra = np.ravel(tdic) * 1e-3
    tzero = np.zeros_like(tsra)
    tpressure = np.zeros_like(tsra)
    tpressure[:] = 1
    tzero = tpressure * 0

    tsra_psu = tsra * 35 / 35.16504
    ttera_is = gsw.t_from_CT(tsra, ttera, tzero)

    response_tup = mocsy.mvars(temp=ttera_is,
                               sal=tsra_psu,
                               alk=ttara,
                               dic=tdra,
                               sil=tzero,
                               phos=tzero,
                               patm=tpressure,
                               depth=tdepths,
                               lat=tzero,
                               optcon='mol/m3',
                               optt='Tinsitu',
                               optp='m',
                               optb='l10',
                               optk1k2='m10',
                               optkf='dg',
                               optgas='Pinsitu')
    pH, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, DENis, p, Tis = response_tup

    pHr = pH.reshape(40, 898, 398)
    OmAr = OmegaA.reshape(40, 898, 398)
    OmCr = OmegaC.reshape(40, 898, 398)
    pco2r = pco2.reshape(40, 898, 398)

    return pHr, OmAr, OmCr, pco2r
Ejemplo n.º 7
0
def oned_moxy(tsal, ttemp, tdic, tta, pres_atm, depth_this):

    ### GET pCO2 (and Omega, etc) GIVEN DIC, TA
    import sys
    sys.path.append('/data/tjarniko/mocsy')
    import mocsy
    import numpy as np
    import gsw

    size_box = np.shape(tdic)
    size_0 = size_box[0]
    size_1 = size_box[1]

    tsra = np.ravel(tsal)
    ttera = np.ravel(ttemp)
    #convert cons. temperature to potential temperature
    ttera_pot = gsw.pt_from_CT(tsra, ttera)

    ttara = np.ravel(tta) * 1e-3
    tdra = np.ravel(tdic) * 1e-3
    tzero = np.zeros_like(tsra)
    tpressure = np.zeros_like(tsra)
    #tdepth = np.zeros_like(tsra)
    tpressure[:] = pres_atm
    tdepth = np.ravel(depth_this)
    tzero = tpressure * 0

    tsra_psu = tsra * 35 / 35.16504
    #ttera_is = gsw.t_from_CT(tsra,ttera,tzero)

    response_tup = mocsy.mvars(temp=ttera_pot,
                               sal=tsra_psu,
                               alk=ttara,
                               dic=tdra,
                               sil=tzero,
                               phos=tzero,
                               patm=tpressure,
                               depth=tdepth,
                               lat=tzero,
                               optcon='mol/m3',
                               optt='Tpot',
                               optp='m',
                               optb='l10',
                               optk1k2='m10',
                               optkf='dg',
                               optgas='Pinsitu')
    pH, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, DENis, p, Tis = response_tup

    pHr = pH.reshape(size_0, size_1)
    OmAr = OmegaA.reshape(size_0, size_1)
    pco2r = pco2.reshape(size_0, size_1)

    return pHr, OmAr, pco2r
Ejemplo n.º 8
0
def OmA_3D(grid, carp):
    tsal = grid['vosaline'][0, :, :, :]
    ttemp = grid['votemper'][0, :, :, :]
    tdic = carp['dissolved_inorganic_carbon'][0, :, :, :]
    tta = carp['total_alkalinity'][0, :, :, :]

    test_LO = nc.Dataset(
        '/results/forcing/LiveOcean/boundary_conditions/LiveOcean_v201905_y2018m01d01.nc'
    )
    zlevels = (test_LO['deptht'][:])

    depths = np.zeros([40, 898, 398])

    for j in range(0, 898):
        for i in range(0, 398):
            depths[:, j, i] = zlevels

    tdepths = np.ravel(depths)
    tsra = np.ravel(tsal)
    ttera = np.ravel(ttemp)
    ttara = np.ravel(tta) * 1e-3
    tdra = np.ravel(tdic) * 1e-3
    tzero = np.zeros_like(tsra)
    tpressure = np.zeros_like(tsra)
    tpressure[:] = 1
    tzero = tpressure * 0

    tsra_psu = tsra * 35 / 35.16504
    ttera_is = gsw.t_from_CT(tsra, ttera, tzero)

    response_tup = mocsy.mvars(temp=ttera_is,
                               sal=tsra_psu,
                               alk=ttara,
                               dic=tdra,
                               sil=tzero,
                               phos=tzero,
                               patm=tpressure,
                               depth=tdepths,
                               lat=tzero,
                               optcon='mol/m3',
                               optt='Tinsitu',
                               optp='m',
                               optb='l10',
                               optk1k2='m10',
                               optkf='dg',
                               optgas='Pinsitu')
    pH, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, DENis, p, Tis = response_tup

    BetaDr = BetaD.reshape(40, 898, 398)

    return BetaDr
Ejemplo n.º 9
0
def point_moxy(tsal, ttemp, tdic, tta, pres_atm, depth_this):

    ### GET pCO2 (and Omega, etc) GIVEN DIC, TA
    import sys
    sys.path.append('/data/tjarniko/mocsy')
    import mocsy
    import numpy as np
    import gsw

    tsra = (tsal)
    ttera = (ttemp)
    #convert cons. temperature to potential temperature
    ttera_pot = gsw.pt_from_CT(tsra, ttera)

    ttara = (tta) * 1e-3
    tdra = (tdic) * 1e-3
    tzero = 0
    tpressure = pres_atm
    tdepth = (depth_this)
    tsra_psu = tsra * 35 / 35.16504
    #ttera_is = gsw.t_from_CT(tsra,ttera,tzero)

    response_tup = mocsy.mvars(temp=ttera_pot,
                               sal=tsra_psu,
                               alk=ttara,
                               dic=tdra,
                               sil=tzero,
                               phos=tzero,
                               patm=tpressure,
                               depth=tdepth,
                               lat=tzero,
                               optcon='mol/m3',
                               optt='Tpot',
                               optp='m',
                               optb='l10',
                               optk1k2='m10',
                               optkf='dg',
                               optgas='Pinsitu')
    pH, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, DENis, p, Tis = response_tup

    pHr = pH
    OmAr = OmegaA
    pco2r = pco2

    return pHr, OmAr, pco2r
Ejemplo n.º 10
0
def oned_moxy(tsal, ttemp, tdic, tta, pres_atm, depth_this):
    import sys
    sys.path.append('/data/tjarniko/mocsy')
    import mocsy
    import numpy as np
    import gsw

    tsra = np.ravel(tsal)
    ttera = np.ravel(ttemp)
    ttara = np.ravel(tta) * 1e-3
    tdra = np.ravel(tdic) * 1e-3
    tzero = np.zeros_like(tsra)
    tpressure = np.zeros_like(tsra)
    #tdepth = np.zeros_like(tsra)
    tpressure[:] = pres_atm
    tdepth = np.ravel(depth_this)
    tzero = tpressure * 0

    #no need to convert these, they're already converted
    #tsra_psu = tsra*35/35.16504
    #ttera_is = gsw.t_from_CT(tsra,ttera,tzero)

    response_tup = mocsy.mvars(temp=ttera,
                               sal=tsra,
                               alk=ttara,
                               dic=tdra,
                               sil=tzero,
                               phos=tzero,
                               patm=tpressure,
                               depth=tdepth,
                               lat=tzero,
                               optcon='mol/m3',
                               optt='Tinsitu',
                               optp='m',
                               optb='l10',
                               optk1k2='m10',
                               optkf='dg',
                               optgas='Pinsitu')
    pH, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, DENis, p, Tis = response_tup

    return pH, OmegaA, pco2
Ejemplo n.º 11
0
def scalar_variables():
    """
    Functions return 1-dimensional numpy arrays.
    Scalar inputs return length-1 arrays.
    DATA input: DIC and ALk in mol/kg, in situ temperature, pressure.
    """

    return mocsy.mvars(temp=18,
                       sal=35,
                       alk=2300.e-6,
                       dic=2000.e-6,
                       sil=0,
                       phos=0,
                       patm=1,
                       depth=100,
                       lat=0,
                       optcon='mol/kg',
                       optt='Tinsitu',
                       optp='db',
                       optb='u74',
                       optk1k2='l',
                       optkf='dg',
                       optgas='Pinsitu')
Ejemplo n.º 12
0
def scalar_variables():
    """
    Functions return 1-dimensional numpy arrays.
    Scalar inputs return length-1 arrays.
    DATA input: DIC and ALk in mol/kg, in situ temperature, pressure.
    """

    return mocsy.mvars(temp=18,
                       sal=35,
                       alk=2300.e-6,
                       dic=2000.e-6,
                       sil=0,
                       phos=0,
                       patm=1,
                       depth=100,
                       lat=0,
                       optcon='mol/kg',
                       optt='Tinsitu',
                       optp='db',
                       optb='u74',
                       optk1k2='l',
                       optkf='dg',
                       optgas='Pinsitu')
Ejemplo n.º 13
0
def plume_maps(carp, grid, stns, ddmmmyy, rdir, humandate, dss_sig):

    tsal = grid.variables['vosaline'][0, 0, :, :]
    ttemp = grid.variables['votemper'][0, 0, :, :]
    tdic = carp.variables['dissolved_inorganic_carbon'][0, 0, :, :]
    tta = carp.variables['total_alkalinity'][0, 0, :, :]

    tsra = np.ravel(tsal)
    ttera = np.ravel(ttemp)
    ttara = np.ravel(tta) * 1e-3
    tdra = np.ravel(tdic) * 1e-3
    tzero = np.zeros_like(tsra)
    tpressure = np.zeros_like(tsra)
    tpressure[:] = 1
    tzero = tpressure * 0

    tsra_psu = tsra * 35 / 35.16504

    response_tup = mocsy.mvars(temp=ttera,
                               sal=tsra_psu,
                               alk=ttara,
                               dic=tdra,
                               sil=tzero,
                               phos=tzero,
                               patm=tpressure,
                               depth=tzero,
                               lat=tzero,
                               optcon='mol/m3',
                               optt='Tpot',
                               optp='m',
                               optb='l10',
                               optk1k2='m10',
                               optkf='dg',
                               optgas='Pinsitu')
    pH, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, DENis, p, Tis = response_tup

    pHr = pH.reshape(898, 398)
    OmA = OmegaA.reshape(898, 398)

    surf_dat = [tsal, tdic, tta, ttemp, pHr, OmA]

    vmins = [15, 500, 500, 5, 7.5, 0]
    vmaxs = [30, 1800, 1800, 15, 8.5, 2]
    msk = [0, 0, 0, 0, 1e20, 1e20]
    cl = [
        'salinity psu', 'DIC umol/kg', 'TA umol/kg', 'temp deg C', 'pH',
        'Omega A'
    ]
    t_cmap = [
        cm.cm.haline, cm.cm.matter, cm.cm.matter, cm.cm.thermal, cm.cm.speed,
        cm.cm.curl
    ]

    fig, ((ax1, ax2, ax3), (ax4, ax5, ax6)) = \
    plt.subplots(figsize=(17, 8.5) , nrows=2, ncols=3)

    viz_tools.set_aspect(ax1)
    viz_tools.set_aspect(ax2)
    viz_tools.set_aspect(ax3)
    viz_tools.set_aspect(ax4)
    viz_tools.set_aspect(ax5)
    viz_tools.set_aspect(ax6)

    y1 = 390
    y2 = 460
    x1 = 240
    x2 = 398
    i = 0
    tplt0 = surf_dat[i][y1:y2, x1:x2]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax1.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax1)
    cbar.set_label(cl[i], fontsize=20)
    ax1.set_xticks([])
    ax1.set_yticks([])

    i = 1
    tplt0 = surf_dat[i][y1:y2, x1:x2]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax2.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax2)
    cbar.set_label(cl[i], fontsize=20)
    ax2.set_xticks([])
    ax2.set_yticks([])

    i = 2
    tplt0 = surf_dat[i][y1:y2, x1:x2]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax3.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax3)
    cbar.set_label(cl[i], fontsize=20)
    ax3.set_xticks([])
    ax3.set_yticks([])

    i = 3
    tplt0 = surf_dat[i][y1:y2, x1:x2]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax4.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax4)
    cbar.set_label(cl[i], fontsize=20)
    ax4.set_xticks([])
    ax4.set_yticks([])

    i = 4
    tplt0 = surf_dat[i][y1:y2, x1:x2]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax5.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax5)
    cbar.set_label(cl[i], fontsize=20)
    ax5.set_xticks([])
    ax5.set_yticks([])

    i = 5
    tplt0 = surf_dat[i][y1:y2, x1:x2]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax6.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax6)
    cbar.set_label(cl[i], fontsize=20)
    ax6.set_xticks([])
    ax6.set_yticks([])

    cols = []
    xs = []
    ys = []
    stn_in = []
    for s in stns:
        col = stns[s]['color']
        x = stns[s]['x']
        y = stns[s]['y']
        stn = stns[s]['code']
        cols.append(col)
        xs.append(x)
        ys.append(y)
        stn_in.append(stn)

    #tcmap.set_bad('white')
    st = 'Fraser Plume Carbonate Chemistry, ' + humandate
    plt.suptitle(st, fontsize=20)
    fname = rdir + f'{ddmmmyy}_plume_' + dss_sig + '.png'

    fig.savefig(fname)
    #plt.show()
    plt.close()
Ejemplo n.º 14
0
    	lat   = np.ravel (lat)
    	# Make a flat array of 3D variables: t, s, alk, sio2 & po4
    	t = np.ravel (t.getValue())
    	s = np.ravel (s.getValue())
    	alk = np.ravel (alk.getValue())
    	po4 = np.ravel (po4.getValue())
    	sio2 = np.ravel (sio2.getValue())
    	# Flatten array, missing values filled with 0
    	# dic_array = np.ravel (dic.filled(0.))
	dic = dic.filled(0.)
        patm = t[:]*0 + 1
	#
    	#-----------------------------------------------------------------------------
        # Computed other carbonate system variables (pH, CO2*, HCO3-, CO3--, Omegas, R (BetaD), (& in-situ rho, pressure, & T)
        pH, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, DENis, p, Tis = (
        mocsy.mvars (t, s, alk, dic.ravel(), sio2, po4, patm, depth, lat,
                     optcon='mol/m3', optt='Tpot', optp='m', optb="u74", optk1k2='l', optkf="dg", optgas="Pinsitu")
        )
    	del (t)
    	del (s)
    	# del (alk)
    	# del (dic_array)
    	del (sio2)
    	del (po4)
    	#del (p)
        del (depth)
        del (lat)
    	del (patm)
	#
    	#-----------------------------------------------------------------------------
    	# Make the variables have correct shape
    	pH   = np.reshape (pH, dic.shape)
Ejemplo n.º 15
0
def surface_buffer_maps(carp, grid, ddmmmyy, rdir, humandate, dss_sig):

    #retrieve relevant data for mocsy calculation, calculate mocsy
    tsal = grid.variables['vosaline'][0, 0, :, :]
    ttemp = grid.variables['votemper'][0, 0, :, :]
    tdic = carp.variables['dissolved_inorganic_carbon'][0, 0, :, :]
    tta = carp.variables['total_alkalinity'][0, 0, :, :]

    tsra = np.ravel(tsal)
    ttera = np.ravel(ttemp)
    ttara = np.ravel(tta) * 1e-3
    tdra = np.ravel(tdic) * 1e-3
    tzero = np.zeros_like(tsra)
    tpressure = np.zeros_like(tsra)
    tpressure[:] = 1
    tzero = tpressure * 0

    tsra_psu = tsra * 35 / 35.16504
    ttera_is = gsw.t_from_CT(tsra, ttera, tzero)

    response_tup = mocsy.mvars(temp=ttera_is,
                               sal=tsra_psu,
                               alk=ttara,
                               dic=tdra,
                               sil=tzero,
                               phos=tzero,
                               patm=tpressure,
                               depth=tzero,
                               lat=tzero,
                               optcon='mol/m3',
                               optt='Tinsitu',
                               optp='m',
                               optb='l10',
                               optk1k2='m10',
                               optkf='dg',
                               optgas='Pinsitu')
    pH, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, DENis, p, Tis = response_tup

    #calculate borate and ohminus concentration

    bicarb = hco3
    carb = co3
    #calculate borate, Uppstrom, 1974, looked up in mocsy
    scl = tsra / 1.80655
    borat = 0.000232 * scl / 10.811
    hplus = 10**(-1 * pH)
    borat2 = .0000119 * tsra
    ohminus = ttara - bicarb - 2 * carb - borat

    # - calculates quantities needed for Egleston's factors, and the factors themselves

    #Khb is the acidity constant for boric acid - is this an appropriate ref?
    # https://www2.chemistry.msu.edu/courses/cem262/aciddissconst.html
    Khb = 5.81e-10

    S = bicarb + 4 * (carb) + (hplus * borat) / (Khb + hplus) + hplus - ohminus
    P = 2 * (carb) + bicarb
    AlkC = bicarb + 2 * (carb)

    DIC = co2 + bicarb + carb
    #Alk = bicarb + 2*carb + borat - hplus + ohminus

    g_dic = DIC - AlkC**2 / S
    b_dic = (DIC * S - AlkC**2) / AlkC
    w_dic = DIC - (AlkC * P) / bicarb

    g_alk = (AlkC**2 - DIC * S) / AlkC
    b_alk = (AlkC**2 / DIC) - S
    w_alk = AlkC - (DIC * bicarb) / P

    ####
    g_dicR = g_dic.reshape(898, 398) * 1000
    b_dicR = b_dic.reshape(898, 398) * 1000
    w_dicR = w_dic.reshape(898, 398) * -1000
    g_alkR = g_alk.reshape(898, 398) * -1000
    b_alkR = b_alk.reshape(898, 398) * -1000
    w_alkR = w_alk.reshape(898, 398) * 1000

    surf_dat = [g_dicR, b_dicR, w_dicR, g_alkR, b_alkR, w_alkR]
    #ranges from nov 13,2014 hindcast.
    vmins = [-0.7, -0.4, -0.1, -0.4, -0.4, -0.1]
    vmaxs = [0.7, 1, 0.5, 1, 1, 0.4]
    msk = [1.875e+23, 5e+23, 6e+23, 5e+23, 5e+23, 2e+23]

    cl = ['$\gamma_{DIC}$', '$\\beta_{DIC}$', '-$\omega_{DIC}$',\
          '$\gamma_{TA}$', '$\\beta_{TA}$', '-$\omega_{TA}$']

    t_cmap = [cm.cm.oxy, cm.cm.oxy, cm.cm.oxy, cm.cm.oxy, cm.cm.oxy, cm.cm.oxy]
    fig, ((ax1, ax2, ax3), (ax4, ax5, ax6)) = \
    plt.subplots(figsize=(20, 27) , nrows=2, ncols=3)

    viz_tools.set_aspect(ax1)
    viz_tools.set_aspect(ax2)
    viz_tools.set_aspect(ax3)
    viz_tools.set_aspect(ax4)
    viz_tools.set_aspect(ax5)
    viz_tools.set_aspect(ax6)

    i = 0
    #'g_dicR',
    tplt0 = surf_dat[i]
    tplt = np.ma.masked_values(tplt0, 1.875e+23)
    tcmap = t_cmap[i]
    mesh = ax1.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax1)
    cbar.set_label(cl[i], fontsize=20)
    ax1.set_title('$CO_{2}$ with DIC', fontsize=22)

    i = 1
    #'b_dicR',
    tplt0 = surf_dat[i]
    tplt = np.ma.masked_values(tplt0, 5e+23)
    tcmap = t_cmap[i]
    mesh = ax2.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax2)
    cbar.set_label(cl[i], fontsize=20)
    ax2.set_title('pH with DIC', fontsize=22)

    i = 2
    #'-w_dicR',
    tplt0 = surf_dat[i]
    tplt = np.ma.masked_values(tplt0, 6e+23)
    tcmap = t_cmap[i]
    mesh = ax3.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax3)
    cbar.set_label(cl[i], fontsize=20)
    ax3.set_title('$\Omega$ with DIC', fontsize=22)

    i = 3
    #'-g_alkR',
    tplt0 = surf_dat[i]
    tplt = np.ma.masked_values(tplt0, 5e+23)
    tcmap = t_cmap[i]
    mesh = ax4.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax4)
    cbar.set_label(cl[i], fontsize=20)
    ax4.set_title('$CO_{2}$ with TA', fontsize=22)

    i = 4
    #'-b_alkR',
    tplt0 = surf_dat[i]
    tplt = np.ma.masked_values(tplt0, 5e+23)
    tcmap = t_cmap[i]
    mesh = ax5.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax5)
    cbar.set_label(cl[i], fontsize=20)
    ax5.set_title('pH with TA', fontsize=22)

    i = 5
    #'w_alkR'
    tplt0 = surf_dat[i]
    tplt = np.ma.masked_values(tplt0, 2e+23)
    tcmap = t_cmap[i]
    mesh = ax6.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax6)
    cbar.set_label(cl[i], fontsize=20)
    ax6.set_title('$\Omega$ with TA', fontsize=22)

    #tcmap.set_bad('white')
    st = 'Carbonate Chemistry Buffer Factors, ' + humandate
    plt.suptitle(st, fontsize=20)

    fname = rdir + f'{ddmmmyy}_buffmap_' + dss_sig + '.png'

    fig.savefig(fname)
    plt.close()
Ejemplo n.º 16
0
def pHOmpco2_thres(carp, grid, ddmmmyy, rdir, humandate, dss_sig, pH_M, pCO2_M,
                   OmA_M, pH_T, pCO2_T, OmA_T):

    tsal = grid.variables['vosaline'][0, 0, :, :]
    ttemp = grid.variables['votemper'][0, 0, :, :]
    tdic = carp.variables['dissolved_inorganic_carbon'][0, 0, :, :]
    tta = carp.variables['total_alkalinity'][0, 0, :, :]

    tsra = np.ravel(tsal)
    ttera = np.ravel(ttemp)
    ttara = np.ravel(tta) * 1e-3
    tdra = np.ravel(tdic) * 1e-3
    tzero = np.zeros_like(tsra)
    tpressure = np.zeros_like(tsra)
    tpressure[:] = 1
    tzero = tpressure * 0

    tsra_psu = tsra * 35 / 35.16504

    response_tup = mocsy.mvars(temp=ttera,
                               sal=tsra_psu,
                               alk=ttara,
                               dic=tdra,
                               sil=tzero,
                               phos=tzero,
                               patm=tpressure,
                               depth=tzero,
                               lat=tzero,
                               optcon='mol/m3',
                               optt='Tpot',
                               optp='m',
                               optb='l10',
                               optk1k2='m10',
                               optkf='dg',
                               optgas='Pinsitu')
    pH, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, DENis, p, Tis = response_tup

    pHr = pH.reshape(898, 398)
    OmA = OmegaA.reshape(898, 398)
    pco2R = pco2.reshape(898, 398)

    #surf_dat = [tsal, tdic, tta, ttemp, pHr, OmA]
    surf_dat = [pHr, OmA, pco2R]
    print(OmA[20, 250])
    print(pHr[20, 250])
    print(pco2R[20, 250])

    pH_20 = pH_T - pH_M
    pH_MX = pH_M + (pH_20 * 5)

    OmA_20 = OmA_T - OmA_M
    OmA_MX = OmA_M + (OmA_20 * 5)

    pCO2_20 = pCO2_T - pCO2_M
    pCO2_MX = pCO2_M + (pCO2_20 * 5)

    vmins = [pH_M, OmA_M, pCO2_M]
    vmaxs = [pH_MX, OmA_MX, pCO2_MX]
    msk = [1e20, 1e20, 1e20]
    cl = ['pH', 'Omega A', 'pCO2']
    t_cmap = [cm.cm.oxy, cm.cm.oxy, cm.cm.oxy]

    fig, ((ax1, ax2, ax3)) = \
    plt.subplots(figsize=(17, 8.5) , nrows=1, ncols=3)

    viz_tools.set_aspect(ax1)
    viz_tools.set_aspect(ax2)
    viz_tools.set_aspect(ax3)

    y1 = 0
    y2 = 898
    x1 = 0
    x2 = 398
    i = 0
    tplt0 = surf_dat[i][y1:y2, x1:x2]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax1.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax1)
    cbar.set_label(cl[i], fontsize=20)
    ax1.set_xticks([])
    ax1.set_yticks([])

    i = 1
    tplt0 = surf_dat[i][y1:y2, x1:x2]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax2.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax2)
    cbar.set_label(cl[i], fontsize=20)
    ax2.set_xticks([])
    ax2.set_yticks([])

    i = 2
    tplt0 = surf_dat[i][y1:y2, x1:x2]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax3.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax3)
    cbar.set_label(cl[i], fontsize=20)
    ax3.set_xticks([])
    ax3.set_yticks([])

    st = 'pH, pCO2, Omega_A threshold plots, ' + humandate
    plt.suptitle(st, fontsize=20)
    fname = rdir + f'{ddmmmyy}_pHT_' + dss_sig + '.png'

    fig.savefig(fname)
    plt.show()
Ejemplo n.º 17
0
def atmospheric_exchange_DIC(spec, params, species, temperature, windspeed, Q,
                             flow_velocity, vol, width, length):
    # [mol/m3]
    try:
        conc_DIC = max(spec[params.idic] * 1e-3 / vol, 0)
    except (FloatingPointError):
        conc_DIC = 0
    try:
        conc_ALK = max(spec[params.ialk] * 1e-3 / vol, 0)
    except (FloatingPointError):
        conc_ALK = 0

    if conc_DIC < 999 and conc_ALK < 999 and conc_DIC > 0:
        carb_dat = np.dstack(
            mocsy.mvars(temp=temperature - params.tempcorrection,
                        sal=0,
                        alk=conc_ALK,
                        dic=conc_DIC,
                        sil=0,
                        phos=0,
                        patm=1.,
                        depth=1,
                        lat=0,
                        optcon='mol/m3',
                        optt='Tinsitu',
                        optp='db',
                        optb="u74",
                        optk1k2='l',
                        optkf="dg",
                        optgas='Pinsitu'))[0][0]
        # [micro atmosphere]
        pCO2 = operator.itemgetter(1)(carb_dat)

    elif conc_DIC <= 0:
        pCO2 = 0
    else:
        with suppress_stdout_stderr(
        ):  # suppressing printed output of mocsy module when concentrations of either ALK or DIC are more than 1M
            carb_dat = np.dstack(
                mocsy.mvars(temp=temperature - params.tempcorrection,
                            sal=0,
                            alk=conc_ALK,
                            dic=conc_DIC,
                            sil=0,
                            phos=0,
                            patm=1.,
                            depth=1,
                            lat=0,
                            optcon='mol/m3',
                            optt='Tinsitu',
                            optp='db',
                            optb="u74",
                            optk1k2='l',
                            optkf="dg",
                            optgas='Pinsitu'))[0][0]
        # [micro atmosphere]
        pCO2 = operator.itemgetter(1)(carb_dat)
        if pCO2 > 1e6:
            pCO2 = 1e6

    # [mol/m3]
    CO2_conc = pCO2 * math.pow(10,
                               -6) * species[params.idic].get_val("kH") * 1000

    # [cm s-1]
    v = (flow_velocity * 1e5 / (365. * 86400.))

    # [km]
    length *= math.pow(10, -3)
    # [km]
    width *= math.pow(10, -3)

    if width < 100 * math.pow(10, -3) and v > 0.0:
        # [cm h-1]
        k600 = (species[params.idic].get_val("exch_a1") +
                species[params.idic].get_val("exch_b1") * v)
    else:
        # [cm h-1]
        k600 = (species[params.idic].get_val("exch_a2") +
                species[params.idic].get_val("exch_b2") * windspeed)

    sc = 1911.1 - 118.11 * (temperature - params.tempcorrection) + 3.4527 * (
        temperature - params.tempcorrection)**2 - 0.04132 * (
            temperature - params.tempcorrection)**3
    try:
        k = k600 / ((600 / sc)**(-0.5))
    except (FloatingPointError):
        k = 1e-9

    # [cm d-1]
    k *= 24.
    # [cm y-1]
    k *= 365
    # [m y-1]
    k *= 0.01

    #[mol/m3]
    dCO2 = CO2_conc - params.CO2_eq

    if params.lsensitivity == 1:
        #[mol/m3]
        dCO2 = CO2_conc - params.CO2_eq * params.co2_eq_factor

    # [km y-1]
    k *= math.pow(10, -3)
    #[mol/km3]
    dCO2 *= math.pow(10, 9)
    #[Mmol/km3]
    dCO2 *= math.pow(10, -6)

    #exchange in Mmol/year
    ex = dCO2 * k * length * width

    return ex
Ejemplo n.º 18
0
 # Flatten array, missing values filled with 0
 # dic_array = np.ravel (dicd.filled(0.))
 dicd = dicd.filled(0.0)
 #
 # -----------------------------------------------------------------------------
 # Compute other carbonate system variables (pH, CO2*, HCO3-, CO3--, Omegas, R (BetaD), (& in-situ rho, pressure, & T)
 print "Compute carbonate chemistry"
 pH, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, DENis, p, Tis = mocsy.mvars(
     td,
     sd,
     alkd,
     dicd.ravel(),
     sio2d,
     po4d,
     patmd,
     depth,
     lat,
     optcon="mol/kg",
     optt="Tinsitu",
     optp="m",
     optb="u74",
     optk1k2="l",
     optkf="dg",
     optgas="Pinsitu",
 )
 del (td)
 del (sd)
 # del (alkd)
 # del (dic_array)
 del (sio2d)
 del (po4d)
 # del (p)
Ejemplo n.º 19
0
def point_value(carp, grid, stns):
    '''
    
    '''   
    w = carp
    wp = grid
    
    sal = wp.variables['vosaline'][0,:,:,:]
    temp = wp.variables['votemper'][0,:,:,:]
    DIC = w.variables['dissolved_inorganic_carbon'][0,:,:,:]
    TA = w.variables['total_alkalinity'][0,:,:,:]
    O2 = w.variables['dissolved_oxygen'][0,:,:,:]
    depth = w.variables['deptht'][:]
    
    depth_broadcast = np.zeros([40,20,20])
    for i in range(0,40):
        depth_broadcast[i,:,:] = depth[i]
    
    depth_inds = [0,21,26]
    dum = [0.0,0.0,0.0]
    pt_depths = np.zeros_like(dum)
    
    for i in range(0,len(pt_depths)):
        di = depth_inds
        pt_depths[i] = depth[depth_inds[i]]
    
    nos = len(stns)
    stn_list = []

    sal_pt = np.zeros([nos,len(depth_inds)])
    temp_pt = np.zeros([nos,len(depth_inds)])
    DIC_pt = np.zeros([nos,len(depth_inds)])
    TA_pt = np.zeros([nos,len(depth_inds)])
    pH_pt = np.zeros([nos,len(depth_inds)])
    OmA_pt = np.zeros([nos,len(depth_inds)])
    O2_pt = np.zeros([nos,len(depth_inds)])

    sal_ptSD = np.zeros([nos,len(depth_inds)])
    temp_ptSD = np.zeros([nos,len(depth_inds)])
    DIC_ptSD = np.zeros([nos,len(depth_inds)])
    TA_ptSD = np.zeros([nos,len(depth_inds)])
    pH_ptSD = np.zeros([nos,len(depth_inds)])
    OmA_ptSD = np.zeros([nos,len(depth_inds)])
    O2_ptSD = np.zeros([nos,len(depth_inds)])
    
    b = 0
    for s in stns:
        stn_list.append(s)
        
        
        #print('Calculating point values for ' + stns[s]['fullname'])
        ty = stns[s]['y']
        tx = stns[s]['x']
        
        for d in range(0,len(depth_inds)):
            dp = depth[depth_inds[d]]
            ts = sal[d,ty:ty+20,tx:tx+20]
            tte = temp[d,ty:ty+20,tx:tx+20]
            td = DIC[d,ty:ty+20,tx:tx+20]
            tta = TA[d,ty:ty+20,tx:tx+20]
            to2 = O2[d,ty:ty+20,tx:tx+20]

            tsr =  ts.reshape(1,400)
            tter =  tte.reshape(1,400)
            tdr =  td.reshape(1,400)
            ttar =  tta.reshape(1,400)

            tdepth = np.zeros_like(ttar)
     

            tdepth[:] = dp
            to2r = to2.reshape(1,400)

            tsr[tsr == 0] = np.ma.masked
            tter[tter == 0] = np.ma.masked
            tdr[tdr == 0] = np.ma.masked
            ttar[ttar == 0] = np.ma.masked

            sal_pt[b,d] = np.ma.MaskedArray.nanmean(tsr, axis = 1)
            sal_ptSD[b,d] = np.ma.MaskedArray.nanstd(tsr, axis = 1)

            temp_pt[b,:] = np.ma.MaskedArray.nanmean(tter, axis = 1)
            temp_ptSD[b,d] = np.ma.MaskedArray.nanstd(tter, axis = 1)

            DIC_pt[b,d] = np.ma.MaskedArray.nanmean(tdr, axis = 1)
            DIC_ptSD[b,d] = np.ma.MaskedArray.nanstd(tdr, axis = 1)

            TA_pt[b,d] = np.ma.MaskedArray.nanmean(ttar, axis = 1)
            TA_ptSD[b,d] = np.ma.MaskedArray.nanstd(ttar, axis = 1)

            O2_pt[b,d] = np.ma.MaskedArray.nanmean(to2r, axis = 1)
            O2_ptSD[b,d] = np.ma.MaskedArray.nanstd(to2r, axis = 1)

            tsra = np.ravel(ts)
            ttera = np.ravel(tte)
            tdra = np.ravel(td) * 1e-3
            ttara =  np.ravel(tta) * 1e-3
            tdepthra = np.ravel(tdepth)
            tpressure = np.zeros_like(tdepthra)
            tpressure[:] =1
            tzero = tdepthra * 0 
            
            tsra_psu = tsra*35/35.16504
            ttera_is = gsw.t_from_CT(tsra,ttera,tdepthra)

            response_tup = mocsy.mvars(temp=ttera_is, sal=tsra_psu, alk=ttara, dic=tdra, 
                               sil=tzero, phos=tzero, patm=tpressure, depth=tdepthra, lat=tzero, 
                                optcon='mol/m3', optt='Tinsitu', optp='m',
                                optb = 'l10', optk1k2='m10', optkf = 'dg', optgas = 'Pinsitu')
            pH,pco2,fco2,co2,hco3,co3,OmegaA,OmegaC,BetaD,DENis,p,Tis = response_tup

            pHra = pH.reshape(1,400)
            OmegaAra = OmegaA.reshape(1,400)

            pHra[pHra == 1.00000000e+20] = np.nan
            OmegaAra[OmegaAra == 1.00000000e+20] = np.nan
            pHra = np.ma.masked_invalid(pHra)
            OmegaAra = np.ma.masked_invalid(OmegaAra)
        
            pH_pt[b,d] = np.ma.MaskedArray.nanmean(pHra, axis = 1)
            pH_pt[b,d] = np.ma.MaskedArray.nanstd(pHra, axis = 1)

            OmA_pt[b,d] = np.ma.MaskedArray.nanmean(OmegaAra, axis = 1)
            OmA_pt[b,d] = np.ma.MaskedArray.nanstd(OmegaAra, axis = 1)
            
            sal_pt[sal_pt == 0 ] = np.nan
            temp_pt[temp_pt == 0 ] = np.nan
            DIC_pt[DIC_pt == 0 ] = np.nan
            TA_pt[TA_pt == 0 ] = np.nan
            pH_pt[pH_pt == 0 ] = np.nan
            OmA_pt[OmA_pt == 0 ] = np.nan
            
        wb = b+1

    pars_pts = {'sal': sal_pt, 'sal_SD': sal_ptSD,\
     'temp': temp_pt, 'temp_SD': temp_ptSD,\
     'DIC': DIC_pt, 'DIC_SD' : DIC_ptSD,\
     'TA': TA_pt, 'TA_SD' : TA_ptSD,\
     'OmA': OmA_pt, 'OmA_SD': OmA_ptSD,\
     'pH': pH_pt, 'pH_SD': pH_ptSD,\
     'O2' : O2_pt, 'O2_SD': O2_ptSD}
    
    return pars_pts, pt_depths, stn_list    
Ejemplo n.º 20
0
def surface_maps(carp, grid, stns, ddmmmyy, rdir, humandate, dss_sig):

    tsal = grid.variables['vosaline'][0, 0, :, :]
    ttemp = grid.variables['votemper'][0, 0, :, :]
    tdic = carp.variables['dissolved_inorganic_carbon'][0, 0, :, :]
    tta = carp.variables['total_alkalinity'][0, 0, :, :]

    tsra = np.ravel(tsal)
    ttera = np.ravel(ttemp)
    ttara = np.ravel(tta) * 1e-3
    tdra = np.ravel(tdic) * 1e-3
    tzero = np.zeros_like(tsra)
    tpressure = np.zeros_like(tsra)
    tpressure[:] = 1
    tzero = tpressure * 0

    tsra_psu = tsra * 35 / 35.16504
    ttera_is = gsw.t_from_CT(tsra, ttera, tzero)

    response_tup = mocsy.mvars(temp=ttera_is,
                               sal=tsra_psu,
                               alk=ttara,
                               dic=tdra,
                               sil=tzero,
                               phos=tzero,
                               patm=tpressure,
                               depth=tzero,
                               lat=tzero,
                               optcon='mol/m3',
                               optt='Tinsitu',
                               optp='m',
                               optb='l10',
                               optk1k2='m10',
                               optkf='dg',
                               optgas='Pinsitu')
    pH, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, DENis, p, Tis = response_tup

    pHr = pH.reshape(898, 398)
    OmA = OmegaA.reshape(898, 398)

    surf_dat = [tsal, tdic, tta, ttemp, pHr, OmA]

    vmins = [25, 1800, 1800, 5, 7.5, 0]
    vmaxs = [32, 2200, 2200, 15, 8.5, 2]
    msk = [0, 0, 0, 0, 1e20, 1e20]
    cl = [
        'salinity psu', 'DIC umol/kg', 'TA umol/kg', 'temp deg C', 'pH',
        'Omega A'
    ]
    t_cmap = [
        cm.cm.haline, cm.cm.matter, cm.cm.matter, cm.cm.thermal, cm.cm.speed,
        cm.cm.curl
    ]

    fig, ((ax1, ax2, ax3), (ax4, ax5, ax6)) = \
    plt.subplots(figsize=(20, 27) , nrows=2, ncols=3)

    viz_tools.set_aspect(ax1)
    viz_tools.set_aspect(ax2)
    viz_tools.set_aspect(ax3)
    viz_tools.set_aspect(ax4)
    viz_tools.set_aspect(ax5)
    viz_tools.set_aspect(ax6)

    i = 0
    tplt0 = surf_dat[i]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax1.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax1)
    cbar.set_label(cl[i], fontsize=20)

    i = 1
    tplt0 = surf_dat[i]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax2.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax2)
    cbar.set_label(cl[i], fontsize=20)

    i = 2
    tplt0 = surf_dat[i]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax3.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax3)
    cbar.set_label(cl[i], fontsize=20)

    i = 3
    tplt0 = surf_dat[i]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax4.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax4)
    cbar.set_label(cl[i], fontsize=20)

    i = 4
    tplt0 = surf_dat[i]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax5.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax5)
    cbar.set_label(cl[i], fontsize=20)

    i = 5
    tplt0 = surf_dat[i]
    tplt = np.ma.masked_values(tplt0, msk[i])
    tcmap = t_cmap[i]
    mesh = ax6.pcolormesh(tplt, cmap=tcmap, vmin=vmins[i], vmax=vmaxs[i])
    cbar = fig.colorbar(mesh, ax=ax6)
    cbar.set_label(cl[i], fontsize=20)

    cols = []
    xs = []
    ys = []
    stn_in = []
    for s in stns:
        col = stns[s]['color']
        x = stns[s]['x']
        y = stns[s]['y']
        stn = stns[s]['code']
        cols.append(col)
        xs.append(x)
        ys.append(y)
        stn_in.append(stn)

    for w in range(0, len(stns)):
        pat = patches.Rectangle((xs[w], ys[w]),
                                20,
                                20,
                                linewidth=2,
                                edgecolor=cols[w],
                                facecolor='none')
        ax1.add_patch(pat)

    for w in range(0, len(cols)):
        pat = patches.Rectangle((xs[w], ys[w]),
                                20,
                                20,
                                linewidth=2,
                                edgecolor=cols[w],
                                facecolor='none')
        ax2.add_patch(pat)
    for w in range(0, len(cols)):
        pat = patches.Rectangle((xs[w], ys[w]),
                                20,
                                20,
                                linewidth=2,
                                edgecolor=cols[w],
                                facecolor='none')
        ax3.add_patch(pat)
    for w in range(0, len(cols)):
        pat = patches.Rectangle((xs[w], ys[w]),
                                20,
                                20,
                                linewidth=2,
                                edgecolor=cols[w],
                                facecolor='none')
        ax4.add_patch(pat)
    for w in range(0, len(cols)):
        pat = patches.Rectangle((xs[w], ys[w]),
                                20,
                                20,
                                linewidth=2,
                                edgecolor=cols[w],
                                facecolor='none')
        ax5.add_patch(pat)
    for w in range(0, len(cols)):
        pat = patches.Rectangle((xs[w], ys[w]),
                                20,
                                20,
                                linewidth=2,
                                edgecolor=cols[w],
                                facecolor='none')
        ax6.add_patch(pat)

    for i in range(0, len(xs)):
        ax1.text(xs[i] + 22, ys[i] + 3, stn_in[i], weight='bold', fontsize=20)

    #tcmap.set_bad('white')
    st = 'Salish Sea Carbonate Chemistry Map, ' + humandate
    plt.suptitle(st, fontsize=20)

    fname = rdir + f'{ddmmmyy}_map_' + dss_sig + '.png'

    fig.savefig(fname)
    plt.close()
Ejemplo n.º 21
0
def profiles(carp, grid, stns):
             
    '''
    Take 2 daily datasets, carbon+ and grid, extract depth 
    profiles of sal,temp,DIC,TA,O2,pH,OmA and their standard deviations"
    '''
    w = carp
    wp = grid

    
    sal = wp.variables['vosaline'][0,:,:,:]
    temp = wp.variables['votemper'][0,:,:,:]
    DIC = w.variables['dissolved_inorganic_carbon'][0,:,:,:]
    TA = w.variables['total_alkalinity'][0,:,:,:]
    O2 = w.variables['dissolved_oxygen'][0,:,:,:]
    prof_depth = w.variables['deptht'][:]

    
    depth_broadcast = np.zeros([40,20,20])
    for i in range(0,40):
        depth_broadcast[i,:,:] = prof_depth[i]

    nos = len(stns)
    stn_list = []
    
    sal_prof = np.zeros([nos,40])
    temp_prof = np.zeros([nos,40])
    DIC_prof = np.zeros([nos,40])
    TA_prof = np.zeros([nos,40])
    pH_prof = np.zeros([nos,40])
    OmA_prof = np.zeros([nos,40])
    O2_prof = np.zeros([nos,40])

    sal_profSD = np.zeros([nos,40])
    temp_profSD = np.zeros([nos,40])
    DIC_profSD = np.zeros([nos,40])
    TA_profSD = np.zeros([nos,40])
    pH_profSD = np.zeros([nos,40])
    OmA_profSD = np.zeros([nos,40])
    O2_profSD = np.zeros([nos,40])
    
    b = 0
    for s in stns:
        stn_list.append(s)
        stn = stns[s]
        #print('Calculating profiles for ' + stns[s]['fullname'])
        ty = stns[s]['y']
        tx = stns[s]['x']

        ts = sal[:,ty:ty+20,tx:tx+20]
        tte = temp[:,ty:ty+20,tx:tx+20]
        td = DIC[:,ty:ty+20,tx:tx+20]
        tta = TA[:,ty:ty+20,tx:tx+20]
        to2 = O2[:,ty:ty+20,tx:tx+20]

        tsr =  ts.reshape(40,400)
        tter =  tte.reshape(40,400)
        tdr =  td.reshape(40,400)
        ttar =  tta.reshape(40,400)
        tdepth = depth_broadcast.reshape(40,400)
        to2r = to2.reshape(40,400)

        tsr[tsr == 0] = np.ma.masked
        tter[tter == 0] = np.ma.masked
        tdr[tdr == 0] = np.ma.masked
        ttar[ttar == 0] = np.ma.masked

        sal_prof[b,:] = np.ma.MaskedArray.nanmean(tsr, axis = 1)
        sal_profSD[b,:] = np.ma.MaskedArray.nanstd(tsr, axis = 1)
        
        temp_prof[b,:] = np.ma.MaskedArray.nanmean(tter, axis = 1)
        temp_profSD[b,:] = np.ma.MaskedArray.nanstd(tter, axis = 1)

        DIC_prof[b,:] = np.ma.MaskedArray.nanmean(tdr, axis = 1)
        DIC_profSD[b,:] = np.ma.MaskedArray.nanstd(tdr, axis = 1)

        TA_prof[b,:] = np.ma.MaskedArray.nanmean(ttar, axis = 1)
        TA_profSD[b,:] = np.ma.MaskedArray.nanstd(ttar, axis = 1)

        O2_prof[b,:] = np.ma.MaskedArray.nanmean(to2r, axis = 1)
        O2_profSD[b,:] = np.ma.MaskedArray.nanstd(to2r, axis = 1)

        tsra = np.ravel(ts)
        ttera = np.ravel(tte)
        tdra = np.ravel(td) * 1e-3
        ttara =  np.ravel(tta) * 1e-3
        tdepthra = np.ravel(tdepth)
        tpressure = tdepthra 
        tpressure[:] =1
        tzero = tdepthra * 0 
        
        tsra_psu = tsra*35/35.16504
        ttera_is = gsw.t_from_CT(tsra,ttera,tdepthra)

        response_tup = mocsy.mvars(temp=ttera_is, sal=tsra_psu, alk=ttara, dic=tdra, 
                           sil=tzero, phos=tzero, patm=tpressure, depth=tdepthra, lat=tzero, 
                            optcon='mol/m3', optt='Tinsitu', optp='m',
                            optb = 'l10', optk1k2='m10', optkf = 'dg', optgas = 'Pinsitu')
        pH,pco2,fco2,co2,hco3,co3,OmegaA,OmegaC,BetaD,DENis,p,Tis = response_tup

        pHra = pH.reshape(40,400)
        OmegaAra = OmegaA.reshape(40,400)

        pHra[pHra == 1.00000000e+20] = np.nan
        OmegaAra[OmegaAra == 1.00000000e+20] = np.nan
        pHra = np.ma.masked_invalid(pHra)
        OmegaAra = np.ma.masked_invalid(OmegaAra)

        pH_prof[b,:] = np.ma.MaskedArray.nanmean(pHra, axis = 1)
        pH_profSD[b,:] = np.ma.MaskedArray.nanstd(pHra, axis = 1)

        OmA_prof[b,:] = np.ma.MaskedArray.nanmean(OmegaAra, axis = 1)
        OmA_profSD[b,:] = np.ma.MaskedArray.nanstd(OmegaAra, axis = 1)
        
        #depth = w.variables['deptht'][:]
        sal_prof[sal_prof == 0 ] = np.nan
        temp_prof[temp_prof == 0 ] = np.nan
        DIC_prof[DIC_prof == 0 ] = np.nan
        TA_prof[TA_prof == 0 ] = np.nan
        pH_prof[pH_prof == 0 ] = np.nan
        OmA_prof[OmA_prof == 0 ] = np.nan
        
        b = b+1
        
    pars_profs = {'sal': sal_prof, 'sal_SD': sal_profSD,\
         'temp': temp_prof, 'temp_SD': temp_profSD,\
         'DIC': DIC_prof, 'DIC_SD' : DIC_profSD,\
         'TA': TA_prof, 'TA_SD' : TA_profSD,\
         'OmA': OmA_prof, 'OmA_SD': OmA_profSD,\
         'pH': pH_prof, 'pH_SD': pH_profSD,\
         'O2' : O2_prof, 'O2_SD': O2_profSD}
    return pars_profs, stn_list, prof_depth
Ejemplo n.º 22
0
def find_DIC_corresp_to_pco2(tsal, ttemp, tpco2, tta, pres_atm, depth_this):

    ### given a pco2, salinity, temp, etc get DIC
    import numpy as np
    import mocsy
    import gsw

    steps = 10000
    tsal_r = np.zeros([steps])
    tsal_r[:] = tsal
    #convert to psu
    tsal_r_psu = tsal_r * 35 / 35.16504

    ttemp_r = np.zeros([steps])
    ttemp_r[:] = ttemp
    #convert temperature to potential temperature
    ttemp_r_pot = gsw.pt_from_CT(tsal_r, ttemp_r)
    tta_r = np.zeros([steps])
    tta_r[:] = tta * 1e-3
    tpres_r = np.zeros([steps])
    tpres_r[:] = pres_atm
    depth_r = np.zeros([steps])
    depth_r[:] = depth_this
    tzero = np.zeros([steps])
    tlat = np.zeros([steps])
    tlat[:] = 50

    end_d = 2400
    start_d = 600
    intvl = (end_d - start_d) / steps
    tdic_r = np.arange(start_d, end_d - 0.1, intvl) * 1e-3
    #change to take potential temperature
    response_tup = mocsy.mvars(temp=ttemp_r_pot,
                               sal=tsal_r_psu,
                               alk=tta_r,
                               dic=tdic_r,
                               sil=tzero,
                               phos=tzero,
                               patm=tpres_r,
                               depth=depth_r,
                               lat=tzero,
                               optcon='mol/m3',
                               optt='Tpot',
                               optp='m',
                               optb='l10',
                               optk1k2='m10',
                               optkf='dg',
                               optgas='Pinsitu')
    pH, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, DENis, p, Tis = response_tup

    diffmat = pco2 - tpco2
    idx, ans = find_nearest(diffmat, 0)

    if ans > 2:
        print('Danger, pco2 found >2 uatm from pco2 given')


#     print(idx)
#     print('difference between real pco2 and pco2 from calc. dic: ',ans)
#     print('DIC found this way:', tdic_r[idx]*1e3)
    fin_dic = tdic_r[idx] * 1e3

    return fin_dic
Ejemplo n.º 23
0
BetaD = np.zeros((6, )).astype('float32')
rhoSW = np.zeros((6, )).astype('float32')
p = np.zeros((6, )).astype('float32')
tempis = np.zeros((6, )).astype('float32')
# values of derivatives w/ respect to 6 input variables and at 6 input points
ph_deriv = np.zeros((6 * 6, )).astype('float32')
pco2_deriv = np.zeros((6 * 6, )).astype('float32')
OmegaA_deriv = np.zeros((6 * 6, )).astype('float32')
ph_deriv = ph_deriv.reshape((6, 6), order='F')
pco2_deriv = pco2_deriv.reshape((6, 6), order='F')
OmegaA_deriv = OmegaA_deriv.reshape((6, 6), order='F')

# Run mocsy.vars()
# Notice that option names are all lowercase
ph, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, rhoSW, p, tempis = \
    mocsy.mvars (temp, sal, alk, dic, sil, phos, Patm, depth, lat,
                 optcon='mol/kg', optt='Tinsitu', optp='db', optb='l10', optk1k2=optK1K2, optkf='dg')

# print mocsy results
# -------------------

print "pH     pCO2   fCO2     CO2*       HCO3-       CO32-      OmegaA OmegaC  R    Density Press  Temperature"
for i in range(0, 6):
    print ph[i], pco2[i], fco2[i], co2[i], hco3[i], co3[i], OmegaA[i], OmegaC[
        i], BetaD[i], rhoSW[i], p[i], tempis[i]

# Compute automatic derivatives (using automatic differentiation)
ph_deriv, pco2_deriv, fco2_deriv, co2_deriv, hco3_deriv, co3_deriv, OmegaA_deriv, OmegaC_deriv = \
    mocsy.mderivauto(temp, sal, alk, dic, sil, phos, Patm, depth, lat,                                     # INPUT
                    optcon='mol/kg', optt='Tinsitu', optp='db', optb='l10', optk1k2=optK1K2, optkf='dg')  # INPUT OPTIONS

# Compute buffer factors from Egleston
Ejemplo n.º 24
0
BetaD  = np.zeros((6,)).astype('float32')
rhoSW  = np.zeros((6,)).astype('float32')
p      = np.zeros((6,)).astype('float32')
tempis = np.zeros((6,)).astype('float32')
# values of derivatives w/ respect to 6 input variables and at 6 input points
ph_deriv     = np.zeros((6*6,)).astype('float32')
pco2_deriv   = np.zeros((6*6,)).astype('float32')
OmegaA_deriv = np.zeros((6*6,)).astype('float32')
ph_deriv     = ph_deriv.reshape ((6,6), order='F')
pco2_deriv   = pco2_deriv.reshape ((6,6), order='F')
OmegaA_deriv = OmegaA_deriv.reshape ((6,6), order='F')

# Run mocsy.vars()
# Notice that option names are all lowercase
ph, pco2, fco2, co2, hco3, co3, OmegaA, OmegaC, BetaD, rhoSW, p, tempis = \
    mocsy.mvars (temp, sal, alk, dic, sil, phos, Patm, depth, lat,
                 optcon='mol/kg', optt='Tinsitu', optp='db', optb='l10', optk1k2=optK1K2, optkf='dg')

# print mocsy results
# -------------------

print "pH     pCO2   fCO2     CO2*       HCO3-       CO32-      OmegaA OmegaC  R    Density Press  Temperature"
for i in range (0, 6):
    print ph[i], pco2[i], fco2[i], co2[i], hco3[i], co3[i], OmegaA[i], OmegaC[i], BetaD[i], rhoSW[i], p[i], tempis[i]


# Compute automatic derivatives (using automatic differentiation)
ph_deriv, pco2_deriv, fco2_deriv, co2_deriv, hco3_deriv, co3_deriv, OmegaA_deriv, OmegaC_deriv = \
    mocsy.mderivauto(temp, sal, alk, dic, sil, phos, Patm, depth, lat,                                     # INPUT
                    optcon='mol/kg', optt='Tinsitu', optp='db', optb='l10', optk1k2=optK1K2, optkf='dg')  # INPUT OPTIONS

# Compute buffer factors from Egleston