From b4b1281350f244111174831a711b2bfa5689235e Mon Sep 17 00:00:00 2001 From: Yi-Cheng Teng - NOAA GFDL <143743249+yichengt900@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:36:08 -0500 Subject: [PATCH 1/2] Added 3d PP in NEP xml (#110) * add 3d pp * Removing redundant lines that appeared twice --- xmls/NEP10/CEFI_NEP_cobalt.xml | 17 +++++++++-------- xmls/NEP10/MOM_inputs/2024_08/MOM_input | 4 ---- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/xmls/NEP10/CEFI_NEP_cobalt.xml b/xmls/NEP10/CEFI_NEP_cobalt.xml index 09bd93e86..62d12c9bf 100644 --- a/xmls/NEP10/CEFI_NEP_cobalt.xml +++ b/xmls/NEP10/CEFI_NEP_cobalt.xml @@ -21,6 +21,9 @@ C6: fremake -x CEFI_NEP_cobalt.xml -p ncrc6.intel23 -t repro MOM6_SIS2_GENERIC_4P_compile_symm frerun -x CEFI_NEP_cobalt.xml -p ncrc6.intel23 -t repro CEFI_NEP_COBALT_V1 +pp (on PPAN): +frepp -t 2019 -c ocean_cobalt_tracers_month_z -d /archive/e1n/fre/cefi/NEP/2024_08/NEP10k_082024_clean_spinup/gfdl.ncrc5-intel22-repro/history/ -x CEFI_NEP_cobalt.xml -p gfdl.ncrc6-intel23 -T repro CEFI_NEP_COBALT_V1 + Regression test frerun -x CEFI_NEP_cobalt.xml -p ncrc6.intel23 -q debug -r test -t repro CEFI_NEP_COBALT_V1 @@ -63,7 +66,7 @@ frecheck -v -r restart -p ncrc6.intel23 -t repro -x CEFI_NEP_cobalt.xml CEFI_NE - + @@ -599,12 +602,7 @@ cat > $work/INPUT/MOM_override << MOM_OVERRIDE_EOF #override PHA_MLD_DRHO = 0.03 #override HREF_FOR_MLD = 5.0 #override DIAG_MLD_DENSITY_DIFF = 0.03 -#override OBC_REMAPPING_USE_OM4_SUBCELLS = True -#override REMAPPING_USE_OM4_SUBCELLS = True -#override DIAG_REMAPPING_USE_OM4_SUBCELLS = True #override VISC_REM_BUG = True -#override FRICTWORK_BUG = True -#override INTWAVE_REMAPPING_USE_OM4_SUBCELLS = True #override GENERIC_TRACER_IC_FILE = "NEP_COBALT_spinup_2003.nc" MOM_OVERRIDE_EOF @@ -696,6 +694,7 @@ COBALT_INPUT_EOF ]]> + @@ -1001,8 +1000,10 @@ endif - - + + + + diff --git a/xmls/NEP10/MOM_inputs/2024_08/MOM_input b/xmls/NEP10/MOM_inputs/2024_08/MOM_input index 432c9030f..417b356cd 100644 --- a/xmls/NEP10/MOM_inputs/2024_08/MOM_input +++ b/xmls/NEP10/MOM_inputs/2024_08/MOM_input @@ -189,10 +189,6 @@ OBC_REMAPPING_USE_OM4_SUBCELLS = False ! [Boolean] default = True ! If true, use the OM4 remapping-via-subcells algorithm for neutral diffusion. ! See REMAPPING_USE_OM4_SUBCELLS for more details. We recommend setting this ! option to false. -OBC_REMAPPING_USE_OM4_SUBCELLS = False ! [Boolean] default = True - ! If true, use the OM4 remapping-via-subcells algorithm for neutral diffusion. - ! See REMAPPING_USE_OM4_SUBCELLS for more details. We recommend setting this - ! option to false. MASKING_DEPTH = 1.0 ! [m] default = -9999.0 ! The depth below which to mask points as land points, for which all ! fluxes are zeroed out. MASKING_DEPTH is ignored if negative. From 71e3b672126a0f9991963d313bc276738a1a25ab Mon Sep 17 00:00:00 2001 From: Yi-Cheng Teng - NOAA GFDL <143743249+yichengt900@users.noreply.github.com> Date: Tue, 12 Nov 2024 11:26:21 -0500 Subject: [PATCH 2/2] Add BGC runoff scripts for NEP and ARC domains (#111) * Added NEP bgc runoff scripts * Update README.md * Added ARC bgc runoff scripts --- .../ArcticGRO_Water_Quality_Data.xlsx | 1 + .../ARC/Data/ArcticGro/ArcticGro_Process.m | 129 ++ .../ARC/Data/GLORICH/Arctic_GLORICH_Process.m | 287 ++++ tools/rivers/bgc/ARC/README.md | 112 ++ .../ARC/make_discharge_climatology_arctic.m | 61 + tools/rivers/bgc/ARC/mapriv_NEWS2.m | 859 +++++++++++ tools/rivers/bgc/ARC/mapriv_combined_Arctic.m | 1343 +++++++++++++++++ .../ArcticGRO_Water_Quality_Data.xlsx | Bin 0 -> 210813 bytes .../NEP/Data/ArcticGro/ArcticGro_Process.m | 129 ++ .../NEP/Data/GLORICH/NEP_GLORICH_Process.m | 288 ++++ tools/rivers/bgc/NEP/README.md | 112 ++ .../bgc/NEP/make_discharge_climatology_nep.m | 61 + tools/rivers/bgc/NEP/mapriv_NEWS2.m | 859 +++++++++++ tools/rivers/bgc/NEP/mapriv_combined_NEP10k.m | 1342 ++++++++++++++++ .../GlobalNEWS2_RH2000Dataset-version1.0.xls | Bin tools/rivers/bgc/{ => NWA}/README.md | 4 +- .../bgc/{ => NWA}/mapriv_NEWS2_NWA12_GLOFAS.m | 0 .../{ => NWA}/mapriv_combined_NWA12_GLOFAS.m | 0 tools/rivers/bgc/{ => NWA}/nc64startup.m | 0 .../rivers/bgc/{ => NWA}/write_glofas_ave.py | 0 20 files changed, 5585 insertions(+), 2 deletions(-) create mode 120000 tools/rivers/bgc/ARC/Data/ArcticGro/ArcticGRO_Water_Quality_Data.xlsx create mode 100644 tools/rivers/bgc/ARC/Data/ArcticGro/ArcticGro_Process.m create mode 100644 tools/rivers/bgc/ARC/Data/GLORICH/Arctic_GLORICH_Process.m create mode 100644 tools/rivers/bgc/ARC/README.md create mode 100644 tools/rivers/bgc/ARC/make_discharge_climatology_arctic.m create mode 100644 tools/rivers/bgc/ARC/mapriv_NEWS2.m create mode 100644 tools/rivers/bgc/ARC/mapriv_combined_Arctic.m create mode 100644 tools/rivers/bgc/NEP/Data/ArcticGro/ArcticGRO_Water_Quality_Data.xlsx create mode 100644 tools/rivers/bgc/NEP/Data/ArcticGro/ArcticGro_Process.m create mode 100644 tools/rivers/bgc/NEP/Data/GLORICH/NEP_GLORICH_Process.m create mode 100644 tools/rivers/bgc/NEP/README.md create mode 100644 tools/rivers/bgc/NEP/make_discharge_climatology_nep.m create mode 100644 tools/rivers/bgc/NEP/mapriv_NEWS2.m create mode 100644 tools/rivers/bgc/NEP/mapriv_combined_NEP10k.m rename tools/rivers/bgc/{ => NWA}/GlobalNEWS2_RH2000Dataset-version1.0.xls (100%) rename tools/rivers/bgc/{ => NWA}/README.md (80%) rename tools/rivers/bgc/{ => NWA}/mapriv_NEWS2_NWA12_GLOFAS.m (100%) rename tools/rivers/bgc/{ => NWA}/mapriv_combined_NWA12_GLOFAS.m (100%) rename tools/rivers/bgc/{ => NWA}/nc64startup.m (100%) rename tools/rivers/bgc/{ => NWA}/write_glofas_ave.py (100%) diff --git a/tools/rivers/bgc/ARC/Data/ArcticGro/ArcticGRO_Water_Quality_Data.xlsx b/tools/rivers/bgc/ARC/Data/ArcticGro/ArcticGRO_Water_Quality_Data.xlsx new file mode 120000 index 000000000..53601b94a --- /dev/null +++ b/tools/rivers/bgc/ARC/Data/ArcticGro/ArcticGRO_Water_Quality_Data.xlsx @@ -0,0 +1 @@ +../../../NEP/Data/ArcticGro/ArcticGRO_Water_Quality_Data.xlsx \ No newline at end of file diff --git a/tools/rivers/bgc/ARC/Data/ArcticGro/ArcticGro_Process.m b/tools/rivers/bgc/ARC/Data/ArcticGro/ArcticGro_Process.m new file mode 100644 index 000000000..fc9f33be8 --- /dev/null +++ b/tools/rivers/bgc/ARC/Data/ArcticGro/ArcticGro_Process.m @@ -0,0 +1,129 @@ +% Program to process the ArcticGro data + +clear all + +filename = 'ArcticGRO_Water_Quality_Data.xlsx' +% co2 system solver to derive DIC from alkalinity, pH and temperature +addpath /home/cas/matlab/co2sys + +% Longitude and Latitude from GlobalNEWS +river_name{1} = 'Ob'; +lon(1) = 68.5; lat(1) = 68.75; +river_name{2} = 'Yenisey'; +lon(2) = 82.25; lat(2) = 71.25; +river_name{3} = 'Lena'; +lon(3) = 128; lat(3) = 73; +river_name{4} = 'Kolyma'; +lon(4) = 161.25; lat(4) = 69.25; +river_name{5} = 'Yukon'; +lon(5) = -164.75; lat(5) = 62.75; +river_name{6} = 'Mackenzie'; +lon(6) = -134.75; lat(6) = 69.25; + + +for n = 1:6 + Data = readtable(filename,'Sheet',n); + discharge(n) = nanmean(Data{:,5}); + temp(n) = nanmean(Data{:,6}); + % alk in mg CaCO3/L ~ g CaCO3/m3 + alk(n) = nanmean(Data{:,9}); + alk(n) = alk(n)/(40+12+16*3)*2*1e3; % to milliequivalents per m-3 + % pH + pH(n) = nanmean(Data{:,7}); + % tdn in mg N L-1 ~ g N/m3 + tdn(n) = nanmean(Data{:,21}); + tdn(n) = tdn(n)*1e3/14; % mmoles m-3 + % no3 in micrograms N per L ~ mg N m-3 + no3(n) = nanmean(Data{:,22}); + no3(n) = no3(n)/14; % mmoles m-3 + % nh4 in micrograms N per L ~ mg N m-3 + nh4(n) = nanmean(Data{:,23}); + nh4(n) = nh4(n)/14; % mmoles m-3 + % tdp in micrograms P per L ~ mg P m-3 + tdp(n) = nanmean(Data{:,24}); + tdp(n) = tdp(n)/31; % mmoles m-3 + % po4 in micrograms P per L ~ mg P m-3 + po4(n) = nanmean(Data{:,25}); + po4(n) = po4(n)/31; % mmoles m-3 + % sio2 in mg SiO2 per L ~ g P m-3 + sio2(n) = nanmean(Data{:,26}); + sio2(n) = sio2(n)*1e3/(28.06+16*2); + % pon in micrograms N per L ~ mg N m-3 + pon(n) = nanmean(Data{:,47}); + pon(n) = pon(n)/14; %mmoles m-3 + + % calculate DIC from alk, pH and DIC + out = CO2SYS(alk(n),pH(n),1,3,0,temp(n),temp(n), ... + 100,100,0,0,0,0,4,15,1,2,2); + dic(n) = mean(out(:,2)); + + % calculate don from tdn, no3 and nh4 + aa = find(isfinite(Data{:,21}) & isfinite(Data{:,22}) & isfinite(Data{:,23})); + don(n) = nanmean(Data{aa,21}*1e3/14 - Data{aa,22}/14 - Data{aa,23}/14); + + % calculate dop from tdp and po4 + bb = find(isfinite(Data{:,24}/31) & isfinite(Data{:,25}/31)); + dop(n) = nanmean(Data{aa,24}/31 - Data{aa,25}/31); +end + +% Fill in particulate phosphorus from GLOBAL NEWS +pp(1) = 1.29; % Ob +pp(2) = 0.82; % Yenisey +pp(3) = 1.48; % Lena +pp(4) = 1.21; % Kolyma +pp(5) = 1.94; % Yukon +pp(6) = 1.44; % Mackenzie + +% For reference (DIN, DON, PN, DIP, DOP, PP) +% Yukon: 7.30 17.25 29.10 0.07 0.42 1.94 +% Mackenzie: 7.42 19.86 24.34 0.14 0.48 1.44 +% St. Lawrence: 52.80 24.86 3.81 0.98 0.55 0.21 +% Ob: 21.80 24.16 22.35 1.16 0.56 1.29 +% Lena: 7.74 21.34 25.48 0.24 0.52 1.48 +% Yenisey: 8.54 21.65 14.21 0.088 0.52 0.82 +% Kolyma: 10.17 21.92 21.27 0.18 0.53 1.21 + +lon_stations_arcticgro = lon; +lat_stations_arcticgro = lat; +station_names_arcticgro = river_name; + +Q_ann_arcticgro = discharge; +dic_ann_arcticgro = dic; +alk_ann_arcticgro = alk; +no3_ann_arcticgro = no3; +nh4_ann_arcticgro = nh4; +din_ann_arcticgro = no3_ann_arcticgro + nh4_ann_arcticgro; +pn_ann_arcticgro = pon; +don_ann_arcticgro = don; +dip_ann_arcticgro = po4; +dop_ann_arcticgro = dop; +pp_ann_arcticgro = pp; +si_ann_arcticgro = sio2; +o2_ann_arcticgro = ones(size(Q_ann_arcticgro))*NaN; +dfe_ann_arcticgro = ones(size(Q_ann_arcticgro))*NaN; +pfe_ann_arcticgro = ones(size(Q_ann_arcticgro))*NaN; + +% did not try and extract monthly data from arcticgro, so leave as NaNs +dic_monthly_arcticgro = ones(12,size(lon_stations_arcticgro,2))*NaN; +alk_monthly_arcticgro = ones(12,size(lon_stations_arcticgro,2))*NaN; +no3_monthly_arcticgro = ones(12,size(lon_stations_arcticgro,2))*NaN; +nh4_monthly_arcticgro = ones(12,size(lon_stations_arcticgro,2))*NaN; +din_monthly_arcticgro = ones(12,size(lon_stations_arcticgro,2))*NaN; +don_monthly_arcticgro = ones(12,size(lon_stations_arcticgro,2))*NaN; +pn_monthly_arcticgro = ones(12,size(lon_stations_arcticgro,2))*NaN; +dip_monthly_arcticgro = ones(12,size(lon_stations_arcticgro,2))*NaN; +dop_monthly_arcticgro = ones(12,size(lon_stations_arcticgro,2))*NaN; +pp_monthly_arcticgro = ones(12,size(lon_stations_arcticgro,2))*NaN; +dfe_monthly_arcticgro = ones(12,size(lon_stations_arcticgro,2))*NaN; +pfe_monthly_arcticgro = ones(12,size(lon_stations_arcticgro,2))*NaN; +si_monthly_arcticgro = ones(12,size(lon_stations_arcticgro,2))*NaN; +o2_monthly_arcticgro = ones(12,size(lon_stations_arcticgro,2))*NaN; + +save arcticgro_data lon_stations_arcticgro lat_stations_arcticgro station_names_arcticgro ... + Q_ann_arcticgro dic_ann_arcticgro alk_ann_arcticgro no3_ann_arcticgro nh4_ann_arcticgro ... + din_ann_arcticgro pn_ann_arcticgro don_ann_arcticgro dip_ann_arcticgro dop_ann_arcticgro ... + pp_ann_arcticgro si_ann_arcticgro o2_ann_arcticgro dfe_ann_arcticgro pfe_ann_arcticgro ... + dic_monthly_arcticgro alk_monthly_arcticgro no3_monthly_arcticgro nh4_monthly_arcticgro ... + din_monthly_arcticgro don_monthly_arcticgro pn_monthly_arcticgro dip_monthly_arcticgro ... + dop_monthly_arcticgro pp_monthly_arcticgro dfe_monthly_arcticgro pfe_monthly_arcticgro ... + si_monthly_arcticgro o2_monthly_arcticgro diff --git a/tools/rivers/bgc/ARC/Data/GLORICH/Arctic_GLORICH_Process.m b/tools/rivers/bgc/ARC/Data/GLORICH/Arctic_GLORICH_Process.m new file mode 100644 index 000000000..5c50c3019 --- /dev/null +++ b/tools/rivers/bgc/ARC/Data/GLORICH/Arctic_GLORICH_Process.m @@ -0,0 +1,287 @@ +clear all; + +% load in matlab file with GLORICH data +% created with:T = readtable('hydrochemistry.csv','NumHeaderLines',1); +%load GLORICH_Data.mat; +T = readtable('hydrochemistry.csv','NumHeaderLines',1); +stations = T{:,1}; + +%"110009","Skeena River at Usk","BC08EF0001","Canada","BC",54.63,-128.41,"NA1983" +%"110004","Stikine River above Choquette River","BC08CF0002","Canada","BC",56.82,-131.76,"NA1983" +%"102954","COPPER R AT MILLION DOLLAR BRIDGE NR CORDOVA AK","15214000","USA","AK",60.67,-144.74,"NA1983" +%"102983","SUSITNA R AT SUSITNA STATION AK","15294350","USA","AK",61.54,-150.51,"NA1983" +%"102985","NUSHAGAK R AT EKWOK AK","15302500","USA","AK",59.34,-157.47,"NA1983" +%"102986","KUSKOKWIM R AT CROOKED CREEK AK","15304000","USA","AK",61.87,-158.10,"NA1983" +%"102988","YUKON R AT PILOT STATION AK","15565447","USA","AK",61.93,-162.88,"NA1983" +% this one had by far the most readings of the 3 Churchill stations +%"111762","CHURCHILL RIVER ABOVE UPPER MUSKRAT FALLS","NF03OE0001","Canada","New Foundland",53.24,-60.78,"NA1983" +%"101569","ST. LAWRENCE R AT CORNWALL ONT NR MASSENA NY","4264331","USA","NY",45.00,-74.79,"NA1983" + + +% Define rivers. I took the lat/lon from the mouths defined in Global NEWS +% Where stream gages are upstream, this makes the assumption that those +% properties are reasonably indicative of conditions at the river mouth. +num_rivers = 8; +river_name{1} = 'Skeena'; station_num(1) = 110009; +lat(1) = 54.25; lon(1) = 229.75; +river_name{2} = 'Stikine'; station_num(2) = 110004; +lat(2) = 56.75; lon(2) = 227.75; +river_name{3} = 'Copper'; station_num(3) = 102954; +lat(3) = 60.25; lon(3) = 215.25; +river_name{4} = 'Susitna'; station_num(4) = 102983; +lat(4) = 61.75; lon(4) = 209.75; +river_name{5} = 'Nushagak'; station_num(5) = 102985; +lat(5) = 58.75; lon(5) = 201.75; +river_name{6} = 'Kuskokwim'; station_num(6) = 102986; +lat(6) = 60.25; lon(6) = 197.75; +river_name{7} = 'Churchill'; station_num(7) = 111762; +lat(7) = 54.0; lon(7) = -59; +%river_name{8} = 'St. Lawrence'; station_num(8) = 120300; +river_name{8} = 'St. Lawrence'; station_num(8) = 101569; +%river_name{8} = 'St. Lawrence'; station_num(8) = 111573; +lat(8) = 60.25; lon(8) = 197.75; + +% co2 system solver to derive DIC from alkalinity, pH and temperature +addpath /home/cas/matlab/co2sys + +for n = 1:num_rivers + aa = find(stations == station_num(n)); + num_stations(n) = size(aa,1); + discharge(n) = nanmean(T{aa,6}); + alk_vec = T{aa,20}; + alk(n) = nanmean(alk_vec); + % nitrogen species + tn_vec = T{aa,62}; num_tn(n) = size(find(isfinite(tn_vec) == 1),1); tn(n) = nanmean(tn_vec); + dn_vec = T{aa,64}; num_dn(n) = size(find(isfinite(dn_vec) == 1),1); dn(n) = nanmean(dn_vec); + % first method of extracting particulate nitrogen from GLORICH + pn1_vec = tn_vec - dn_vec; pn1_vec(pn1_vec < 0) = 0; + num_pn1(n) = size(find(isfinite(pn1_vec) == 1),1); pn1(n) = nanmean(pn1_vec); + %pn_vec = T{aa,66}; num_pn(n) = size(find(isfinite(pn_vec) == 1),1); pn(n) = nanmean(pn_vec); + tin_vec = T{aa,68}; num_tin(n) = size(find(isfinite(tin_vec) == 1),1); tin(n) = nanmean(tin_vec); + din_vec = T{aa,70}; num_din(n) = size(find(isfinite(din_vec) == 1),1); din(n) = nanmean(din_vec); + ton_vec = T{aa,72}; num_ton(n) = size(find(isfinite(ton_vec) == 1),1); ton(n) = nanmean(ton_vec); + %don_vec = T{aa,74}; num_don(n) = size(find(isfinite(don_vec) == 1),1); don(n) = nanmean(don_vec); + pon_vec = T{aa,76}; num_pon(n) = size(find(isfinite(pon_vec) == 1),1); pon(n) = nanmean(pon_vec); + tkn_vec = T{aa,78}; num_tkn(n) = size(find(isfinite(tkn_vec) == 1),1); tkn(n) = nanmean(tkn_vec); + dkn_vec = T{aa,80}; num_dkn(n) = size(find(isfinite(dkn_vec) == 1),1); dkn(n) = nanmean(dkn_vec); + % second method of extracting particulate nitrogen from GLORICH + pn2_vec = tkn_vec - dkn_vec; pn1_vec(pn2_vec < 0) = 0; + num_pn2(n) = size(find(isfinite(pn2_vec) == 1),1); pn2(n) = nanmean(pn2_vec); + no3_vec = T{aa,82}; num_no3(n) = size(find(isfinite(no3_vec) == 1),1); no3(n) = nanmean(no3_vec); + no2_vec = T{aa,84}; num_no2(n) = size(find(isfinite(no2_vec) == 1),1); no2(n) = nanmean(no2_vec); + no2no3_vec = T{aa,86}; num_no2no3(n) = size(find(isfinite(no2no3_vec) == 1),1); no2no3(n) = nanmean(no2no3_vec); + tnh4_vec = T{aa,88}; num_tnh4(n) = size(find(isfinite(tnh4_vec) == 1),1); tnh4(n) = nanmean(tnh4_vec); + dnh4_vec = T{aa,90}; num_dnh4(n) = size(find(isfinite(dnh4_vec) == 1),1); dnh4(n) = nanmean(dnh4_vec); + don_vec = dn_vec-no2no3_vec-dnh4(n); don_vec(don_vec < 0) = 0; + num_don(n) = size(find(isfinite(don_vec) == 1),1); don(n) = nanmean(don_vec); + % phosphorus + tp_vec = T{aa,92}; num_tp(n) = size(find(isfinite(tp_vec) == 1),1); tp(n) = nanmean(tp_vec); + dp_vec = T{aa,94}; num_dp(n) = size(find(isfinite(dp_vec) == 1),1); dp(n) = nanmean(dp_vec); + pp_vec = tp_vec - dp_vec; pp_vec(pp_vec < 0) = 0; + num_pp(n) = size(find(isfinite(pp_vec) == 1),1); pp(n) = nanmean(pp_vec); + %pp_vec = T{aa,96}; pp(n) = nanmean(pp_vec); + tip_vec = T{aa,98}; num_tip(n) = size(find(isfinite(tip_vec) == 1),1); tip(n) = nanmean(tip_vec); + dip_vec = T{aa,100}; num_dip(n) = size(find(isfinite(dip_vec) == 1),1); dip(n) = nanmean(dip_vec); + dop_vec = dp_vec - dip_vec; dop_vec(dop_vec < 0) = 0; + num_dop(n) = size(find(isfinite(dop_vec) == 1),1); dop(n) = nanmean(dop_vec); + % oxygen + o2_vec = T{aa,12}; num_o2(n) = size(find(isfinite(o2_vec) == 1),1); o2(n) = nanmean(o2_vec); + % silica + si_vec = T{aa,34}; num_si(n) = size(find(isfinite(si_vec) == 1),1); si(n) = nanmean(si_vec); + % dic, fill in with pH if needed + %dic_vec = T{aa,52}; + %bb = find(isfinite(dic_vec)); + pH_vec = T{aa,10}; pH(n) = nanmean(pH_vec); + temp_vec = T{aa,8}; temp(n) = nanmean(temp_vec); + + + % Simple initial DIC calculation based on mean alk and mean pH, room for + % improvement here. + + if isnan(temp(n)); temp(n) = 5; end; + %[RESULT,HEADERS,NICEHEADERS]=CO2SYS(PAR1,PAR2,PAR1TYPE,PAR2TYPE,... + % ...SAL,TEMPIN,TEMPOUT,PRESIN,PRESOUT,SI,PO4,NH4,H2S,pHSCALEIN,... + % ...K1K2CONSTANTS,KSO4CONSTANT,KFCONSTANT,BORON) + out = CO2SYS(alk(n),pH(n),1,3,0,temp(n),temp(n), ... + 100,100,0,0,0,0,4,15,1,2,2); + dic(n) = mean(out(:,2)); +end + +lon_stations_glorich = lon; +lat_stations_glorich = lat; +station_names_glorich = river_name; + +Q_ann_glorich = discharge; +% Set Churchill discharge from GlobalNEWS +Q_ann_glorich(7) = 2281; +dic_ann_glorich = dic; +alk_ann_glorich = alk; +no3_ann_glorich = no2no3; +% use no3 for the Stikine +no3_ann_glorich(2) = no3(1); +nh4_ann_glorich = dnh4; +% assume nh4 in Stikine is equal to nh4 in Skeena +nh4_ann_glorich(2) = nh4_ann_glorich(1); +din_ann_glorich = no3_ann_glorich + nh4_ann_glorich; +% Use weighted average of TN-DN and TKN-DKN +% not that there is no pn data for the Churchill river. Will fill in with +% GlobalNEWS. +pn1(num_pn1 == 0) = 0; pn2(num_pn2 == 0) = 0; +pn_ann_glorich = (pn1.*num_pn1 + pn2.*num_pn2)./(num_pn1 + num_pn2); +% assume particulate nitrogen in Stikine is equal to Skeena +pn_ann_glorich(2) = pn_ann_glorich(1); +don_ann_glorich = don; +% assume dissolved organic nitrogen in Stikine is equal to Skeena +don_ann_glorich(2) = don_ann_glorich(1); + +dip_ann_glorich = dip; +% assume po4 in Stikine is equal to po4 in GLORICH +dip_ann_glorich(2) = dip_ann_glorich(1); + +dop_ann_glorich = dop; +% assume dop in the Stikine and Skeena are equal to that in the Copper +% DOP constraints are generally poor. The Fraser is based on a single +% joint dp, dip measurement. However, the contribution of dop to the total +% phosphorus load is also very low, so this is an issue I'm willing to +% stomach. +dop_ann_glorich(1) = dop_ann_glorich(3); +dop_ann_glorich(2) = dop_ann_glorich(3); + +pp_ann_glorich = pp; +% set particulate load in the Stikine to that in the Skeena +pp_ann_glorich(2) = pp_ann_glorich(1); + +si_ann_glorich = si; +o2_ann_glorich = o2; +dfe_ann_glorich = ones(size(o2_ann_glorich))*NaN; +pfe_ann_glorich = ones(size(o2_ann_glorich))*NaN; + +% did not try and extract monthly data from GLORICH, so leave as NaNs +dic_monthly_glorich = ones(12,size(lon_stations_glorich,2))*NaN; +alk_monthly_glorich = ones(12,size(lon_stations_glorich,2))*NaN; +no3_monthly_glorich = ones(12,size(lon_stations_glorich,2))*NaN; +nh4_monthly_glorich = ones(12,size(lon_stations_glorich,2))*NaN; +din_monthly_glorich = ones(12,size(lon_stations_glorich,2))*NaN; +don_monthly_glorich = ones(12,size(lon_stations_glorich,2))*NaN; +pn_monthly_glorich = ones(12,size(lon_stations_glorich,2))*NaN; +dip_monthly_glorich = ones(12,size(lon_stations_glorich,2))*NaN; +dop_monthly_glorich = ones(12,size(lon_stations_glorich,2))*NaN; +pp_monthly_glorich = ones(12,size(lon_stations_glorich,2))*NaN; +dfe_monthly_glorich = ones(12,size(lon_stations_glorich,2))*NaN; +pfe_monthly_glorich = ones(12,size(lon_stations_glorich,2))*NaN; +si_monthly_glorich = ones(12,size(lon_stations_glorich,2))*NaN; +o2_monthly_glorich = ones(12,size(lon_stations_glorich,2))*NaN; + +save Arctic_GLORICH_data lon_stations_glorich lat_stations_glorich station_names_glorich ... + Q_ann_glorich dic_ann_glorich alk_ann_glorich no3_ann_glorich nh4_ann_glorich ... + din_ann_glorich pn_ann_glorich don_ann_glorich dip_ann_glorich dop_ann_glorich ... + pp_ann_glorich si_ann_glorich o2_ann_glorich dfe_ann_glorich pfe_ann_glorich ... + dic_monthly_glorich alk_monthly_glorich no3_monthly_glorich nh4_monthly_glorich ... + din_monthly_glorich don_monthly_glorich pn_monthly_glorich dip_monthly_glorich ... + dop_monthly_glorich pp_monthly_glorich dfe_monthly_glorich pfe_monthly_glorich ... + si_monthly_glorich o2_monthly_glorich + +% Ordering of the GLORICH Data +%1. "STAT_ID", +%2. "RESULT_DATETIME", +%3. "SAMPLE_TIME_DESC", +%4. "SAMPLING_MODE", +%5. "Ref", +%6. "Discharge_inst", +%7. "Discharge_inst_vrc", +%8. "Temp_water", +%9. "Temp_water_vrc", +%10. "pH", +%11. "pH_vrc", +%12. "DO_mgL", +%13. "DO_mgL_vrc", +%14. "DOSAT", +%15. "DOSAT_vrc", +%16. "SpecCond25C", +%17. "SpecCond25C_vrc", +%18. "SPM", +%19. "SPM_vrc", +%20. "Alkalinity", +%21. "Alkalinity_vrc", +%22. "HCO3", +%23. "HCO3_vrc", +%24. "CO3", +%25. "CO3_vrc", +%26. "Ca", +%27. "Ca_vrc", +%28. "Mg", +%29. "Mg_vrc", +%30. "Na", +%31. "Na_vrc", +%32. "K", +%33. "K_vrc", +%34. "SiO2", +%35. "SiO2_vrc", +%36. "Cl", +%37. "Cl_vrc", +%38. "SO4", +%39. "SO4_vrc", +%40. "F", +%41. "F_vrc", +%42. "DSr", +%43. "DSr_vrc", +%44. "TC", +%45. "TC_vrc", +%46. "DC", +%47. "DC_vrc", +%48. "PC", +%49. "PC_vrc", +%50. "TIC", +%51. "TIC_vrc", +%52. "DIC", +%53. "DIC_vrc", +%54. "PIC", +%55. "PIC_vrc", +%56. "TOC", +%57. "TOC_vrc", +%58. "DOC", +%59. "DOC_vrc", +%60. "POC", +%61. "POC_vrc", +%62. "TN", +%63. "TN_vrc", +%64. "DN", +%65. "DN_vrc", +%66. "PN", +%67. "PN_vrc", +%68. "TIN", +%69. "TIN_vrc", +%70. "DIN", +%71. "DIN_vrc", +%72. "TON", +%73. "TON_vrc", +%74. "DON", +%75. "DON_vrc", +%76. "PON", +%77. "PON_vrc", +%78. "TKN", +%79. "TKN_vrc", +%80. "DKN", +%81. "DKN_vrc", +%82. "NO3", +%83. "NO3_vrc", +%84. "NO2", +%85. "NO2_vrc", +%86. "NO2_NO3", +%87. "NO2_NO3_vrc", +%88. "TNH4", +%89. "TNH4_vrc", +%90. "DNH4", +%91. "DNH4_vrc", +%92. "TP", +%93. "TP_vrc", +%94. "DP", +%95. "DP_vrc", +%96. "PP", +%97. "PP_vrc", +%98. "TIP", +%99. "TIP_vrc", +%100. "DIP", +%101. "DIP_vrc", +%102. "PS", +%103. "PS_vrc" diff --git a/tools/rivers/bgc/ARC/README.md b/tools/rivers/bgc/ARC/README.md new file mode 100644 index 000000000..469e88e89 --- /dev/null +++ b/tools/rivers/bgc/ARC/README.md @@ -0,0 +1,112 @@ +## Example Scripts for ARC BGC runoff generation + +This folder contains example scripts for ARC BGC runoff file generation. Users can follow the following instructions to generate BGC runoff file: + +1: Generate a monthly climatology of the river inputs on the model grid +using `make_discharge_climatology.m`. This routine creates a monthly climatology +from the model's freshwater forcing. For example, the default uses GLOFAS/HILL +forcing files created by Kate Hedstrom on 5/11/2023. All you need to do to +regenerate files (or create new ones) is update the file path. The file creates +a matlab file (`*.mat`) with the discharge climatology. This is used in the +assignment of rivers to discharge points. +``` +matlab232 -nodisplay -nosplash -nodesktop -r "run('make_discharge_climatology_arctic.m');exit;" +``` + +2: Use `mapriv_NEWS2.m` to create a river nutrient input file based on the +GlobalNEWS2 estimates (Mayorga et al., 2010). GlobalNEWS contains a +database of global rivers with empirically-derived nutrient inputs. GlobalNEWS +does not, however, have DIC or alkalinity so it cannot be used to provide forcing for +carbon cycling. Also, while globalNEWS is quite skilfull globally, it can +have significant regional biases. Nonetheless, the routine provides a good +way to identify major rivers in the region, and the comprehensive nutrient +estimates that it provides will eventually be used to fill in gaps in river +forcing drawn from direct observations. + +More details about the mapping algorithm can be found below (and in the code). +The first time through, I would recommend setting `inspect_map1` to `y`. +This allows you to step through the mapping of each river and assess its +quality and properties. I have also found that applying a minimum discharge +of 100 m3 sec-1 helps avoid erroneous mapping of very small rivers onto +large discharges. The assignment algorithm was designed to be relatively +insensitive to such instances, but care should still be taken. + +The required inputs are the discharge climatology (from step 1) and a copy +of the globalNEWS data. +``` +matlab232 -nodisplay -nosplash -nodesktop -r "run('mapriv_NEWS2.m');exit;" +``` + +3: Gather/Process direct river measurements: The next step is to get as many +direct measurements as you can. + + - [RC4USCoast](https://www.ncei.noaa.gov/access/metadata/landing-page/bin/iso?id=gov.noaa.nodc:0260455) +``` +mkdir -p Data/RC4USCoast +cd Data/RC4USCoast +wget https://www.ncei.noaa.gov/archive/archive-management-system/OAS/bin/prd/jquery/download/260455.3.3.tar.gz +tar -xzf 260455.3.3.tar.gz --wildcards --strip-components=4 -C . "*/data/0-data/*.nc" +``` + + - [GLORICH](https://www.geo.uni-hamburg.de/en/geologie/forschung/aquatische-geochemie/glorich.html) +``` +cd Data/GLORICH +wget https://store.pangaea.de/Publications/HartmannJens-etal_2019/Glorich_V01_CSV_plus_Shapefiles_2019_05_24.zip +unzip Glorich_V01_CSV_plus_Shapefiles_2019_05_24.zip +matlab232 -nodisplay -nosplash -nodesktop -r "run('Arctic_GLORICH_Process.m');exit;" +``` + + - [ArcticGro](https://arcticgreatrivers.org/data/) +``` +# A copy of this dataset is provided in the Data directory. +# You may want to download your own to ensure +# that it is up-to-date. +cd Data/ArcticGro +matlab232 -nodisplay -nosplash -nodesktop -r "run('ArcticGro_Process.m');exit;" +``` +4: run `mapriv_combined_Arctic` to create river nutrient and carbon input +estimates based on available observation, while using GlobalNEWS to fill in +some gaps. +``` +cp /archive/ynt//woa_sst_climo.nc ./Data/ +matlab232 -nodisplay -nosplash -nodesktop -r "run('mapriv_combined_Arctic.m');exit;" +``` +As was the case for globalNEWS2, I recommend running these with "inspect_map = 'y'" until +you are satisfied with the results. You can just "click through" each river mapping and +confirm its properties. The routine will then produce numerous final plots for analysis +and quality control, before generating the netcdf for use with MOM6. + +Note: River oxygen levels are set at saturating levels at temperatures provided by the +World Ocean Atlas Climatology. +___________________________________________________________________________________________ + +## RIVER MAPPING ALGORITHM: +Rivers are first filtered to isolate those within the domain and +above a user specified flow threshold. The rationale for this threshold is to minimize the +risk of inadvertantly mapping very small rivers onto large freshwater flows. Small rivers +tend to have more volatile nutrient concentrations, so such mistakes can have large consequences. +To further reduce this risk, rivers are then sorted by size from smallest to largest. Model +outflow points nearest to each river are accumulated until the the value closest to the observed +flow is reached. These points are assigned the concentration for that river. If a larger river +subsequently claims those points, the larger river is given precedence. The concentrations of +any model discharge points left unassigned after all estimates have been cycled through +are assigned using a nearest neighbor algorithm. + +## Note: +One must specify the fraction of particulate phosphorus that is bioavailable (generally between +10-30%, Froelich, Kinetic control of dissolved phosphate in natural rivers and estuaries: A primer +on the phosphate buffer mechanism, Limnology and Oceanography), and the fraction of dissolved organic +inputs that fall into labile, semi-labile and semi-refractory pools. This is set by default to 30%, 35%, +and 35%. This is consistent with the range of bio-availability suggested by Weigner et al. (2006), +Bio-availability of dissolved organic nitrogen and carbon from 9 rivers in the eastern US, Aquatic +Microbial Ecology. + +## VISUALIZATION AND QUALITY CONTROL: +The routines include a y/n toggle option for inspecting the +mapping of each river as it is done. If "inspect_map" is set to 'y', a graphical map of the +model discharge point assigned to each river is presented, along with the outflow and nutrient +characteristics of the river. This can be useful for identifying rivers that may require some +manual editing to ensure the outflow is assigned to the right place. A section for such manual +edits is provided in the code. The visualization pauses until the user presses any key. It +then moves onto the next river. Once all the rivers have been mapped and interpolation completed, +the routine always produces a series of domain-wide plots to evaluate the overall results. diff --git a/tools/rivers/bgc/ARC/make_discharge_climatology_arctic.m b/tools/rivers/bgc/ARC/make_discharge_climatology_arctic.m new file mode 100644 index 000000000..1223376d9 --- /dev/null +++ b/tools/rivers/bgc/ARC/make_discharge_climatology_arctic.m @@ -0,0 +1,61 @@ +clear all; +addpath /home/cas/matlab +nc64startup; + +syear = 1993; +eyear = 2019; +num_years = eyear-syear+1; +readme = '1993-2019 monthly Arctic climatology from GLOFAS/Hill (May 11, 2023 from Kate Hedstrom), kg m-2 sec-1'; + +% get grid information +file_name = ['/archive/cas/Regional_MOM6/Arctic/glofas_hill_05112023/glofas_hill_',num2str(syear,'%4u'),'.nc'] +lon = ncread(file_name,'lon'); +lat = ncread(file_name,'lat'); +nlat = size(lat,2); +nlon = size(lon,1); +area = ncread(file_name,'area'); + +% holds the runoff climatology +runoff_mc = zeros(nlon,nlat,12); + +for yr = syear:eyear + file_name = ['/archive/cas/Regional_MOM6/Arctic/glofas_hill_05112023/glofas_hill_',num2str(yr,'%4u'),'.nc'] + + time = ncread(file_name,'time'); + ntime = size(time,1); + + date = datevec(time+datenum(1950,1,1,0,0,0)); + runoff_days_temp = ncread(file_name,'runoff'); + % files are padded with the first day of the following year, remove + runoff_days = runoff_days_temp(:,:,1:(ntime-1)); + month = date(1:(ntime-1),2); + + for m = 1:12 + aa = find(month == m); + runoff_temp = runoff_days(:,:,aa); + runoff_mc(:,:,m) = runoff_mc(:,:,m) + mean(runoff_temp,3)/num_years; + end + + clear runoff_days runoff_days_temp; + clear runoff_temp aa time date month; + +end + +% modify so that it is time, nlat, nlon +runoff = permute(runoff_mc,[3 2 1]); +area = permute(area,[2 1]); +lon = permute(lon,[2 1]); +lat = permute(lat,[2 1]); + +for m = 1:12; temp = squeeze(runoff(m,:,:)); total_runoff(m) = sum(temp(:).*area(:)); end +figure(1); clf; plot(total_runoff); xlabel('month'); ylabel('runoff, kg sec-1'); + +for m = 1:12; + figure(2); + clf + temp = squeeze(runoff(m,:,:)); + scatter3(lon(:),lat(:),log10(temp(:)),ones(size(temp(:)))*10,log10(temp(:))); view(2); caxis([-3 -1]); colorbar; + pause +end + +save glofas_hill_runoff_monthlyclim_arctic12k_05112023 runoff area lat lon readme; diff --git a/tools/rivers/bgc/ARC/mapriv_NEWS2.m b/tools/rivers/bgc/ARC/mapriv_NEWS2.m new file mode 100644 index 000000000..53542f4c8 --- /dev/null +++ b/tools/rivers/bgc/ARC/mapriv_NEWS2.m @@ -0,0 +1,859 @@ +% Routine to map Global NEWS nutrient data onto the MOM6 Arctic grid @ + +clear all; +addpath /home/cas/matlab +nc64startup; + +% name of netcdf file to be created +%nc_file_name = 'RiverNutrients_GlobalNEWS2_plusFe_Q100_NEP10k.nc'; +% Arctic +nc_file_name = 'RiverNutrients_GlobalNEWS2_plusFe_Q100_Arctic12k.nc'; + +% Parameters for the assignment algorithm. +Q_min = 100; % minimum flow in m3 sec +plot_width = 15; % width of window (in degrees) for inspecting locations + % of rivers and outflow points that have been assigned to + % them. +min_dist = 2.5; % minimum distance (degrees) of the closest outflow point + % for the river to be considered in the domain (useful + % for preventing the algorithm from trying to map rivers + % flowing to different ocean basins. +max_dist = 3; % maximum distance to search for a point +inspect_map = 'n'; % flag enabling you to pause and inspect each river + % mapping as it is being done. + +% set the bio-availability of phosphorus and the fractionation of dissolved +% organic; The code assumes that 30% of particulate phosphorus (PP) is +% bioavailable (e.g., Frolich et al., 1988). One also needs to divide the +% dissolved organic nitrogen and phosphorus components into fractions with +% different lability. The default values are based losely on Wiegner et +% al., (2006). If you have better information, feel free to modify. +frac_PP = 0.3; +frac_ldon = 0.3; +frac_sldon = 0.35; +frac_srdon = 0.35; +frac_ldop = 0.3; +frac_sldop = 0.35; +frac_srdop = 0.35; +% 40 nM dissolved iron concentration from De Baar and De Jong + 30nM +% Colloidal and nanoparticle flux as reported in Canfield and Raiswell +const_fed = 70.0e-6; + +% GlobalNEWS2 data obtained from Emilio Mayorga +filename = '/archive/cas/COBALT_EVAL/River_Data/GlobalNEWS2/GlobalNEWS2_RH2000Dataset-version1.0.xls' +basin = readtable(filename,'Sheet',2); +hydrology = readtable(filename,'Sheet',3); +load = readtable(filename,'Sheet',4); + +% find all the river basins that empty into "land", e.g., lakes +ocean = basin.ocean; +land_index = zeros(size(ocean)); +for n = 1:size(ocean,1); + test = strcmp('Land',ocean(n)); + land_index(n) = single(test); +end + +river_names_all = basin.basinname; + +% basin area in +area = basin.A; +lon_news_all = basin.mouth_lon; +lat_news_all = basin.mouth_lat; +% Depending on the model output, may need to adjust longitudes +lon_news_all(lon_news_all < 0) = lon_news_all(lon_news_all < 0) + 360; + +% Loads in Mg yr-1 converted to moles per sec +DIN_load_all = load.Ld_DIN*1e6/14/86400/365; +DIP_load_all = load.Ld_DIP*1e6/31/86400/365; +DON_load_all = load.Ld_DON*1e6/14/86400/365; +DOP_load_all = load.Ld_DOP*1e6/31/86400/365; +Si_load_all = load.Ld_DSi*1e6/28.1/86400/365; +PN_load_all = (load.Ld_PN*1e6/14/86400/365); +PP_load_all = (load.Ld_PP*1e6/31/86400/365)*frac_PP; + +% actual and natural discharge (convert from km3/yr to m3/sec) +% Used the actual hydrology to calculate concentrations +Qact_all = hydrology.Qact*1e9/(86400*365); +Qnat_all = hydrology.Qnat*1e9/(86400*365); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Load in monthly climatology of river forcing from the regional grid. % +% File contains: % +% runoff: monthly average runoff in kg m-2 sec-1 % +% area: area of grid cell in m-2 % +% lon: longitude (0-360 degrees) % +% lat: latitude % +% % +% The file was calculated from daily output using the routine % +% "make_climatology.m". This routine and all associated files can be % +% found in the same directory as the data file % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% NEP +%load glofas_hill_runoff_monthlyclim_NEP10k_05122023.mat; +% Arctic +load glofas_hill_runoff_monthlyclim_arctic12k_05112023.mat; +lon_mod = lon; +lat_mod = lat; +area_mod = area; +% convert runoff from kg m-2 sec-1 to m3 sec-1 +Q_mod_monthly = zeros(size(runoff)); +for m = 1:12 + Q_mod_monthly(m,:,:) = squeeze(runoff(m,:,:)).*area_mod./1000; +end +Q_mod_ann = squeeze(mean(Q_mod_monthly,1)); +clear lon lat runoff area; + +%grid_file = '/archive/cas/Regional_MOM6/NWA12/nwa12_ocean_static.nc'; +%temp = ncread(grid_file,'deptho'); +%depth = permute(temp,[2,1]); clear temp; +%depth(isnan(depth)) = -1; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Filter for rivers in the region, set thresholds for minimum river size, % +% set parameters for plotting routines. % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% use grid to filter rivers outside domain +lat_mod_max = max(lat_mod(:)); +lat_mod_min = min(lat_mod(:)); +lon_mod_max = max(lon_mod(:)); +lon_mod_min = min(lon_mod(:)); + +in_region = find( (lon_news_all <= lon_mod_max) & (lon_news_all >= lon_mod_min) & ... + (lat_news_all <= lat_mod_max) & (lat_news_all >= lat_mod_min) & ... + (isfinite(Qact_all)) & (Qact_all > Q_min) ); + +% If you are using a high threshold, grab one smaller river to constrain +% Carribean Islands +%if Q_min > 100 +% for n = 1:size(lon_news_all,1); +% test = strcmp('GHAASBasin1808',river_names_all{n}); +% if test == 1; +% cuba_ind = n; +% end +% end +% in_region = [in_region; cuba_ind]; +%end + +num_rivers = size(in_region,1); + +% Establish vectors of flow and nutrient loads for the NWA +Qact = Qact_all(in_region); +lon_news = lon_news_all(in_region); +lat_news = lat_news_all(in_region); +DIN_load = DIN_load_all(in_region); +DON_load = DON_load_all(in_region); +PN_load = PN_load_all(in_region); +DIP_load = DIP_load_all(in_region); +DOP_load = DOP_load_all(in_region); +PP_load = PP_load_all(in_region); +Si_load = Si_load_all(in_region); +river_names = river_names_all(in_region); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Following inspection of initial mapping, add any manual edits here to % +% prevent anomalous extrapolations, etc. % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Add in 2 "dummy" rivers to handle Cuba, giving it properties like + %Jamaica or Haiti rather than Florida. + + %GHAASBasin1808 is in Haiti. Fluxes are characterized by particularly + %high particulate phosphorus inputs. +%for n = 1:num_rivers; +% n +% test = strcmp('GHAASBasin1808',river_names{n}) +% if test == 1; +% cuba_ind = n; +% end + + % Move the Susquehanna a bit south so that it catches the Chesapeake + % and not the Delaware. +% if strcmp('Susquehanna',river_names{n}) +% lat_news(n) = 38.5; +% lon_news(n) = -76.67; +% end +%end + +% Two "rivers" with properties like Haiti used to specify Cuba +%Qact(num_rivers+1) = Qact(cuba_ind)/2; +%lon_news(num_rivers+1) = -81; +%lat_news(num_rivers+1) = 22.6; +%DIN_load(num_rivers+1) = DIN_load(cuba_ind)/2; +%DON_load(num_rivers+1) = DON_load(cuba_ind)/2; +%PN_load(num_rivers+1) = PN_load(cuba_ind)/2; +%DIP_load(num_rivers+1) = DIP_load(cuba_ind)/2; +%DOP_load(num_rivers+1) = DOP_load(cuba_ind)/2; +%PP_load(num_rivers+1) = PP_load(cuba_ind)/2; +%Si_load(num_rivers+1) = Si_load(cuba_ind)/2; +%river_names(num_rivers+1) = river_names(cuba_ind); + +%Qact(num_rivers+2) = Qact(cuba_ind)/2; +%lon_news(num_rivers+2) = -83.25; +%lat_news(num_rivers+2) = 22.6; +%DIN_load(num_rivers+2) = DIN_load(cuba_ind)/2; +%DON_load(num_rivers+2) = DON_load(cuba_ind)/2; +%PN_load(num_rivers+2) = PN_load(cuba_ind)/2; +%DIP_load(num_rivers+2) = DIP_load(cuba_ind)/2; +%DOP_load(num_rivers+2) = DOP_load(cuba_ind)/2; +%PP_load(num_rivers+2) = PP_load(cuba_ind)/2; +%Si_load(num_rivers+2) = Si_load(cuba_ind)/2; +%river_names(num_rivers+2) = river_names(cuba_ind); + +%num_rivers = num_rivers + 1; + +% Adjust location of cfilename = '/archive/cas/COBALT_EVAL/River_Data/GlobalNEWS2/GlobalNEWS2_RH2000Dataset-version1.0.xls' +basin = readtable(filename,'Sheet',2); +hydrology = readtable(filename,'Sheet',3); +load = readtable(filename,'Sheet',4); +% Cuba; This has little effect on patterns in Florida. +%for n = 1:num_rivers; +% n +% test = strcmp('GHAASBasin448',river_names{n}) +% if test == 1; +% fla_ind = n; +% end +%end + +%lon_news(fla_ind) = -80.5; +%lat_news(fla_ind) = 26.6; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% END MANUAL EDITS % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Assigning outflow points to rivers. % +% 1. Assignment starts with the rivers with the smallest flow and works % +% to the largest, w/larger river characteristics taking precedence to % +% ensure the most significant rivers are well represented. % +% 2. The algorithm keeps choosing the closest points to each river mouth % +% until the assigned flow is as close as possible to that observed % +% 3. Once the outflow points are assigned using the mean flow values, % +% monthly concentrations are assigned to those points. % +% 4. A simple "nearest neighbor" algorithm is used to fill in the gaps % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Sort rivers by discharge +[Qact_sort,sort_ind] = sort(Qact,'ascend'); +lon_news_sort = lon_news(sort_ind); +lat_news_sort = lat_news(sort_ind); +DIN_load_sort = DIN_load(sort_ind); +DON_load_sort = DON_load(sort_ind); +PN_load_sort = PN_load(sort_ind); +DIP_load_sort = DIP_load(sort_ind); +DOP_load_sort = DOP_load(sort_ind); +PP_load_sort = PP_load(sort_ind); +Si_load_sort = Si_load(sort_ind); +river_names_sort = river_names(sort_ind); + +% Total N and P load diagnostics +N_load_sort = DIN_load_sort + DON_load_sort + PN_load_sort; +P_load_sort = DIP_load_sort + DOP_load_sort + PP_load_sort; + +% Calculate concentrations +% Loads are in moles N sec-1, Q in m3 s-1; conc in moles N m-3 +DIN_conc_sort = DIN_load_sort./Qact_sort; +DON_conc_sort = DON_load_sort./Qact_sort; +DIP_conc_sort = DIP_load_sort./Qact_sort; +DOP_conc_sort = DOP_load_sort./Qact_sort; +PN_conc_sort = PN_load_sort./Qact_sort; +PP_conc_sort = PP_load_sort./Qact_sort; +Si_conc_sort = Si_load_sort./Qact_sort; + +% initialize vectors to hold nutrient concentrations at eac runoff +% point. +aa = find(Q_mod_ann > 0); +Q_mod_vec = Q_mod_ann(aa); +din_conc_vec = zeros(size(Q_mod_vec)); +don_conc_vec = zeros(size(Q_mod_vec)); +pn_conc_vec = zeros(size(Q_mod_vec)); +dip_conc_vec = zeros(size(Q_mod_vec)); +dop_conc_vec = zeros(size(Q_mod_vec)); +pp_conc_vec = zeros(size(Q_mod_vec)); +si_conc_vec = zeros(size(Q_mod_vec)); + +lon_mod_runoff_vec = double(lon_mod(aa)); +lat_mod_runoff_vec = double(lat_mod(aa)); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Loop identifies points assigned to each river % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +for k=1:num_rivers + k + dist = pdist2([lon_news_sort(k) lat_news_sort(k)], ... + [lon_mod_runoff_vec lat_mod_runoff_vec]); + [dist_sort, dist_sort_ind] = sort(dist,'ascend'); + + if dist_sort(1) < min_dist; % filters out rivers lying outside the domain + Q_sum1 = 0; + Q_sum2 = 0; + n = 0; + while ((Q_sum2 < Qact_sort(k)) & (dist_sort(n+1) < max_dist)) + Q_sum1 = Q_sum2; + n = n+1; + Q_sum2 = Q_sum1 + Q_mod_vec(dist_sort_ind(n)); + end + % I generally find that the search algorithm works best when you keep + % grabbing points until the total flow captured exceeds the flow in + % the river. If you uncomment the the first part of the "if" + % statement here will pick the last below if it is closer than the + % first above. However, I've found that this option sometimes fails + % to map important rivers. + %if abs(Q_sum1 - Qact_sort(k)) < abs(Q_sum2 - Qact_sort(k)) + % nrp = n-1; % number of runoff points + % [Q_sum1 Qact_sort(k)] % a quick check for comparable flow + % din_conc_vec(dist_sort_ind(1:nrp)) = DIN_conc_sort(k); + % don_conc_vec(dist_sort_ind(1:nrp)) = DON_conc_sort(k); + % dip_conc_vec(dist_sort_ind(1:nrp)) = DIP_conc_sort(k); + % dop_conc_vec(dist_sort_ind(1:nrp)) = DOP_conc_sort(k); + % pn_conc_vec(dist_sort_ind(1:nrp)) = PN_conc_sort(k); + % pp_conc_vec(dist_sort_ind(1:nrp)) = PP_conc_sort(k); + % si_conc_vec(dist_sort_ind(1:nrp)) = Si_conc_sort(k); + %else + nrp = n; % number of runoff points + [Q_sum2 Qact_sort(k)] % a quick check for comparable flow + din_conc_vec(dist_sort_ind(1:nrp)) = DIN_conc_sort(k); + don_conc_vec(dist_sort_ind(1:nrp)) = DON_conc_sort(k); + dip_conc_vec(dist_sort_ind(1:nrp)) = DIP_conc_sort(k); + dop_conc_vec(dist_sort_ind(1:nrp)) = DOP_conc_sort(k); + pn_conc_vec(dist_sort_ind(1:nrp)) = PN_conc_sort(k); + pp_conc_vec(dist_sort_ind(1:nrp)) = PP_conc_sort(k); + si_conc_vec(dist_sort_ind(1:nrp)) = Si_conc_sort(k); + %end + + if inspect_map == 'y' + figure(1) + clf + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,log10(Q_mod_vec),3,log10(Q_mod_vec)); + hold on + scatter3(lon_mod_runoff_vec(dist_sort_ind(1:nrp)),lat_mod_runoff_vec(dist_sort_ind(1:nrp)), ... + log10(Q_mod_vec(dist_sort_ind(1:nrp))),40, ... + log10(Q_mod_vec(dist_sort_ind(1:nrp))),'filled'); + view(2); + plot3(lon_news_sort(k),lat_news_sort(k),1e5,'k.','MarkerSize',20); + %contour(lon_mod,lat_mod,depth,[0 0],'k-'); + axis([lon_news_sort(k)-plot_width lon_news_sort(k)+plot_width ... + lat_news_sort(k)-plot_width lat_news_sort(k)+plot_width]); + caxis([-4 3]); + titl = ['river number: ',num2str(k),' name: ',river_names_sort{k}]; + title(titl); + colorbar; + + % provide a few diagnostics to ensure the calculation was done + % correctly (remove semicolon to inspect as they are mapped in + % the matlab output line. Feel free to add more here. + N_conc = DIN_conc_sort(k) + DON_conc_sort(k) + PN_conc_sort(k); + P_conc = DIP_conc_sort(k) + DOP_conc_sort(k) + PP_conc_sort(k); + Si_conc = Si_conc_sort(k); + river_names_sort(k) + [lon_news_sort(k) lat_news_sort(k)] + ind = dist_sort_ind(1:nrp); + 'lon lat' + [lon_news_sort(k) lat_news_sort(k)] + 'total flow in m3 sec' + [Qact_sort(k) sum(Q_mod_vec(ind))] + 'Nitrogen and phosphorus in Gg per year'; + [N_load_sort(k) sum(Q_mod_vec(ind))*N_conc]*14*86400*365/1e9; + [P_load_sort(k) sum(Q_mod_vec(ind))*P_conc]*31*86400*365/1e9; + 'N, P conc (mmoles m-3), DI, DO, P' + [DIN_conc_sort(k) DON_conc_sort(k) PN_conc_sort(k)]*1e3 + [DIP_conc_sort(k) DOP_conc_sort(k) PP_conc_sort(k)]*1e3 + 'Total N, Total P, Total N: Total P'; + [N_conc*1e3 P_conc*1e3 N_conc/P_conc] + 'DO:DI and P:DI ratios'; + [DON_conc_sort(k)/DIN_conc_sort(k) PN_conc_sort(k)/DIN_conc_sort(k)]; + [DOP_conc_sort(k)/DIP_conc_sort(k) PP_conc_sort(k)/DIP_conc_sort(k)]; + 'silica concentration (mmoles m-3)'; + [Si_conc_sort(k)]*1e3; + pause + end + + else + % This is for rivers that were captured by the coarse initial filter + % to determine if they were in the domain; but are actually outside + % the domain. Calibration suggested that a threshold of 0.75 degrees + % from the specified river mouth reliably identified these cases. + + if inspect_map == 'y' + figure(1) + clf + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,log10(Q_mod_vec),3,log10(Q_mod_vec)); + hold on + view(2); + plot3(lon_news_sort(k),lat_news_sort(k),1e5,'k.','MarkerSize',20); + axis([lon_news_sort(k)-15 lon_news_sort(k)+15 ... + lat_news_sort(k)-15 lat_news_sort(k)+15]); + caxis([-4 3]); + titl = ['OUTSIDE: river number: ',num2str(k),' name: ',river_names_sort{k}]; + title(titl); + colorbar; + pause + end + + end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% nearest neighbor search to fill in any 0 values left for each input field +% after the river mapping is done. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +aa = find(din_conc_vec == 0); +bb = find(din_conc_vec > 0); +F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb),din_conc_vec(bb), ... + 'nearest','nearest'); +din_conc_vec(aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + +aa = find(don_conc_vec == 0); +bb = find(don_conc_vec > 0); +F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb),don_conc_vec(bb), ... + 'nearest','nearest'); +don_conc_vec(aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + +aa = find(pn_conc_vec == 0); +bb = find(pn_conc_vec > 0); +F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb),pn_conc_vec(bb), ... + 'nearest','nearest'); +pn_conc_vec(aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + +aa = find(dip_conc_vec == 0); +bb = find(dip_conc_vec > 0); +F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb),dip_conc_vec(bb), ... + 'nearest','nearest'); +dip_conc_vec(aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + +aa = find(dop_conc_vec == 0); +bb = find(dop_conc_vec > 0); +F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb),dop_conc_vec(bb), ... + 'nearest','nearest'); +dop_conc_vec(aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + +aa = find(pp_conc_vec == 0); +bb = find(pp_conc_vec > 0); +F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb),pp_conc_vec(bb), ... + 'nearest','nearest'); +pp_conc_vec(aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + +aa = find(si_conc_vec == 0); +bb = find(si_conc_vec > 0); +F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb),si_conc_vec(bb), ... + 'nearest','nearest'); +si_conc_vec(aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + +totn_conc_vec = din_conc_vec + don_conc_vec + pn_conc_vec; +totp_conc_vec = dip_conc_vec + dop_conc_vec + pp_conc_vec; + +% calculate ratios of dissolved and particulate to inorganic +din_flux_vec = din_conc_vec.*Q_mod_vec; +dip_flux_vec = dip_conc_vec.*Q_mod_vec; +don_flux_vec = don_conc_vec.*Q_mod_vec; +dop_flux_vec = dop_conc_vec.*Q_mod_vec; +pn_flux_vec = pn_conc_vec.*Q_mod_vec; +pp_flux_vec = pp_conc_vec.*Q_mod_vec; + +don_ratio = sum(don_flux_vec)/sum(din_flux_vec) +dop_ratio = sum(dop_flux_vec)/sum(dip_flux_vec) +pn_ratio = sum(pn_flux_vec)/sum(din_flux_vec) +pp_ratio = sum(pp_flux_vec)/sum(dip_flux_vec) + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Produce plots to evaluate the mapping % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Use total fluxes to scale dots, m3 sec-1 * moles m-3 = moles sec-1 +totn_flux_vec = totn_conc_vec.*Q_mod_vec; +totp_flux_vec = totp_conc_vec.*Q_mod_vec; +totsi_flux_vec = si_conc_vec.*Q_mod_vec; + +% scale marker size with the total nitrogen flux +ms_vec = zeros(size(Q_mod_vec)); +ms_vec(log10(Q_mod_vec) < 0) = 1; +ms_vec((log10(Q_mod_vec) > 0) & (log10(Q_mod_vec) < 1)) = 1; +ms_vec((log10(Q_mod_vec) > 1) & (log10(Q_mod_vec) < 2)) = 1; +ms_vec((log10(Q_mod_vec) > 2) & (log10(Q_mod_vec) < 3)) = 1; +ms_vec(log10(Q_mod_vec) > 3) = 100; + +figure(1) +clf + +subplot(1,3,1); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,totn_conc_vec*1e3,ms_vec, ... + totn_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([30 150]); +colorbar +title('total nitrogen concentration, mmoles m-3'); + +subplot(1,3,2); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,totp_conc_vec*1e3,ms_vec, ... + totp_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([0 10]); +colorbar +title('total phosphorus concentration, mmoles m-3'); + +subplot(1,3,3) +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,totn_conc_vec./totp_conc_vec,ms_vec, ... + totn_conc_vec./totp_conc_vec,'filled'); +hold on +view(2); +caxis([10 100]); +colorbar +title('N:P ratio'); + +figure(2) +clf + +subplot(1,3,1); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,din_conc_vec*1e3,ms_vec, ... + din_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([0 100]); +colorbar +title('din concentration, mmoles m-3'); + +subplot(1,3,2); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,don_conc_vec*1e3,ms_vec, ... + don_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([0 100]); +colorbar +title('don concentration, mmoles m-3'); + +subplot(1,3,3) +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pn_conc_vec*1e3,ms_vec, ... + pn_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([0 100]); +colorbar +title('pn concentration, mmoles m-3'); + +figure(3) +clf + +subplot(1,3,1); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dip_conc_vec*1e3,ms_vec, ... + dip_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([0 5]); +colorbar +title('dip concentration, mmoles m-3'); + +subplot(1,3,2); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dop_conc_vec*1e3,ms_vec, ... + dop_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([0 3]); +colorbar +title('dop concentration, mmoles m-3'); + +subplot(1,3,3) +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pp_conc_vec*1e3,ms_vec, ... + pp_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([0 3]); +colorbar +title('pp concentration, mmoles m-3'); + +figure(10) +clf + +subplot(2,2,1); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,don_conc_vec./din_conc_vec,ms_vec, ... + don_conc_vec./din_conc_vec,'filled'); +hold on +view(2); +caxis([0 2]); +colorbar +title('don:din'); + +subplot(2,2,2); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pn_conc_vec./din_conc_vec,ms_vec, ... + pn_conc_vec./din_conc_vec,'filled'); +hold on +view(2); +caxis([0 2]); +colorbar +title('pn:din'); + +subplot(2,2,3) +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dop_conc_vec./dip_conc_vec,ms_vec, ... + dop_conc_vec./dip_conc_vec,'filled'); +hold on +view(2); +caxis([0 2]); +colorbar +title('dop:dip'); + +subplot(2,2,4) +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pp_conc_vec./dip_conc_vec,ms_vec, ... + pp_conc_vec./dip_conc_vec,'filled'); +hold on +view(2); +caxis([0 2]); +colorbar +title('pp:dip'); + +figure(5) +clf +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,si_conc_vec*1e3,ms_vec, ... + si_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([30 300]); +colorbar +title('si concentration, mmoles m-3'); + +figure(6) +clf + +subplot(1,2,1); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,log10(totn_flux_vec),ms_vec, ... + log10(totn_flux_vec),'filled'); +hold on +view(2); +caxis([-1 2]); +colorbar +title('N flux, log10(moles sec-1)'); + +subplot(1,2,2); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,log10(totp_flux_vec),ms_vec, ... + log10(totp_flux_vec),'filled'); +hold on +view(2); +caxis([-3 1]); +colorbar +title('P flux, log10(moles sec-1)'); + +% output total fluxes in gigagrams of N +total_annual_n = sum(totn_flux_vec)*86400*365*14/1e12 +total_annual_p = sum(totp_flux_vec)*86400*365*31/1e12 +total_annual_si = sum(totsi_flux_vec)*86400*365*28.1/1e12 + +'press any key to continue' +pause + +% Initialize 2D concentration arrays; these are the ones read into MOM6 to +% specify the nutrient concentrations of river inputs. +din_conc = zeros(size(lon_mod)); +don_conc = zeros(size(lon_mod)); +dip_conc = zeros(size(lon_mod)); +dop_conc = zeros(size(lon_mod)); +pn_conc = zeros(size(lon_mod)); +pp_conc = zeros(size(lon_mod)); +si_conc = zeros(size(lon_mod)); + +% Map concentration vectors onto 2D arrays. +aa = find(Q_mod_ann > 0); +din_conc(aa) = din_conc_vec; +don_conc(aa) = don_conc_vec; +pn_conc(aa) = pn_conc_vec; +dip_conc(aa) = dip_conc_vec; +dop_conc(aa) = dop_conc_vec; +pp_conc(aa) = pp_conc_vec; +si_conc(aa) = si_conc_vec; + +NO3_CONC = din_conc; +LDON_CONC = frac_ldon*don_conc; +SLDON_CONC = frac_sldon*don_conc; +SRDON_CONC = frac_srdon*don_conc; +PO4_CONC = dip_conc; +LDOP_CONC = frac_ldop*dop_conc; +SLDOP_CONC = frac_sldop*dop_conc; +SRDOP_CONC = frac_srdop*dop_conc; +NDET_CONC = pn_conc; +PDET_CONC = pp_conc; % The bioavailability of particulate P has already + % been accounted for. + +SI_CONC = si_conc; + +% Add iron concentrations - initialize with nitrate and then overwrite +FED_CONC = NO3_CONC; +FEDET_CONC = NO3_CONC; +% 40 nM dissolved iron concentration from De Baar and De Jong + 30nM +% Colloidal and nanoparticle flux as reported in Canfield and Raiswell +FED_CONC(FED_CONC > 0) = const_fed; +FEDET_CONC(FEDET_CONC > 0) = 0.0; + +% series of quick figures to check the 2D nutrient input files. +ms = 8; +figure(7); +clf +subplot(3,2,1); +title('log10(NO3 CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(NO3_CONC(:)),ms,log10(NO3_CONC(:)),'filled'); +caxis([-4 -1]); colorbar; + +subplot(3,2,2); +title('log10(LDON CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(LDON_CONC(:)),ms,log10(LDON_CONC(:)),'filled'); +caxis([-4 -1]); colorbar; + +subplot(3,2,3); +title('log10(SLDON CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(SLDON_CONC(:)),ms,log10(SLDON_CONC(:)),'filled'); +caxis([-4 -1]); colorbar; + +subplot(3,2,4); +title('log10(SRDON CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(SRDON_CONC(:)),ms,log10(SRDON_CONC(:)),'filled'); +caxis([-4 -1]); colorbar; + +subplot(3,2,5); +title('log10(NDET CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(NDET_CONC(:)),ms,log10(NDET_CONC(:)),'filled'); +caxis([-4 -1]); colorbar; + +figure(8); +clf +subplot(3,2,1); +title('log10(PO4 CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(PO4_CONC(:)),ms,log10(PO4_CONC(:)),'filled'); +caxis([-4 -2]); colorbar; + +subplot(3,2,2); +title('log10(LDOP CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(LDOP_CONC(:)),ms,log10(LDOP_CONC(:)),'filled'); +caxis([-4 -2]); colorbar; + +subplot(3,2,3); +title('log10(SLDOP CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(SLDOP_CONC(:)),ms,log10(SLDOP_CONC(:)),'filled'); +caxis([-4 -2]); colorbar; + +subplot(3,2,4); +title('log10(SRDOP CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(SRDOP_CONC(:)),ms,log10(SRDOP_CONC(:)),'filled'); +caxis([-4 -2]); colorbar; + +subplot(3,2,5); +title('log10(PDET CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(PDET_CONC(:)),ms,log10(PDET_CONC(:)),'filled'); +caxis([-4 -2]); colorbar; + +figure(9) +clf +clf +subplot(3,2,1); +title('log10(FED CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(FED_CONC(:)),ms,log10(FED_CONC(:)),'filled'); +caxis([-5 -3]); colorbar; + +subplot(3,2,2); +title('log10(FEDET CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(FEDET_CONC(:)),ms,log10(FEDET_CONC(:)),'filled'); +caxis([-5 -3]); colorbar; + +subplot(3,2,3); +title('log10(SI CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(SI_CONC(:)),ms,log10(SI_CONC(:)),'filled'); +caxis([-3 -0]); colorbar; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Save Files % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% option to save matlab file +% save River_DIC_ALK_USGS_NWA ALK_CONC DIC_CONC + +% Construct netcdf file following format used by nutrient input files to +% MOM6 +time = 0; +nlat = size(lat_mod,1); +nlon = size(lat_mod,2); + +ncid = netcdf.create(nc_file_name,'CLOBBER'); +dimid0 = netcdf.defDim(ncid,'time',netcdf.getConstant('NC_UNLIMITED')); + +dimid1 = netcdf.defDim(ncid,'y',nlat); +dimid2 = netcdf.defDim(ncid,'x',nlon); + +%attributes inherited from the old river nutrient forcing file. The +%calendar needs to be specified even though the nutrient values are +%constant. Not sure how much of the rest is needed. +varid0 = netcdf.defVar(ncid,'time','double',dimid0); +netcdf.putAtt(ncid,varid0,'calendar','NOLEAP'); +netcdf.putAtt(ncid,varid0,'calendar_type','NOLEAP'); +netcdf.putAtt(ncid,varid0,'modulo','T'); +netcdf.putAtt(ncid,varid0,'units','days since 1900-1-1 0:00:00'); +netcdf.putAtt(ncid,varid0,'time_origin','01-JAN-1990 00:00:00'); + +varid1 = netcdf.defVar(ncid,'y','int',dimid1); +netcdf.putAtt(ncid,varid1,'cartesian_axis','Y'); +varid2 = netcdf.defVar(ncid,'x','int',dimid2); +netcdf.putAtt(ncid,varid2,'cartesian_axis','X'); +varid3 = netcdf.defVar(ncid,'lat','double',[dimid2 dimid1]); +netcdf.putAtt(ncid,varid3,'units','degrees north'); +varid4 = netcdf.defVar(ncid,'lon','double',[dimid2 dimid1]); +netcdf.putAtt(ncid,varid4,'units','degrees east'); +varid5 = netcdf.defVar(ncid,'NO3_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid5,'units','mol m-3'); +netcdf.putAtt(ncid,varid5,'long_name','DIN_CONC'); +varid6 = netcdf.defVar(ncid,'LDON_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid6,'units','mol m-3'); +netcdf.putAtt(ncid,varid6,'long_name','0.3*DON_CONC'); +varid7 = netcdf.defVar(ncid,'SLDON_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid7,'units','mol m-3'); +netcdf.putAtt(ncid,varid7,'long_name','0.35*DON_CONC'); +varid8 = netcdf.defVar(ncid,'SRDON_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid8,'units','mol m-3'); +netcdf.putAtt(ncid,varid8,'long_name','0.35*DON_CONC'); +varid9 = netcdf.defVar(ncid,'NDET_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid9,'units','mol m-3'); +netcdf.putAtt(ncid,varid9,'long_name','1.0*PN_CONC'); +varid10 = netcdf.defVar(ncid,'PO4_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid10,'units','mol m-3'); +netcdf.putAtt(ncid,varid10,'long_name','PO4_CONC'); +varid11 = netcdf.defVar(ncid,'LDOP_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid11,'units','mol m-3'); +netcdf.putAtt(ncid,varid11,'long_name','0.3*DOP_CONC'); +varid12 = netcdf.defVar(ncid,'SLDOP_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid12,'units','mol m-3'); +netcdf.putAtt(ncid,varid12,'long_name','0.35*DOP_CONC'); +varid13 = netcdf.defVar(ncid,'SRDOP_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid13,'units','mol m-3'); +netcdf.putAtt(ncid,varid13,'long_name','0.35*DOP_CONC'); +varid14 = netcdf.defVar(ncid,'PDET_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid14,'units','mol m-3'); +netcdf.putAtt(ncid,varid14,'long_name','0.3*PP_CONC'); +varid15 = netcdf.defVar(ncid,'FED_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid15,'units','mol m-3'); +netcdf.putAtt(ncid,varid15,'long_name','FED_CONC'); +varid16 = netcdf.defVar(ncid,'FEDET_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid16,'units','mol m-3'); +netcdf.putAtt(ncid,varid16,'long_name','FEDET_CONC'); +varid17 = netcdf.defVar(ncid,'SI_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid17,'units','mol m-3'); +netcdf.putAtt(ncid,varid17,'long_name','SI_CONC'); +netcdf.close(ncid) + +ncid = netcdf.open(nc_file_name,'NC_WRITE'); +netcdf.putVar(ncid,varid0,0,1,time); +% nutrient input files appear seem to need dummy axes to be read in +% properly, but eventually do a grid by grid mapping that doesn't require +% these. +netcdf.putVar(ncid,varid1,1:nlat); +netcdf.putVar(ncid,varid2,1:nlon); +netcdf.putVar(ncid,varid3,permute(lon_mod,[2,1])); +netcdf.putVar(ncid,varid4,permute(lat_mod,[2,1])); +netcdf.putVar(ncid,varid5,permute(NO3_CONC,[3,2,1])); +netcdf.putVar(ncid,varid6,permute(LDON_CONC,[3,2,1])); +netcdf.putVar(ncid,varid7,permute(SLDON_CONC,[3,2,1])); +netcdf.putVar(ncid,varid8,permute(SRDON_CONC,[3,2,1])); +netcdf.putVar(ncid,varid9,permute(NDET_CONC,[3,2,1])); +netcdf.putVar(ncid,varid10,permute(PO4_CONC,[3,2,1])); +netcdf.putVar(ncid,varid11,permute(LDOP_CONC,[3,2,1])); +netcdf.putVar(ncid,varid12,permute(SLDOP_CONC,[3,2,1])); +netcdf.putVar(ncid,varid13,permute(SRDOP_CONC,[3,2,1])); +netcdf.putVar(ncid,varid14,permute(PDET_CONC,[3,2,1])); +netcdf.putVar(ncid,varid15,permute(FED_CONC,[3,2,1])); +netcdf.putVar(ncid,varid16,permute(FEDET_CONC,[3,2,1])); +netcdf.putVar(ncid,varid17,permute(SI_CONC,[3,2,1])); +netcdf.close(ncid) diff --git a/tools/rivers/bgc/ARC/mapriv_combined_Arctic.m b/tools/rivers/bgc/ARC/mapriv_combined_Arctic.m new file mode 100644 index 000000000..dfcb9cafe --- /dev/null +++ b/tools/rivers/bgc/ARC/mapriv_combined_Arctic.m @@ -0,0 +1,1343 @@ +% Routine to map USGS nutrient data onto the MOM6 Northwest Atlantic (NWA) +% grid. Run on matlab97 or above. + +clear all; +addpath /home/cas/matlab +nc64startup + +% name of netcdf file to be created +nc_file_name = 'RiverNutrients_Combined_Q100_Arctic12k.nc'; + +% GLOBAL NEWS based map for filling in gaps +NEWS_file = 'RiverNutrients_GlobalNEWS2_plusFe_Q100_Arctic12k.nc'; + +% load in monthly world ocean T, S climatology for saturated oxygen calculation +temp = ncread('Data/woa_sst_climo.nc','t_an'); +woa_temp = permute(temp,[3 2 1]); + +% Parameters for the assignment algorithm. +Q_min = 100; % minimum flow in m3 sec +plot_width = 30; % width of window (in degrees) for inspecting locations + % of rivers and outflow points that have been assigned to + % them. +min_dist = 1.5; % minimum distance (degrees) of the closest outflow point + % for the river to be considered in the domain (useful + % for preventing the algorithm from trying to map rivers + % flowing to different ocean basins. +max_dist = 2.0; % maximum distance (degrees) away that the algorithm + % looks for points for rivers that are in the domain +nutrient_option = 2; % option for deriving dissolved organic nutrients in RC4US +inspect_map = 'y'; % flag enabling you to pause and inspect each river + % mapping as it is being done. + +min_lon_ref = -180;% set to either 0 if model grid contains no negative + % values; set to -180 if model is on a -180-180 grid. + + +% set the bio-availability of phosphorus and the fractionation of dissolved +% organic; PP is set to 30% based on Froelich; Partitioning of detritus +% between +frac_PP = 0.3; +frac_ldon = 0.3; +frac_sldon = 0.35; +frac_srdon = 0.35; +frac_ldop = 0.3; +frac_sldop = 0.35; +frac_srdop = 0.35; +% 40 nM dissolved iron concentration from De Baar and De Jong + 30nM +% Colloidal and nanoparticle flux as reported in Canfield and Raiswell +const_fed = 70.0e-6; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% USGS data compiled by Fabian Gomez % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +filename_chem = 'Data/RC4USCoast/mclim_19902022_chem.nc'; +alk_monthly_RC4US = ncread(filename_chem,'alk'); alk_monthly_RC4US = permute(alk_monthly_RC4US,[2 1]); +dic_monthly_RC4US = ncread(filename_chem,'dic'); dic_monthly_RC4US = permute(dic_monthly_RC4US,[2 1]); +no3_monthly_RC4US = ncread(filename_chem,'no3'); no3_monthly_RC4US = permute(no3_monthly_RC4US,[2 1]); +nh4_monthly_RC4US = ncread(filename_chem,'nh4'); nh4_monthly_RC4US = permute(nh4_monthly_RC4US,[2 1]); +din_monthly_RC4US = no3_monthly_RC4US + nh4_monthly_RC4US; +dip_monthly_RC4US = ncread(filename_chem,'po4'); dip_monthly_RC4US = permute(dip_monthly_RC4US,[2 1]); +si_monthly_RC4US = ncread(filename_chem,'sio2'); si_monthly_RC4US = permute(si_monthly_RC4US,[2 1]); +% The RC4US database seems to be in mmoles O m-3 rather than mmoles O2 m-3, +% divide by 2.0 for consistency with other O2 data sources +o2_monthly_RC4US = ncread(filename_chem,'do'); o2_monthly_RC4US = permute(o2_monthly_RC4US,[2 1])/2.0; +don_monthly_RC4US = ncread(filename_chem,'don'); don_monthly_RC4US = permute(don_monthly_RC4US,[2 1]); +temp_monthly_RC4US = ncread(filename_chem,'temp'); temp_monthly_RC4US = permute(temp_monthly_RC4US,[2 1]); +if nutrient_option == 1 + % This option will eventually set all river values for pn, dop and pp using GlobalNEWS + pn_monthly_RC4US = no3_monthly_RC4US*NaN; + dop_monthly_RC4US = no3_monthly_RC4US*NaN; + pp_monthly_RC4US = no3_monthly_RC4US*NaN; +elseif nutrient_option == 2 + % This option will use differences between total filtered and unfiltered + % and other properties to derive pn, dop and pp. This unfortunately + % generates negative values in some cases. + tnf_monthly_RC4US = ncread(filename_chem,'tnf'); tnf_monthly_RC4US = permute(tnf_monthly_RC4US,[2 1]); + don2_monthly_RC4US = tnf_monthly_RC4US - din_monthly_RC4US; + tnu_monthly_RC4US = ncread(filename_chem,'tnu'); tnu_monthly_RC4US = permute(tnu_monthly_RC4US,[2 1]); + pn_monthly_RC4US = tnu_monthly_RC4US - tnf_monthly_RC4US; + pn_monthly_RC4US(pn_monthly_RC4US < 0) = NaN; + tpf_monthly_RC4US = ncread(filename_chem,'tpf'); tpf_monthly_RC4US = permute(tpf_monthly_RC4US,[2 1]); + dop_monthly_RC4US = tpf_monthly_RC4US - dip_monthly_RC4US; + dop_monthly_RC4US(dop_monthly_RC4US < 0) = NaN; + tpu_monthly_RC4US = ncread(filename_chem,'tpu'); tpu_monthly_RC4US = permute(tpu_monthly_RC4US,[2 1]); + pp_monthly_RC4US = (tpu_monthly_RC4US - tpf_monthly_RC4US)*frac_PP; + pp_monthly_RC4US(pp_monthly_RC4US < 0) = NaN; +end +dfe_monthly_RC4US = no3_monthly_RC4US*NaN; +pfe_monthly_RC4US = no3_monthly_RC4US*NaN; + +filename_discharge = 'Data/RC4USCoast/mclim_19902022_disc.nc'; +Q_monthly_RC4US = ncread(filename_discharge,'disc'); Q_monthly_RC4US = permute(Q_monthly_RC4US,[2 1]); % m-3 sec-1 +station_names_RC4US = h5read(filename_discharge,'/river_name'); +lon_stations_RC4US = ncread(filename_discharge,'mouth_lon'); +lat_stations_RC4US = ncread(filename_discharge,'mouth_lat'); + +Q_ann_RC4US = mean(Q_monthly_RC4US,1,'native','omitnan')'; +dic_ann_RC4US = mean(dic_monthly_RC4US,1,'native','omitnan')'; +alk_ann_RC4US = mean(alk_monthly_RC4US,1,'native','omitnan')'; +no3_ann_RC4US = mean(no3_monthly_RC4US,1,'native','omitnan')'; +nh4_ann_RC4US = mean(nh4_monthly_RC4US,1,'native','omitnan')'; +o2_ann_RC4US = mean(o2_monthly_RC4US,1,'native','omitnan')'; +dip_ann_RC4US = mean(dip_monthly_RC4US,1,'native','omitnan')'; +si_ann_RC4US = mean(si_monthly_RC4US,1,'native','omitnan')'; +din_ann_RC4US = no3_ann_RC4US + nh4_ann_RC4US; +don_ann_RC4US = mean(don_monthly_RC4US,1,'native','omitnan')'; +if nutrient_option == 1 + don_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + pn_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + dop_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + pp_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; +elseif nutrient_option == 2 + don2_ann_RC4US = mean(don2_monthly_RC4US,1,'native','omitnan')'; + pn_ann_RC4US = mean(pn_monthly_RC4US,1,'native','omitnan')'; + dop_ann_RC4US = mean(dop_monthly_RC4US,1,'native','omitnan')'; + pp_ann_RC4US = mean(pp_monthly_RC4US,1,'native','omitnan')'; +end +dfe_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; +pfe_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + +for n = 1:size(lon_stations_RC4US,1) + + % Make any adjustments to the river locations here, e.g: + % + % Move the Susquehanna a bit south so that it catches the Chesapeake + % and not the Delaware. + %if strcmp('Susquehanna',station_names_RC4US{n}) + % lat_stations_RC4US(n) = 38.5; + % lon_stations_RC4US(n) = -77.5; + % %pause + %end + +end + +Q_ann_RC4US = mean(Q_monthly_RC4US,1,'native','omitnan')'; +dic_ann_RC4US = mean(dic_monthly_RC4US,1,'native','omitnan')'; +alk_ann_RC4US = mean(alk_monthly_RC4US,1,'native','omitnan')'; +no3_ann_RC4US = mean(no3_monthly_RC4US,1,'native','omitnan')'; +nh4_ann_RC4US = mean(nh4_monthly_RC4US,1,'native','omitnan')'; +o2_ann_RC4US = mean(o2_monthly_RC4US,1,'native','omitnan')'; +dip_ann_RC4US = mean(dip_monthly_RC4US,1,'native','omitnan')'; +si_ann_RC4US = mean(si_monthly_RC4US,1,'native','omitnan')'; +din_ann_RC4US = no3_ann_RC4US + nh4_ann_RC4US; +don_ann_RC4US = mean(don_monthly_RC4US,1,'native','omitnan')'; +if nutrient_option == 1 + don_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + pn_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + dop_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + pp_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; +elseif nutrient_option == 2 + don2_ann_RC4US = mean(don2_monthly_RC4US,1,'native','omitnan')'; + pn_ann_RC4US = mean(pn_monthly_RC4US,1,'native','omitnan')'; + dop_ann_RC4US = mean(dop_monthly_RC4US,1,'native','omitnan')'; + pp_ann_RC4US = mean(pp_monthly_RC4US,1,'native','omitnan')'; +end +dfe_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; +pfe_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + +% Created by Process_GLORICH_NEP.m, includes following variables: +%save Arctic_GLORICH_data lon_stations_glorich lat_stations_glorich station_names_glorich ... +% Q_ann_glorich dic_ann_glorich alk_ann_glorich no3_ann_glorich nh4_ann_glorich ... +% din_ann_glorich pn_ann_glorich don_ann_glorich dip_ann_glorich dop_ann_glorich ... +% pp_ann_glorich si_ann_glorich o2_ann_glorich dfe_ann_glorich pfe_ann_glorich ... +% dic_monthly_glorich alk_monthly_glorich no3_monthly_glorich nh4_monthly_glorich ... +% din_monthly_glorich don_monthly_glorich pn_monthly_glorich dip_monthly_glorich ... +% dop_monthly_glorich pp_monthly_glorich dfe_monthly_glorich pfe_monthly_glorich ... +% si_monthly_glorich o2_monthly_glorich +load Data/GLORICH/Arctic_GLORICH_data.mat; + +% Created by Process_ARCTICGRO.m, includes following variables: +%save arcticgro_data lon_stations_arcticgro lat_stations_arcticgro station_names_arcticgro ... +% Q_ann_arcticgro dic_ann_arcticgro alk_ann_arcticgro no3_ann_arcticgro nh4_ann_arcticgro ... +% din_ann_arcticgro pn_ann_arcticgro don_ann_arcticgro dip_ann_arcticgro dop_ann_arcticgro ... +% pp_ann_arcticgro si_ann_arcticgro o2_ann_arcticgro dfe_ann_arcticgro pfe_ann_arcticgro ... +% dic_monthly_arcticgro alk_monthly_arcticgro no3_monthly_arcticgro nh4_monthly_arcticgro ... +% din_monthly_arcticgro don_monthly_arcticgro pn_monthly_arcticgro dip_monthly_arcticgro ... +% dop_monthly_arcticgro pp_monthly_arcticgro dfe_monthly_arcticgro pfe_monthly_arcticgro ... +% si_monthly_arcticgro o2_monthly_arcticgro +load Data/ArcticGro/arcticgro_data.mat; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Combine all annual and monthly station data % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +station_names_all = [station_names_RC4US; string(station_names_glorich)'; string(station_names_arcticgro)']; +lon_stations_all = [lon_stations_RC4US; lon_stations_glorich'; lon_stations_arcticgro']; +if min_lon_ref == 0 + lon_stations_all(lon_stations_all < 0) = lon_stations_all(lon_stations_all < 0) + 360; +elseif min_lon_ref == -180 + lon_stations_all(lon_stations_all > 180) = lon_stations_all(lon_stations_all > 180) - 360; +end +lat_stations_all = [lat_stations_RC4US; lat_stations_glorich'; lat_stations_arcticgro']; +Q_ann_all = [Q_ann_RC4US; Q_ann_glorich'; Q_ann_arcticgro']; + +dic_ann_all = [dic_ann_RC4US; dic_ann_glorich'; dic_ann_arcticgro']; +alk_ann_all = [alk_ann_RC4US; alk_ann_glorich'; alk_ann_arcticgro']; +no3_ann_all = [no3_ann_RC4US; no3_ann_glorich'; no3_ann_arcticgro']; +nh4_ann_all = [nh4_ann_RC4US; nh4_ann_glorich'; nh4_ann_arcticgro']; +din_ann_all = [din_ann_RC4US; din_ann_glorich'; din_ann_arcticgro']; +don_ann_all = [don_ann_RC4US; don_ann_glorich'; don_ann_arcticgro']; +pn_ann_all = [pn_ann_RC4US; pn_ann_glorich'; pn_ann_arcticgro']; +dip_ann_all = [dip_ann_RC4US; dip_ann_glorich'; dip_ann_arcticgro']; +dop_ann_all = [dop_ann_RC4US; dop_ann_glorich'; dop_ann_arcticgro']; +pp_ann_all = [pp_ann_RC4US; pp_ann_glorich'; pp_ann_arcticgro']; +dfe_ann_all = [dfe_ann_RC4US; dfe_ann_glorich'; dfe_ann_arcticgro']; +pfe_ann_all = [pfe_ann_RC4US; pfe_ann_glorich'; pfe_ann_arcticgro']; +si_ann_all = [si_ann_RC4US; si_ann_glorich'; si_ann_arcticgro']; +o2_ann_all = [o2_ann_RC4US; o2_ann_glorich'; o2_ann_arcticgro']; + +dic_monthly_all = [dic_monthly_RC4US dic_monthly_glorich dic_monthly_arcticgro]; +alk_monthly_all = [alk_monthly_RC4US alk_monthly_glorich alk_monthly_arcticgro]; +no3_monthly_all = [no3_monthly_RC4US no3_monthly_glorich no3_monthly_arcticgro]; +nh4_monthly_all = [nh4_monthly_RC4US nh4_monthly_glorich nh4_monthly_arcticgro]; +din_monthly_all = [din_monthly_RC4US din_monthly_glorich din_monthly_arcticgro]; +don_monthly_all = [don_monthly_RC4US don_monthly_glorich don_monthly_arcticgro]; +pn_monthly_all = [pn_monthly_RC4US pn_monthly_glorich pn_monthly_arcticgro]; +dip_monthly_all = [dip_monthly_RC4US dip_monthly_glorich dip_monthly_arcticgro]; +dop_monthly_all = [dop_monthly_RC4US dop_monthly_glorich dop_monthly_arcticgro]; +pp_monthly_all = [pp_monthly_RC4US pp_monthly_glorich pp_monthly_arcticgro]; +dfe_monthly_all = [dfe_monthly_RC4US dfe_monthly_glorich dfe_monthly_arcticgro]; +pfe_monthly_all = [pfe_monthly_RC4US pfe_monthly_glorich pfe_monthly_arcticgro]; +si_monthly_all = [si_monthly_RC4US si_monthly_glorich si_monthly_arcticgro]; +o2_monthly_all = [o2_monthly_RC4US o2_monthly_glorich o2_monthly_arcticgro]; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Load in monthly climatology of river forcing from the regional grid. % +% File contains: % +% runoff: monthly average runoff in kg m-2 sec-1 % +% area: area of grid cell in m-2 % +% lon: longitude (0-360 degrees) % +% lat: latitude % % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +load glofas_hill_runoff_monthlyclim_arctic12k_05112023.mat; + +lon_mod = lon; +lat_mod = lat; +area_mod = area; +% convert runoff from kg m-2 sec-1 to m3 sec-1 +Q_mod_monthly = zeros(size(runoff)); +for m = 1:12 + Q_mod_monthly(m,:,:) = squeeze(runoff(m,:,:)).*area_mod./1000; +end +Q_mod_ann = squeeze(mean(Q_mod_monthly,1)); +clear lon lat runoff area; + +%grid_file = '/archive/cas/Regional_MOM6/NWA12/nwa12_ocean_static.nc'; +%temp = ncread(grid_file,'deptho'); +%depth = permute(temp,[2,1]); clear temp; +%depth(isnan(depth)) = -1; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Filter for rivers in the region, set thresholds for minimum river size, % +% set parameters for plotting routines. % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% use grid to filter rivers outside domain +lat_mod_max = max(lat_mod(:)); +lat_mod_min = min(lat_mod(:)); +lon_mod_max = max(lon_mod(:)); +lon_mod_min = min(lon_mod(:)); + +in_region = find( (lon_stations_all <= lon_mod_max) & (lon_stations_all >= lon_mod_min) & ... + (lat_stations_all <= lat_mod_max) & (lat_stations_all >= lat_mod_min) & ... + (isfinite(Q_ann_all)) & (Q_ann_all > Q_min) ); +num_rivers = size(in_region,1); + +station_names_reg = station_names_all(in_region); +lon_stations_reg = lon_stations_all(in_region); +lat_stations_reg = lat_stations_all(in_region); +Q_ann_reg = Q_ann_all(in_region); +dic_ann_reg = dic_ann_all(in_region); +alk_ann_reg = alk_ann_all(in_region); +no3_ann_reg = no3_ann_all(in_region); +nh4_ann_reg = nh4_ann_all(in_region); +din_ann_reg = din_ann_all(in_region); +don_ann_reg = don_ann_all(in_region); +pn_ann_reg = pn_ann_all(in_region); +dip_ann_reg = dip_ann_all(in_region); +dop_ann_reg = dop_ann_all(in_region); +pp_ann_reg = pp_ann_all(in_region); +dfe_ann_reg = dfe_ann_all(in_region); +pfe_ann_reg = pfe_ann_all(in_region); +si_ann_reg = si_ann_all(in_region); +o2_ann_reg = o2_ann_all(in_region); + +for m = 1:12 + dic_monthly_reg(m,:) = dic_monthly_all(m,in_region); + alk_monthly_reg(m,:) = alk_monthly_all(m,in_region); + no3_monthly_reg(m,:) = no3_monthly_all(m,in_region); + nh4_monthly_reg(m,:) = nh4_monthly_all(m,in_region); + din_monthly_reg(m,:) = din_monthly_all(m,in_region); + don_monthly_reg(m,:) = don_monthly_all(m,in_region); + pn_monthly_reg(m,:) = pn_monthly_all(m,in_region); + dip_monthly_reg(m,:) = dip_monthly_all(m,in_region); + dop_monthly_reg(m,:) = dop_monthly_all(m,in_region); + pp_monthly_reg(m,:) = pp_monthly_all(m,in_region); + dfe_monthly_reg(m,:) = dfe_monthly_all(m,in_region); + pfe_monthly_reg(m,:) = pfe_monthly_all(m,in_region); + si_monthly_reg(m,:) = si_monthly_all(m,in_region); + o2_monthly_reg(m,:) = o2_monthly_all(m,in_region); +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Assigning outflow points to rivers. % +% 1. Assignment starts with the rivers with the smallest flow and works % +% to the largest, w/larger river characteristics taking precedence to % +% ensure the most significant rivers are well represented. % +% 2. The algorithm keeps choosing the closest points to each river mouth % +% until the assigned flow is as close as possible to that observed % +% 3. Once the outflow points are assigned using the mean flow values, % +% monthly concentrations are assigned to those points. % +% 4. A simple "nearest neighbor" algorithm is used to fill in the gaps % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Sort rivers by discharge +[Q_ann_sort,sort_ind] = sort(Q_ann_reg,'ascend'); + +station_names_sort = station_names_reg(sort_ind); +lon_stations_sort = lon_stations_reg(sort_ind); +lat_stations_sort = lat_stations_reg(sort_ind); +Q_ann_sort = Q_ann_reg(sort_ind); +dic_ann_sort = dic_ann_reg(sort_ind); +alk_ann_sort = alk_ann_reg(sort_ind); +no3_ann_sort = no3_ann_reg(sort_ind); +nh4_ann_sort = nh4_ann_reg(sort_ind); +din_ann_sort = din_ann_reg(sort_ind); +don_ann_sort = don_ann_reg(sort_ind); +pn_ann_sort = pn_ann_reg(sort_ind); +dip_ann_sort = dip_ann_reg(sort_ind); +dop_ann_sort = dop_ann_reg(sort_ind); +pp_ann_sort = pp_ann_reg(sort_ind); +dfe_ann_sort = dfe_ann_reg(sort_ind); +pfe_ann_sort = pfe_ann_reg(sort_ind); +si_ann_sort = si_ann_reg(sort_ind); +o2_ann_sort = o2_ann_reg(sort_ind); + +for m = 1:12 + dic_monthly_sort(m,:) = dic_monthly_reg(m,sort_ind); + alk_monthly_sort(m,:) = alk_monthly_reg(m,sort_ind); + no3_monthly_sort(m,:) = no3_monthly_reg(m,sort_ind); + nh4_monthly_sort(m,:) = nh4_monthly_reg(m,sort_ind); + din_monthly_sort(m,:) = din_monthly_reg(m,sort_ind); + don_monthly_sort(m,:) = don_monthly_reg(m,sort_ind); + pn_monthly_sort(m,:) = pn_monthly_reg(m,sort_ind); + dip_monthly_sort(m,:) = dip_monthly_reg(m,sort_ind); + dop_monthly_sort(m,:) = dop_monthly_reg(m,sort_ind); + pp_monthly_sort(m,:) = pp_monthly_reg(m,sort_ind); + dfe_monthly_sort(m,:) = dfe_monthly_reg(m,sort_ind); + pfe_monthly_sort(m,:) = pfe_monthly_reg(m,sort_ind); + si_monthly_sort(m,:) = si_monthly_reg(m,sort_ind); + o2_monthly_sort(m,:) = o2_monthly_reg(m,sort_ind); +end + +% Create vectors of values at the runoff points from the model grid. These +% are used to accelerate the mapping relative to wrangling the full grid +% with all the zeros included. "ind_ro" are the grid indexes with runoff +ind_ro = find(Q_mod_ann > 0); +Q_mod_vec = Q_mod_ann(ind_ro); +lon_mod_runoff_vec = lon_mod(ind_ro); +lat_mod_runoff_vec = lat_mod(ind_ro); +Q_mod_monthly_vecs = zeros(12,size(lon_mod_runoff_vec,1)); +for m = 1:12 + temp = squeeze(Q_mod_monthly(m,:,:)); + Q_mod_monthly_vecs(m,:) = temp(ind_ro); +end + +% Create a grid of saturated oxygen values using the world ocean atlas data +temp_woa_monthly_vecs = zeros(12,size(lon_mod_runoff_vec,1)); +o2sat_woa_monthly_vecs = zeros(12,size(lon_mod_runoff_vec,1)); + +% Constants for o2 saturation calculation (taken from COBALT) +a_0 = 2.00907; +a_1 = 3.22014; +a_2 = 4.05010; +a_3 = 4.94457; +a_4 = -2.56847e-1; +a_5 = 3.88767; +sal = 0; +b_0 = -6.24523e-3; +b_1 = -7.37614e-3; +b_2 = -1.03410e-2; +b_3 = -8.17083e-3; +c_0 = -4.88682e-7; + +for m = 1:12 + temp = squeeze(woa_temp(m,:,:)); + % limit for validity of o2sat calculation + temp(temp > 40) = 40; temp(temp < 0) = 0; + temp_woa_monthly_vecs(m,:) = temp(ind_ro); + % calculate the oxygen saturation at a given temperature and salinity = 0 + % code taken from COBALT with limits applied above + tt = 298.15 - temp_woa_monthly_vecs(m,:); + tkb = 273.15 + temp_woa_monthly_vecs(m,:); + ts = log(tt / tkb); + ts2 = ts * ts; + ts3 = ts2 * ts; + ts4 = ts3 * ts; + ts5 = ts4 * ts; + + o2sat_woa_monthly_vecs(m,:) = (1000.0/22391.6) * 1000 * ... %convert from ml/l to mmol m-3 + exp(a_0 + a_1*ts + a_2*ts2 + a_3*ts3 + a_4*ts4 + a_5*ts5 + ... + (b_0 + b_1*ts + b_2*ts2 + b_3*ts3 + c_0*sal)*sal); +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Load in fields generated from global NEWS. Where necessary, the ratio % +% of constituents relative to DIN will be used to fill forcing gaps % +% The m-file used to generate the NEWS forcing file is included in this % +% directory and uses an analogous mapping algorithm to this one % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +din_ann_NEWS = nc_varget(NEWS_file,'NO3_CONC'); +aa = find(din_ann_NEWS > 0); +temp1 = nc_varget(NEWS_file,'LDON_CONC'); +temp2 = nc_varget(NEWS_file,'SLDON_CONC'); +temp3 = nc_varget(NEWS_file,'SRDON_CONC'); +don_ann_NEWS = temp1 + temp2 + temp3; +don_ratio_NEWS_vec = don_ann_NEWS(aa)./din_ann_NEWS(aa); +clear temp1 temp2 temp3; +pn_ann_NEWS = nc_varget(NEWS_file,'NDET_CONC'); +pn_ratio_NEWS_vec = pn_ann_NEWS(aa)./din_ann_NEWS(aa); + +dip_ann_NEWS = nc_varget(NEWS_file,'PO4_CONC'); +dip_ratio_NEWS_vec = dip_ann_NEWS(aa)./din_ann_NEWS(aa); +temp1 = nc_varget(NEWS_file,'LDOP_CONC'); +temp2 = nc_varget(NEWS_file,'SLDOP_CONC'); +temp3 = nc_varget(NEWS_file,'SRDOP_CONC'); +dop_ann_NEWS = temp1 + temp2 + temp3; +dop_ratio_NEWS_vec = dop_ann_NEWS(aa)./din_ann_NEWS(aa); +clear temp1 temp2 temp3; +pp_ann_NEWS = nc_varget(NEWS_file,'PDET_CONC'); +pp_ratio_NEWS_vec = pp_ann_NEWS(aa)./din_ann_NEWS(aa); +si_ann_NEWS = nc_varget(NEWS_file,'SI_CONC'); +si_ratio_NEWS_vec = si_ann_NEWS(aa)./din_ann_NEWS(aa); + +% Vectors to hold monthly values mapped onto model runoff points +dic_mod_monthly_vecs = zeros(12,size(lon_mod_runoff_vec,1)); +alk_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +no3_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +nh4_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +din_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +don_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +pn_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +dip_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +dop_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +pp_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +dfe_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +pfe_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +si_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +o2_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Loop identifies points assigned to each river % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +for k=1:num_rivers + dist = pdist2([lon_stations_sort(k) lat_stations_sort(k)], ... + [lon_mod_runoff_vec lat_mod_runoff_vec]); + [dist_sort, dist_sort_ind] = sort(dist,'ascend'); + + if dist_sort(1) < min_dist + Q_sum1 = 0; + Q_sum2 = 0; + n = 0; + while (Q_sum2 < Q_ann_sort(k) && (dist_sort(n+1) < max_dist)) + Q_sum1 = Q_sum2; + n = n+1; + Q_sum2 = Q_sum1 + Q_mod_vec(dist_sort_ind(n)); + end + %if abs(Q_sum1 - Q_ann_sort(k)) < abs(Q_sum2 - Q_ann_sort(k)) + % nrp = n-1; % number of runoff points + % [Q_sum1 Q_ann_sort(k)] % a quick check for comparable flow + %else + nrp = n; + [Q_sum2 Q_ann_sort(k)] + %end + + % enter monthly concentration values into an array of monthly values + % if no monthly value is available, use annuals. + for m = 1:12 + + if isnan(dic_monthly_sort(m,k)) + if isfinite(dic_ann_sort(k)) + dic_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = dic_ann_sort(k); + else + dic_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = 0; + end + else + dic_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = dic_monthly_sort(m,k); + end + + if isnan(alk_monthly_sort(m,k)) + if isfinite(dic_ann_sort(k)) + alk_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = alk_ann_sort(k); + else + alk_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = 0; + end + else + alk_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = alk_monthly_sort(m,k); + end + + % mapping assumes that DIN is defined for nutrient calculations since + % ratios relative to DIN are used to fill in other components. If + % DIN is not defined, values are left at 0 and eventually filled with + % a nearest neighbor filling (next section) + + if (isfinite(din_monthly_sort(m,k)) || isfinite(din_ann_sort(k)) ) + if isfinite(din_monthly_sort(m,k)) + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = din_monthly_sort(m,k); + elseif isfinite(din_ann_sort(k)) + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = din_ann_sort(k); + end + + if isfinite(no3_monthly_sort(m,k)) + no3_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = no3_monthly_sort(m,k); + elseif isfinite(no3_ann_sort(k)) + no3_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = no3_ann_sort(k); + end + + if isfinite(nh4_monthly_sort(m,k)) + nh4_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = nh4_monthly_sort(m,k); + elseif isfinite(nh4_ann_sort(k)) + nh4_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = nh4_ann_sort(k); + end + + if (isnan(don_monthly_sort(m,k)) && isnan(don_ann_sort(k))) + don_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = ... + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)).* ... + don_ratio_NEWS_vec(dist_sort_ind(1:nrp))'; + elseif (isnan(don_monthly_sort(m,k)) && ~isnan(don_ann_sort(k))) + don_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = don_ann_sort(k); + else + don_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = don_monthly_sort(m,k); + end + + if (isnan(pn_monthly_sort(m,k)) && isnan(pn_ann_sort(k))) + pn_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = ... + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)).* ... + pn_ratio_NEWS_vec(dist_sort_ind(1:nrp))'; + elseif (isnan(pn_monthly_sort(m,k)) && ~isnan(pn_ann_sort(k))) + pn_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = pn_ann_sort(k); + else + pn_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = pn_monthly_sort(m,k); + end + + if (isnan(dip_monthly_sort(m,k)) && isnan(dip_ann_sort(k))) + dip_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = ... + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)).* ... + dip_ratio_NEWS_vec(dist_sort_ind(1:nrp))'; + elseif (isnan(dip_monthly_sort(m,k)) && ~isnan(dip_ann_sort(k))) + dip_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = dip_ann_sort(k); + else + dip_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = dip_monthly_sort(m,k); + end + + if (isnan(dop_monthly_sort(m,k)) && isnan(dop_ann_sort(k))) + dop_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = ... + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)).* ... + dop_ratio_NEWS_vec(dist_sort_ind(1:nrp))'; + elseif (isnan(dop_monthly_sort(m,k)) && ~isnan(dop_ann_sort(k))) + dop_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = dop_ann_sort(k); + else + dop_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = dop_monthly_sort(m,k); + end + + if (isnan(pp_monthly_sort(m,k)) && isnan(pp_ann_sort(k))) + pp_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = ... + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)).* ... + pp_ratio_NEWS_vec(dist_sort_ind(1:nrp))'; + elseif (isnan(pp_monthly_sort(m,k)) && ~isnan(pp_ann_sort(k))) + pp_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = pp_ann_sort(k); + else + pp_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = pp_monthly_sort(m,k); + end + + if (isnan(si_monthly_sort(m,k)) && isnan(si_ann_sort(k))) + si_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = ... + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)).* ... + si_ratio_NEWS_vec(dist_sort_ind(1:nrp))'; + elseif (isnan(si_monthly_sort(m,k)) && ~isnan(si_ann_sort(k))) + si_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = si_ann_sort(k); + else + si_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = si_monthly_sort(m,k); + end + + if isnan(o2_monthly_sort(m,k)) + o2_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = ... + o2sat_woa_monthly_vecs(m,dist_sort_ind(1:nrp)); + else + o2_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = o2_monthly_sort(m,k); + end + + end + end + + % plot to check location if inspect_map == 'y'. The plot puts + % open circles at each runoff location in the model grid and fills + % those that are assigned to each river. Note that some of the smaller + % rivers may be replaced with larger ones as the fitting process + % continues. + + if inspect_map == 'y' + figure(1) + clf + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,log10(Q_mod_vec),3,log10(Q_mod_vec)); + hold on + scatter3(lon_mod_runoff_vec(dist_sort_ind(1:nrp)),lat_mod_runoff_vec(dist_sort_ind(1:nrp)), ... + log10(Q_mod_vec(dist_sort_ind(1:nrp))),25, ... + log10(Q_mod_vec(dist_sort_ind(1:nrp))),'filled'); + view(2); + plot3(lon_stations_sort(k),lat_stations_sort(k),1e5,'k.','MarkerSize',20); + %contour(lon_mod,lat_mod,depth,[0 0],'k-'); + axis([lon_stations_sort(k)-plot_width/2 lon_stations_sort(k)+plot_width/2 ... + lat_stations_sort(k)-plot_width/2 lat_stations_sort(k)+plot_width/2]); + caxis([-4 3]); + titl = ['river number: ',num2str(k),' name: ',station_names_sort{k}]; + title(titl); + colorbar; + + % check the values of each mapping + N_check = mean(din_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all') + ... + mean(don_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all') + ... + mean(pn_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + P_check = mean(dip_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all') + ... + mean(dop_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all') + ... + mean(pp_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + SI_check = mean(si_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + DIN_check = mean(din_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + DON_check = mean(don_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + PN_check = mean(pn_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + DIP_check = mean(dip_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + DOP_check = mean(dop_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + PP_check = mean(pp_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + SI_check = mean(si_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + + station_names_sort(k) + ind = dist_sort_ind(1:nrp); + 'total flow in m3 sec' + [Q_ann_sort(k) sum(Q_mod_vec(dist_sort_ind(1:nrp)))] + 'N, P conc (mmoles m-3), DI, DO, P' + [DIN_check DON_check PN_check] + [DIP_check DOP_check PP_check] + 'Total N, Total P, Total N: Total P' + [N_check P_check N_check/P_check] + 'DO:DI and P:DI ratios'; + [DON_check/DIN_check PN_check/DIN_check]; + [DOP_check/DIP_check PP_check/DIP_check]; + 'silica concentration (mmoles m-3)'; + SI_check; + + pause + end + + % If river is outside the domain, skip all of the calculations above and + % just plot for inspection/evaluation + else + % This is for rivers that were outside of the domain + if inspect_map == 'y' + figure(1) + clf + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,log10(Q_mod_vec),3,log10(Q_mod_vec)); + hold on + view(2); + plot3(lon_stations_sort(k),lat_stations_sort(k),1e5,'k.','MarkerSize',20); + axis([lon_stations_sort(k)-10 lon_stations_sort(k)+10 ... + lat_stations_sort(k)-10 lat_stations_sort(k)+10]); + caxis([-4 3]); + titl = ['OUTSIDE: river number: ',num2str(k),' name: ',station_names_sort{k}]; + title(titl); + colorbar; + + pause + end + + end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% nearest neighbor search to fill in any runoff points that were not % +% assigned after the runoff mapping step % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +lon_mod_runoff_vec = double(lon_mod_runoff_vec); +lat_mod_runoff_vec = double(lat_mod_runoff_vec); + +for m = 1:12 + aa = find(dic_mod_monthly_vecs(m,:) == 0); + bb = find(dic_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + dic_mod_monthly_vecs(m,bb)','nearest','nearest'); + dic_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(alk_mod_monthly_vecs(m,:) == 0); + bb = find(alk_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + alk_mod_monthly_vecs(m,bb)','nearest','nearest'); + alk_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(no3_mod_monthly_vecs(m,:) == 0); + bb = find(no3_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + no3_mod_monthly_vecs(m,bb)','nearest','nearest'); + no3_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(nh4_mod_monthly_vecs(m,:) == 0); + bb = find(nh4_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + nh4_mod_monthly_vecs(m,bb)','nearest','nearest'); + nh4_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(din_mod_monthly_vecs(m,:) == 0); + bb = find(din_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + din_mod_monthly_vecs(m,bb)','nearest','nearest'); + din_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(don_mod_monthly_vecs(m,:) == 0); + bb = find(don_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + don_mod_monthly_vecs(m,bb)','nearest','nearest'); + don_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(pn_mod_monthly_vecs(m,:) == 0); + bb = find(pn_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + pn_mod_monthly_vecs(m,bb)','nearest','nearest'); + pn_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(dip_mod_monthly_vecs(m,:) == 0); + bb = find(dip_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + dip_mod_monthly_vecs(m,bb)','nearest','nearest'); + dip_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(dop_mod_monthly_vecs(m,:) == 0); + bb = find(dop_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + dop_mod_monthly_vecs(m,bb)','nearest','nearest'); + dop_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(pp_mod_monthly_vecs(m,:) == 0); + bb = find(pp_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + pp_mod_monthly_vecs(m,bb)','nearest','nearest'); + pp_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(si_mod_monthly_vecs(m,:) == 0); + bb = find(si_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + si_mod_monthly_vecs(m,bb)','nearest','nearest'); + si_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); +end + +% For o2sat, fill in any 0 values with saturated o2 at the world ocean +% atlas climatology +for m = 1:12 + aa = find(o2_mod_monthly_vecs(m,:) == 0); + o2_mod_monthly_vecs(m,aa) = o2sat_woa_monthly_vecs(m,aa); +end + +totn_mod_monthly_vecs = din_mod_monthly_vecs + don_mod_monthly_vecs + pn_mod_monthly_vecs; +totp_mod_monthly_vecs = dip_mod_monthly_vecs + dop_mod_monthly_vecs + pp_mod_monthly_vecs; + +dicflux_mod_monthly_vecs = dic_mod_monthly_vecs.*Q_mod_monthly_vecs; +alkflux_mod_monthly_vecs = alk_mod_monthly_vecs.*Q_mod_monthly_vecs; +dinflux_mod_monthly_vecs = din_mod_monthly_vecs.*Q_mod_monthly_vecs; +no3flux_mod_monthly_vecs = no3_mod_monthly_vecs.*Q_mod_monthly_vecs; +nh4flux_mod_monthly_vecs = nh4_mod_monthly_vecs.*Q_mod_monthly_vecs; +dipflux_mod_monthly_vecs = dip_mod_monthly_vecs.*Q_mod_monthly_vecs; +donflux_mod_monthly_vecs = don_mod_monthly_vecs.*Q_mod_monthly_vecs; +dopflux_mod_monthly_vecs = dop_mod_monthly_vecs.*Q_mod_monthly_vecs; +pnflux_mod_monthly_vecs = pn_mod_monthly_vecs.*Q_mod_monthly_vecs; +ppflux_mod_monthly_vecs = pp_mod_monthly_vecs.*Q_mod_monthly_vecs; +siflux_mod_monthly_vecs = si_mod_monthly_vecs.*Q_mod_monthly_vecs; +totnflux_mod_monthly_vecs = totn_mod_monthly_vecs.*Q_mod_monthly_vecs; +totpflux_mod_monthly_vecs = totp_mod_monthly_vecs.*Q_mod_monthly_vecs; +o2flux_mod_monthly_vecs = o2_mod_monthly_vecs.*Q_mod_monthly_vecs; + +dicflux_mod_ann_vec = mean(dicflux_mod_monthly_vecs,1); +alkflux_mod_ann_vec = mean(alkflux_mod_monthly_vecs,1); +dinflux_mod_ann_vec = mean(dinflux_mod_monthly_vecs,1); +no3flux_mod_ann_vec = mean(no3flux_mod_monthly_vecs,1); +nh4flux_mod_ann_vec = mean(nh4flux_mod_monthly_vecs,1); +dipflux_mod_ann_vec = mean(dipflux_mod_monthly_vecs,1); +donflux_mod_ann_vec = mean(donflux_mod_monthly_vecs,1); +dopflux_mod_ann_vec = mean(dopflux_mod_monthly_vecs,1); +pnflux_mod_ann_vec = mean(pnflux_mod_monthly_vecs,1); +ppflux_mod_ann_vec = mean(ppflux_mod_monthly_vecs,1); +siflux_mod_ann_vec = mean(siflux_mod_monthly_vecs,1); +totnflux_mod_ann_vec = mean(totnflux_mod_monthly_vecs,1); +totpflux_mod_ann_vec = mean(totpflux_mod_monthly_vecs,1); +o2flux_mod_ann_vec = mean(o2flux_mod_monthly_vecs,1); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Produce plots to evaluate the mapping % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% scale marker size with the freshwater flux +ms_vec = zeros(size(Q_mod_vec)); +ms_vec(log10(Q_mod_vec) < 0) = 1; +ms_vec((log10(Q_mod_vec) > 0) & (log10(Q_mod_vec) < 1)) = 1; +ms_vec((log10(Q_mod_vec) > 1) & (log10(Q_mod_vec) < 2)) = 1; +ms_vec((log10(Q_mod_vec) > 2) & (log10(Q_mod_vec) < 3)) = 1; +ms_vec(log10(Q_mod_vec) > 3) = 100; + +% DIC, Alk concentrations and DIC:Alk +for m = 1:12 + + figure(1) + clf + + subplot(1,3,1); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dic_mod_monthly_vecs(m,:),ms_vec, ... + dic_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 2500]); + colorbar + titlestr = ['DIC, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(1,3,2); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,alk_mod_monthly_vecs(m,:),ms_vec, ... + alk_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 2500]); + colorbar + titlestr = ['Alk, meq m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(1,3,3) + dic_alk_ratio = dic_mod_monthly_vecs(m,:)./alk_mod_monthly_vecs(m,:); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dic_alk_ratio, ... + ms_vec,dic_alk_ratio,'filled'); + hold on + view(2); + caxis([0.8 1.2]); + colorbar + title('DIC:Alk ratio'); + + pause +end + +% Nitrogen Concentrations +for m = 1:12 + + figure(1) + clf + + subplot(2,2,1); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,din_mod_monthly_vecs(m,:),ms_vec, ... + din_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 100]); + colorbar + titlestr = ['DIN, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,2,2); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,no3_mod_monthly_vecs(m,:),ms_vec, ... + din_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 100]); + colorbar + titlestr = ['no3, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,2,3); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,nh4_mod_monthly_vecs(m,:),ms_vec, ... + nh4_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 20]); + colorbar + titlestr = ['nh4, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,2,4); + no3_din_ratio = no3_mod_monthly_vecs(m,:)./din_mod_monthly_vecs(m,:); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,no3_din_ratio, ... + ms_vec,no3_din_ratio,'filled'); + hold on + view(2); + caxis([0 1.0]); + colorbar + title('NO3:DIN ratio'); + + pause +end + +for m = 1:12 + + subplot(2,3,1); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,din_mod_monthly_vecs(m,:),ms_vec, ... + din_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 100]); + colorbar + titlestr = ['DIN, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,3,2); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,don_mod_monthly_vecs(m,:),ms_vec, ... + don_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 100]); + colorbar + titlestr = ['DON, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,3,3); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pn_mod_monthly_vecs(m,:),ms_vec, ... + pn_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 100]); + colorbar + titlestr = ['PN, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,3,5) + don_din_ratio = don_mod_monthly_vecs(m,:)./din_mod_monthly_vecs(m,:); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,don_din_ratio, ... + ms_vec,don_din_ratio,'filled'); + hold on + view(2); + caxis([0 2]); + colorbar + title('DON:DIN ratio'); + + subplot(2,3,6) + pn_din_ratio = pn_mod_monthly_vecs(m,:)./din_mod_monthly_vecs(m,:); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pn_din_ratio, ... + ms_vec,pn_din_ratio,'filled'); + hold on + view(2); + caxis([0 2]); + colorbar + title('PN:DIN ratio'); + + pause +end + +% Phosphorus Concentrations +for m = 1:12 + + figure(1) + clf + + subplot(2,3,1); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dip_mod_monthly_vecs(m,:),ms_vec, ... + dip_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 3]); + colorbar + titlestr = ['DIP, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,3,2); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dop_mod_monthly_vecs(m,:),ms_vec, ... + dop_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 3]); + colorbar + titlestr = ['DOP, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,3,3); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pp_mod_monthly_vecs(m,:),ms_vec, ... + pp_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 3]); + colorbar + titlestr = ['PP, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,3,5) + dop_dip_ratio = dop_mod_monthly_vecs(m,:)./dip_mod_monthly_vecs(m,:); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dop_dip_ratio, ... + ms_vec,dop_dip_ratio,'filled'); + hold on + view(2); + caxis([0 3]); + colorbar + title('DOP:DIP ratio'); + + subplot(2,3,6) + pp_dip_ratio = pp_mod_monthly_vecs(m,:)./dip_mod_monthly_vecs(m,:); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pp_dip_ratio, ... + ms_vec,pp_dip_ratio,'filled'); + hold on + view(2); + caxis([0 2]); + colorbar + title('PP:DIP ratio'); + + pause +end + +% silica and oxygen concentrations +for m = 1:12 + figure(1) + clf + + subplot(2,1,1); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,si_mod_monthly_vecs(m,:),ms_vec, ... + si_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 200]); + colorbar + titlestr = ['Si, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,1,2); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,o2_mod_monthly_vecs(m,:),ms_vec, ... + o2_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 350]); + colorbar + titlestr = ['o2, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + pause +end + +% Initialize 2D concentration arrays; these are the ones read into MOM6 to +% specify the nutrient concentrations of river inputs. +DIC_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +ALK_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +NO3_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +NH4_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +LDON_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +SLDON_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +SRDON_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +PO4_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +LDOP_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +SLDOP_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +SRDOP_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +NDET_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +PDET_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +SI_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +O2_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); + +% Map concentration vectors onto 2D arrays +temp = zeros(size(lon_mod)); +for m = 1:12 + temp(ind_ro) = dic_mod_monthly_vecs(m,:); + DIC_CONC(m,:,:) = temp; + temp(ind_ro) = alk_mod_monthly_vecs(m,:); + ALK_CONC(m,:,:) = temp; + + temp(ind_ro) = no3_mod_monthly_vecs(m,:); % contains all NEWS DIN + %temp(ind_ro) = din_mod_monthly_vecs(m,:); + NO3_CONC(m,:,:) = temp; + temp(ind_ro) = nh4_mod_monthly_vecs(m,:); + NH4_CONC(m,:,:) = temp; + temp(ind_ro) = don_mod_monthly_vecs(m,:); + LDON_CONC(m,:,:) = frac_ldon*temp; + SLDON_CONC(m,:,:) = frac_sldon*temp; + SRDON_CONC(m,:,:) = frac_srdon*temp; + temp(ind_ro) = pn_mod_monthly_vecs(m,:); + NDET_CONC(m,:,:) = temp; + + temp(ind_ro) = dip_mod_monthly_vecs(m,:); + PO4_CONC(m,:,:) = temp; + temp(ind_ro) = dop_mod_monthly_vecs(m,:); + LDOP_CONC(m,:,:) = frac_ldop*temp; + SLDOP_CONC(m,:,:) = frac_sldop*temp; + SRDOP_CONC(m,:,:) = frac_srdop*temp; + temp(ind_ro) = pp_mod_monthly_vecs(m,:); + PDET_CONC(m,:,:) = temp; + + temp(ind_ro) = si_mod_monthly_vecs(m,:); + SI_CONC(m,:,:) = temp; + temp(ind_ro) = o2_mod_monthly_vecs(m,:); + O2_CONC(m,:,:) = temp; +end + +% MOM6 is taking river values in moles m-3 for other constituents. Change +% for consistency across river constituents +DIC_CONC = DIC_CONC./1e3; +ALK_CONC = ALK_CONC./1e3; +NO3_CONC = NO3_CONC./1e3; +NH4_CONC = NH4_CONC./1e3; +LDON_CONC = LDON_CONC./1e3; +SLDON_CONC = SLDON_CONC./1e3; +SRDON_CONC = SRDON_CONC./1e3; +NDET_CONC = NDET_CONC./1e3; +PO4_CONC = PO4_CONC./1e3; +LDOP_CONC = LDON_CONC./1e3; +SLDOP_CONC = SLDON_CONC./1e3; +SRDOP_CONC = SRDON_CONC./1e3; +PDET_CONC = PDET_CONC./1e3; +SI_CONC = SI_CONC./1e3; +O2_CONC = O2_CONC./1e3; + +% Add iron concentrations - initialize with nitrate and then overwrite +FED_CONC = NO3_CONC; +FEDET_CONC = NO3_CONC; +% 40 nM dissolved iron concentration from De Baar and De Jong + 30nM +% Colloidal and nanoparticle flux as reported in Canfield and Raiswell +FED_CONC(FED_CONC > 0) = const_fed; +FEDET_CONC(FEDET_CONC > 0) = 0.0; + +ms = 8; + +% quick set of plots to ensure the mapping to the model grid was successful +for m = 1:12 + % DIC and alkalinity + figure(1) + clf + subplot(2,1,1); + title('log10(DIC CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(DIC_CONC(m,:)),ms,log10(DIC_CONC(m,:)),'filled'); + caxis([-1 1]); colorbar; + + subplot(2,1,2); + title('log10(ALK CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(ALK_CONC(m,:)),ms,log10(ALK_CONC(m,:)),'filled'); + caxis([-1 1]); colorbar; + + %pause +end + +% Nitrogen +for m = 1:12 + figure(1); + clf + subplot(3,2,1); + title('log10(NO3 CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(NO3_CONC(m,:)),ms,log10(NO3_CONC(m,:)),'filled'); + caxis([-4 -1]); colorbar; + + subplot(3,2,2); + title('log10(NH4 CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(NH4_CONC(m,:)),ms,log10(NH4_CONC(m,:)),'filled'); + caxis([-4 -1]); colorbar; + + subplot(3,2,3); + title('log10(LDON CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(LDON_CONC(m,:)),ms,log10(LDON_CONC(m,:)),'filled'); + caxis([-4 -1]); colorbar; + + subplot(3,2,4); + title('log10(SLDON CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(SLDON_CONC(m,:)),ms,log10(SLDON_CONC(m,:)),'filled'); + caxis([-4 -1]); colorbar; + + subplot(3,2,5); + title('log10(SRDON CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(SRDON_CONC(m,:)),ms,log10(SRDON_CONC(m,:)),'filled'); + caxis([-4 -1]); colorbar; + + subplot(3,2,6); + title('log10(NDET CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(NDET_CONC(m,:)),ms,log10(NDET_CONC(m,:)),'filled'); + caxis([-4 -1]); colorbar; + + %pause +end + +% Phosphorus +for m = 1:12 + figure(1); + clf + subplot(3,2,1); + title('log10(PO4 CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(PO4_CONC(m,:)),ms,log10(PO4_CONC(m,:)),'filled'); + caxis([-4 -2]); colorbar; + + subplot(3,2,2); + title('log10(LDOP CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(LDOP_CONC(m,:)),ms,log10(LDOP_CONC(m,:)),'filled'); + caxis([-4 -2]); colorbar; + + subplot(3,2,3); + title('log10(SLDOP CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(SLDOP_CONC(m,:)),ms,log10(SLDOP_CONC(m,:)),'filled'); + caxis([-4 -2]); colorbar; + + subplot(3,2,4); + title('log10(SRDOP CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(SRDOP_CONC(m,:)),ms,log10(SRDOP_CONC(m,:)),'filled'); + caxis([-4 -2]); colorbar; + + subplot(3,2,5); + title('log10(PDET CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(PDET_CONC(m,:)),ms,log10(PDET_CONC(m,:)),'filled'); + caxis([-4 -2]); colorbar; + + %pause; +end + +% Iron, Silica, Oxygen +for m = 1:12 + figure(1) + clf + subplot(3,2,1); + title('log10(FED CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(FED_CONC(m,:)),ms,log10(FED_CONC(m,:)),'filled'); + caxis([-5 -3]); colorbar; + + subplot(3,2,2); + title('log10(FEDET CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(FEDET_CONC(m,:)),ms,log10(FEDET_CONC(m,:)),'filled'); + caxis([-5 -3]); colorbar; + + subplot(3,2,3); + title('log10(SI CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(SI_CONC(m,:)),ms,log10(SI_CONC(m,:)),'filled'); + caxis([-3 0]); colorbar; + + subplot(3,2,4); + title('log10(O2 CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(O2_CONC(m,:)),ms,log10(O2_CONC(m,:)),'filled'); + caxis([-3 0]); colorbar; + + %pause; +end + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Save Files % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% option to save matlab file +% save River_DIC_ALK_RC4US_NWA ALK_CONC DIC_CONC + +% Construct netcdf file following format used by nutrient input files to +% MOM6 + +% Make reference dates for standard non-leap year +dates = [1990 1 16 12 0 0; 1990 2 15 0 0 0; 1990 3 16 12 0 0; ... + 1990 4 16 0 0 0; 1990 5 16 12 0 0; 1990 6 16 0 0 0; ... + 1990 7 16 12 0 0; 1990 8 16 12 0 0; 1990 9 16 0 0 0; ... + 1990 10 16 12 0 0; 1990 11 16 0 0 0; 1990 12 16 12 0 0]; +time = datenum(dates) - datenum([1990 1 1 0 0 0]); + +nlat = size(lat_mod,1); +nlon = size(lat_mod,2); + +ncid = netcdf.create(nc_file_name,'CLOBBER'); +dimid0 = netcdf.defDim(ncid,'time',netcdf.getConstant('NC_UNLIMITED')); +dimid1 = netcdf.defDim(ncid,'y',nlat); +dimid2 = netcdf.defDim(ncid,'x',nlon); + +varid0 = netcdf.defVar(ncid,'time','double',dimid0); +netcdf.putAtt(ncid,varid0,'calendar','NOLEAP'); +netcdf.putAtt(ncid,varid0,'calendar_type','NOLEAP'); +netcdf.putAtt(ncid,varid0,'modulo','T'); +netcdf.putAtt(ncid,varid0,'units','days since 1990-1-1 0:00:00'); +netcdf.putAtt(ncid,varid0,'time_origin','01-JAN-1990 00:00:00'); +varid1 = netcdf.defVar(ncid,'y','int',dimid1); +netcdf.putAtt(ncid,varid1,'cartesian_axis','Y'); +varid2 = netcdf.defVar(ncid,'x','int',dimid2); +netcdf.putAtt(ncid,varid2,'cartesian_axis','X'); +varid3 = netcdf.defVar(ncid,'lat','double',[dimid2 dimid1]); +netcdf.putAtt(ncid,varid3,'units','degrees north'); +varid4 = netcdf.defVar(ncid,'lon','double',[dimid2 dimid1]); +netcdf.putAtt(ncid,varid4,'units','degrees east'); +varid5 = netcdf.defVar(ncid,'DIC_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid5,'units','mol m-3'); +netcdf.putAtt(ncid,varid5,'long_name','DIC_CONC'); +varid6 = netcdf.defVar(ncid,'ALK_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid6,'units','mole Eq. m-3'); +netcdf.putAtt(ncid,varid6,'long_name','ALK_CONC'); +varid7 = netcdf.defVar(ncid,'NO3_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid7,'units','mol m-3'); +netcdf.putAtt(ncid,varid7,'long_name','NO3_CONC'); +varid8 = netcdf.defVar(ncid,'NH4_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid8,'units','mol m-3'); +netcdf.putAtt(ncid,varid8,'long_name','NH4_CONC'); +varid9 = netcdf.defVar(ncid,'LDON_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid9,'units','mol m-3'); +netcdf.putAtt(ncid,varid9,'long_name','0.3*DON_CONC'); +varid10 = netcdf.defVar(ncid,'SLDON_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid10,'units','mol m-3'); +netcdf.putAtt(ncid,varid10,'long_name','0.35*DON_CONC'); +varid11 = netcdf.defVar(ncid,'SRDON_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid11,'units','mol m-3'); +netcdf.putAtt(ncid,varid11,'long_name','0.35*DON_CONC'); +varid12 = netcdf.defVar(ncid,'NDET_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid12,'units','mol m-3'); +netcdf.putAtt(ncid,varid12,'long_name','1.0*PN_CONC'); +varid13 = netcdf.defVar(ncid,'PO4_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid13,'units','mol m-3'); +netcdf.putAtt(ncid,varid13,'long_name','PO4_CONC+0.3*PP_CONC'); +varid14 = netcdf.defVar(ncid,'LDOP_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid14,'units','mol m-3'); +netcdf.putAtt(ncid,varid14,'long_name','0.3*DOP_CONC'); +varid15 = netcdf.defVar(ncid,'SLDOP_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid15,'units','mol m-3'); +netcdf.putAtt(ncid,varid15,'long_name','0.35*DOP_CONC'); +varid16 = netcdf.defVar(ncid,'SRDOP_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid16,'units','mol m-3'); +netcdf.putAtt(ncid,varid16,'long_name','0.35*DOP_CONC'); +varid17 = netcdf.defVar(ncid,'PDET_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid17,'units','mol m-3'); +netcdf.putAtt(ncid,varid17,'long_name','0*PP_CONC'); +varid18 = netcdf.defVar(ncid,'FED_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid18,'units','mol m-3'); +netcdf.putAtt(ncid,varid18,'long_name','FED_CONC'); +varid19 = netcdf.defVar(ncid,'FEDET_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid19,'units','mol m-3'); +netcdf.putAtt(ncid,varid19,'long_name','FEDET_CONC'); +varid20 = netcdf.defVar(ncid,'O2_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid20,'units','mol m-3'); +netcdf.putAtt(ncid,varid20,'long_name','O2_CONC'); +netcdf.close(ncid) + +ncid = netcdf.open(nc_file_name,'NC_WRITE'); +netcdf.putVar(ncid,varid0,0,12,time); +% nutrient input files appear seem to need dummy axes to be read in +% properly, but eventually do a grid by grid mapping that doesn't require +% these. +netcdf.putVar(ncid,varid1,1:nlat); +netcdf.putVar(ncid,varid2,1:nlon); +netcdf.putVar(ncid,varid3,permute(lat_mod,[2,1])); +netcdf.putVar(ncid,varid4,permute(lon_mod,[2,1])); +netcdf.putVar(ncid,varid5,permute(DIC_CONC,[3,2,1])); +netcdf.putVar(ncid,varid6,permute(ALK_CONC,[3,2,1])); +netcdf.putVar(ncid,varid7,permute(NO3_CONC,[3,2,1])); +netcdf.putVar(ncid,varid8,permute(NH4_CONC,[3,2,1])); +netcdf.putVar(ncid,varid9,permute(LDON_CONC,[3,2,1])); +netcdf.putVar(ncid,varid10,permute(SLDON_CONC,[3,2,1])); +netcdf.putVar(ncid,varid11,permute(SRDON_CONC,[3,2,1])); +netcdf.putVar(ncid,varid12,permute(NDET_CONC,[3,2,1])); +netcdf.putVar(ncid,varid13,permute(PO4_CONC,[3,2,1])); +netcdf.putVar(ncid,varid14,permute(LDOP_CONC,[3,2,1])); +netcdf.putVar(ncid,varid15,permute(SLDOP_CONC,[3,2,1])); +netcdf.putVar(ncid,varid16,permute(SRDOP_CONC,[3,2,1])); +netcdf.putVar(ncid,varid17,permute(PDET_CONC,[3,2,1])); +netcdf.putVar(ncid,varid18,permute(FED_CONC,[3,2,1])); +netcdf.putVar(ncid,varid19,permute(FEDET_CONC,[3,2,1])); +netcdf.putVar(ncid,varid20,permute(O2_CONC,[3,2,1])); +netcdf.close(ncid) diff --git a/tools/rivers/bgc/NEP/Data/ArcticGro/ArcticGRO_Water_Quality_Data.xlsx b/tools/rivers/bgc/NEP/Data/ArcticGro/ArcticGRO_Water_Quality_Data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9a60d7aec670112f068f11f1aed93795ee7059ba GIT binary patch literal 210813 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

6obf3a3-etx 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%0A*oC96xR225$Gd@CSfsZWDD}N3im*B7 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 z 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 m$1CjVTIYKa1>pW_= lon_mod_min) & ... + (lat_news_all <= lat_mod_max) & (lat_news_all >= lat_mod_min) & ... + (isfinite(Qact_all)) & (Qact_all > Q_min) ); + +% If you are using a high threshold, grab one smaller river to constrain +% Carribean Islands +%if Q_min > 100 +% for n = 1:size(lon_news_all,1); +% test = strcmp('GHAASBasin1808',river_names_all{n}); +% if test == 1; +% cuba_ind = n; +% end +% end +% in_region = [in_region; cuba_ind]; +%end + +num_rivers = size(in_region,1); + +% Establish vectors of flow and nutrient loads for the NWA +Qact = Qact_all(in_region); +lon_news = lon_news_all(in_region); +lat_news = lat_news_all(in_region); +DIN_load = DIN_load_all(in_region); +DON_load = DON_load_all(in_region); +PN_load = PN_load_all(in_region); +DIP_load = DIP_load_all(in_region); +DOP_load = DOP_load_all(in_region); +PP_load = PP_load_all(in_region); +Si_load = Si_load_all(in_region); +river_names = river_names_all(in_region); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Following inspection of initial mapping, add any manual edits here to % +% prevent anomalous extrapolations, etc. % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Add in 2 "dummy" rivers to handle Cuba, giving it properties like + %Jamaica or Haiti rather than Florida. + + %GHAASBasin1808 is in Haiti. Fluxes are characterized by particularly + %high particulate phosphorus inputs. +%for n = 1:num_rivers; +% n +% test = strcmp('GHAASBasin1808',river_names{n}) +% if test == 1; +% cuba_ind = n; +% end + + % Move the Susquehanna a bit south so that it catches the Chesapeake + % and not the Delaware. +% if strcmp('Susquehanna',river_names{n}) +% lat_news(n) = 38.5; +% lon_news(n) = -76.67; +% end +%end + +% Two "rivers" with properties like Haiti used to specify Cuba +%Qact(num_rivers+1) = Qact(cuba_ind)/2; +%lon_news(num_rivers+1) = -81; +%lat_news(num_rivers+1) = 22.6; +%DIN_load(num_rivers+1) = DIN_load(cuba_ind)/2; +%DON_load(num_rivers+1) = DON_load(cuba_ind)/2; +%PN_load(num_rivers+1) = PN_load(cuba_ind)/2; +%DIP_load(num_rivers+1) = DIP_load(cuba_ind)/2; +%DOP_load(num_rivers+1) = DOP_load(cuba_ind)/2; +%PP_load(num_rivers+1) = PP_load(cuba_ind)/2; +%Si_load(num_rivers+1) = Si_load(cuba_ind)/2; +%river_names(num_rivers+1) = river_names(cuba_ind); + +%Qact(num_rivers+2) = Qact(cuba_ind)/2; +%lon_news(num_rivers+2) = -83.25; +%lat_news(num_rivers+2) = 22.6; +%DIN_load(num_rivers+2) = DIN_load(cuba_ind)/2; +%DON_load(num_rivers+2) = DON_load(cuba_ind)/2; +%PN_load(num_rivers+2) = PN_load(cuba_ind)/2; +%DIP_load(num_rivers+2) = DIP_load(cuba_ind)/2; +%DOP_load(num_rivers+2) = DOP_load(cuba_ind)/2; +%PP_load(num_rivers+2) = PP_load(cuba_ind)/2; +%Si_load(num_rivers+2) = Si_load(cuba_ind)/2; +%river_names(num_rivers+2) = river_names(cuba_ind); + +%num_rivers = num_rivers + 1; + +% Adjust location of cfilename = '/archive/cas/COBALT_EVAL/River_Data/GlobalNEWS2/GlobalNEWS2_RH2000Dataset-version1.0.xls' +basin = readtable(filename,'Sheet',2); +hydrology = readtable(filename,'Sheet',3); +load = readtable(filename,'Sheet',4); +% Cuba; This has little effect on patterns in Florida. +%for n = 1:num_rivers; +% n +% test = strcmp('GHAASBasin448',river_names{n}) +% if test == 1; +% fla_ind = n; +% end +%end + +%lon_news(fla_ind) = -80.5; +%lat_news(fla_ind) = 26.6; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% END MANUAL EDITS % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Assigning outflow points to rivers. % +% 1. Assignment starts with the rivers with the smallest flow and works % +% to the largest, w/larger river characteristics taking precedence to % +% ensure the most significant rivers are well represented. % +% 2. The algorithm keeps choosing the closest points to each river mouth % +% until the assigned flow is as close as possible to that observed % +% 3. Once the outflow points are assigned using the mean flow values, % +% monthly concentrations are assigned to those points. % +% 4. A simple "nearest neighbor" algorithm is used to fill in the gaps % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Sort rivers by discharge +[Qact_sort,sort_ind] = sort(Qact,'ascend'); +lon_news_sort = lon_news(sort_ind); +lat_news_sort = lat_news(sort_ind); +DIN_load_sort = DIN_load(sort_ind); +DON_load_sort = DON_load(sort_ind); +PN_load_sort = PN_load(sort_ind); +DIP_load_sort = DIP_load(sort_ind); +DOP_load_sort = DOP_load(sort_ind); +PP_load_sort = PP_load(sort_ind); +Si_load_sort = Si_load(sort_ind); +river_names_sort = river_names(sort_ind); + +% Total N and P load diagnostics +N_load_sort = DIN_load_sort + DON_load_sort + PN_load_sort; +P_load_sort = DIP_load_sort + DOP_load_sort + PP_load_sort; + +% Calculate concentrations +% Loads are in moles N sec-1, Q in m3 s-1; conc in moles N m-3 +DIN_conc_sort = DIN_load_sort./Qact_sort; +DON_conc_sort = DON_load_sort./Qact_sort; +DIP_conc_sort = DIP_load_sort./Qact_sort; +DOP_conc_sort = DOP_load_sort./Qact_sort; +PN_conc_sort = PN_load_sort./Qact_sort; +PP_conc_sort = PP_load_sort./Qact_sort; +Si_conc_sort = Si_load_sort./Qact_sort; + +% initialize vectors to hold nutrient concentrations at eac runoff +% point. +aa = find(Q_mod_ann > 0); +Q_mod_vec = Q_mod_ann(aa); +din_conc_vec = zeros(size(Q_mod_vec)); +don_conc_vec = zeros(size(Q_mod_vec)); +pn_conc_vec = zeros(size(Q_mod_vec)); +dip_conc_vec = zeros(size(Q_mod_vec)); +dop_conc_vec = zeros(size(Q_mod_vec)); +pp_conc_vec = zeros(size(Q_mod_vec)); +si_conc_vec = zeros(size(Q_mod_vec)); + +lon_mod_runoff_vec = double(lon_mod(aa)); +lat_mod_runoff_vec = double(lat_mod(aa)); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Loop identifies points assigned to each river % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +for k=1:num_rivers + k + dist = pdist2([lon_news_sort(k) lat_news_sort(k)], ... + [lon_mod_runoff_vec lat_mod_runoff_vec]); + [dist_sort, dist_sort_ind] = sort(dist,'ascend'); + + if dist_sort(1) < min_dist; % filters out rivers lying outside the domain + Q_sum1 = 0; + Q_sum2 = 0; + n = 0; + while ((Q_sum2 < Qact_sort(k)) & (dist_sort(n+1) < max_dist)) + Q_sum1 = Q_sum2; + n = n+1; + Q_sum2 = Q_sum1 + Q_mod_vec(dist_sort_ind(n)); + end + % I generally find that the search algorithm works best when you keep + % grabbing points until the total flow captured exceeds the flow in + % the river. If you uncomment the the first part of the "if" + % statement here will pick the last below if it is closer than the + % first above. However, I've found that this option sometimes fails + % to map important rivers. + %if abs(Q_sum1 - Qact_sort(k)) < abs(Q_sum2 - Qact_sort(k)) + % nrp = n-1; % number of runoff points + % [Q_sum1 Qact_sort(k)] % a quick check for comparable flow + % din_conc_vec(dist_sort_ind(1:nrp)) = DIN_conc_sort(k); + % don_conc_vec(dist_sort_ind(1:nrp)) = DON_conc_sort(k); + % dip_conc_vec(dist_sort_ind(1:nrp)) = DIP_conc_sort(k); + % dop_conc_vec(dist_sort_ind(1:nrp)) = DOP_conc_sort(k); + % pn_conc_vec(dist_sort_ind(1:nrp)) = PN_conc_sort(k); + % pp_conc_vec(dist_sort_ind(1:nrp)) = PP_conc_sort(k); + % si_conc_vec(dist_sort_ind(1:nrp)) = Si_conc_sort(k); + %else + nrp = n; % number of runoff points + [Q_sum2 Qact_sort(k)] % a quick check for comparable flow + din_conc_vec(dist_sort_ind(1:nrp)) = DIN_conc_sort(k); + don_conc_vec(dist_sort_ind(1:nrp)) = DON_conc_sort(k); + dip_conc_vec(dist_sort_ind(1:nrp)) = DIP_conc_sort(k); + dop_conc_vec(dist_sort_ind(1:nrp)) = DOP_conc_sort(k); + pn_conc_vec(dist_sort_ind(1:nrp)) = PN_conc_sort(k); + pp_conc_vec(dist_sort_ind(1:nrp)) = PP_conc_sort(k); + si_conc_vec(dist_sort_ind(1:nrp)) = Si_conc_sort(k); + %end + + if inspect_map == 'y' + figure(1) + clf + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,log10(Q_mod_vec),3,log10(Q_mod_vec)); + hold on + scatter3(lon_mod_runoff_vec(dist_sort_ind(1:nrp)),lat_mod_runoff_vec(dist_sort_ind(1:nrp)), ... + log10(Q_mod_vec(dist_sort_ind(1:nrp))),40, ... + log10(Q_mod_vec(dist_sort_ind(1:nrp))),'filled'); + view(2); + plot3(lon_news_sort(k),lat_news_sort(k),1e5,'k.','MarkerSize',20); + %contour(lon_mod,lat_mod,depth,[0 0],'k-'); + axis([lon_news_sort(k)-plot_width lon_news_sort(k)+plot_width ... + lat_news_sort(k)-plot_width lat_news_sort(k)+plot_width]); + caxis([-4 3]); + titl = ['river number: ',num2str(k),' name: ',river_names_sort{k}]; + title(titl); + colorbar; + + % provide a few diagnostics to ensure the calculation was done + % correctly (remove semicolon to inspect as they are mapped in + % the matlab output line. Feel free to add more here. + N_conc = DIN_conc_sort(k) + DON_conc_sort(k) + PN_conc_sort(k); + P_conc = DIP_conc_sort(k) + DOP_conc_sort(k) + PP_conc_sort(k); + Si_conc = Si_conc_sort(k); + river_names_sort(k) + [lon_news_sort(k) lat_news_sort(k)] + ind = dist_sort_ind(1:nrp); + 'lon lat' + [lon_news_sort(k) lat_news_sort(k)] + 'total flow in m3 sec' + [Qact_sort(k) sum(Q_mod_vec(ind))] + 'Nitrogen and phosphorus in Gg per year'; + [N_load_sort(k) sum(Q_mod_vec(ind))*N_conc]*14*86400*365/1e9; + [P_load_sort(k) sum(Q_mod_vec(ind))*P_conc]*31*86400*365/1e9; + 'N, P conc (mmoles m-3), DI, DO, P' + [DIN_conc_sort(k) DON_conc_sort(k) PN_conc_sort(k)]*1e3 + [DIP_conc_sort(k) DOP_conc_sort(k) PP_conc_sort(k)]*1e3 + 'Total N, Total P, Total N: Total P'; + [N_conc*1e3 P_conc*1e3 N_conc/P_conc] + 'DO:DI and P:DI ratios'; + [DON_conc_sort(k)/DIN_conc_sort(k) PN_conc_sort(k)/DIN_conc_sort(k)]; + [DOP_conc_sort(k)/DIP_conc_sort(k) PP_conc_sort(k)/DIP_conc_sort(k)]; + 'silica concentration (mmoles m-3)'; + [Si_conc_sort(k)]*1e3; + pause + end + + else + % This is for rivers that were captured by the coarse initial filter + % to determine if they were in the domain; but are actually outside + % the domain. Calibration suggested that a threshold of 0.75 degrees + % from the specified river mouth reliably identified these cases. + + if inspect_map == 'y' + figure(1) + clf + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,log10(Q_mod_vec),3,log10(Q_mod_vec)); + hold on + view(2); + plot3(lon_news_sort(k),lat_news_sort(k),1e5,'k.','MarkerSize',20); + axis([lon_news_sort(k)-15 lon_news_sort(k)+15 ... + lat_news_sort(k)-15 lat_news_sort(k)+15]); + caxis([-4 3]); + titl = ['OUTSIDE: river number: ',num2str(k),' name: ',river_names_sort{k}]; + title(titl); + colorbar; + pause + end + + end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% nearest neighbor search to fill in any 0 values left for each input field +% after the river mapping is done. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +aa = find(din_conc_vec == 0); +bb = find(din_conc_vec > 0); +F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb),din_conc_vec(bb), ... + 'nearest','nearest'); +din_conc_vec(aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + +aa = find(don_conc_vec == 0); +bb = find(don_conc_vec > 0); +F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb),don_conc_vec(bb), ... + 'nearest','nearest'); +don_conc_vec(aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + +aa = find(pn_conc_vec == 0); +bb = find(pn_conc_vec > 0); +F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb),pn_conc_vec(bb), ... + 'nearest','nearest'); +pn_conc_vec(aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + +aa = find(dip_conc_vec == 0); +bb = find(dip_conc_vec > 0); +F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb),dip_conc_vec(bb), ... + 'nearest','nearest'); +dip_conc_vec(aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + +aa = find(dop_conc_vec == 0); +bb = find(dop_conc_vec > 0); +F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb),dop_conc_vec(bb), ... + 'nearest','nearest'); +dop_conc_vec(aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + +aa = find(pp_conc_vec == 0); +bb = find(pp_conc_vec > 0); +F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb),pp_conc_vec(bb), ... + 'nearest','nearest'); +pp_conc_vec(aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + +aa = find(si_conc_vec == 0); +bb = find(si_conc_vec > 0); +F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb),si_conc_vec(bb), ... + 'nearest','nearest'); +si_conc_vec(aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + +totn_conc_vec = din_conc_vec + don_conc_vec + pn_conc_vec; +totp_conc_vec = dip_conc_vec + dop_conc_vec + pp_conc_vec; + +% calculate ratios of dissolved and particulate to inorganic +din_flux_vec = din_conc_vec.*Q_mod_vec; +dip_flux_vec = dip_conc_vec.*Q_mod_vec; +don_flux_vec = don_conc_vec.*Q_mod_vec; +dop_flux_vec = dop_conc_vec.*Q_mod_vec; +pn_flux_vec = pn_conc_vec.*Q_mod_vec; +pp_flux_vec = pp_conc_vec.*Q_mod_vec; + +don_ratio = sum(don_flux_vec)/sum(din_flux_vec) +dop_ratio = sum(dop_flux_vec)/sum(dip_flux_vec) +pn_ratio = sum(pn_flux_vec)/sum(din_flux_vec) +pp_ratio = sum(pp_flux_vec)/sum(dip_flux_vec) + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Produce plots to evaluate the mapping % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Use total fluxes to scale dots, m3 sec-1 * moles m-3 = moles sec-1 +totn_flux_vec = totn_conc_vec.*Q_mod_vec; +totp_flux_vec = totp_conc_vec.*Q_mod_vec; +totsi_flux_vec = si_conc_vec.*Q_mod_vec; + +% scale marker size with the total nitrogen flux +ms_vec = zeros(size(Q_mod_vec)); +ms_vec(log10(Q_mod_vec) < 0) = 1; +ms_vec((log10(Q_mod_vec) > 0) & (log10(Q_mod_vec) < 1)) = 1; +ms_vec((log10(Q_mod_vec) > 1) & (log10(Q_mod_vec) < 2)) = 1; +ms_vec((log10(Q_mod_vec) > 2) & (log10(Q_mod_vec) < 3)) = 1; +ms_vec(log10(Q_mod_vec) > 3) = 100; + +figure(1) +clf + +subplot(1,3,1); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,totn_conc_vec*1e3,ms_vec, ... + totn_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([30 150]); +colorbar +title('total nitrogen concentration, mmoles m-3'); + +subplot(1,3,2); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,totp_conc_vec*1e3,ms_vec, ... + totp_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([0 10]); +colorbar +title('total phosphorus concentration, mmoles m-3'); + +subplot(1,3,3) +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,totn_conc_vec./totp_conc_vec,ms_vec, ... + totn_conc_vec./totp_conc_vec,'filled'); +hold on +view(2); +caxis([10 100]); +colorbar +title('N:P ratio'); + +figure(2) +clf + +subplot(1,3,1); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,din_conc_vec*1e3,ms_vec, ... + din_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([0 100]); +colorbar +title('din concentration, mmoles m-3'); + +subplot(1,3,2); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,don_conc_vec*1e3,ms_vec, ... + don_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([0 100]); +colorbar +title('don concentration, mmoles m-3'); + +subplot(1,3,3) +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pn_conc_vec*1e3,ms_vec, ... + pn_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([0 100]); +colorbar +title('pn concentration, mmoles m-3'); + +figure(3) +clf + +subplot(1,3,1); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dip_conc_vec*1e3,ms_vec, ... + dip_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([0 5]); +colorbar +title('dip concentration, mmoles m-3'); + +subplot(1,3,2); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dop_conc_vec*1e3,ms_vec, ... + dop_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([0 3]); +colorbar +title('dop concentration, mmoles m-3'); + +subplot(1,3,3) +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pp_conc_vec*1e3,ms_vec, ... + pp_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([0 3]); +colorbar +title('pp concentration, mmoles m-3'); + +figure(10) +clf + +subplot(2,2,1); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,don_conc_vec./din_conc_vec,ms_vec, ... + don_conc_vec./din_conc_vec,'filled'); +hold on +view(2); +caxis([0 2]); +colorbar +title('don:din'); + +subplot(2,2,2); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pn_conc_vec./din_conc_vec,ms_vec, ... + pn_conc_vec./din_conc_vec,'filled'); +hold on +view(2); +caxis([0 2]); +colorbar +title('pn:din'); + +subplot(2,2,3) +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dop_conc_vec./dip_conc_vec,ms_vec, ... + dop_conc_vec./dip_conc_vec,'filled'); +hold on +view(2); +caxis([0 2]); +colorbar +title('dop:dip'); + +subplot(2,2,4) +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pp_conc_vec./dip_conc_vec,ms_vec, ... + pp_conc_vec./dip_conc_vec,'filled'); +hold on +view(2); +caxis([0 2]); +colorbar +title('pp:dip'); + +figure(5) +clf +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,si_conc_vec*1e3,ms_vec, ... + si_conc_vec*1e3,'filled'); +hold on +view(2); +caxis([30 300]); +colorbar +title('si concentration, mmoles m-3'); + +figure(6) +clf + +subplot(1,2,1); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,log10(totn_flux_vec),ms_vec, ... + log10(totn_flux_vec),'filled'); +hold on +view(2); +caxis([-1 2]); +colorbar +title('N flux, log10(moles sec-1)'); + +subplot(1,2,2); +scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,log10(totp_flux_vec),ms_vec, ... + log10(totp_flux_vec),'filled'); +hold on +view(2); +caxis([-3 1]); +colorbar +title('P flux, log10(moles sec-1)'); + +% output total fluxes in gigagrams of N +total_annual_n = sum(totn_flux_vec)*86400*365*14/1e12 +total_annual_p = sum(totp_flux_vec)*86400*365*31/1e12 +total_annual_si = sum(totsi_flux_vec)*86400*365*28.1/1e12 + +'press any key to continue' +pause + +% Initialize 2D concentration arrays; these are the ones read into MOM6 to +% specify the nutrient concentrations of river inputs. +din_conc = zeros(size(lon_mod)); +don_conc = zeros(size(lon_mod)); +dip_conc = zeros(size(lon_mod)); +dop_conc = zeros(size(lon_mod)); +pn_conc = zeros(size(lon_mod)); +pp_conc = zeros(size(lon_mod)); +si_conc = zeros(size(lon_mod)); + +% Map concentration vectors onto 2D arrays. +aa = find(Q_mod_ann > 0); +din_conc(aa) = din_conc_vec; +don_conc(aa) = don_conc_vec; +pn_conc(aa) = pn_conc_vec; +dip_conc(aa) = dip_conc_vec; +dop_conc(aa) = dop_conc_vec; +pp_conc(aa) = pp_conc_vec; +si_conc(aa) = si_conc_vec; + +NO3_CONC = din_conc; +LDON_CONC = frac_ldon*don_conc; +SLDON_CONC = frac_sldon*don_conc; +SRDON_CONC = frac_srdon*don_conc; +PO4_CONC = dip_conc; +LDOP_CONC = frac_ldop*dop_conc; +SLDOP_CONC = frac_sldop*dop_conc; +SRDOP_CONC = frac_srdop*dop_conc; +NDET_CONC = pn_conc; +PDET_CONC = pp_conc; % The bioavailability of particulate P has already + % been accounted for. + +SI_CONC = si_conc; + +% Add iron concentrations - initialize with nitrate and then overwrite +FED_CONC = NO3_CONC; +FEDET_CONC = NO3_CONC; +% 40 nM dissolved iron concentration from De Baar and De Jong + 30nM +% Colloidal and nanoparticle flux as reported in Canfield and Raiswell +FED_CONC(FED_CONC > 0) = const_fed; +FEDET_CONC(FEDET_CONC > 0) = 0.0; + +% series of quick figures to check the 2D nutrient input files. +ms = 8; +figure(7); +clf +subplot(3,2,1); +title('log10(NO3 CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(NO3_CONC(:)),ms,log10(NO3_CONC(:)),'filled'); +caxis([-4 -1]); colorbar; + +subplot(3,2,2); +title('log10(LDON CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(LDON_CONC(:)),ms,log10(LDON_CONC(:)),'filled'); +caxis([-4 -1]); colorbar; + +subplot(3,2,3); +title('log10(SLDON CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(SLDON_CONC(:)),ms,log10(SLDON_CONC(:)),'filled'); +caxis([-4 -1]); colorbar; + +subplot(3,2,4); +title('log10(SRDON CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(SRDON_CONC(:)),ms,log10(SRDON_CONC(:)),'filled'); +caxis([-4 -1]); colorbar; + +subplot(3,2,5); +title('log10(NDET CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(NDET_CONC(:)),ms,log10(NDET_CONC(:)),'filled'); +caxis([-4 -1]); colorbar; + +figure(8); +clf +subplot(3,2,1); +title('log10(PO4 CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(PO4_CONC(:)),ms,log10(PO4_CONC(:)),'filled'); +caxis([-4 -2]); colorbar; + +subplot(3,2,2); +title('log10(LDOP CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(LDOP_CONC(:)),ms,log10(LDOP_CONC(:)),'filled'); +caxis([-4 -2]); colorbar; + +subplot(3,2,3); +title('log10(SLDOP CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(SLDOP_CONC(:)),ms,log10(SLDOP_CONC(:)),'filled'); +caxis([-4 -2]); colorbar; + +subplot(3,2,4); +title('log10(SRDOP CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(SRDOP_CONC(:)),ms,log10(SRDOP_CONC(:)),'filled'); +caxis([-4 -2]); colorbar; + +subplot(3,2,5); +title('log10(PDET CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(PDET_CONC(:)),ms,log10(PDET_CONC(:)),'filled'); +caxis([-4 -2]); colorbar; + +figure(9) +clf +clf +subplot(3,2,1); +title('log10(FED CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(FED_CONC(:)),ms,log10(FED_CONC(:)),'filled'); +caxis([-5 -3]); colorbar; + +subplot(3,2,2); +title('log10(FEDET CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(FEDET_CONC(:)),ms,log10(FEDET_CONC(:)),'filled'); +caxis([-5 -3]); colorbar; + +subplot(3,2,3); +title('log10(SI CONC)'); hold on; +scatter3(lon_mod(:),lat_mod(:),log10(SI_CONC(:)),ms,log10(SI_CONC(:)),'filled'); +caxis([-3 -0]); colorbar; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Save Files % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% option to save matlab file +% save River_DIC_ALK_USGS_NWA ALK_CONC DIC_CONC + +% Construct netcdf file following format used by nutrient input files to +% MOM6 +time = 0; +nlat = size(lat_mod,1); +nlon = size(lat_mod,2); + +ncid = netcdf.create(nc_file_name,'CLOBBER'); +dimid0 = netcdf.defDim(ncid,'time',netcdf.getConstant('NC_UNLIMITED')); + +dimid1 = netcdf.defDim(ncid,'y',nlat); +dimid2 = netcdf.defDim(ncid,'x',nlon); + +%attributes inherited from the old river nutrient forcing file. The +%calendar needs to be specified even though the nutrient values are +%constant. Not sure how much of the rest is needed. +varid0 = netcdf.defVar(ncid,'time','double',dimid0); +netcdf.putAtt(ncid,varid0,'calendar','NOLEAP'); +netcdf.putAtt(ncid,varid0,'calendar_type','NOLEAP'); +netcdf.putAtt(ncid,varid0,'modulo','T'); +netcdf.putAtt(ncid,varid0,'units','days since 1900-1-1 0:00:00'); +netcdf.putAtt(ncid,varid0,'time_origin','01-JAN-1990 00:00:00'); + +varid1 = netcdf.defVar(ncid,'y','int',dimid1); +netcdf.putAtt(ncid,varid1,'cartesian_axis','Y'); +varid2 = netcdf.defVar(ncid,'x','int',dimid2); +netcdf.putAtt(ncid,varid2,'cartesian_axis','X'); +varid3 = netcdf.defVar(ncid,'lat','double',[dimid2 dimid1]); +netcdf.putAtt(ncid,varid3,'units','degrees north'); +varid4 = netcdf.defVar(ncid,'lon','double',[dimid2 dimid1]); +netcdf.putAtt(ncid,varid4,'units','degrees east'); +varid5 = netcdf.defVar(ncid,'NO3_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid5,'units','mol m-3'); +netcdf.putAtt(ncid,varid5,'long_name','DIN_CONC'); +varid6 = netcdf.defVar(ncid,'LDON_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid6,'units','mol m-3'); +netcdf.putAtt(ncid,varid6,'long_name','0.3*DON_CONC'); +varid7 = netcdf.defVar(ncid,'SLDON_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid7,'units','mol m-3'); +netcdf.putAtt(ncid,varid7,'long_name','0.35*DON_CONC'); +varid8 = netcdf.defVar(ncid,'SRDON_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid8,'units','mol m-3'); +netcdf.putAtt(ncid,varid8,'long_name','0.35*DON_CONC'); +varid9 = netcdf.defVar(ncid,'NDET_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid9,'units','mol m-3'); +netcdf.putAtt(ncid,varid9,'long_name','1.0*PN_CONC'); +varid10 = netcdf.defVar(ncid,'PO4_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid10,'units','mol m-3'); +netcdf.putAtt(ncid,varid10,'long_name','PO4_CONC'); +varid11 = netcdf.defVar(ncid,'LDOP_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid11,'units','mol m-3'); +netcdf.putAtt(ncid,varid11,'long_name','0.3*DOP_CONC'); +varid12 = netcdf.defVar(ncid,'SLDOP_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid12,'units','mol m-3'); +netcdf.putAtt(ncid,varid12,'long_name','0.35*DOP_CONC'); +varid13 = netcdf.defVar(ncid,'SRDOP_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid13,'units','mol m-3'); +netcdf.putAtt(ncid,varid13,'long_name','0.35*DOP_CONC'); +varid14 = netcdf.defVar(ncid,'PDET_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid14,'units','mol m-3'); +netcdf.putAtt(ncid,varid14,'long_name','0.3*PP_CONC'); +varid15 = netcdf.defVar(ncid,'FED_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid15,'units','mol m-3'); +netcdf.putAtt(ncid,varid15,'long_name','FED_CONC'); +varid16 = netcdf.defVar(ncid,'FEDET_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid16,'units','mol m-3'); +netcdf.putAtt(ncid,varid16,'long_name','FEDET_CONC'); +varid17 = netcdf.defVar(ncid,'SI_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid17,'units','mol m-3'); +netcdf.putAtt(ncid,varid17,'long_name','SI_CONC'); +netcdf.close(ncid) + +ncid = netcdf.open(nc_file_name,'NC_WRITE'); +netcdf.putVar(ncid,varid0,0,1,time); +% nutrient input files appear seem to need dummy axes to be read in +% properly, but eventually do a grid by grid mapping that doesn't require +% these. +netcdf.putVar(ncid,varid1,1:nlat); +netcdf.putVar(ncid,varid2,1:nlon); +netcdf.putVar(ncid,varid3,permute(lon_mod,[2,1])); +netcdf.putVar(ncid,varid4,permute(lat_mod,[2,1])); +netcdf.putVar(ncid,varid5,permute(NO3_CONC,[3,2,1])); +netcdf.putVar(ncid,varid6,permute(LDON_CONC,[3,2,1])); +netcdf.putVar(ncid,varid7,permute(SLDON_CONC,[3,2,1])); +netcdf.putVar(ncid,varid8,permute(SRDON_CONC,[3,2,1])); +netcdf.putVar(ncid,varid9,permute(NDET_CONC,[3,2,1])); +netcdf.putVar(ncid,varid10,permute(PO4_CONC,[3,2,1])); +netcdf.putVar(ncid,varid11,permute(LDOP_CONC,[3,2,1])); +netcdf.putVar(ncid,varid12,permute(SLDOP_CONC,[3,2,1])); +netcdf.putVar(ncid,varid13,permute(SRDOP_CONC,[3,2,1])); +netcdf.putVar(ncid,varid14,permute(PDET_CONC,[3,2,1])); +netcdf.putVar(ncid,varid15,permute(FED_CONC,[3,2,1])); +netcdf.putVar(ncid,varid16,permute(FEDET_CONC,[3,2,1])); +netcdf.putVar(ncid,varid17,permute(SI_CONC,[3,2,1])); +netcdf.close(ncid) diff --git a/tools/rivers/bgc/NEP/mapriv_combined_NEP10k.m b/tools/rivers/bgc/NEP/mapriv_combined_NEP10k.m new file mode 100644 index 000000000..9583ca265 --- /dev/null +++ b/tools/rivers/bgc/NEP/mapriv_combined_NEP10k.m @@ -0,0 +1,1342 @@ +% Routine to map USGS nutrient data onto the MOM6 Northwest Atlantic (NWA) +% grid. Run on matlab97 or above. + +clear all; +addpath /home/cas/matlab +nc64startup + +% name of netcdf file to be created +nc_file_name = 'RiverNutrients_Combined_Q100_NEP10k.nc'; + +% GLOBAL NEWS based map for filling in gaps +NEWS_file = 'RiverNutrients_GlobalNEWS2_plusFe_Q100_NEP10k.nc'; + +% load in monthly world ocean T, S climatology for saturated oxygen calculation +temp = ncread('Data/woa_sst_climo.nc','t_an'); +woa_temp = permute(temp,[3 2 1]); + +% Parameters for the assignment algorithm. +Q_min = 100; % minimum flow in m3 sec +plot_width = 15; % width of window (in degrees) for inspecting locations + % of rivers and outflow points that have been assigned to + % them. +min_dist = 1.5; % minimum distance (degrees) of the closest outflow point + % for the river to be considered in the domain (useful + % for preventing the algorithm from trying to map rivers + % flowing to different ocean basins. +max_dist = 2.0; % maximum distance (degrees) away that the algorithm + % looks for points for rivers that are in the domain +nutrient_option = 2; % option for deriving dissolved organic nutrients in RC4US +inspect_map = 'y'; % flag enabling you to pause and inspect each river + % mapping as it is being done. + +min_lon_ref = 0; % set to either 0 if model grid contains no negative + % values; set to -180 if model is on a -180-180 grid. + +% set the bio-availability of phosphorus and the fractionation of dissolved +% organic; PP is set to 30% based on Froelich; Partitioning of detritus +% between +frac_PP = 0.3; +frac_ldon = 0.3; +frac_sldon = 0.35; +frac_srdon = 0.35; +frac_ldop = 0.3; +frac_sldop = 0.35; +frac_srdop = 0.35; +% 40 nM dissolved iron concentration from De Baar and De Jong + 30nM +% Colloidal and nanoparticle flux as reported in Canfield and Raiswell +const_fed = 70.0e-6; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% USGS data compiled by Fabian Gomez % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +filename_chem = 'Data/RC4USCoast/mclim_19902022_chem.nc'; +alk_monthly_RC4US = ncread(filename_chem,'alk'); alk_monthly_RC4US = permute(alk_monthly_RC4US,[2 1]); +dic_monthly_RC4US = ncread(filename_chem,'dic'); dic_monthly_RC4US = permute(dic_monthly_RC4US,[2 1]); +no3_monthly_RC4US = ncread(filename_chem,'no3'); no3_monthly_RC4US = permute(no3_monthly_RC4US,[2 1]); +nh4_monthly_RC4US = ncread(filename_chem,'nh4'); nh4_monthly_RC4US = permute(nh4_monthly_RC4US,[2 1]); +din_monthly_RC4US = no3_monthly_RC4US + nh4_monthly_RC4US; +dip_monthly_RC4US = ncread(filename_chem,'po4'); dip_monthly_RC4US = permute(dip_monthly_RC4US,[2 1]); +si_monthly_RC4US = ncread(filename_chem,'sio2'); si_monthly_RC4US = permute(si_monthly_RC4US,[2 1]); +% The RC4US database seems to be in mmoles O m-3 rather than mmoles O2 m-3, +% divide by 2.0 for consistency with other O2 data sources +o2_monthly_RC4US = ncread(filename_chem,'do'); o2_monthly_RC4US = permute(o2_monthly_RC4US,[2 1])/2.0; +don_monthly_RC4US = ncread(filename_chem,'don'); don_monthly_RC4US = permute(don_monthly_RC4US,[2 1]); +temp_monthly_RC4US = ncread(filename_chem,'temp'); temp_monthly_RC4US = permute(temp_monthly_RC4US,[2 1]); +if nutrient_option == 1 + % This option will eventually set all river values for pn, dop and pp using GlobalNEWS + pn_monthly_RC4US = no3_monthly_RC4US*NaN; + dop_monthly_RC4US = no3_monthly_RC4US*NaN; + pp_monthly_RC4US = no3_monthly_RC4US*NaN; +elseif nutrient_option == 2 + % This option will use differences between total filtered and unfiltered + % and other properties to derive pn, dop and pp. This unfortunately + % generates negative values in some cases. + tnf_monthly_RC4US = ncread(filename_chem,'tnf'); tnf_monthly_RC4US = permute(tnf_monthly_RC4US,[2 1]); + don2_monthly_RC4US = tnf_monthly_RC4US - din_monthly_RC4US; + tnu_monthly_RC4US = ncread(filename_chem,'tnu'); tnu_monthly_RC4US = permute(tnu_monthly_RC4US,[2 1]); + pn_monthly_RC4US = tnu_monthly_RC4US - tnf_monthly_RC4US; + pn_monthly_RC4US(pn_monthly_RC4US < 0) = NaN; + tpf_monthly_RC4US = ncread(filename_chem,'tpf'); tpf_monthly_RC4US = permute(tpf_monthly_RC4US,[2 1]); + dop_monthly_RC4US = tpf_monthly_RC4US - dip_monthly_RC4US; + dop_monthly_RC4US(dop_monthly_RC4US < 0) = NaN; + tpu_monthly_RC4US = ncread(filename_chem,'tpu'); tpu_monthly_RC4US = permute(tpu_monthly_RC4US,[2 1]); + pp_monthly_RC4US = (tpu_monthly_RC4US - tpf_monthly_RC4US)*frac_PP; + pp_monthly_RC4US(pp_monthly_RC4US < 0) = NaN; +end +dfe_monthly_RC4US = no3_monthly_RC4US*NaN; +pfe_monthly_RC4US = no3_monthly_RC4US*NaN; + +filename_discharge = 'Data/RC4USCoast/mclim_19902022_disc.nc'; +Q_monthly_RC4US = ncread(filename_discharge,'disc'); Q_monthly_RC4US = permute(Q_monthly_RC4US,[2 1]); % m-3 sec-1 +station_names_RC4US = h5read(filename_discharge,'/river_name'); +lon_stations_RC4US = ncread(filename_discharge,'mouth_lon'); +lat_stations_RC4US = ncread(filename_discharge,'mouth_lat'); + +Q_ann_RC4US = mean(Q_monthly_RC4US,1,'native','omitnan')'; +dic_ann_RC4US = mean(dic_monthly_RC4US,1,'native','omitnan')'; +alk_ann_RC4US = mean(alk_monthly_RC4US,1,'native','omitnan')'; +no3_ann_RC4US = mean(no3_monthly_RC4US,1,'native','omitnan')'; +nh4_ann_RC4US = mean(nh4_monthly_RC4US,1,'native','omitnan')'; +o2_ann_RC4US = mean(o2_monthly_RC4US,1,'native','omitnan')'; +dip_ann_RC4US = mean(dip_monthly_RC4US,1,'native','omitnan')'; +si_ann_RC4US = mean(si_monthly_RC4US,1,'native','omitnan')'; +din_ann_RC4US = no3_ann_RC4US + nh4_ann_RC4US; +don_ann_RC4US = mean(don_monthly_RC4US,1,'native','omitnan')'; +if nutrient_option == 1 + don_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + pn_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + dop_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + pp_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; +elseif nutrient_option == 2 + don2_ann_RC4US = mean(don2_monthly_RC4US,1,'native','omitnan')'; + pn_ann_RC4US = mean(pn_monthly_RC4US,1,'native','omitnan')'; + dop_ann_RC4US = mean(dop_monthly_RC4US,1,'native','omitnan')'; + pp_ann_RC4US = mean(pp_monthly_RC4US,1,'native','omitnan')'; +end +dfe_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; +pfe_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + +for n = 1:size(lon_stations_RC4US,1) + + % Make any adjustments to the river locations here, e.g: + % + % Move the Susquehanna a bit south so that it catches the Chesapeake + % and not the Delaware. + %if strcmp('Susquehanna',station_names_RC4US{n}) + % lat_stations_RC4US(n) = 38.5; + % lon_stations_RC4US(n) = -77.5; + % %pause + %end + +end + +Q_ann_RC4US = mean(Q_monthly_RC4US,1,'native','omitnan')'; +dic_ann_RC4US = mean(dic_monthly_RC4US,1,'native','omitnan')'; +alk_ann_RC4US = mean(alk_monthly_RC4US,1,'native','omitnan')'; +no3_ann_RC4US = mean(no3_monthly_RC4US,1,'native','omitnan')'; +nh4_ann_RC4US = mean(nh4_monthly_RC4US,1,'native','omitnan')'; +o2_ann_RC4US = mean(o2_monthly_RC4US,1,'native','omitnan')'; +dip_ann_RC4US = mean(dip_monthly_RC4US,1,'native','omitnan')'; +si_ann_RC4US = mean(si_monthly_RC4US,1,'native','omitnan')'; +din_ann_RC4US = no3_ann_RC4US + nh4_ann_RC4US; +don_ann_RC4US = mean(don_monthly_RC4US,1,'native','omitnan')'; +if nutrient_option == 1 + don_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + pn_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + dop_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + pp_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; +elseif nutrient_option == 2 + don2_ann_RC4US = mean(don2_monthly_RC4US,1,'native','omitnan')'; + pn_ann_RC4US = mean(pn_monthly_RC4US,1,'native','omitnan')'; + dop_ann_RC4US = mean(dop_monthly_RC4US,1,'native','omitnan')'; + pp_ann_RC4US = mean(pp_monthly_RC4US,1,'native','omitnan')'; +end +dfe_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; +pfe_ann_RC4US = ones(size(lon_stations_RC4US))*NaN; + +% Created by Process_GLORICH_NEP.m, includes following variables: +%save NEP_GLORICH_data lon_stations_glorich lat_stations_glorich station_names_glorich ... +% Q_ann_glorich dic_ann_glorich alk_ann_glorich no3_ann_glorich nh4_ann_glorich ... +% din_ann_glorich pn_ann_glorich don_ann_glorich dip_ann_glorich dop_ann_glorich ... +% pp_ann_glorich si_ann_glorich o2_ann_glorich dfe_ann_glorich pfe_ann_glorich ... +% dic_monthly_glorich alk_monthly_glorich no3_monthly_glorich nh4_monthly_glorich ... +% din_monthly_glorich don_monthly_glorich pn_monthly_glorich dip_monthly_glorich ... +% dop_monthly_glorich pp_monthly_glorich dfe_monthly_glorich pfe_monthly_glorich ... +% si_monthly_glorich o2_monthly_glorich +load Data/GLORICH/NEP_GLORICH_data.mat; + +% Created by Process_ARCTICGRO.m, includes following variables: +%save arcticgro_data lon_stations_arcticgro lat_stations_arcticgro station_names_arcticgro ... +% Q_ann_arcticgro dic_ann_arcticgro alk_ann_arcticgro no3_ann_arcticgro nh4_ann_arcticgro ... +% din_ann_arcticgro pn_ann_arcticgro don_ann_arcticgro dip_ann_arcticgro dop_ann_arcticgro ... +% pp_ann_arcticgro si_ann_arcticgro o2_ann_arcticgro dfe_ann_arcticgro pfe_ann_arcticgro ... +% dic_monthly_arcticgro alk_monthly_arcticgro no3_monthly_arcticgro nh4_monthly_arcticgro ... +% din_monthly_arcticgro don_monthly_arcticgro pn_monthly_arcticgro dip_monthly_arcticgro ... +% dop_monthly_arcticgro pp_monthly_arcticgro dfe_monthly_arcticgro pfe_monthly_arcticgro ... +% si_monthly_arcticgro o2_monthly_arcticgro +load Data/ArcticGro/arcticgro_data.mat; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Combine all annual and monthly station data % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +station_names_all = [station_names_RC4US; string(station_names_glorich)'; string(station_names_arcticgro)']; +lon_stations_all = [lon_stations_RC4US; lon_stations_glorich'; lon_stations_arcticgro']; +if min_lon_ref == 0 + lon_stations_all(lon_stations_all < 0) = lon_stations_all(lon_stations_all < 0) + 360; +elseif min_lon_ref == -180 + lon_stations_all(lon_stations_all > 180) = lon_stations_all(lon_stations_all < 180) - 360; +end +lat_stations_all = [lat_stations_RC4US; lat_stations_glorich'; lat_stations_arcticgro']; +Q_ann_all = [Q_ann_RC4US; Q_ann_glorich'; Q_ann_arcticgro']; + +dic_ann_all = [dic_ann_RC4US; dic_ann_glorich'; dic_ann_arcticgro']; +alk_ann_all = [alk_ann_RC4US; alk_ann_glorich'; alk_ann_arcticgro']; +no3_ann_all = [no3_ann_RC4US; no3_ann_glorich'; no3_ann_arcticgro']; +nh4_ann_all = [nh4_ann_RC4US; nh4_ann_glorich'; nh4_ann_arcticgro']; +din_ann_all = [din_ann_RC4US; din_ann_glorich'; din_ann_arcticgro']; +don_ann_all = [don_ann_RC4US; don_ann_glorich'; don_ann_arcticgro']; +pn_ann_all = [pn_ann_RC4US; pn_ann_glorich'; pn_ann_arcticgro']; +dip_ann_all = [dip_ann_RC4US; dip_ann_glorich'; dip_ann_arcticgro']; +dop_ann_all = [dop_ann_RC4US; dop_ann_glorich'; dop_ann_arcticgro']; +pp_ann_all = [pp_ann_RC4US; pp_ann_glorich'; pp_ann_arcticgro']; +dfe_ann_all = [dfe_ann_RC4US; dfe_ann_glorich'; dfe_ann_arcticgro']; +pfe_ann_all = [pfe_ann_RC4US; pfe_ann_glorich'; pfe_ann_arcticgro']; +si_ann_all = [si_ann_RC4US; si_ann_glorich'; si_ann_arcticgro']; +o2_ann_all = [o2_ann_RC4US; o2_ann_glorich'; o2_ann_arcticgro']; + +dic_monthly_all = [dic_monthly_RC4US dic_monthly_glorich dic_monthly_arcticgro]; +alk_monthly_all = [alk_monthly_RC4US alk_monthly_glorich alk_monthly_arcticgro]; +no3_monthly_all = [no3_monthly_RC4US no3_monthly_glorich no3_monthly_arcticgro]; +nh4_monthly_all = [nh4_monthly_RC4US nh4_monthly_glorich nh4_monthly_arcticgro]; +din_monthly_all = [din_monthly_RC4US din_monthly_glorich din_monthly_arcticgro]; +don_monthly_all = [don_monthly_RC4US don_monthly_glorich don_monthly_arcticgro]; +pn_monthly_all = [pn_monthly_RC4US pn_monthly_glorich pn_monthly_arcticgro]; +dip_monthly_all = [dip_monthly_RC4US dip_monthly_glorich dip_monthly_arcticgro]; +dop_monthly_all = [dop_monthly_RC4US dop_monthly_glorich dop_monthly_arcticgro]; +pp_monthly_all = [pp_monthly_RC4US pp_monthly_glorich pp_monthly_arcticgro]; +dfe_monthly_all = [dfe_monthly_RC4US dfe_monthly_glorich dfe_monthly_arcticgro]; +pfe_monthly_all = [pfe_monthly_RC4US pfe_monthly_glorich pfe_monthly_arcticgro]; +si_monthly_all = [si_monthly_RC4US si_monthly_glorich si_monthly_arcticgro]; +o2_monthly_all = [o2_monthly_RC4US o2_monthly_glorich o2_monthly_arcticgro]; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Load in monthly climatology of river forcing from the regional grid. % +% File contains: % +% runoff: monthly average runoff in kg m-2 sec-1 % +% area: area of grid cell in m-2 % +% lon: longitude (0-360 degrees) % +% lat: latitude % % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +load glofas_hill_runoff_monthlyclim_NEP10k_05122023.mat; + +lon_mod = lon; +lat_mod = lat; +area_mod = area; +% convert runoff from kg m-2 sec-1 to m3 sec-1 +Q_mod_monthly = zeros(size(runoff)); +for m = 1:12 + Q_mod_monthly(m,:,:) = squeeze(runoff(m,:,:)).*area_mod./1000; +end +Q_mod_ann = squeeze(mean(Q_mod_monthly,1)); +clear lon lat runoff area; + +%grid_file = '/archive/cas/Regional_MOM6/NWA12/nwa12_ocean_static.nc'; +%temp = ncread(grid_file,'deptho'); +%depth = permute(temp,[2,1]); clear temp; +%depth(isnan(depth)) = -1; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Filter for rivers in the region, set thresholds for minimum river size, % +% set parameters for plotting routines. % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% use grid to filter rivers outside domain +lat_mod_max = max(lat_mod(:)); +lat_mod_min = min(lat_mod(:)); +lon_mod_max = max(lon_mod(:)); +lon_mod_min = min(lon_mod(:)); + +in_region = find( (lon_stations_all <= lon_mod_max) & (lon_stations_all >= lon_mod_min) & ... + (lat_stations_all <= lat_mod_max) & (lat_stations_all >= lat_mod_min) & ... + (isfinite(Q_ann_all)) & (Q_ann_all > Q_min) ); +num_rivers = size(in_region,1); + +station_names_reg = station_names_all(in_region); +lon_stations_reg = lon_stations_all(in_region); +lat_stations_reg = lat_stations_all(in_region); +Q_ann_reg = Q_ann_all(in_region); +dic_ann_reg = dic_ann_all(in_region); +alk_ann_reg = alk_ann_all(in_region); +no3_ann_reg = no3_ann_all(in_region); +nh4_ann_reg = nh4_ann_all(in_region); +din_ann_reg = din_ann_all(in_region); +don_ann_reg = don_ann_all(in_region); +pn_ann_reg = pn_ann_all(in_region); +dip_ann_reg = dip_ann_all(in_region); +dop_ann_reg = dop_ann_all(in_region); +pp_ann_reg = pp_ann_all(in_region); +dfe_ann_reg = dfe_ann_all(in_region); +pfe_ann_reg = pfe_ann_all(in_region); +si_ann_reg = si_ann_all(in_region); +o2_ann_reg = o2_ann_all(in_region); + +for m = 1:12 + dic_monthly_reg(m,:) = dic_monthly_all(m,in_region); + alk_monthly_reg(m,:) = alk_monthly_all(m,in_region); + no3_monthly_reg(m,:) = no3_monthly_all(m,in_region); + nh4_monthly_reg(m,:) = nh4_monthly_all(m,in_region); + din_monthly_reg(m,:) = din_monthly_all(m,in_region); + don_monthly_reg(m,:) = don_monthly_all(m,in_region); + pn_monthly_reg(m,:) = pn_monthly_all(m,in_region); + dip_monthly_reg(m,:) = dip_monthly_all(m,in_region); + dop_monthly_reg(m,:) = dop_monthly_all(m,in_region); + pp_monthly_reg(m,:) = pp_monthly_all(m,in_region); + dfe_monthly_reg(m,:) = dfe_monthly_all(m,in_region); + pfe_monthly_reg(m,:) = pfe_monthly_all(m,in_region); + si_monthly_reg(m,:) = si_monthly_all(m,in_region); + o2_monthly_reg(m,:) = o2_monthly_all(m,in_region); +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Assigning outflow points to rivers. % +% 1. Assignment starts with the rivers with the smallest flow and works % +% to the largest, w/larger river characteristics taking precedence to % +% ensure the most significant rivers are well represented. % +% 2. The algorithm keeps choosing the closest points to each river mouth % +% until the assigned flow is as close as possible to that observed % +% 3. Once the outflow points are assigned using the mean flow values, % +% monthly concentrations are assigned to those points. % +% 4. A simple "nearest neighbor" algorithm is used to fill in the gaps % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Sort rivers by discharge +[Q_ann_sort,sort_ind] = sort(Q_ann_reg,'ascend'); + +station_names_sort = station_names_reg(sort_ind); +lon_stations_sort = lon_stations_reg(sort_ind); +lat_stations_sort = lat_stations_reg(sort_ind); +Q_ann_sort = Q_ann_reg(sort_ind); +dic_ann_sort = dic_ann_reg(sort_ind); +alk_ann_sort = alk_ann_reg(sort_ind); +no3_ann_sort = no3_ann_reg(sort_ind); +nh4_ann_sort = nh4_ann_reg(sort_ind); +din_ann_sort = din_ann_reg(sort_ind); +don_ann_sort = don_ann_reg(sort_ind); +pn_ann_sort = pn_ann_reg(sort_ind); +dip_ann_sort = dip_ann_reg(sort_ind); +dop_ann_sort = dop_ann_reg(sort_ind); +pp_ann_sort = pp_ann_reg(sort_ind); +dfe_ann_sort = dfe_ann_reg(sort_ind); +pfe_ann_sort = pfe_ann_reg(sort_ind); +si_ann_sort = si_ann_reg(sort_ind); +o2_ann_sort = o2_ann_reg(sort_ind); + +for m = 1:12 + dic_monthly_sort(m,:) = dic_monthly_reg(m,sort_ind); + alk_monthly_sort(m,:) = alk_monthly_reg(m,sort_ind); + no3_monthly_sort(m,:) = no3_monthly_reg(m,sort_ind); + nh4_monthly_sort(m,:) = nh4_monthly_reg(m,sort_ind); + din_monthly_sort(m,:) = din_monthly_reg(m,sort_ind); + don_monthly_sort(m,:) = don_monthly_reg(m,sort_ind); + pn_monthly_sort(m,:) = pn_monthly_reg(m,sort_ind); + dip_monthly_sort(m,:) = dip_monthly_reg(m,sort_ind); + dop_monthly_sort(m,:) = dop_monthly_reg(m,sort_ind); + pp_monthly_sort(m,:) = pp_monthly_reg(m,sort_ind); + dfe_monthly_sort(m,:) = dfe_monthly_reg(m,sort_ind); + pfe_monthly_sort(m,:) = pfe_monthly_reg(m,sort_ind); + si_monthly_sort(m,:) = si_monthly_reg(m,sort_ind); + o2_monthly_sort(m,:) = o2_monthly_reg(m,sort_ind); +end + +% Create vectors of values at the runoff points from the model grid. These +% are used to accelerate the mapping relative to wrangling the full grid +% with all the zeros included. "ind_ro" are the grid indexes with runoff +ind_ro = find(Q_mod_ann > 0); +Q_mod_vec = Q_mod_ann(ind_ro); +lon_mod_runoff_vec = lon_mod(ind_ro); +lat_mod_runoff_vec = lat_mod(ind_ro); +Q_mod_monthly_vecs = zeros(12,size(lon_mod_runoff_vec,1)); +for m = 1:12 + temp = squeeze(Q_mod_monthly(m,:,:)); + Q_mod_monthly_vecs(m,:) = temp(ind_ro); +end + +% Create a grid of saturated oxygen values using the world ocean atlas data +temp_woa_monthly_vecs = zeros(12,size(lon_mod_runoff_vec,1)); +o2sat_woa_monthly_vecs = zeros(12,size(lon_mod_runoff_vec,1)); + +% Constants for o2 saturation calculation (taken from COBALT) +a_0 = 2.00907; +a_1 = 3.22014; +a_2 = 4.05010; +a_3 = 4.94457; +a_4 = -2.56847e-1; +a_5 = 3.88767; +sal = 0; +b_0 = -6.24523e-3; +b_1 = -7.37614e-3; +b_2 = -1.03410e-2; +b_3 = -8.17083e-3; +c_0 = -4.88682e-7; + +for m = 1:12 + temp = squeeze(woa_temp(m,:,:)); + % limit for validity of o2sat calculation + temp(temp > 40) = 40; temp(temp < 0) = 0; + temp_woa_monthly_vecs(m,:) = temp(ind_ro); + % calculate the oxygen saturation at a given temperature and salinity = 0 + % code taken from COBALT with limits applied above + tt = 298.15 - temp_woa_monthly_vecs(m,:); + tkb = 273.15 + temp_woa_monthly_vecs(m,:); + ts = log(tt / tkb); + ts2 = ts * ts; + ts3 = ts2 * ts; + ts4 = ts3 * ts; + ts5 = ts4 * ts; + + o2sat_woa_monthly_vecs(m,:) = (1000.0/22391.6) * 1000 * ... %convert from ml/l to mmol m-3 + exp(a_0 + a_1*ts + a_2*ts2 + a_3*ts3 + a_4*ts4 + a_5*ts5 + ... + (b_0 + b_1*ts + b_2*ts2 + b_3*ts3 + c_0*sal)*sal); +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Load in fields generated from global NEWS. Where necessary, the ratio % +% of constituents relative to DIN will be used to fill forcing gaps % +% The m-file used to generate the NEWS forcing file is included in this % +% directory and uses an analogous mapping algorithm to this one % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +din_ann_NEWS = nc_varget(NEWS_file,'NO3_CONC'); +aa = find(din_ann_NEWS > 0); +temp1 = nc_varget(NEWS_file,'LDON_CONC'); +temp2 = nc_varget(NEWS_file,'SLDON_CONC'); +temp3 = nc_varget(NEWS_file,'SRDON_CONC'); +don_ann_NEWS = temp1 + temp2 + temp3; +don_ratio_NEWS_vec = don_ann_NEWS(aa)./din_ann_NEWS(aa); +clear temp1 temp2 temp3; +pn_ann_NEWS = nc_varget(NEWS_file,'NDET_CONC'); +pn_ratio_NEWS_vec = pn_ann_NEWS(aa)./din_ann_NEWS(aa); + +dip_ann_NEWS = nc_varget(NEWS_file,'PO4_CONC'); +dip_ratio_NEWS_vec = dip_ann_NEWS(aa)./din_ann_NEWS(aa); +temp1 = nc_varget(NEWS_file,'LDOP_CONC'); +temp2 = nc_varget(NEWS_file,'SLDOP_CONC'); +temp3 = nc_varget(NEWS_file,'SRDOP_CONC'); +dop_ann_NEWS = temp1 + temp2 + temp3; +dop_ratio_NEWS_vec = dop_ann_NEWS(aa)./din_ann_NEWS(aa); +clear temp1 temp2 temp3; +pp_ann_NEWS = nc_varget(NEWS_file,'PDET_CONC'); +pp_ratio_NEWS_vec = pp_ann_NEWS(aa)./din_ann_NEWS(aa); +si_ann_NEWS = nc_varget(NEWS_file,'SI_CONC'); +si_ratio_NEWS_vec = si_ann_NEWS(aa)./din_ann_NEWS(aa); + +% Vectors to hold monthly values mapped onto model runoff points +dic_mod_monthly_vecs = zeros(12,size(lon_mod_runoff_vec,1)); +alk_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +no3_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +nh4_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +din_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +don_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +pn_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +dip_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +dop_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +pp_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +dfe_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +pfe_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +si_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); +o2_mod_monthly_vecs = zeros(12,size(lat_mod_runoff_vec,1)); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Loop identifies points assigned to each river % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +for k=1:num_rivers + dist = pdist2([lon_stations_sort(k) lat_stations_sort(k)], ... + [lon_mod_runoff_vec lat_mod_runoff_vec]); + [dist_sort, dist_sort_ind] = sort(dist,'ascend'); + + if dist_sort(1) < min_dist + Q_sum1 = 0; + Q_sum2 = 0; + n = 0; + while (Q_sum2 < Q_ann_sort(k) && (dist_sort(n+1) < max_dist)) + Q_sum1 = Q_sum2; + n = n+1; + Q_sum2 = Q_sum1 + Q_mod_vec(dist_sort_ind(n)); + end + %if abs(Q_sum1 - Q_ann_sort(k)) < abs(Q_sum2 - Q_ann_sort(k)) + % nrp = n-1; % number of runoff points + % [Q_sum1 Q_ann_sort(k)] % a quick check for comparable flow + %else + nrp = n; + [Q_sum2 Q_ann_sort(k)] + %end + + % enter monthly concentration values into an array of monthly values + % if no monthly value is available, use annuals. + for m = 1:12 + + if isnan(dic_monthly_sort(m,k)) + if isfinite(dic_ann_sort(k)) + dic_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = dic_ann_sort(k); + else + dic_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = 0; + end + else + dic_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = dic_monthly_sort(m,k); + end + + if isnan(alk_monthly_sort(m,k)) + if isfinite(dic_ann_sort(k)) + alk_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = alk_ann_sort(k); + else + alk_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = 0; + end + else + alk_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = alk_monthly_sort(m,k); + end + + % mapping assumes that DIN is defined for nutrient calculations since + % ratios relative to DIN are used to fill in other components. If + % DIN is not defined, values are left at 0 and eventually filled with + % a nearest neighbor filling (next section) + + if (isfinite(din_monthly_sort(m,k)) || isfinite(din_ann_sort(k)) ) + if isfinite(din_monthly_sort(m,k)) + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = din_monthly_sort(m,k); + elseif isfinite(din_ann_sort(k)) + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = din_ann_sort(k); + end + + if isfinite(no3_monthly_sort(m,k)) + no3_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = no3_monthly_sort(m,k); + elseif isfinite(no3_ann_sort(k)) + no3_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = no3_ann_sort(k); + end + + if isfinite(nh4_monthly_sort(m,k)) + nh4_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = nh4_monthly_sort(m,k); + elseif isfinite(nh4_ann_sort(k)) + nh4_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = nh4_ann_sort(k); + end + + if (isnan(don_monthly_sort(m,k)) && isnan(don_ann_sort(k))) + don_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = ... + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)).* ... + don_ratio_NEWS_vec(dist_sort_ind(1:nrp))'; + elseif (isnan(don_monthly_sort(m,k)) && ~isnan(don_ann_sort(k))) + don_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = don_ann_sort(k); + else + don_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = don_monthly_sort(m,k); + end + + if (isnan(pn_monthly_sort(m,k)) && isnan(pn_ann_sort(k))) + pn_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = ... + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)).* ... + pn_ratio_NEWS_vec(dist_sort_ind(1:nrp))'; + elseif (isnan(pn_monthly_sort(m,k)) && ~isnan(pn_ann_sort(k))) + pn_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = pn_ann_sort(k); + else + pn_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = pn_monthly_sort(m,k); + end + + if (isnan(dip_monthly_sort(m,k)) && isnan(dip_ann_sort(k))) + dip_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = ... + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)).* ... + dip_ratio_NEWS_vec(dist_sort_ind(1:nrp))'; + elseif (isnan(dip_monthly_sort(m,k)) && ~isnan(dip_ann_sort(k))) + dip_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = dip_ann_sort(k); + else + dip_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = dip_monthly_sort(m,k); + end + + if (isnan(dop_monthly_sort(m,k)) && isnan(dop_ann_sort(k))) + dop_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = ... + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)).* ... + dop_ratio_NEWS_vec(dist_sort_ind(1:nrp))'; + elseif (isnan(dop_monthly_sort(m,k)) && ~isnan(dop_ann_sort(k))) + dop_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = dop_ann_sort(k); + else + dop_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = dop_monthly_sort(m,k); + end + + if (isnan(pp_monthly_sort(m,k)) && isnan(pp_ann_sort(k))) + pp_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = ... + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)).* ... + pp_ratio_NEWS_vec(dist_sort_ind(1:nrp))'; + elseif (isnan(pp_monthly_sort(m,k)) && ~isnan(pp_ann_sort(k))) + pp_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = pp_ann_sort(k); + else + pp_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = pp_monthly_sort(m,k); + end + + if (isnan(si_monthly_sort(m,k)) && isnan(si_ann_sort(k))) + si_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = ... + din_mod_monthly_vecs(m,dist_sort_ind(1:nrp)).* ... + si_ratio_NEWS_vec(dist_sort_ind(1:nrp))'; + elseif (isnan(si_monthly_sort(m,k)) && ~isnan(si_ann_sort(k))) + si_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = si_ann_sort(k); + else + si_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = si_monthly_sort(m,k); + end + + if isnan(o2_monthly_sort(m,k)) + o2_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = ... + o2sat_woa_monthly_vecs(m,dist_sort_ind(1:nrp)); + else + o2_mod_monthly_vecs(m,dist_sort_ind(1:nrp)) = o2_monthly_sort(m,k); + end + + end + end + + % plot to check location if inspect_map == 'y'. The plot puts + % open circles at each runoff location in the model grid and fills + % those that are assigned to each river. Note that some of the smaller + % rivers may be replaced with larger ones as the fitting process + % continues. + + if inspect_map == 'y' + figure(1) + clf + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,log10(Q_mod_vec),3,log10(Q_mod_vec)); + hold on + scatter3(lon_mod_runoff_vec(dist_sort_ind(1:nrp)),lat_mod_runoff_vec(dist_sort_ind(1:nrp)), ... + log10(Q_mod_vec(dist_sort_ind(1:nrp))),25, ... + log10(Q_mod_vec(dist_sort_ind(1:nrp))),'filled'); + view(2); + plot3(lon_stations_sort(k),lat_stations_sort(k),1e5,'k.','MarkerSize',20); + %contour(lon_mod,lat_mod,depth,[0 0],'k-'); + axis([lon_stations_sort(k)-plot_width/2 lon_stations_sort(k)+plot_width/2 ... + lat_stations_sort(k)-plot_width/2 lat_stations_sort(k)+plot_width/2]); + caxis([-4 3]); + titl = ['river number: ',num2str(k),' name: ',station_names_sort{k}]; + title(titl); + colorbar; + + % check the values of each mapping + N_check = mean(din_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all') + ... + mean(don_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all') + ... + mean(pn_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + P_check = mean(dip_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all') + ... + mean(dop_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all') + ... + mean(pp_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + SI_check = mean(si_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + DIN_check = mean(din_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + DON_check = mean(don_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + PN_check = mean(pn_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + DIP_check = mean(dip_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + DOP_check = mean(dop_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + PP_check = mean(pp_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + SI_check = mean(si_mod_monthly_vecs(:,dist_sort_ind(1:nrp)),'all'); + + station_names_sort(k) + ind = dist_sort_ind(1:nrp); + 'total flow in m3 sec' + [Q_ann_sort(k) sum(Q_mod_vec(dist_sort_ind(1:nrp)))] + 'N, P conc (mmoles m-3), DI, DO, P' + [DIN_check DON_check PN_check] + [DIP_check DOP_check PP_check] + 'Total N, Total P, Total N: Total P' + [N_check P_check N_check/P_check] + 'DO:DI and P:DI ratios'; + [DON_check/DIN_check PN_check/DIN_check]; + [DOP_check/DIP_check PP_check/DIP_check]; + 'silica concentration (mmoles m-3)'; + SI_check; + + pause + end + + % If river is outside the domain, skip all of the calculations above and + % just plot for inspection/evaluation + else + % This is for rivers that were outside of the domain + if inspect_map == 'y' + figure(1) + clf + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,log10(Q_mod_vec),3,log10(Q_mod_vec)); + hold on + view(2); + plot3(lon_stations_sort(k),lat_stations_sort(k),1e5,'k.','MarkerSize',20); + axis([lon_stations_sort(k)-10 lon_stations_sort(k)+10 ... + lat_stations_sort(k)-10 lat_stations_sort(k)+10]); + caxis([-4 3]); + titl = ['OUTSIDE: river number: ',num2str(k),' name: ',station_names_sort{k}]; + title(titl); + colorbar; + + pause + end + + end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% nearest neighbor search to fill in any runoff points that were not % +% assigned after the runoff mapping step % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +lon_mod_runoff_vec = double(lon_mod_runoff_vec); +lat_mod_runoff_vec = double(lat_mod_runoff_vec); + +for m = 1:12 + aa = find(dic_mod_monthly_vecs(m,:) == 0); + bb = find(dic_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + dic_mod_monthly_vecs(m,bb)','nearest','nearest'); + dic_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(alk_mod_monthly_vecs(m,:) == 0); + bb = find(alk_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + alk_mod_monthly_vecs(m,bb)','nearest','nearest'); + alk_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(no3_mod_monthly_vecs(m,:) == 0); + bb = find(no3_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + no3_mod_monthly_vecs(m,bb)','nearest','nearest'); + no3_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(nh4_mod_monthly_vecs(m,:) == 0); + bb = find(nh4_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + nh4_mod_monthly_vecs(m,bb)','nearest','nearest'); + nh4_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(din_mod_monthly_vecs(m,:) == 0); + bb = find(din_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + din_mod_monthly_vecs(m,bb)','nearest','nearest'); + din_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(don_mod_monthly_vecs(m,:) == 0); + bb = find(don_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + don_mod_monthly_vecs(m,bb)','nearest','nearest'); + don_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(pn_mod_monthly_vecs(m,:) == 0); + bb = find(pn_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + pn_mod_monthly_vecs(m,bb)','nearest','nearest'); + pn_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(dip_mod_monthly_vecs(m,:) == 0); + bb = find(dip_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + dip_mod_monthly_vecs(m,bb)','nearest','nearest'); + dip_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(dop_mod_monthly_vecs(m,:) == 0); + bb = find(dop_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + dop_mod_monthly_vecs(m,bb)','nearest','nearest'); + dop_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(pp_mod_monthly_vecs(m,:) == 0); + bb = find(pp_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + pp_mod_monthly_vecs(m,bb)','nearest','nearest'); + pp_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); + + aa = find(si_mod_monthly_vecs(m,:) == 0); + bb = find(si_mod_monthly_vecs(m,:) > 0); + F = scatteredInterpolant(lon_mod_runoff_vec(bb),lat_mod_runoff_vec(bb), ... + si_mod_monthly_vecs(m,bb)','nearest','nearest'); + si_mod_monthly_vecs(m,aa) = F(lon_mod_runoff_vec(aa),lat_mod_runoff_vec(aa)); +end + +% For o2sat, fill in any 0 values with saturated o2 at the world ocean +% atlas climatology +for m = 1:12 + aa = find(o2_mod_monthly_vecs(m,:) == 0); + o2_mod_monthly_vecs(m,aa) = o2sat_woa_monthly_vecs(m,aa); +end + +totn_mod_monthly_vecs = din_mod_monthly_vecs + don_mod_monthly_vecs + pn_mod_monthly_vecs; +totp_mod_monthly_vecs = dip_mod_monthly_vecs + dop_mod_monthly_vecs + pp_mod_monthly_vecs; + +dicflux_mod_monthly_vecs = dic_mod_monthly_vecs.*Q_mod_monthly_vecs; +alkflux_mod_monthly_vecs = alk_mod_monthly_vecs.*Q_mod_monthly_vecs; +dinflux_mod_monthly_vecs = din_mod_monthly_vecs.*Q_mod_monthly_vecs; +no3flux_mod_monthly_vecs = no3_mod_monthly_vecs.*Q_mod_monthly_vecs; +nh4flux_mod_monthly_vecs = nh4_mod_monthly_vecs.*Q_mod_monthly_vecs; +dipflux_mod_monthly_vecs = dip_mod_monthly_vecs.*Q_mod_monthly_vecs; +donflux_mod_monthly_vecs = don_mod_monthly_vecs.*Q_mod_monthly_vecs; +dopflux_mod_monthly_vecs = dop_mod_monthly_vecs.*Q_mod_monthly_vecs; +pnflux_mod_monthly_vecs = pn_mod_monthly_vecs.*Q_mod_monthly_vecs; +ppflux_mod_monthly_vecs = pp_mod_monthly_vecs.*Q_mod_monthly_vecs; +siflux_mod_monthly_vecs = si_mod_monthly_vecs.*Q_mod_monthly_vecs; +totnflux_mod_monthly_vecs = totn_mod_monthly_vecs.*Q_mod_monthly_vecs; +totpflux_mod_monthly_vecs = totp_mod_monthly_vecs.*Q_mod_monthly_vecs; +o2flux_mod_monthly_vecs = o2_mod_monthly_vecs.*Q_mod_monthly_vecs; + +dicflux_mod_ann_vec = mean(dicflux_mod_monthly_vecs,1); +alkflux_mod_ann_vec = mean(alkflux_mod_monthly_vecs,1); +dinflux_mod_ann_vec = mean(dinflux_mod_monthly_vecs,1); +no3flux_mod_ann_vec = mean(no3flux_mod_monthly_vecs,1); +nh4flux_mod_ann_vec = mean(nh4flux_mod_monthly_vecs,1); +dipflux_mod_ann_vec = mean(dipflux_mod_monthly_vecs,1); +donflux_mod_ann_vec = mean(donflux_mod_monthly_vecs,1); +dopflux_mod_ann_vec = mean(dopflux_mod_monthly_vecs,1); +pnflux_mod_ann_vec = mean(pnflux_mod_monthly_vecs,1); +ppflux_mod_ann_vec = mean(ppflux_mod_monthly_vecs,1); +siflux_mod_ann_vec = mean(siflux_mod_monthly_vecs,1); +totnflux_mod_ann_vec = mean(totnflux_mod_monthly_vecs,1); +totpflux_mod_ann_vec = mean(totpflux_mod_monthly_vecs,1); +o2flux_mod_ann_vec = mean(o2flux_mod_monthly_vecs,1); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Produce plots to evaluate the mapping % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% scale marker size with the freshwater flux +ms_vec = zeros(size(Q_mod_vec)); +ms_vec(log10(Q_mod_vec) < 0) = 1; +ms_vec((log10(Q_mod_vec) > 0) & (log10(Q_mod_vec) < 1)) = 2.5; +ms_vec((log10(Q_mod_vec) > 1) & (log10(Q_mod_vec) < 2)) = 10; +ms_vec((log10(Q_mod_vec) > 2) & (log10(Q_mod_vec) < 3)) = 25; +ms_vec(log10(Q_mod_vec) > 3) = 100; + +% DIC, Alk concentrations and DIC:Alk +for m = 1:12 + + figure(1) + clf + + subplot(1,3,1); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dic_mod_monthly_vecs(m,:),ms_vec, ... + dic_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 2500]); + colorbar + titlestr = ['DIC, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(1,3,2); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,alk_mod_monthly_vecs(m,:),ms_vec, ... + alk_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 2500]); + colorbar + titlestr = ['Alk, meq m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(1,3,3) + dic_alk_ratio = dic_mod_monthly_vecs(m,:)./alk_mod_monthly_vecs(m,:); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dic_alk_ratio, ... + ms_vec,dic_alk_ratio,'filled'); + hold on + view(2); + caxis([0.8 1.2]); + colorbar + title('DIC:Alk ratio'); + + pause +end + +% Nitrogen Concentrations +for m = 1:12 + + figure(1) + clf + + subplot(2,2,1); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,din_mod_monthly_vecs(m,:),ms_vec, ... + din_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 100]); + colorbar + titlestr = ['DIN, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,2,2); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,no3_mod_monthly_vecs(m,:),ms_vec, ... + din_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 100]); + colorbar + titlestr = ['no3, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,2,3); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,nh4_mod_monthly_vecs(m,:),ms_vec, ... + nh4_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 20]); + colorbar + titlestr = ['nh4, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,2,4); + no3_din_ratio = no3_mod_monthly_vecs(m,:)./din_mod_monthly_vecs(m,:); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,no3_din_ratio, ... + ms_vec,no3_din_ratio,'filled'); + hold on + view(2); + caxis([0 1.0]); + colorbar + title('NO3:DIN ratio'); + + pause +end + +for m = 1:12 + + subplot(2,3,1); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,din_mod_monthly_vecs(m,:),ms_vec, ... + din_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 100]); + colorbar + titlestr = ['DIN, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,3,2); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,don_mod_monthly_vecs(m,:),ms_vec, ... + don_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 100]); + colorbar + titlestr = ['DON, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,3,3); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pn_mod_monthly_vecs(m,:),ms_vec, ... + pn_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 100]); + colorbar + titlestr = ['PN, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,3,5) + don_din_ratio = don_mod_monthly_vecs(m,:)./din_mod_monthly_vecs(m,:); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,don_din_ratio, ... + ms_vec,don_din_ratio,'filled'); + hold on + view(2); + caxis([0 2]); + colorbar + title('DON:DIN ratio'); + + subplot(2,3,6) + pn_din_ratio = pn_mod_monthly_vecs(m,:)./din_mod_monthly_vecs(m,:); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pn_din_ratio, ... + ms_vec,pn_din_ratio,'filled'); + hold on + view(2); + caxis([0 2]); + colorbar + title('PN:DIN ratio'); + + pause +end + +% Phosphorus Concentrations +for m = 1:12 + + figure(1) + clf + + subplot(2,3,1); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dip_mod_monthly_vecs(m,:),ms_vec, ... + dip_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 3]); + colorbar + titlestr = ['DIP, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,3,2); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dop_mod_monthly_vecs(m,:),ms_vec, ... + dop_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 3]); + colorbar + titlestr = ['DOP, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,3,3); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pp_mod_monthly_vecs(m,:),ms_vec, ... + pp_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 3]); + colorbar + titlestr = ['PP, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,3,5) + dop_dip_ratio = dop_mod_monthly_vecs(m,:)./dip_mod_monthly_vecs(m,:); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,dop_dip_ratio, ... + ms_vec,dop_dip_ratio,'filled'); + hold on + view(2); + caxis([0 3]); + colorbar + title('DOP:DIP ratio'); + + subplot(2,3,6) + pp_dip_ratio = pp_mod_monthly_vecs(m,:)./dip_mod_monthly_vecs(m,:); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,pp_dip_ratio, ... + ms_vec,pp_dip_ratio,'filled'); + hold on + view(2); + caxis([0 2]); + colorbar + title('PP:DIP ratio'); + + pause +end + +% silica and oxygen concentrations +for m = 1:12 + figure(1) + clf + + subplot(2,1,1); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,si_mod_monthly_vecs(m,:),ms_vec, ... + si_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 200]); + colorbar + titlestr = ['Si, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + subplot(2,1,2); + scatter3(lon_mod_runoff_vec,lat_mod_runoff_vec,o2_mod_monthly_vecs(m,:),ms_vec, ... + o2_mod_monthly_vecs(m,:),'filled'); + hold on + view(2); + caxis([0 350]); + colorbar + titlestr = ['o2, mmoles m-3; month = ',num2str(m)]; + title(titlestr); + + pause +end + +% Initialize 2D concentration arrays; these are the ones read into MOM6 to +% specify the nutrient concentrations of river inputs. +DIC_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +ALK_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +NO3_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +NH4_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +LDON_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +SLDON_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +SRDON_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +PO4_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +LDOP_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +SLDOP_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +SRDOP_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +NDET_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +PDET_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +SI_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); +O2_CONC = zeros(12,size(lon_mod,1),size(lon_mod,2)); + +% Map concentration vectors onto 2D arrays +temp = zeros(size(lon_mod)); +for m = 1:12 + temp(ind_ro) = dic_mod_monthly_vecs(m,:); + DIC_CONC(m,:,:) = temp; + temp(ind_ro) = alk_mod_monthly_vecs(m,:); + ALK_CONC(m,:,:) = temp; + + temp(ind_ro) = no3_mod_monthly_vecs(m,:); % contains all NEWS DIN + %temp(ind_ro) = din_mod_monthly_vecs(m,:); + NO3_CONC(m,:,:) = temp; + temp(ind_ro) = nh4_mod_monthly_vecs(m,:); + NH4_CONC(m,:,:) = temp; + temp(ind_ro) = don_mod_monthly_vecs(m,:); + LDON_CONC(m,:,:) = frac_ldon*temp; + SLDON_CONC(m,:,:) = frac_sldon*temp; + SRDON_CONC(m,:,:) = frac_srdon*temp; + temp(ind_ro) = pn_mod_monthly_vecs(m,:); + NDET_CONC(m,:,:) = temp; + + temp(ind_ro) = dip_mod_monthly_vecs(m,:); + PO4_CONC(m,:,:) = temp; + temp(ind_ro) = dop_mod_monthly_vecs(m,:); + LDOP_CONC(m,:,:) = frac_ldop*temp; + SLDOP_CONC(m,:,:) = frac_sldop*temp; + SRDOP_CONC(m,:,:) = frac_srdop*temp; + temp(ind_ro) = pp_mod_monthly_vecs(m,:); + PDET_CONC(m,:,:) = temp; + + temp(ind_ro) = si_mod_monthly_vecs(m,:); + SI_CONC(m,:,:) = temp; + temp(ind_ro) = o2_mod_monthly_vecs(m,:); + O2_CONC(m,:,:) = temp; +end + +% MOM6 is taking river values in moles m-3 for other constituents. Change +% for consistency across river constituents +DIC_CONC = DIC_CONC./1e3; +ALK_CONC = ALK_CONC./1e3; +NO3_CONC = NO3_CONC./1e3; +NH4_CONC = NH4_CONC./1e3; +LDON_CONC = LDON_CONC./1e3; +SLDON_CONC = SLDON_CONC./1e3; +SRDON_CONC = SRDON_CONC./1e3; +NDET_CONC = NDET_CONC./1e3; +PO4_CONC = PO4_CONC./1e3; +LDOP_CONC = LDON_CONC./1e3; +SLDOP_CONC = SLDON_CONC./1e3; +SRDOP_CONC = SRDON_CONC./1e3; +PDET_CONC = PDET_CONC./1e3; +SI_CONC = SI_CONC./1e3; +O2_CONC = O2_CONC./1e3; + +% Add iron concentrations - initialize with nitrate and then overwrite +FED_CONC = NO3_CONC; +FEDET_CONC = NO3_CONC; +% 40 nM dissolved iron concentration from De Baar and De Jong + 30nM +% Colloidal and nanoparticle flux as reported in Canfield and Raiswell +FED_CONC(FED_CONC > 0) = const_fed; +FEDET_CONC(FEDET_CONC > 0) = 0.0; + +ms = 8; + +% quick set of plots to ensure the mapping to the model grid was successful +for m = 1:12 + % DIC and alkalinity + figure(1) + clf + subplot(2,1,1); + title('log10(DIC CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(DIC_CONC(m,:)),ms,log10(DIC_CONC(m,:)),'filled'); + caxis([-1 1]); colorbar; + + subplot(2,1,2); + title('log10(ALK CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(ALK_CONC(m,:)),ms,log10(ALK_CONC(m,:)),'filled'); + caxis([-1 1]); colorbar; + + %pause +end + +% Nitrogen +for m = 1:12 + figure(1); + clf + subplot(3,2,1); + title('log10(NO3 CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(NO3_CONC(m,:)),ms,log10(NO3_CONC(m,:)),'filled'); + caxis([-4 -1]); colorbar; + + subplot(3,2,2); + title('log10(NH4 CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(NH4_CONC(m,:)),ms,log10(NH4_CONC(m,:)),'filled'); + caxis([-4 -1]); colorbar; + + subplot(3,2,3); + title('log10(LDON CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(LDON_CONC(m,:)),ms,log10(LDON_CONC(m,:)),'filled'); + caxis([-4 -1]); colorbar; + + subplot(3,2,4); + title('log10(SLDON CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(SLDON_CONC(m,:)),ms,log10(SLDON_CONC(m,:)),'filled'); + caxis([-4 -1]); colorbar; + + subplot(3,2,5); + title('log10(SRDON CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(SRDON_CONC(m,:)),ms,log10(SRDON_CONC(m,:)),'filled'); + caxis([-4 -1]); colorbar; + + subplot(3,2,6); + title('log10(NDET CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(NDET_CONC(m,:)),ms,log10(NDET_CONC(m,:)),'filled'); + caxis([-4 -1]); colorbar; + + %pause +end + +% Phosphorus +for m = 1:12 + figure(1); + clf + subplot(3,2,1); + title('log10(PO4 CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(PO4_CONC(m,:)),ms,log10(PO4_CONC(m,:)),'filled'); + caxis([-4 -2]); colorbar; + + subplot(3,2,2); + title('log10(LDOP CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(LDOP_CONC(m,:)),ms,log10(LDOP_CONC(m,:)),'filled'); + caxis([-4 -2]); colorbar; + + subplot(3,2,3); + title('log10(SLDOP CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(SLDOP_CONC(m,:)),ms,log10(SLDOP_CONC(m,:)),'filled'); + caxis([-4 -2]); colorbar; + + subplot(3,2,4); + title('log10(SRDOP CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(SRDOP_CONC(m,:)),ms,log10(SRDOP_CONC(m,:)),'filled'); + caxis([-4 -2]); colorbar; + + subplot(3,2,5); + title('log10(PDET CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(PDET_CONC(m,:)),ms,log10(PDET_CONC(m,:)),'filled'); + caxis([-4 -2]); colorbar; + + %pause; +end + +% Iron, Silica, Oxygen +for m = 1:12 + figure(1) + clf + subplot(3,2,1); + title('log10(FED CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(FED_CONC(m,:)),ms,log10(FED_CONC(m,:)),'filled'); + caxis([-5 -3]); colorbar; + + subplot(3,2,2); + title('log10(FEDET CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(FEDET_CONC(m,:)),ms,log10(FEDET_CONC(m,:)),'filled'); + caxis([-5 -3]); colorbar; + + subplot(3,2,3); + title('log10(SI CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(SI_CONC(m,:)),ms,log10(SI_CONC(m,:)),'filled'); + caxis([-3 0]); colorbar; + + subplot(3,2,4); + title('log10(O2 CONC)'); hold on; + scatter3(lon_mod(:),lat_mod(:),log10(O2_CONC(m,:)),ms,log10(O2_CONC(m,:)),'filled'); + caxis([-3 0]); colorbar; + + %pause; +end + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Save Files % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% option to save matlab file +% save River_DIC_ALK_RC4US_NWA ALK_CONC DIC_CONC + +% Construct netcdf file following format used by nutrient input files to +% MOM6 + +% Make reference dates for standard non-leap year +dates = [1990 1 16 12 0 0; 1990 2 15 0 0 0; 1990 3 16 12 0 0; ... + 1990 4 16 0 0 0; 1990 5 16 12 0 0; 1990 6 16 0 0 0; ... + 1990 7 16 12 0 0; 1990 8 16 12 0 0; 1990 9 16 0 0 0; ... + 1990 10 16 12 0 0; 1990 11 16 0 0 0; 1990 12 16 12 0 0]; +time = datenum(dates) - datenum([1990 1 1 0 0 0]); + +nlat = size(lat_mod,1); +nlon = size(lat_mod,2); + +ncid = netcdf.create(nc_file_name,'CLOBBER'); +dimid0 = netcdf.defDim(ncid,'time',netcdf.getConstant('NC_UNLIMITED')); +dimid1 = netcdf.defDim(ncid,'y',nlat); +dimid2 = netcdf.defDim(ncid,'x',nlon); + +varid0 = netcdf.defVar(ncid,'time','double',dimid0); +netcdf.putAtt(ncid,varid0,'calendar','NOLEAP'); +netcdf.putAtt(ncid,varid0,'calendar_type','NOLEAP'); +netcdf.putAtt(ncid,varid0,'modulo','T'); +netcdf.putAtt(ncid,varid0,'units','days since 1990-1-1 0:00:00'); +netcdf.putAtt(ncid,varid0,'time_origin','01-JAN-1990 00:00:00'); +varid1 = netcdf.defVar(ncid,'y','int',dimid1); +netcdf.putAtt(ncid,varid1,'cartesian_axis','Y'); +varid2 = netcdf.defVar(ncid,'x','int',dimid2); +netcdf.putAtt(ncid,varid2,'cartesian_axis','X'); +varid3 = netcdf.defVar(ncid,'lat','double',[dimid2 dimid1]); +netcdf.putAtt(ncid,varid3,'units','degrees north'); +varid4 = netcdf.defVar(ncid,'lon','double',[dimid2 dimid1]); +netcdf.putAtt(ncid,varid4,'units','degrees east'); +varid5 = netcdf.defVar(ncid,'DIC_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid5,'units','mol m-3'); +netcdf.putAtt(ncid,varid5,'long_name','DIC_CONC'); +varid6 = netcdf.defVar(ncid,'ALK_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid6,'units','mole Eq. m-3'); +netcdf.putAtt(ncid,varid6,'long_name','ALK_CONC'); +varid7 = netcdf.defVar(ncid,'NO3_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid7,'units','mol m-3'); +netcdf.putAtt(ncid,varid7,'long_name','NO3_CONC'); +varid8 = netcdf.defVar(ncid,'NH4_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid8,'units','mol m-3'); +netcdf.putAtt(ncid,varid8,'long_name','NH4_CONC'); +varid9 = netcdf.defVar(ncid,'LDON_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid9,'units','mol m-3'); +netcdf.putAtt(ncid,varid9,'long_name','0.3*DON_CONC'); +varid10 = netcdf.defVar(ncid,'SLDON_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid10,'units','mol m-3'); +netcdf.putAtt(ncid,varid10,'long_name','0.35*DON_CONC'); +varid11 = netcdf.defVar(ncid,'SRDON_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid11,'units','mol m-3'); +netcdf.putAtt(ncid,varid11,'long_name','0.35*DON_CONC'); +varid12 = netcdf.defVar(ncid,'NDET_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid12,'units','mol m-3'); +netcdf.putAtt(ncid,varid12,'long_name','1.0*PN_CONC'); +varid13 = netcdf.defVar(ncid,'PO4_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid13,'units','mol m-3'); +netcdf.putAtt(ncid,varid13,'long_name','PO4_CONC+0.3*PP_CONC'); +varid14 = netcdf.defVar(ncid,'LDOP_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid14,'units','mol m-3'); +netcdf.putAtt(ncid,varid14,'long_name','0.3*DOP_CONC'); +varid15 = netcdf.defVar(ncid,'SLDOP_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid15,'units','mol m-3'); +netcdf.putAtt(ncid,varid15,'long_name','0.35*DOP_CONC'); +varid16 = netcdf.defVar(ncid,'SRDOP_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid16,'units','mol m-3'); +netcdf.putAtt(ncid,varid16,'long_name','0.35*DOP_CONC'); +varid17 = netcdf.defVar(ncid,'PDET_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid17,'units','mol m-3'); +netcdf.putAtt(ncid,varid17,'long_name','0*PP_CONC'); +varid18 = netcdf.defVar(ncid,'FED_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid18,'units','mol m-3'); +netcdf.putAtt(ncid,varid18,'long_name','FED_CONC'); +varid19 = netcdf.defVar(ncid,'FEDET_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid19,'units','mol m-3'); +netcdf.putAtt(ncid,varid19,'long_name','FEDET_CONC'); +varid20 = netcdf.defVar(ncid,'O2_CONC','double',[dimid2,dimid1,dimid0]); +netcdf.putAtt(ncid,varid20,'units','mol m-3'); +netcdf.putAtt(ncid,varid20,'long_name','O2_CONC'); +netcdf.close(ncid) + +ncid = netcdf.open(nc_file_name,'NC_WRITE'); +netcdf.putVar(ncid,varid0,0,12,time); +% nutrient input files appear seem to need dummy axes to be read in +% properly, but eventually do a grid by grid mapping that doesn't require +% these. +netcdf.putVar(ncid,varid1,1:nlat); +netcdf.putVar(ncid,varid2,1:nlon); +netcdf.putVar(ncid,varid3,permute(lat_mod,[2,1])); +netcdf.putVar(ncid,varid4,permute(lon_mod,[2,1])); +netcdf.putVar(ncid,varid5,permute(DIC_CONC,[3,2,1])); +netcdf.putVar(ncid,varid6,permute(ALK_CONC,[3,2,1])); +netcdf.putVar(ncid,varid7,permute(NO3_CONC,[3,2,1])); +netcdf.putVar(ncid,varid8,permute(NH4_CONC,[3,2,1])); +netcdf.putVar(ncid,varid9,permute(LDON_CONC,[3,2,1])); +netcdf.putVar(ncid,varid10,permute(SLDON_CONC,[3,2,1])); +netcdf.putVar(ncid,varid11,permute(SRDON_CONC,[3,2,1])); +netcdf.putVar(ncid,varid12,permute(NDET_CONC,[3,2,1])); +netcdf.putVar(ncid,varid13,permute(PO4_CONC,[3,2,1])); +netcdf.putVar(ncid,varid14,permute(LDOP_CONC,[3,2,1])); +netcdf.putVar(ncid,varid15,permute(SLDOP_CONC,[3,2,1])); +netcdf.putVar(ncid,varid16,permute(SRDOP_CONC,[3,2,1])); +netcdf.putVar(ncid,varid17,permute(PDET_CONC,[3,2,1])); +netcdf.putVar(ncid,varid18,permute(FED_CONC,[3,2,1])); +netcdf.putVar(ncid,varid19,permute(FEDET_CONC,[3,2,1])); +netcdf.putVar(ncid,varid20,permute(O2_CONC,[3,2,1])); +netcdf.close(ncid) diff --git a/tools/rivers/bgc/GlobalNEWS2_RH2000Dataset-version1.0.xls b/tools/rivers/bgc/NWA/GlobalNEWS2_RH2000Dataset-version1.0.xls similarity index 100% rename from tools/rivers/bgc/GlobalNEWS2_RH2000Dataset-version1.0.xls rename to tools/rivers/bgc/NWA/GlobalNEWS2_RH2000Dataset-version1.0.xls diff --git a/tools/rivers/bgc/README.md b/tools/rivers/bgc/NWA/README.md similarity index 80% rename from tools/rivers/bgc/README.md rename to tools/rivers/bgc/NWA/README.md index 434413a4f..6a14aa436 100644 --- a/tools/rivers/bgc/README.md +++ b/tools/rivers/bgc/NWA/README.md @@ -1,6 +1,6 @@ -## Example Scripts for BGC runoff generation +## Example Scripts for NWA BGC runoff generation -This folder contains example scripts for BGC runoff file generation. Users can follow the following instructions to generate BGC runoff file: +This folder contains example scripts for NWA BGC runoff file generation. Users can follow the following instructions to generate BGC runoff file: ``` # 1. First run write_glofas_ave.py to get climatological monthly runoff ./write_glofas_ave.py diff --git a/tools/rivers/bgc/mapriv_NEWS2_NWA12_GLOFAS.m b/tools/rivers/bgc/NWA/mapriv_NEWS2_NWA12_GLOFAS.m similarity index 100% rename from tools/rivers/bgc/mapriv_NEWS2_NWA12_GLOFAS.m rename to tools/rivers/bgc/NWA/mapriv_NEWS2_NWA12_GLOFAS.m diff --git a/tools/rivers/bgc/mapriv_combined_NWA12_GLOFAS.m b/tools/rivers/bgc/NWA/mapriv_combined_NWA12_GLOFAS.m similarity index 100% rename from tools/rivers/bgc/mapriv_combined_NWA12_GLOFAS.m rename to tools/rivers/bgc/NWA/mapriv_combined_NWA12_GLOFAS.m diff --git a/tools/rivers/bgc/nc64startup.m b/tools/rivers/bgc/NWA/nc64startup.m similarity index 100% rename from tools/rivers/bgc/nc64startup.m rename to tools/rivers/bgc/NWA/nc64startup.m diff --git a/tools/rivers/bgc/write_glofas_ave.py b/tools/rivers/bgc/NWA/write_glofas_ave.py similarity index 100% rename from tools/rivers/bgc/write_glofas_ave.py rename to tools/rivers/bgc/NWA/write_glofas_ave.py