22
33from __future__ import annotations
44
5+ import logging
56from datetime import timedelta
67from pathlib import Path
78from typing import TYPE_CHECKING
89
10+ from yaspin import yaspin
11+
912from virtualship .instruments .adcp import simulate_adcp
1013from virtualship .instruments .argo_float import simulate_argo_floats
1114from virtualship .instruments .ctd import simulate_ctd
1417from virtualship .instruments .ship_underwater_st import simulate_ship_underwater_st
1518from virtualship .instruments .xbt import simulate_xbt
1619from virtualship .models import ShipConfig
20+ from virtualship .utils import ship_spinner
1721
1822from .simulate_schedule import MeasurementsToSimulate
1923
2024if TYPE_CHECKING :
2125 from .input_data import InputData
2226
27+ # parcels logger (suppress INFO messages to prevent log being flooded)
28+ external_logger = logging .getLogger ("parcels.tools.loggers" )
29+ external_logger .setLevel (logging .WARNING )
30+
2331
2432def simulate_measurements (
2533 expedition_dir : str | Path ,
@@ -42,61 +50,91 @@ def simulate_measurements(
4250 expedition_dir = Path (expedition_dir )
4351
4452 if len (measurements .ship_underwater_sts ) > 0 :
45- print ("Simulating onboard salinity and temperature measurements." )
4653 if ship_config .ship_underwater_st_config is None :
4754 raise RuntimeError ("No configuration for ship underwater ST provided." )
4855 if input_data .ship_underwater_st_fieldset is None :
4956 raise RuntimeError ("No fieldset for ship underwater ST provided." )
50- simulate_ship_underwater_st (
51- fieldset = input_data .ship_underwater_st_fieldset ,
52- out_path = expedition_dir .joinpath ("results" , "ship_underwater_st.zarr" ),
53- depth = - 2 ,
54- sample_points = measurements .ship_underwater_sts ,
55- )
57+ with yaspin (
58+ text = "Simulating onboard temperature and salinity measurements... " ,
59+ side = "right" ,
60+ spinner = ship_spinner ,
61+ ) as spinner :
62+ simulate_ship_underwater_st (
63+ fieldset = input_data .ship_underwater_st_fieldset ,
64+ out_path = expedition_dir .joinpath ("results" , "ship_underwater_st.zarr" ),
65+ depth = - 2 ,
66+ sample_points = measurements .ship_underwater_sts ,
67+ )
68+ spinner .ok ("✅" )
5669
5770 if len (measurements .adcps ) > 0 :
58- print ("Simulating onboard ADCP." )
5971 if ship_config .adcp_config is None :
6072 raise RuntimeError ("No configuration for ADCP provided." )
6173 if input_data .adcp_fieldset is None :
6274 raise RuntimeError ("No fieldset for ADCP provided." )
63- simulate_adcp (
64- fieldset = input_data .adcp_fieldset ,
65- out_path = expedition_dir .joinpath ("results" , "adcp.zarr" ),
66- max_depth = ship_config .adcp_config .max_depth_meter ,
67- min_depth = - 5 ,
68- num_bins = ship_config .adcp_config .num_bins ,
69- sample_points = measurements .adcps ,
70- )
75+ with yaspin (
76+ text = "Simulating onboard ADCP... " , side = "right" , spinner = ship_spinner
77+ ) as spinner :
78+ simulate_adcp (
79+ fieldset = input_data .adcp_fieldset ,
80+ out_path = expedition_dir .joinpath ("results" , "adcp.zarr" ),
81+ max_depth = ship_config .adcp_config .max_depth_meter ,
82+ min_depth = - 5 ,
83+ num_bins = ship_config .adcp_config .num_bins ,
84+ sample_points = measurements .adcps ,
85+ )
86+ spinner .ok ("✅" )
7187
7288 if len (measurements .ctds ) > 0 :
73- print ("Simulating CTD casts." )
7489 if ship_config .ctd_config is None :
7590 raise RuntimeError ("No configuration for CTD provided." )
7691 if input_data .ctd_fieldset is None :
7792 raise RuntimeError ("No fieldset for CTD provided." )
78- simulate_ctd (
79- out_path = expedition_dir .joinpath ("results" , "ctd.zarr" ),
80- fieldset = input_data .ctd_fieldset ,
81- ctds = measurements .ctds ,
82- outputdt = timedelta (seconds = 10 ),
83- )
93+ with yaspin (
94+ text = "Simulating CTD casts... " , side = "right" , spinner = ship_spinner
95+ ) as spinner :
96+ simulate_ctd (
97+ out_path = expedition_dir .joinpath ("results" , "ctd.zarr" ),
98+ fieldset = input_data .ctd_fieldset ,
99+ ctds = measurements .ctds ,
100+ outputdt = timedelta (seconds = 10 ),
101+ )
102+ spinner .ok ("✅" )
84103
85104 if len (measurements .ctd_bgcs ) > 0 :
86- print ("Simulating BGC CTD casts." )
87105 if ship_config .ctd_bgc_config is None :
88106 raise RuntimeError ("No configuration for CTD_BGC provided." )
89107 if input_data .ctd_bgc_fieldset is None :
90108 raise RuntimeError ("No fieldset for CTD_BGC provided." )
91- simulate_ctd_bgc (
92- out_path = expedition_dir .joinpath ("results" , "ctd_bgc.zarr" ),
93- fieldset = input_data .ctd_bgc_fieldset ,
94- ctd_bgcs = measurements .ctd_bgcs ,
95- outputdt = timedelta (seconds = 10 ),
96- )
109+ with yaspin (
110+ text = "Simulating BGC CTD casts... " , side = "right" , spinner = ship_spinner
111+ ) as spinner :
112+ simulate_ctd_bgc (
113+ out_path = expedition_dir .joinpath ("results" , "ctd_bgc.zarr" ),
114+ fieldset = input_data .ctd_bgc_fieldset ,
115+ ctd_bgcs = measurements .ctd_bgcs ,
116+ outputdt = timedelta (seconds = 10 ),
117+ )
118+ spinner .ok ("✅" )
119+
120+ if len (measurements .xbts ) > 0 :
121+ if ship_config .xbt_config is None :
122+ raise RuntimeError ("No configuration for XBTs provided." )
123+ if input_data .xbt_fieldset is None :
124+ raise RuntimeError ("No fieldset for XBTs provided." )
125+ with yaspin (
126+ text = "Simulating XBTs... " , side = "right" , spinner = ship_spinner
127+ ) as spinner :
128+ simulate_xbt (
129+ out_path = expedition_dir .joinpath ("results" , "xbts.zarr" ),
130+ fieldset = input_data .xbt_fieldset ,
131+ xbts = measurements .xbts ,
132+ outputdt = timedelta (seconds = 1 ),
133+ )
134+ spinner .ok ("✅" )
97135
98136 if len (measurements .drifters ) > 0 :
99- print ("Simulating drifters" )
137+ print ("Simulating drifters... " )
100138 if ship_config .drifter_config is None :
101139 raise RuntimeError ("No configuration for drifters provided." )
102140 if input_data .drifter_fieldset is None :
@@ -111,7 +149,7 @@ def simulate_measurements(
111149 )
112150
113151 if len (measurements .argo_floats ) > 0 :
114- print ("Simulating argo floats" )
152+ print ("Simulating argo floats... " )
115153 if ship_config .argo_float_config is None :
116154 raise RuntimeError ("No configuration for argo floats provided." )
117155 if input_data .argo_float_fieldset is None :
@@ -123,16 +161,3 @@ def simulate_measurements(
123161 outputdt = timedelta (minutes = 5 ),
124162 endtime = None ,
125163 )
126-
127- if len (measurements .xbts ) > 0 :
128- print ("Simulating XBTs" )
129- if ship_config .xbt_config is None :
130- raise RuntimeError ("No configuration for XBTs provided." )
131- if input_data .xbt_fieldset is None :
132- raise RuntimeError ("No fieldset for XBTs provided." )
133- simulate_xbt (
134- out_path = expedition_dir .joinpath ("results" , "xbts.zarr" ),
135- fieldset = input_data .xbt_fieldset ,
136- xbts = measurements .xbts ,
137- outputdt = timedelta (seconds = 1 ),
138- )
0 commit comments