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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