def test_retrieval_runs(): """ """ mwi = ICI(stokes_dimension = 1) mwi.name = "mwi" mwi.f_grid = np.array([19e9, 35e9, 89e9, 118e9]) mwi.sensor_line_of_sight = np.array([[135.0]]) mwi.sensor_position = np.array([[600e3]]) simulation = setup_retrieval_simulation(retrieval_type = "passive", scattering = False) simulation._sensors += [mwi] def get_o2(self): return 0.2091 * np.ones(21) data_provider = DataProvider() simulation.data_provider = data_provider simulation.setup() simulation.run() data_provider.get_O2 = get_o2.__get__(data_provider) # H2O a priori h2o_a_priori = FixedAPriori("H2O", 0.5, Diagonal(0.01)) data_provider.add(h2o_a_priori) # O2 a priori o2_a_priori = FixedAPriori("O2", 1.0, Diagonal(0.001)) data_provider.add(o2_a_priori) # observation error a priori n = 0 for s in simulation.sensors: n += s.f_grid.size * s.stokes_dimension measurement_a_priori = IndependentMeasurementErrors(n, 1.0) data_provider.add(measurement_a_priori) h2o = simulation.atmosphere.absorbers[-1] simulation.retrieval.add(h2o) h2o.retrieval.unit = RelativeHumidity() o2 = simulation.atmosphere.absorbers[0] simulation.retrieval.add(o2) o2.retrieval.unit = Relative(0.2091 * np.ones((21, 1, 1))) y = np.copy(simulation.workspace.y) simulation.retrieval.y = y def remove_mwi_o2(retrieval_run): retrieval_run.sensors = retrieval_run.sensors[:1] retrieval_run.retrieval_quantities = retrieval_run.retrieval_quantities[:1] simulation.retrieval.callbacks = [remove_mwi_o2, None] simulation.setup() simulation.run() return simulation.workspace.x.value
def test_simulation_telsem(): atmosphere = Atmosphere1D(absorbers=[O2(), N2(), H2O()], surface=Telsem("/home/simon/Downloads")) mwi = MWI() mwi.sensor_line_of_sight = np.array([[135.0]]) mwi.sensor_position = np.array([[600e3]]) data_provider = DataProvider() data_provider.surface_temperature = 280.0 * np.ones((1, 1)) data_provider.latitude = 58.0 data_provider.longitude = 12.0 simulation = ArtsSimulation(atmosphere=atmosphere, data_provider=data_provider, sensors=[mwi]) simulation.setup() simulation.run()
def test_simulation_scattering_combined(scattering_solver): ice = ScatteringSpecies("ice", D14(-1.0, 2.0), scattering_data = scattering_data, scattering_meta_data = scattering_meta) ice.psd.t_min = 0.0 ice.psd.t_max = 275.0 ici = ICI(channel_indices = [0, -1], stokes_dimension = 1) ici.sensor_line_of_sight = np.array([[135.0]]) ici.sensor_position = np.array([[600e3]]) cs = CloudSat(stokes_dimension = 1) cs.range_bins = np.linspace(0, 30e3, 31) cs.sensor_line_of_sight = np.array([[135.0]]) cs.sensor_position = np.array([[600e3]]) atmosphere = Atmosphere1D(absorbers = [O2(), N2(), H2O()], scatterers = [ice], surface = Tessem()) simulation = ArtsSimulation(atmosphere = atmosphere, data_provider = DataProvider(), sensors = [ici, cs]) simulation.scattering_solver = scattering_solver() simulation.setup() simulation.run() y = np.copy(simulation.workspace.y) return y
def test_masks(): data_provider = DataProvider() temperature = data_provider.get_temperature() temperature_mask = TemperatureMask(lower_limit=230.0, upper_limit=280.0) mask = temperature_mask(data_provider) assert (np.all(temperature[mask] >= 230)) assert (np.all(temperature[mask] < 280)) tropopause_mask = TropopauseMask() mask = tropopause_mask(data_provider) assert (np.all(temperature[mask]) <= 225) mask = And(temperature_mask, tropopause_mask)(data_provider) assert (np.all(temperature[mask] >= 230)) assert (np.all(temperature[mask] < 280)) assert (np.all(temperature[mask]) <= 225)
def test_covariances(): data_provider = DataProvider() z = data_provider.get_altitude() diagonal = Diagonal(2) diag = diagonal.get_covariance(data_provider) assert (np.all(np.isclose(diag.diagonal(), 2.0 * np.ones(z.size)))) gauss = SpatialCorrelation(diagonal, 1000.0) covmat = gauss.get_covariance(data_provider) assert (np.all(np.isclose(covmat.diagonal(), 2.0 * np.ones(z.size)))) temperature_mask = TemperatureMask(lower_limit=230.0, upper_limit=280.0) thik = Thikhonov(scaling=1.0, z_scaling=False, mask=temperature_mask) precmat = thik.get_precision(data_provider) mask = np.logical_not(temperature_mask(data_provider)) assert (np.all(precmat.diagonal()[mask] >= 1e12)) mask2 = np.logical_not(mask)[2:-2] assert (np.all(precmat.diagonal()[2:-2][mask2] == 6))
def test_scattering_retrieval_active(): simulation = setup_retrieval_simulation(retrieval_type = "active", scattering = True) data_provider = DataProvider() simulation.data_provider = data_provider simulation.setup() simulation.run() y = np.copy(simulation.workspace.y) ice = simulation.atmosphere.scatterers[0] simulation.retrieval.add(ice.mass_density) ice.mass_density.limit_low = 1e-6 simulation.retrieval.settings["max_iter"] = 5 ice.mass_density.transformation = Log10() # Ice a priori ice_a_priori = FixedAPriori("ice_mass_density", -6, Diagonal(2.0)) data_provider.add(ice_a_priori) # Observation error a priori n = simulation.sensors[0].range_bins.size - 1 measurement_a_priori = IndependentMeasurementErrors(n, 1.0) data_provider.add(measurement_a_priori) simulation.retrieval.y = y simulation.setup() simulation.run() return simulation.workspace
def test_simulation_absorption_retrieval(): """ This test runs a passive clearsky water vapor retrieval retrieving relative humidity. """ simulation = setup_retrieval_simulation(retrieval_type = "passive", scattering = False) data_provider = DataProvider() simulation.data_provider = data_provider simulation.setup() simulation.run() # H2O a priori h2o_a_priori = FixedAPriori("H2O", 0.5, Diagonal(0.01)) data_provider.add(h2o_a_priori) n = simulation.sensors[0].f_grid.size * simulation.sensors[0].stokes_dimension measurement_a_priori = IndependentMeasurementErrors(n, 1.0) data_provider.add(measurement_a_priori) h2o = simulation.atmosphere.absorbers[-1] y = np.copy(simulation.workspace.y) simulation.retrieval.add(h2o) h2o.retrieval.unit = RelativeHumidity() simulation.retrieval.y = y simulation.setup() simulation.run() return simulation.workspace.x.value
def test_scattering_retrieval_passive(): simulation = setup_retrieval_simulation(retrieval_type = "passive", scattering = True) data_provider = DataProvider() simulation.data_provider = data_provider simulation.setup() simulation.run() y = np.copy(simulation.workspace.y) ice = simulation.atmosphere.scatterers[0] simulation.retrieval.add(ice.mass_density) ice.mass_density.transformation = Log10() ice.mass_density.limit_low = -10 simulation.retrieval.settings["max_iter"] = 1 ice_a_priori = FixedAPriori("ice_mass_density", -6, Diagonal(2.0)) data_provider.add(ice_a_priori) n = simulation.sensors[0].f_grid.size * simulation.sensors[0].stokes_dimension measurement_a_priori = IndependentMeasurementErrors(n, 1.0) data_provider.add(measurement_a_priori) simulation.retrieval.y = y simulation.setup() simulation.run() return simulation.workspace
def test_scattering_combined_retrieval(): simulation = setup_retrieval_simulation(retrieval_type = "combined", scattering = True) data_provider = DataProvider() simulation.data_provider = data_provider simulation.sensors[1].stokes_dimension = 1 simulation.setup() # Forward simulation simulation.run() y = np.copy(simulation.workspace.y) ice = simulation.atmosphere.scatterers[0] simulation.retrieval.add(ice.mass_density) simulation.retrieval.add(ice.mass_weighted_diameter) ice.mass_density.retrieval.limit_low = -10 ice.mass_density.transformation = Log10() ice.mass_weighted_diameter.retrieval.limit_low = -6 ice.mass_weighted_diameter.transformation = Log10() # Ice a prioris ice_a_priori = FixedAPriori("ice_mass_density", -6, Diagonal(2.0)) data_provider.add(ice_a_priori) ice_a_priori = FixedAPriori("ice_mass_weighted_diameter", -3, Diagonal(2.0)) data_provider.add(ice_a_priori) # Observation errors n = simulation.sensors[0].range_bins.size - 1 n += simulation.sensors[1].f_grid.size * simulation.sensors[1].stokes_dimension measurement_a_priori = IndependentMeasurementErrors(n, 1.0) data_provider.add(measurement_a_priori) print(ice.mass_density.transformation) simulation.retrieval.settings["max_iter"] = 1 simulation.retrieval.y = y # Retrieval simulation.workspace.x = [] simulation.run() y_f = np.copy(simulation.workspace.yf.value) x = np.copy(simulation.workspace.x.value) return simulation
def test_data_provider_a_priori(): temperature_mask = TemperatureMask(lower_limit=230.0, upper_limit=280.0) tropopause_mask = TropopauseMask() covariance = Diagonal(2.0, And(temperature_mask, tropopause_mask)) data_provider = DataProvider() data_provider.add(DataProviderAPriori("temperature", covariance)) t = data_provider.get_temperature() assert (np.all(data_provider.get_temperature_xa() == t))
def test_simulation_combined(): surface_1 = Tessem() surface_2 = Telsem("/home/simon/Downloads") surface = CombinedSurface(surface_1, surface_2) atmosphere = Atmosphere1D(absorbers=[O2(), N2(), H2O()], surface=surface) mwi = MWI() mwi.sensor_line_of_sight = np.array([[135.0]]) mwi.sensor_position = np.array([[600e3]]) data_provider = DataProvider() data_provider.surface_temperature = 280.0 * np.ones((1, 1)) data_provider.surface_latitude = 58.0 data_provider.surface_longitude = 12.0 data_provider.surface_type = 0.0 simulation = ArtsSimulation(atmosphere=atmosphere, data_provider=data_provider, sensors=[mwi]) simulation.setup() simulation.run() y = np.copy(mwi.y) atmosphere_r = Atmosphere1D(absorbers=[O2(), N2(), H2O()], surface=surface_1) simulation_r = ArtsSimulation(atmosphere=atmosphere_r, data_provider=data_provider, sensors=[mwi]) simulation_r.setup() simulation_r.run() y_r = np.copy(mwi.y) assert (np.allclose(y, y_r)) data_provider.surface_type = 1.0 simulation.setup() simulation.run() y = np.copy(mwi.y) atmosphere_r = Atmosphere1D(absorbers=[O2(), N2(), H2O()], surface=surface_2) simulation_r = ArtsSimulation(atmosphere=atmosphere_r, data_provider=data_provider, sensors=[mwi]) simulation_r.setup() simulation_r.run() y_r = np.copy(mwi.y) assert (np.allclose(y, y_r))
def test_functional_a_priori(): temperature_mask = TemperatureMask(lower_limit=230.0, upper_limit=280.0) tropopause_mask = TropopauseMask() covariance = Diagonal(2.0, And(temperature_mask, tropopause_mask)) covariance_new = Diagonal(2.0 * np.ones(10)) data_provider = DataProvider() t = data_provider.get_temperature() f = lambda x: x**2 a_priori = FunctionalAPriori("temperature", "temperature", f, covariance) data_provider.add(a_priori) assert (np.all(np.isclose(t**2, data_provider.get_temperature_xa())))
def test_simulation_tessem(): atmosphere = Atmosphere1D(absorbers=[O2(), N2(), H2O()], surface=Tessem()) mwi = MWI() mwi.sensor_line_of_sight = np.array([[135.0]]) mwi.sensor_position = np.array([[600e3]]) simulation = ArtsSimulation(atmosphere=atmosphere, data_provider=DataProvider(), sensors=[mwi]) simulation.setup() simulation.run() y1 = np.copy(mwi.y) simulation.run() y2 = np.copy(mwi.y) assert (np.all(np.isclose(y1, y2)))
def test_simulation_absorption_jacobian(): atmosphere = Atmosphere1D(absorbers = [O2(), N2(), H2O()], surface = Tessem()) o2, n2, h2o = atmosphere.absorbers ici = ICI(channel_indices = [0, -1]) ici.sensor_line_of_sight = np.array([[135.0]]) ici.sensor_position = np.array([[600e3]]) simulation = ArtsSimulation(atmosphere = atmosphere, data_provider = DataProvider(), sensors = [ici]) simulation.jacobian.add(o2) simulation.jacobian.add(n2) simulation.jacobian.add(h2o) simulation.setup() simulation.run() return np.copy(simulation.workspace.jacobian.value)
def test_simulation_multiview(): atmosphere = Atmosphere1D(absorbers = [O2(), N2(), H2O()], surface = Tessem()) lines_of_sight = np.array([[135.0], [180.0]]) positions = np.array([[600e3], [600e3]]) ici = ICI(lines_of_sight=lines_of_sight, positions=positions) simulation = ArtsSimulation(atmosphere = atmosphere, data_provider = DataProvider(), sensors = [ici]) simulation.setup() simulation.run() y = np.copy(ici.y) assert(y.shape[0] == 2)
def test_simulation_scattering(scattering_solver): ice = ScatteringSpecies("ice", D14(-1.0, 2.0), scattering_data = scattering_data, scattering_meta_data = scattering_meta) ice.psd.t_min = 0.0 ice.psd.t_max = 275.0 atmosphere = Atmosphere1D(absorbers = [O2(), N2(), H2O()], scatterers = [ice], surface = Tessem()) ici = ICI(stokes_dimension = 1, channel_indices = [1, -1]) ici.sensor_line_of_sight = np.array([[135.0]]) ici.sensor_position = np.array([[600e3]]) simulation = ArtsSimulation(atmosphere = atmosphere, data_provider = DataProvider(), sensors = [ici]) simulation.scattering_solver = scattering_solver() simulation.setup() simulation.run()
def test_simulation_scattering_jacobian(): ice = ScatteringSpecies("ice", D14(-1.0, 2.0), scattering_data = scattering_data, scattering_meta_data = scattering_meta) ice.psd.t_min = 0.0 ice.psd.t_max = 275.0 atmosphere = Atmosphere1D(absorbers = [O2(), N2(), H2O()], scatterers = [ice], surface = Tessem()) ici = ICI(channel_indices = [1, -1]) ici.sensor_line_of_sight = np.array([[135.0]]) ici.sensor_position = np.array([[600e3]]) simulation = ArtsSimulation(atmosphere = atmosphere, data_provider = DataProvider(), sensors = [ici]) simulation.jacobian.add(ice.mass_density) simulation.setup() simulation.run() print(simulation.workspace.particle_bulkprop_field.value) return np.copy(simulation.workspace.jacobian.value)
def test_reduced_grid_a_priori(): tropopause_mask = TropopauseMask() temperature_mask = TemperatureMask(lower_limit=230.0, upper_limit=280.0) covariance = Diagonal(2.0, And(temperature_mask, tropopause_mask)) covariance_new = Diagonal(2.0 * np.ones(10)) data_provider = DataProvider() t = data_provider.get_temperature() a_priori = FixedAPriori("temperature", t, covariance) a_priori = ReducedVerticalGrid(a_priori, np.logspace(3, 5, 10)[::-1]) data_provider.add(a_priori) t_xa = data_provider.get_temperature_xa() assert (t_xa.size == 10) covmat = data_provider.get_temperature_covariance() assert (covmat.shape == (10, 10)) data_provider = DataProvider() a_priori = ReducedVerticalGrid(a_priori, np.logspace(3, 5, 10)[::-1], covariance=covariance_new) data_provider.add(a_priori) covmat = data_provider.get_temperature_covariance() assert (np.all(covmat.diagonal() == 2.0))
data_provider = DataProvider(), sensors = [cs]) simulation.setup() simulation.run() y = np.copy(cs.y) assert(y.shape[0] == 2) assert(y.shape[-1] == 2) ice = ScatteringSpecies("ice", D14(-1.0, 2.0), scattering_data = scattering_data, scattering_meta_data = scattering_meta) ice.psd.t_min = 0.0 ice.psd.t_max = 275.0 atmosphere = Atmosphere1D(absorbers = [O2(), N2(), H2O()], scatterers = [], surface = Tessem()) ici = ICI(stokes_dimension = 1, channel_indices = [1, -1]) ici.sensor_line_of_sight = np.array([[135.0]]) ici.sensor_position = np.array([[600e3]]) simulation = ArtsSimulation(atmosphere = atmosphere, data_provider = DataProvider(), sensors = [ici]) simulation.scattering_solver = RT4() simulation.setup() for i in range(100): simulation.run()