{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import netCDF4 as nc\n",
"from matplotlib import pyplot as plt\n",
"import numpy as np\n",
"import glob\n",
"import pickle\n",
"from salishsea_tools import evaltools as et\n",
"import datetime as dt\n",
"import os\n",
"import re\n",
"import cmocean\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"ignorelist=('nav_lat','nav_lon', 'bounds_nav_lon', 'bounds_nav_lat', 'area', 'bounds_lon','bounds_lat',\n",
" 'deptht', 'deptht_bounds', 'time_centered', 'time_centered_bounds', \n",
" 'time_counter', 'time_counter_bounds','nav_lat_grid_T', 'nav_lon_grid_T', \n",
" 'bounds_nav_lon_grid_T', 'bounds_nav_lat_grid_T', 'area_grid_T', \n",
" 'nav_lat_grid_W', 'nav_lon_grid_W', 'bounds_nav_lon_grid_W', \n",
" 'bounds_nav_lat_grid_W', 'area_grid_W', 'time_centered', 'time_centered_bounds',\n",
" 'depthu', 'depthu_bounds','depthv', 'depthv_bounds','depthw', 'depthw_bounds',\n",
" 'layer6m_W', 'layer6m_W_bounds','bounds_lon_grid_T','bounds_lat_grid_T',\n",
" 'bounds_lon_grid_W','bounds_lat_grid_W','time_instant_bounds','time_instant')\n",
"def checkall(ff):\n",
" fkeys=ff.variables.keys()\n",
" print('fP.variables.keys():',fkeys)\n",
" print('Min/Max:')\n",
" for var in fkeys:\n",
" if var not in ignorelist:\n",
" #print(var)\n",
" if len(np.shape(ff.variables[var]))==4:\n",
" print(var,':',np.min(np.ma.masked_where(tmask[:,:,:]==0,ff.variables[var][-1,:,:,:])),\n",
" np.max(np.ma.masked_where(tmask[:,:,:]==0,ff.variables[var][-1,:,:,:])))\n",
" elif len(np.shape(ff.variables[var]))==3:\n",
" print(var,':',np.min(np.ma.masked_where(tmask[0,:,:]==0,ff.variables[var][-1,:,:])),\n",
" np.max(np.ma.masked_where(tmask[0,:,:]==0,ff.variables[var][-1,:,:])))\n",
" else: \n",
" print('unknown shape: ',var,len(np.shape(ff.variables[var])))\n",
"def checkallSlice(ff):\n",
" fkeys=ff.variables.keys()\n",
" print('fP.variables.keys():',fkeys)\n",
" print('Min/Max:')\n",
" for var in fkeys:\n",
" if var not in ignorelist:\n",
" print(var,':',np.min(ff.variables[var][-1,:,:,:]),\n",
" np.max(ff.variables[var][-1,:,:,:]))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"with nc.Dataset('/ocean/eolson/MEOPAR/NEMO-forcing/grid/mesh_mask201702_noLPE.nc') as mesh:\n",
" tmask=mesh.variables['tmask'][0,:,:,:]\n",
" e1t=np.expand_dims(mesh.variables['e1t'][:,:,:],1)\n",
" e2t=np.expand_dims(mesh.variables['e2t'][:,:,:],1)\n",
"SOGtmaskPath='/ocean/eolson/MEOPAR/northernNO3PaperCalcs/save/SOGtmask.pkl'\n",
"(tmaskSOG,_,_,_,_)=pickle.load(open(SOGtmaskPath,'rb'))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"idir='/data/eolson/results/MEOPAR/SS36runs/GrahamRuns/fluxesCorr/'\n",
"ts=dt.datetime(2015,1,1)\n",
"te=dt.datetime(2015,12,31)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"fPlist=et.index_model_files_flex(idir,'dian_T','1d','long',ts,te)\n",
"fDlist=et.index_model_files_flex(idir,'dia1_T','1d','long',ts,te)\n",
"fD2list=et.index_model_files_flex(idir,'dia2_T','1d','long',ts,te)\n",
"fSlist=et.index_model_files_flex(idir,'snp_T','1d','long',ts,te)\n",
"fRlist=et.index_model_files_flex(idir,'rad_T','1d','long',ts,te)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" paths | \n",
" t_0 | \n",
" t_n | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-01-01 | \n",
" 2015-01-21 | \n",
"
\n",
" \n",
" 1 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-01-21 | \n",
" 2015-02-10 | \n",
"
\n",
" \n",
" 2 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-02-10 | \n",
" 2015-03-02 | \n",
"
\n",
" \n",
" 3 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-03-02 | \n",
" 2015-03-22 | \n",
"
\n",
" \n",
" 4 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-03-22 | \n",
" 2015-04-11 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" paths t_0 t_n\n",
"0 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-01-01 2015-01-21\n",
"1 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-01-21 2015-02-10\n",
"2 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-02-10 2015-03-02\n",
"3 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-03-02 2015-03-22\n",
"4 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-03-22 2015-04-11"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fPlist.head()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" paths | \n",
" t_0 | \n",
" t_n | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-01-01 | \n",
" 2015-01-21 | \n",
"
\n",
" \n",
" 1 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-01-21 | \n",
" 2015-02-10 | \n",
"
\n",
" \n",
" 2 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-02-10 | \n",
" 2015-03-02 | \n",
"
\n",
" \n",
" 3 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-03-02 | \n",
" 2015-03-22 | \n",
"
\n",
" \n",
" 4 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-03-22 | \n",
" 2015-04-11 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" paths t_0 t_n\n",
"0 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-01-01 2015-01-21\n",
"1 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-01-21 2015-02-10\n",
"2 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-02-10 2015-03-02\n",
"3 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-03-02 2015-03-22\n",
"4 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-03-22 2015-04-11"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fDlist.head()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" paths | \n",
" t_0 | \n",
" t_n | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-01-01 | \n",
" 2015-01-21 | \n",
"
\n",
" \n",
" 1 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-01-21 | \n",
" 2015-02-10 | \n",
"
\n",
" \n",
" 2 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-02-10 | \n",
" 2015-03-02 | \n",
"
\n",
" \n",
" 3 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-03-02 | \n",
" 2015-03-22 | \n",
"
\n",
" \n",
" 4 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-03-22 | \n",
" 2015-04-11 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" paths t_0 t_n\n",
"0 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-01-01 2015-01-21\n",
"1 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-01-21 2015-02-10\n",
"2 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-02-10 2015-03-02\n",
"3 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-03-02 2015-03-22\n",
"4 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-03-22 2015-04-11"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fD2list.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" paths | \n",
" t_0 | \n",
" t_n | \n",
"
\n",
" \n",
" \n",
" \n",
" 14 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-10-08 | \n",
" 2015-10-28 | \n",
"
\n",
" \n",
" 15 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-10-28 | \n",
" 2015-11-17 | \n",
"
\n",
" \n",
" 16 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-11-17 | \n",
" 2015-12-07 | \n",
"
\n",
" \n",
" 17 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-12-07 | \n",
" 2015-12-27 | \n",
"
\n",
" \n",
" 18 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-12-27 | \n",
" 2016-01-16 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" paths t_0 t_n\n",
"14 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-10-08 2015-10-28\n",
"15 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-10-28 2015-11-17\n",
"16 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-11-17 2015-12-07\n",
"17 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-12-07 2015-12-27\n",
"18 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-12-27 2016-01-16"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fD2list.tail()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" paths | \n",
" t_0 | \n",
" t_n | \n",
"
\n",
" \n",
" \n",
" \n",
" 14 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-10-08 | \n",
" 2015-10-28 | \n",
"
\n",
" \n",
" 15 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-10-28 | \n",
" 2015-11-17 | \n",
"
\n",
" \n",
" 16 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-11-17 | \n",
" 2015-12-07 | \n",
"
\n",
" \n",
" 17 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-12-07 | \n",
" 2015-12-27 | \n",
"
\n",
" \n",
" 18 | \n",
" /data/eolson/results/MEOPAR/SS36runs/GrahamRun... | \n",
" 2015-12-27 | \n",
" 2016-01-16 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" paths t_0 t_n\n",
"14 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-10-08 2015-10-28\n",
"15 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-10-28 2015-11-17\n",
"16 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-11-17 2015-12-07\n",
"17 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-12-07 2015-12-27\n",
"18 /data/eolson/results/MEOPAR/SS36runs/GrahamRun... 2015-12-27 2016-01-16"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fSlist.tail()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fP.variables.keys(): dict_keys(['nav_lat', 'nav_lon', 'bounds_nav_lon', 'bounds_nav_lat', 'area', 'deptht', 'deptht_bounds', 'time_centered', 'time_centered_bounds', 'time_counter', 'time_counter_bounds', 'RDB_NO3', 'RDB_NH4', 'RDB_DON', 'RDB_PON', 'RDB_LIV', 'RDN_NO3', 'RDN_NH4', 'RDN_DON', 'RDN_PON', 'RDN_LIV'])\n",
"Min/Max:\n",
"RDB_NO3 : 0.0 0.0\n",
"RDB_NH4 : 0.0 0.0\n",
"RDB_DON : 0.0 0.0\n",
"RDB_PON : 0.0 0.0\n",
"RDB_LIV : 0.0 0.0008798072\n",
"RDN_NO3 : 0.0 0.0\n",
"RDN_NH4 : 0.0 0.0\n",
"RDN_DON : 0.0 0.0\n",
"RDN_PON : 0.0 0.0\n",
"RDN_LIV : 0.0 0.008846585\n"
]
}
],
"source": [
"with nc.Dataset(fRlist.paths[0]) as ff:\n",
" checkall(ff)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fP.variables.keys(): dict_keys(['nav_lat', 'nav_lon', 'bounds_nav_lon', 'bounds_nav_lat', 'area', 'deptht', 'deptht_bounds', 'time_centered', 'time_centered_bounds', 'time_counter', 'time_counter_bounds', 'NO3RAD', 'RIV_NO3', 'RIV_NH4', 'REM_NO3', 'REM_PON', 'REM_DON', 'PRD_NO3', 'PRD_NH4', 'REFRN', 'TBS_DIAT', 'TBS_PON'])\n",
"Min/Max:\n",
"NO3RAD : 0.0 0.0\n",
"RIV_NO3 : 0.0 4493.3955\n",
"RIV_NH4 : 0.0 2255.5193\n",
"REM_NO3 : 0.0 1.1458147\n",
"REM_PON : -0.8387355 -0.0\n",
"REM_DON : -1.2145004 -0.0\n",
"PRD_NO3 : -1.3886348 -0.0\n",
"PRD_NH4 : -0.36717442 -0.0\n",
"REFRN : -4.6239016e-08 7.842898e-24\n",
"TBS_DIAT : -0.71910423 0.6944675\n",
"TBS_PON : -3.3938205 2.4678273\n"
]
}
],
"source": [
"with nc.Dataset(fPlist.paths[0]) as ff:\n",
" checkall(ff)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"a 1\n",
"a 2\n",
"a 3\n",
"a 4\n",
"a 5\n",
"a 6\n",
"a 7\n",
"a 8\n",
"a 9\n",
"a 10\n",
"a 11\n",
"a 12\n",
"a 13\n",
"a 14\n",
"a 15\n",
"a 16\n",
"a 17\n",
"a 18\n",
"b 19\n"
]
}
],
"source": [
"radNO3Sum=list(); rivNO3Sum=list(); rivNH4Sum=list(); nitrSum=list(); remONSum=list(); prdNO3Sum=list(); \n",
"prdNH4Sum=list(); refrNSum=list();\n",
"radSum=list();\n",
"for i,r in fPlist.iterrows():\n",
" with nc.Dataset(r['paths']) as f:\n",
" if r['t_n']<(te+dt.timedelta(days=1)):\n",
" radNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['NO3RAD'][:,:,:,:],3),2),1))\n",
" rivNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RIV_NO3'][:,:,:,:],3),2),1))\n",
" rivNH4Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RIV_NH4'][:,:,:,:],3),2),1))\n",
" nitrSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['REM_NO3'][:,:,:,:],3),2),1))\n",
" remONSum.append(np.sum(np.sum(np.sum(tmaskSOG*(f.variables['REM_DON'][:,:,:,:]+\\\n",
" f.variables['REM_PON'][:,:,:,:]),3),2),1))\n",
" prdNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['PRD_NO3'][:,:,:,:],3),2),1))\n",
" prdNH4Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['PRD_NH4'][:,:,:,:],3),2),1))\n",
" refrNSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['REFRN'][:,:,:,:],3),2),1))\n",
" print('a',len(refrNSum))\n",
" else:\n",
" iiend=(te-r['t_0']).days+1\n",
" radNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['NO3RAD'][:iiend,:,:,:],3),2),1))\n",
" rivNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RIV_NO3'][:iiend,:,:,:],3),2),1))\n",
" rivNH4Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RIV_NH4'][:iiend,:,:,:],3),2),1))\n",
" nitrSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['REM_NO3'][:iiend,:,:,:],3),2),1))\n",
" remONSum.append(np.sum(np.sum(np.sum(tmaskSOG*(f.variables['REM_DON'][:iiend,:,:,:]+\\\n",
" f.variables['REM_PON'][:iiend,:,:,:]),3),2),1))\n",
" prdNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['PRD_NO3'][:iiend,:,:,:],3),2),1))\n",
" prdNH4Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['PRD_NH4'][:iiend,:,:,:],3),2),1))\n",
" refrNSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['REFRN'][:iiend,:,:,:],3),2),1))\n",
" print('b',len(refrNSum))\n",
"radNO3Sum=np.concatenate(radNO3Sum,axis=0)\n",
"rivNO3Sum=np.concatenate(rivNO3Sum,axis=0)\n",
"rivNH4Sum=np.concatenate(rivNH4Sum,axis=0)\n",
"nitrSum=np.concatenate(nitrSum,axis=0)\n",
"remONSum=np.concatenate(remONSum,axis=0)\n",
"prdNO3Sum=np.concatenate(prdNO3Sum,axis=0)\n",
"prdNH4Sum=np.concatenate(prdNH4Sum,axis=0)\n",
"refrNSum=np.concatenate(refrNSum,axis=0)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"rdbNO3Sum=list(); rdbNH4Sum=list(); rdbDONSum=list(); rdbPONSum=list(); rdbLIVSum=list(); \n",
"rdnNO3Sum=list(); rdnNH4Sum=list(); rdnDONSum=list(); rdnPONSum=list(); rdnLIVSum=list(); \n",
"for i,r in fRlist.iterrows():\n",
" with nc.Dataset(r['paths']) as f:\n",
" if r['t_n']<(te+dt.timedelta(days=1)):\n",
" rdbNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDB_NO3'][:,:,:,:],3),2),1))\n",
" rdbNH4Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDB_NH4'][:,:,:,:],3),2),1))\n",
" rdbDONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDB_DON'][:,:,:,:],3),2),1))\n",
" rdbPONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDB_PON'][:,:,:,:],3),2),1))\n",
" rdbLIVSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDB_LIV'][:,:,:,:],3),2),1))\n",
" rdnNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDN_NO3'][:,:,:,:],3),2),1))\n",
" rdnNH4Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDN_NH4'][:,:,:,:],3),2),1))\n",
" rdnDONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDN_DON'][:,:,:,:],3),2),1))\n",
" rdnPONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDN_PON'][:,:,:,:],3),2),1))\n",
" rdnLIVSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDN_LIV'][:,:,:,:],3),2),1))\n",
" else:\n",
" iiend=(te-r['t_0']).days+1\n",
" rdbNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDB_NO3'][:iiend,:,:,:],3),2),1))\n",
" rdbNH4Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDB_NH4'][:iiend,:,:,:],3),2),1))\n",
" rdbDONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDB_DON'][:iiend,:,:,:],3),2),1))\n",
" rdbPONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDB_PON'][:iiend,:,:,:],3),2),1))\n",
" rdbLIVSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDB_LIV'][:iiend,:,:,:],3),2),1))\n",
" rdnNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDN_NO3'][:iiend,:,:,:],3),2),1))\n",
" rdnNH4Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDN_NH4'][:iiend,:,:,:],3),2),1))\n",
" rdnDONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDN_DON'][:iiend,:,:,:],3),2),1))\n",
" rdnPONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDN_PON'][:iiend,:,:,:],3),2),1))\n",
" rdnLIVSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['RDN_LIV'][:iiend,:,:,:],3),2),1))\n",
"rdbNO3Sum=np.concatenate(rdbNO3Sum,axis=0)\n",
"rdbNH4Sum=np.concatenate(rdbNH4Sum,axis=0)\n",
"rdbDONSum=np.concatenate(rdbDONSum,axis=0)\n",
"rdbPONSum=np.concatenate(rdbPONSum,axis=0)\n",
"rdbLIVSum=np.concatenate(rdbLIVSum,axis=0)\n",
"rdnNO3Sum=np.concatenate(rdnNO3Sum,axis=0)\n",
"rdnNH4Sum=np.concatenate(rdnNH4Sum,axis=0)\n",
"rdnDONSum=np.concatenate(rdnDONSum,axis=0)\n",
"rdnPONSum=np.concatenate(rdnPONSum,axis=0)\n",
"rdnLIVSum=np.concatenate(rdnLIVSum,axis=0)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fP.variables.keys(): dict_keys(['nav_lat_grid_T', 'nav_lon_grid_T', 'bounds_nav_lon_grid_T', 'bounds_nav_lat_grid_T', 'area_grid_T', 'deptht', 'deptht_bounds', 'nav_lat_grid_W', 'nav_lon_grid_W', 'bounds_nav_lon_grid_W', 'bounds_nav_lat_grid_W', 'area_grid_W', 'time_centered', 'time_centered_bounds', 'time_counter', 'time_counter_bounds', 'ATF_NO3', 'ATF_NH4', 'ATF_DON', 'ATF_PON', 'ATF_LIV', 'BFX_PON', 'BFX_DIAT'])\n",
"Min/Max:\n",
"ATF_NO3 : -0.48809335 0.5102586\n",
"ATF_NH4 : -0.01845369 0.024148196\n",
"ATF_DON : -0.012046148 0.022501873\n",
"ATF_PON : -0.0019294947 0.0017544312\n",
"ATF_LIV : -0.04880482 0.052106515\n",
"BFX_PON : -1.942901e-05 -0.0\n",
"BFX_DIAT : -7.981058e-07 -0.0\n"
]
}
],
"source": [
"with nc.Dataset(fDlist.paths[0]) as ff:\n",
" checkall(ff)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"ATFNO3Sum=list(); ATFNH4Sum=list(); ATFDONSum=list(); ATFPONSum=list(); ATFLIVSum=list();\n",
"BFXPONSum=list(); BFXDIATSum=list();\n",
"for i,r in fDlist.iterrows():\n",
" with nc.Dataset(r['paths']) as f:\n",
" if r['t_n']<(te+dt.timedelta(days=1)):\n",
" ATFNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['ATF_NO3'][:,:,:,:],3),2),1))\n",
" ATFNH4Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['ATF_NH4'][:,:,:,:],3),2),1))\n",
" ATFDONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['ATF_DON'][:,:,:,:],3),2),1))\n",
" ATFPONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['ATF_PON'][:,:,:,:],3),2),1))\n",
" ATFLIVSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['ATF_LIV'][:,:,:,:],3),2),1))\n",
" BFXPONSum.append(np.sum(np.sum(tmaskSOG[:,0,:,:]*e1t[:,0,:,:]*e2t[:,0,:,:]*f.variables['BFX_PON'][:,:,:],2),1))\n",
" BFXDIATSum.append(np.sum(np.sum(tmaskSOG[:,0,:,:]*e1t[:,0,:,:]*e2t[:,0,:,:]*f.variables['BFX_DIAT'][:,:,:],2),1))\n",
" else:\n",
" iiend=(te-r['t_0']).days+1\n",
" ATFNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['ATF_NO3'][:iiend,:,:,:],3),2),1))\n",
" ATFNH4Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['ATF_NH4'][:iiend,:,:,:],3),2),1))\n",
" ATFDONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['ATF_DON'][:iiend,:,:,:],3),2),1))\n",
" ATFPONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['ATF_PON'][:iiend,:,:,:],3),2),1))\n",
" ATFLIVSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['ATF_LIV'][:iiend,:,:,:],3),2),1))\n",
" BFXPONSum.append(np.sum(np.sum(tmaskSOG[:,0,:,:]*e1t[:,0,:,:]*e2t[:,0,:,:]*f.variables['BFX_PON'][:iiend,:,:],2),1))\n",
" BFXDIATSum.append(np.sum(np.sum(tmaskSOG[:,0,:,:]*e1t[:,0,:,:]*e2t[:,0,:,:]*f.variables['BFX_DIAT'][:iiend,:,:],2),1))\n",
"ATFNO3Sum=np.concatenate(ATFNO3Sum,axis=0)\n",
"ATFNH4Sum=np.concatenate(ATFNH4Sum,axis=0)\n",
"ATFDONSum=np.concatenate(ATFDONSum,axis=0)\n",
"ATFPONSum=np.concatenate(ATFPONSum,axis=0)\n",
"ATFLIVSum=np.concatenate(ATFLIVSum,axis=0)\n",
"BFXPONSum=np.concatenate(BFXPONSum,axis=0)\n",
"BFXDIATSum=np.concatenate(BFXDIATSum,axis=0)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1, 1, 898, 398)"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.shape(e1t)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fP.variables.keys(): dict_keys(['nav_lat', 'nav_lon', 'bounds_nav_lon', 'bounds_nav_lat', 'area', 'deptht', 'deptht_bounds', 'time_centered', 'time_centered_bounds', 'time_counter', 'time_counter_bounds', 'PHS_NO3', 'PHS_NH4', 'PHS_DON', 'PHS_PON', 'PHS_LIV', 'SMS_NO3', 'SMS_NH4', 'SMS_DON', 'SMS_PON', 'SMS_LIV'])\n",
"Min/Max:\n",
"PHS_NO3 : -4494.692 428.25967\n",
"PHS_NH4 : -2255.2073 14.319815\n",
"PHS_DON : -4.077654 5.426552\n",
"PHS_PON : -2.9007683 3.2405636\n",
"PHS_LIV : -16.46423 17.800003\n",
"SMS_NO3 : -1.3453885 1.1458147\n",
"SMS_NH4 : -0.647849 1.1857631\n",
"SMS_DON : -0.35898173 0.3413085\n",
"SMS_PON : -0.6980262 0.69085413\n",
"SMS_LIV : -2.3560905 0.9131774\n"
]
}
],
"source": [
"with nc.Dataset(fD2list.paths[0]) as ff:\n",
" checkall(ff)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"PHSNO3Sum=list(); PHSNH4Sum=list(); PHSDONSum=list(); PHSPONSum=list(); PHSLIVSum=list();\n",
"SMSNO3Sum=list(); SMSNH4Sum=list(); SMSDONSum=list(); SMSPONSum=list(); SMSLIVSum=list();\n",
"for i,r in fD2list.iterrows():\n",
" with nc.Dataset(r['paths']) as f:\n",
" if r['t_n']<(te+dt.timedelta(days=1)):\n",
" PHSNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['PHS_NO3'][:,:,:,:],3),2),1))\n",
" PHSNH4Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['PHS_NH4'][:,:,:,:],3),2),1))\n",
" PHSDONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['PHS_DON'][:,:,:,:],3),2),1))\n",
" PHSPONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['PHS_PON'][:,:,:,:],3),2),1))\n",
" PHSLIVSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['PHS_LIV'][:,:,:,:],3),2),1))\n",
" SMSNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['SMS_NO3'][:,:,:,:],3),2),1))\n",
" SMSNH4Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['SMS_NH4'][:,:,:,:],3),2),1))\n",
" SMSDONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['SMS_DON'][:,:,:,:],3),2),1))\n",
" SMSPONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['SMS_PON'][:,:,:,:],3),2),1))\n",
" SMSLIVSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['SMS_LIV'][:,:,:,:],3),2),1))\n",
" else:\n",
" iiend=(te-r['t_0']).days+1\n",
" PHSNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['PHS_NO3'][:iiend,:,:,:],3),2),1))\n",
" PHSNH4Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['PHS_NH4'][:iiend,:,:,:],3),2),1))\n",
" PHSDONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['PHS_DON'][:iiend,:,:,:],3),2),1))\n",
" PHSPONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['PHS_PON'][:iiend,:,:,:],3),2),1))\n",
" PHSLIVSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['PHS_LIV'][:iiend,:,:,:],3),2),1))\n",
" SMSNO3Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['SMS_NO3'][:iiend,:,:,:],3),2),1))\n",
" SMSNH4Sum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['SMS_NH4'][:iiend,:,:,:],3),2),1))\n",
" SMSDONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['SMS_DON'][:iiend,:,:,:],3),2),1))\n",
" SMSPONSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['SMS_PON'][:iiend,:,:,:],3),2),1))\n",
" SMSLIVSum.append(np.sum(np.sum(np.sum(tmaskSOG*f.variables['SMS_LIV'][:iiend,:,:,:],3),2),1))\n",
"PHSNO3Sum=np.concatenate(PHSNO3Sum,axis=0)\n",
"PHSNH4Sum=np.concatenate(PHSNH4Sum,axis=0)\n",
"PHSDONSum=np.concatenate(PHSDONSum,axis=0)\n",
"PHSPONSum=np.concatenate(PHSPONSum,axis=0)\n",
"PHSLIVSum=np.concatenate(PHSLIVSum,axis=0)\n",
"SMSNO3Sum=np.concatenate(SMSNO3Sum,axis=0)\n",
"SMSNH4Sum=np.concatenate(SMSNH4Sum,axis=0)\n",
"SMSDONSum=np.concatenate(SMSDONSum,axis=0)\n",
"SMSPONSum=np.concatenate(SMSPONSum,axis=0)\n",
"SMSLIVSum=np.concatenate(SMSLIVSum,axis=0)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.0390982695906037e-05 11.30653698962998 0.17589885967747138 0.0007371635174625377 3.0522178454037815e-06\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"