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
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
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
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
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
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
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
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
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
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
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')
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()
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)
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()
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()
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
# 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)
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
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()
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
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
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
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