From b795ebec80de759940132c32e31e52579b843957 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 28 Aug 2025 12:13:27 +0200 Subject: [PATCH 1/4] add new bgc variables to CTD_BGC instrument --- src/virtualship/cli/_fetch.py | 30 +++++++++++++++ src/virtualship/expedition/input_data.py | 25 +++++++++++- src/virtualship/instruments/ctd_bgc.py | 48 +++++++++++++++++++++++- 3 files changed, 101 insertions(+), 2 deletions(-) diff --git a/src/virtualship/cli/_fetch.py b/src/virtualship/cli/_fetch.py index df66cd66..cc6a290d 100644 --- a/src/virtualship/cli/_fetch.py +++ b/src/virtualship/cli/_fetch.py @@ -250,6 +250,36 @@ def _fetch(path: str | Path, username: str | None, password: str | None) -> None "variables": ["chl"], "output_filename": "ctd_bgc_chloro.nc", }, + "nitratedata": { + "dataset_id": "cmems_mod_glo_bgc-nut_anfc_0.25deg_P1D-m", + "variables": ["no3"], + "output_filename": "ctd_bgc_nitrate.nc", + }, + "phosphatedata": { + "dataset_id": "cmems_mod_glo_bgc-nut_anfc_0.25deg_P1D-m", + "variables": ["po4"], + "output_filename": "ctd_bgc_phosphate.nc", + }, + "phdata": { + "dataset_id": "cmems_mod_glo_bgc-car_anfc_0.25deg_P1D-m", + "variables": ["ph"], + "output_filename": "ctd_bgc_ph.nc", + }, + "phytoplanktondata": { + "dataset_id": "cmems_mod_glo_bgc-pft_anfc_0.25deg_P1D-m", + "variables": ["phyc"], + "output_filename": "ctd_bgc_phytoplankton.nc", + }, + "zooplanktondata": { + "dataset_id": "cmems_mod_glo_bgc-plankton_anfc_0.25deg_P1D-m", + "variables": ["zooc"], + "output_filename": "ctd_bgc_zooplankton.nc", + }, + "primaryproductiondata": { + "dataset_id": "cmems_mod_glo_bgc-bio_anfc_0.25deg_P1D-m", + "variables": ["nppv"], + "output_filename": "ctd_bgc_primary_production.nc", + }, } # Iterate over all datasets and download each based on space_time_region diff --git a/src/virtualship/expedition/input_data.py b/src/virtualship/expedition/input_data.py index 0cf34d28..e9c1750e 100644 --- a/src/virtualship/expedition/input_data.py +++ b/src/virtualship/expedition/input_data.py @@ -138,8 +138,25 @@ def _load_ctd_bgc_fieldset(cls, directory: Path) -> FieldSet: "V": directory.joinpath("ship_uv.nc"), "o2": directory.joinpath("ctd_bgc_o2.nc"), "chl": directory.joinpath("ctd_bgc_chloro.nc"), + "no3": directory.joinpath("ctd_bgc_nitrate.nc"), + "po4": directory.joinpath("ctd_bgc_phosphate.nc"), + "ph": directory.joinpath("ctd_bgc_ph.nc"), + "phytoplankton": directory.joinpath("ctd_bgc_phytoplankton.nc"), + "zooplankton": directory.joinpath("ctd_bgc_zooplankton.nc"), + "primary_production": directory.joinpath("ctd_bgc_primary_production.nc"), + } + variables = { + "U": "uo", + "V": "vo", + "o2": "o2", + "chl": "chl", + "no3": "no3", + "po4": "po4", + "ph": "ph", + "phytoplankton": "phyc", + "zooplankton": "zooc", + "primary_production": "nppv", } - variables = {"U": "uo", "V": "vo", "o2": "o2", "chl": "chl"} dimensions = { "lon": "longitude", "lat": "latitude", @@ -152,6 +169,12 @@ def _load_ctd_bgc_fieldset(cls, directory: Path) -> FieldSet: ) fieldset.o2.interp_method = "linear_invdist_land_tracer" fieldset.chl.interp_method = "linear_invdist_land_tracer" + fieldset.no3.interp_method = "linear_invdist_land_tracer" + fieldset.po4.interp_method = "linear_invdist_land_tracer" + fieldset.ph.interp_method = "linear_invdist_land_tracer" + fieldset.phytoplankton.interp_method = "linear_invdist_land_tracer" + fieldset.zooplankton.interp_method = "linear_invdist_land_tracer" + fieldset.primary_production.interp_method = "linear_invdist_land_tracer" # make depth negative for g in fieldset.gridset.grids: diff --git a/src/virtualship/instruments/ctd_bgc.py b/src/virtualship/instruments/ctd_bgc.py index acd4df61..f4ad9553 100644 --- a/src/virtualship/instruments/ctd_bgc.py +++ b/src/virtualship/instruments/ctd_bgc.py @@ -23,6 +23,12 @@ class CTD_BGC: [ Variable("o2", dtype=np.float32, initial=np.nan), Variable("chl", dtype=np.float32, initial=np.nan), + Variable("no3", dtype=np.float32, initial=np.nan), + Variable("po4", dtype=np.float32, initial=np.nan), + Variable("ph", dtype=np.float32, initial=np.nan), + Variable("phyc", dtype=np.float32, initial=np.nan), + Variable("zooc", dtype=np.float32, initial=np.nan), + Variable("nppv", dtype=np.float32, initial=np.nan), Variable("raising", dtype=np.int8, initial=0.0), # bool. 0 is False, 1 is True. Variable("max_depth", dtype=np.float32), Variable("min_depth", dtype=np.float32), @@ -39,6 +45,36 @@ def _sample_chlorophyll(particle, fieldset, time): particle.chl = fieldset.chl[time, particle.depth, particle.lat, particle.lon] +def _sample_nitrate(particle, fieldset, time): + particle.no3 = fieldset.no3[time, particle.depth, particle.lat, particle.lon] + + +def _sample_phosphate(particle, fieldset, time): + particle.po4 = fieldset.po4[time, particle.depth, particle.lat, particle.lon] + + +def _sample_ph(particle, fieldset, time): + particle.ph = fieldset.ph[time, particle.depth, particle.lat, particle.lon] + + +def _sample_phytoplankton(particle, fieldset, time): + particle.phyc = fieldset.phytoplankton[ + time, particle.depth, particle.lat, particle.lon + ] + + +def _sample_zooplankton(particle, fieldset, time): + particle.zooc = fieldset.zooplankton[ + time, particle.depth, particle.lat, particle.lon + ] + + +def _sample_primary_production(particle, fieldset, time): + particle.nppv = fieldset.primary_production[ + time, particle.depth, particle.lat, particle.lon + ] + + def _ctd_bgc_cast(particle, fieldset, time): # lowering if particle.raising == 0: @@ -129,7 +165,17 @@ def simulate_ctd_bgc( # execute simulation ctd_bgc_particleset.execute( - [_sample_o2, _sample_chlorophyll, _ctd_bgc_cast], + [ + _sample_o2, + _sample_chlorophyll, + _sample_nitrate, + _sample_phosphate, + _sample_ph, + _sample_phytoplankton, + _sample_zooplankton, + _sample_primary_production, + _ctd_bgc_cast, + ], endtime=fieldset_endtime, dt=DT, verbose_progress=False, From 174f29d4305fcd8590daed353b3571e1a290e1e4 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 28 Aug 2025 12:14:37 +0200 Subject: [PATCH 2/4] update tests --- .../expedition_dir/input_data/.gitignore | 1 + .../input_data/ctd_bgc_chloro.nc | Bin 23313 -> 23364 bytes .../input_data/ctd_bgc_nitrate.nc | Bin 0 -> 23347 bytes .../expedition_dir/input_data/ctd_bgc_o2.nc | Bin 23323 -> 23374 bytes .../expedition_dir/input_data/ctd_bgc_ph.nc | Bin 0 -> 23293 bytes .../input_data/ctd_bgc_phosphate.nc | Bin 0 -> 23353 bytes .../input_data/ctd_bgc_phytoplankton.nc | Bin 0 -> 23374 bytes .../input_data/ctd_bgc_primary_production.nc | Bin 0 -> 23424 bytes .../input_data/ctd_bgc_zooplankton.nc | Bin 0 -> 23412 bytes tests/instruments/test_ctd_bgc.py | 93 +++++++++++++++++- 10 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 tests/expedition/expedition_dir/input_data/ctd_bgc_nitrate.nc create mode 100644 tests/expedition/expedition_dir/input_data/ctd_bgc_ph.nc create mode 100644 tests/expedition/expedition_dir/input_data/ctd_bgc_phosphate.nc create mode 100644 tests/expedition/expedition_dir/input_data/ctd_bgc_phytoplankton.nc create mode 100644 tests/expedition/expedition_dir/input_data/ctd_bgc_primary_production.nc create mode 100644 tests/expedition/expedition_dir/input_data/ctd_bgc_zooplankton.nc diff --git a/tests/expedition/expedition_dir/input_data/.gitignore b/tests/expedition/expedition_dir/input_data/.gitignore index 2235154f..b323da5b 100644 --- a/tests/expedition/expedition_dir/input_data/.gitignore +++ b/tests/expedition/expedition_dir/input_data/.gitignore @@ -7,3 +7,4 @@ !ship_uv.nc !drifter_t.nc !drifter_uv.nc +!ctd_bgc_*.nc diff --git a/tests/expedition/expedition_dir/input_data/ctd_bgc_chloro.nc b/tests/expedition/expedition_dir/input_data/ctd_bgc_chloro.nc index efdc51d381ee74b0fefbdac6c097852fd71e55c3..16bc9d5847b53899ea82474938ffe084c2472ef6 100644 GIT binary patch delta 4036 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 literal 0 HcmV?d00001 diff --git a/tests/expedition/expedition_dir/input_data/ctd_bgc_o2.nc b/tests/expedition/expedition_dir/input_data/ctd_bgc_o2.nc index d552f8bbcd344232dc79bbc24ffa8a1ebf9cbc12..2a889d2e35a58ac88dc85af4c379fe5d4dd2d206 100644 GIT binary patch delta 4040 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
    w5y3+}6@42VBM`aCmE2YKmxvx!fKR2(= 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 literal 0 HcmV?d00001 diff --git a/tests/expedition/expedition_dir/input_data/ctd_bgc_phosphate.nc b/tests/expedition/expedition_dir/input_data/ctd_bgc_phosphate.nc new file mode 100644 index 0000000000000000000000000000000000000000..e1e1336a8c53a1d79acafc1872c69469c89e9022 GIT binary patch literal 23353 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 None: "surface": { "o2": 9, "chl": 10, + "no3": 13, + "po4": 14, + "ph": 8.1, + "phyc": 15, + "zooc": 16, + "nppv": 17, "lat": ctd_bgcs[0].spacetime.location.lat, "lon": ctd_bgcs[0].spacetime.location.lon, }, "maxdepth": { "o2": 11, "chl": 12, + "no3": 18, + "po4": 19, + "ph": 8.0, + "phyc": 20, + "zooc": 21, + "nppv": 22, "lat": ctd_bgcs[0].spacetime.location.lat, "lon": ctd_bgcs[0].spacetime.location.lon, }, @@ -59,12 +71,24 @@ def test_simulate_ctd_bgcs(tmpdir) -> None: "surface": { "o2": 9, "chl": 10, + "no3": 13, + "po4": 14, + "ph": 8.1, + "phyc": 15, + "zooc": 16, + "nppv": 17, "lat": ctd_bgcs[1].spacetime.location.lat, "lon": ctd_bgcs[1].spacetime.location.lon, }, "maxdepth": { "o2": 11, "chl": 12, + "no3": 18, + "po4": 19, + "ph": 8.0, + "phyc": 20, + "zooc": 21, + "nppv": 22, "lat": ctd_bgcs[1].spacetime.location.lat, "lon": ctd_bgcs[1].spacetime.location.lon, }, @@ -75,9 +99,16 @@ def test_simulate_ctd_bgcs(tmpdir) -> None: # indices are time, depth, latitude, longitude u = np.zeros((2, 2, 2, 2)) v = np.zeros((2, 2, 2, 2)) - o2 = np.zeros((2, 2, 2, 2)) # o2 field - chl = np.zeros((2, 2, 2, 2)) # chl field - + o2 = np.zeros((2, 2, 2, 2)) + chl = np.zeros((2, 2, 2, 2)) + no3 = np.zeros((2, 2, 2, 2)) + po4 = np.zeros((2, 2, 2, 2)) + ph = np.zeros((2, 2, 2, 2)) + phytoplankton = np.zeros((2, 2, 2, 2)) + zooplankton = np.zeros((2, 2, 2, 2)) + primary_production = np.zeros((2, 2, 2, 2)) + + # Fill fields for both CTDs at surface and maxdepth o2[:, 1, 0, 1] = ctd_bgc_exp[0]["surface"]["o2"] o2[:, 0, 0, 1] = ctd_bgc_exp[0]["maxdepth"]["o2"] o2[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["o2"] @@ -88,8 +119,49 @@ def test_simulate_ctd_bgcs(tmpdir) -> None: chl[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["chl"] chl[:, 0, 1, 0] = ctd_bgc_exp[1]["maxdepth"]["chl"] + no3[:, 1, 0, 1] = ctd_bgc_exp[0]["surface"]["no3"] + no3[:, 0, 0, 1] = ctd_bgc_exp[0]["maxdepth"]["no3"] + no3[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["no3"] + no3[:, 0, 1, 0] = ctd_bgc_exp[1]["maxdepth"]["no3"] + + po4[:, 1, 0, 1] = ctd_bgc_exp[0]["surface"]["po4"] + po4[:, 0, 0, 1] = ctd_bgc_exp[0]["maxdepth"]["po4"] + po4[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["po4"] + po4[:, 0, 1, 0] = ctd_bgc_exp[1]["maxdepth"]["po4"] + + ph[:, 1, 0, 1] = ctd_bgc_exp[0]["surface"]["ph"] + ph[:, 0, 0, 1] = ctd_bgc_exp[0]["maxdepth"]["ph"] + ph[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["ph"] + ph[:, 0, 1, 0] = ctd_bgc_exp[1]["maxdepth"]["ph"] + + phytoplankton[:, 1, 0, 1] = ctd_bgc_exp[0]["surface"]["phyc"] + phytoplankton[:, 0, 0, 1] = ctd_bgc_exp[0]["maxdepth"]["phyc"] + phytoplankton[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["phyc"] + phytoplankton[:, 0, 1, 0] = ctd_bgc_exp[1]["maxdepth"]["phyc"] + + zooplankton[:, 1, 0, 1] = ctd_bgc_exp[0]["surface"]["zooc"] + zooplankton[:, 0, 0, 1] = ctd_bgc_exp[0]["maxdepth"]["zooc"] + zooplankton[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["zooc"] + zooplankton[:, 0, 1, 0] = ctd_bgc_exp[1]["maxdepth"]["zooc"] + + primary_production[:, 1, 0, 1] = ctd_bgc_exp[0]["surface"]["nppv"] + primary_production[:, 0, 0, 1] = ctd_bgc_exp[0]["maxdepth"]["nppv"] + primary_production[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["nppv"] + primary_production[:, 0, 1, 0] = ctd_bgc_exp[1]["maxdepth"]["nppv"] + fieldset = FieldSet.from_data( - {"V": v, "U": u, "o2": o2, "chl": chl}, + { + "V": v, + "U": u, + "o2": o2, + "chl": chl, + "no3": no3, + "po4": po4, + "ph": ph, + "phytoplankton": phytoplankton, + "zooplankton": zooplankton, + "primary_production": primary_production, + }, { "time": [ np.datetime64(base_time + datetime.timedelta(hours=0)), @@ -129,7 +201,18 @@ def test_simulate_ctd_bgcs(tmpdir) -> None: (obs_maxdepth, "maxdepth"), ]: exp = exp_bothloc[loc] - for var in ["o2", "chl", "lat", "lon"]: + for var in [ + "o2", + "chl", + "no3", + "po4", + "ph", + "phyc", + "zooc", + "nppv", + "lat", + "lon", + ]: obs_value = obs[var].values.item() exp_value = exp[var] assert np.isclose(obs_value, exp_value), ( From 90a0ce2a0e8c7ffdbf593e4bb52b333f5e8688bd Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 28 Aug 2025 17:14:37 +0200 Subject: [PATCH 3/4] use abbreviations consistently --- src/virtualship/expedition/input_data.py | 18 ++++++------ src/virtualship/instruments/ctd_bgc.py | 12 ++------ tests/instruments/test_ctd_bgc.py | 36 ++++++++++++------------ 3 files changed, 30 insertions(+), 36 deletions(-) diff --git a/src/virtualship/expedition/input_data.py b/src/virtualship/expedition/input_data.py index e9c1750e..08380429 100644 --- a/src/virtualship/expedition/input_data.py +++ b/src/virtualship/expedition/input_data.py @@ -141,9 +141,9 @@ def _load_ctd_bgc_fieldset(cls, directory: Path) -> FieldSet: "no3": directory.joinpath("ctd_bgc_nitrate.nc"), "po4": directory.joinpath("ctd_bgc_phosphate.nc"), "ph": directory.joinpath("ctd_bgc_ph.nc"), - "phytoplankton": directory.joinpath("ctd_bgc_phytoplankton.nc"), - "zooplankton": directory.joinpath("ctd_bgc_zooplankton.nc"), - "primary_production": directory.joinpath("ctd_bgc_primary_production.nc"), + "phyc": directory.joinpath("ctd_bgc_phytoplankton.nc"), + "zooc": directory.joinpath("ctd_bgc_zooplankton.nc"), + "nppv": directory.joinpath("ctd_bgc_primary_production.nc"), } variables = { "U": "uo", @@ -153,9 +153,9 @@ def _load_ctd_bgc_fieldset(cls, directory: Path) -> FieldSet: "no3": "no3", "po4": "po4", "ph": "ph", - "phytoplankton": "phyc", - "zooplankton": "zooc", - "primary_production": "nppv", + "phyc": "phyc", + "zooc": "zooc", + "nppv": "nppv", } dimensions = { "lon": "longitude", @@ -172,9 +172,9 @@ def _load_ctd_bgc_fieldset(cls, directory: Path) -> FieldSet: fieldset.no3.interp_method = "linear_invdist_land_tracer" fieldset.po4.interp_method = "linear_invdist_land_tracer" fieldset.ph.interp_method = "linear_invdist_land_tracer" - fieldset.phytoplankton.interp_method = "linear_invdist_land_tracer" - fieldset.zooplankton.interp_method = "linear_invdist_land_tracer" - fieldset.primary_production.interp_method = "linear_invdist_land_tracer" + fieldset.phyc.interp_method = "linear_invdist_land_tracer" + fieldset.zooc.interp_method = "linear_invdist_land_tracer" + fieldset.nppv.interp_method = "linear_invdist_land_tracer" # make depth negative for g in fieldset.gridset.grids: diff --git a/src/virtualship/instruments/ctd_bgc.py b/src/virtualship/instruments/ctd_bgc.py index f4ad9553..fde92ca1 100644 --- a/src/virtualship/instruments/ctd_bgc.py +++ b/src/virtualship/instruments/ctd_bgc.py @@ -58,21 +58,15 @@ def _sample_ph(particle, fieldset, time): def _sample_phytoplankton(particle, fieldset, time): - particle.phyc = fieldset.phytoplankton[ - time, particle.depth, particle.lat, particle.lon - ] + particle.phyc = fieldset.phyc[time, particle.depth, particle.lat, particle.lon] def _sample_zooplankton(particle, fieldset, time): - particle.zooc = fieldset.zooplankton[ - time, particle.depth, particle.lat, particle.lon - ] + particle.zooc = fieldset.zooc[time, particle.depth, particle.lat, particle.lon] def _sample_primary_production(particle, fieldset, time): - particle.nppv = fieldset.primary_production[ - time, particle.depth, particle.lat, particle.lon - ] + particle.nppv = fieldset.nppv[time, particle.depth, particle.lat, particle.lon] def _ctd_bgc_cast(particle, fieldset, time): diff --git a/tests/instruments/test_ctd_bgc.py b/tests/instruments/test_ctd_bgc.py index 93e577f4..5347a2ce 100644 --- a/tests/instruments/test_ctd_bgc.py +++ b/tests/instruments/test_ctd_bgc.py @@ -104,9 +104,9 @@ def test_simulate_ctd_bgcs(tmpdir) -> None: no3 = np.zeros((2, 2, 2, 2)) po4 = np.zeros((2, 2, 2, 2)) ph = np.zeros((2, 2, 2, 2)) - phytoplankton = np.zeros((2, 2, 2, 2)) - zooplankton = np.zeros((2, 2, 2, 2)) - primary_production = np.zeros((2, 2, 2, 2)) + phyc = np.zeros((2, 2, 2, 2)) + zooc = np.zeros((2, 2, 2, 2)) + nppv = np.zeros((2, 2, 2, 2)) # Fill fields for both CTDs at surface and maxdepth o2[:, 1, 0, 1] = ctd_bgc_exp[0]["surface"]["o2"] @@ -134,20 +134,20 @@ def test_simulate_ctd_bgcs(tmpdir) -> None: ph[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["ph"] ph[:, 0, 1, 0] = ctd_bgc_exp[1]["maxdepth"]["ph"] - phytoplankton[:, 1, 0, 1] = ctd_bgc_exp[0]["surface"]["phyc"] - phytoplankton[:, 0, 0, 1] = ctd_bgc_exp[0]["maxdepth"]["phyc"] - phytoplankton[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["phyc"] - phytoplankton[:, 0, 1, 0] = ctd_bgc_exp[1]["maxdepth"]["phyc"] + phyc[:, 1, 0, 1] = ctd_bgc_exp[0]["surface"]["phyc"] + phyc[:, 0, 0, 1] = ctd_bgc_exp[0]["maxdepth"]["phyc"] + phyc[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["phyc"] + phyc[:, 0, 1, 0] = ctd_bgc_exp[1]["maxdepth"]["phyc"] - zooplankton[:, 1, 0, 1] = ctd_bgc_exp[0]["surface"]["zooc"] - zooplankton[:, 0, 0, 1] = ctd_bgc_exp[0]["maxdepth"]["zooc"] - zooplankton[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["zooc"] - zooplankton[:, 0, 1, 0] = ctd_bgc_exp[1]["maxdepth"]["zooc"] + zooc[:, 1, 0, 1] = ctd_bgc_exp[0]["surface"]["zooc"] + zooc[:, 0, 0, 1] = ctd_bgc_exp[0]["maxdepth"]["zooc"] + zooc[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["zooc"] + zooc[:, 0, 1, 0] = ctd_bgc_exp[1]["maxdepth"]["zooc"] - primary_production[:, 1, 0, 1] = ctd_bgc_exp[0]["surface"]["nppv"] - primary_production[:, 0, 0, 1] = ctd_bgc_exp[0]["maxdepth"]["nppv"] - primary_production[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["nppv"] - primary_production[:, 0, 1, 0] = ctd_bgc_exp[1]["maxdepth"]["nppv"] + nppv[:, 1, 0, 1] = ctd_bgc_exp[0]["surface"]["nppv"] + nppv[:, 0, 0, 1] = ctd_bgc_exp[0]["maxdepth"]["nppv"] + nppv[:, 1, 1, 0] = ctd_bgc_exp[1]["surface"]["nppv"] + nppv[:, 0, 1, 0] = ctd_bgc_exp[1]["maxdepth"]["nppv"] fieldset = FieldSet.from_data( { @@ -158,9 +158,9 @@ def test_simulate_ctd_bgcs(tmpdir) -> None: "no3": no3, "po4": po4, "ph": ph, - "phytoplankton": phytoplankton, - "zooplankton": zooplankton, - "primary_production": primary_production, + "phyc": phyc, + "zooc": zooc, + "nppv": nppv, }, { "time": [ From f306dfea002364f87172dd22edc97d883ccffe3e Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Thu, 28 Aug 2025 17:42:35 +0200 Subject: [PATCH 4/4] maintain consistency with copernicus marine variable names --- src/virtualship/cli/_fetch.py | 12 ++++++------ src/virtualship/expedition/input_data.py | 12 ++++++------ .../{ctd_bgc_chloro.nc => ctd_bgc_chl.nc} | Bin .../{ctd_bgc_nitrate.nc => ctd_bgc_no3.nc} | Bin ...td_bgc_primary_production.nc => ctd_bgc_nppv.nc} | Bin .../{ctd_bgc_phytoplankton.nc => ctd_bgc_phyc.nc} | Bin .../{ctd_bgc_phosphate.nc => ctd_bgc_po4.nc} | Bin .../{ctd_bgc_zooplankton.nc => ctd_bgc_zooc.nc} | Bin 8 files changed, 12 insertions(+), 12 deletions(-) rename tests/expedition/expedition_dir/input_data/{ctd_bgc_chloro.nc => ctd_bgc_chl.nc} (100%) rename tests/expedition/expedition_dir/input_data/{ctd_bgc_nitrate.nc => ctd_bgc_no3.nc} (100%) rename tests/expedition/expedition_dir/input_data/{ctd_bgc_primary_production.nc => ctd_bgc_nppv.nc} (100%) rename tests/expedition/expedition_dir/input_data/{ctd_bgc_phytoplankton.nc => ctd_bgc_phyc.nc} (100%) rename tests/expedition/expedition_dir/input_data/{ctd_bgc_phosphate.nc => ctd_bgc_po4.nc} (100%) rename tests/expedition/expedition_dir/input_data/{ctd_bgc_zooplankton.nc => ctd_bgc_zooc.nc} (100%) diff --git a/src/virtualship/cli/_fetch.py b/src/virtualship/cli/_fetch.py index cc6a290d..ac039d76 100644 --- a/src/virtualship/cli/_fetch.py +++ b/src/virtualship/cli/_fetch.py @@ -248,17 +248,17 @@ def _fetch(path: str | Path, username: str | None, password: str | None) -> None "chlorodata": { "dataset_id": "cmems_mod_glo_bgc-pft_anfc_0.25deg_P1D-m", "variables": ["chl"], - "output_filename": "ctd_bgc_chloro.nc", + "output_filename": "ctd_bgc_chl.nc", }, "nitratedata": { "dataset_id": "cmems_mod_glo_bgc-nut_anfc_0.25deg_P1D-m", "variables": ["no3"], - "output_filename": "ctd_bgc_nitrate.nc", + "output_filename": "ctd_bgc_no3.nc", }, "phosphatedata": { "dataset_id": "cmems_mod_glo_bgc-nut_anfc_0.25deg_P1D-m", "variables": ["po4"], - "output_filename": "ctd_bgc_phosphate.nc", + "output_filename": "ctd_bgc_po4.nc", }, "phdata": { "dataset_id": "cmems_mod_glo_bgc-car_anfc_0.25deg_P1D-m", @@ -268,17 +268,17 @@ def _fetch(path: str | Path, username: str | None, password: str | None) -> None "phytoplanktondata": { "dataset_id": "cmems_mod_glo_bgc-pft_anfc_0.25deg_P1D-m", "variables": ["phyc"], - "output_filename": "ctd_bgc_phytoplankton.nc", + "output_filename": "ctd_bgc_phyc.nc", }, "zooplanktondata": { "dataset_id": "cmems_mod_glo_bgc-plankton_anfc_0.25deg_P1D-m", "variables": ["zooc"], - "output_filename": "ctd_bgc_zooplankton.nc", + "output_filename": "ctd_bgc_zooc.nc", }, "primaryproductiondata": { "dataset_id": "cmems_mod_glo_bgc-bio_anfc_0.25deg_P1D-m", "variables": ["nppv"], - "output_filename": "ctd_bgc_primary_production.nc", + "output_filename": "ctd_bgc_nppv.nc", }, } diff --git a/src/virtualship/expedition/input_data.py b/src/virtualship/expedition/input_data.py index 08380429..921daeda 100644 --- a/src/virtualship/expedition/input_data.py +++ b/src/virtualship/expedition/input_data.py @@ -137,13 +137,13 @@ def _load_ctd_bgc_fieldset(cls, directory: Path) -> FieldSet: "U": directory.joinpath("ship_uv.nc"), "V": directory.joinpath("ship_uv.nc"), "o2": directory.joinpath("ctd_bgc_o2.nc"), - "chl": directory.joinpath("ctd_bgc_chloro.nc"), - "no3": directory.joinpath("ctd_bgc_nitrate.nc"), - "po4": directory.joinpath("ctd_bgc_phosphate.nc"), + "chl": directory.joinpath("ctd_bgc_chl.nc"), + "no3": directory.joinpath("ctd_bgc_no3.nc"), + "po4": directory.joinpath("ctd_bgc_po4.nc"), "ph": directory.joinpath("ctd_bgc_ph.nc"), - "phyc": directory.joinpath("ctd_bgc_phytoplankton.nc"), - "zooc": directory.joinpath("ctd_bgc_zooplankton.nc"), - "nppv": directory.joinpath("ctd_bgc_primary_production.nc"), + "phyc": directory.joinpath("ctd_bgc_phyc.nc"), + "zooc": directory.joinpath("ctd_bgc_zooc.nc"), + "nppv": directory.joinpath("ctd_bgc_nppv.nc"), } variables = { "U": "uo", diff --git a/tests/expedition/expedition_dir/input_data/ctd_bgc_chloro.nc b/tests/expedition/expedition_dir/input_data/ctd_bgc_chl.nc similarity index 100% rename from tests/expedition/expedition_dir/input_data/ctd_bgc_chloro.nc rename to tests/expedition/expedition_dir/input_data/ctd_bgc_chl.nc diff --git a/tests/expedition/expedition_dir/input_data/ctd_bgc_nitrate.nc b/tests/expedition/expedition_dir/input_data/ctd_bgc_no3.nc similarity index 100% rename from tests/expedition/expedition_dir/input_data/ctd_bgc_nitrate.nc rename to tests/expedition/expedition_dir/input_data/ctd_bgc_no3.nc diff --git a/tests/expedition/expedition_dir/input_data/ctd_bgc_primary_production.nc b/tests/expedition/expedition_dir/input_data/ctd_bgc_nppv.nc similarity index 100% rename from tests/expedition/expedition_dir/input_data/ctd_bgc_primary_production.nc rename to tests/expedition/expedition_dir/input_data/ctd_bgc_nppv.nc diff --git a/tests/expedition/expedition_dir/input_data/ctd_bgc_phytoplankton.nc b/tests/expedition/expedition_dir/input_data/ctd_bgc_phyc.nc similarity index 100% rename from tests/expedition/expedition_dir/input_data/ctd_bgc_phytoplankton.nc rename to tests/expedition/expedition_dir/input_data/ctd_bgc_phyc.nc diff --git a/tests/expedition/expedition_dir/input_data/ctd_bgc_phosphate.nc b/tests/expedition/expedition_dir/input_data/ctd_bgc_po4.nc similarity index 100% rename from tests/expedition/expedition_dir/input_data/ctd_bgc_phosphate.nc rename to tests/expedition/expedition_dir/input_data/ctd_bgc_po4.nc diff --git a/tests/expedition/expedition_dir/input_data/ctd_bgc_zooplankton.nc b/tests/expedition/expedition_dir/input_data/ctd_bgc_zooc.nc similarity index 100% rename from tests/expedition/expedition_dir/input_data/ctd_bgc_zooplankton.nc rename to tests/expedition/expedition_dir/input_data/ctd_bgc_zooc.nc