From d3dcaa612171690dbcbb1e627e18738fc0a1f3e9 Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Mon, 10 Jun 2024 18:19:23 +0200 Subject: [PATCH 1/8] Add option for the user to provide initial time window size of the micro simulation --- docs/configuration.md | 4 +- .../micro-manager-cpp-adaptivity-config.json | 3 +- examples/micro-manager-cpp-config.json | 3 +- ...icro-manager-python-adaptivity-config.json | 3 +- examples/micro-manager-python-config.json | 3 +- micro_manager/config.py | 14 ++++++ micro_manager/micro_manager.py | 47 ++++++++++--------- micro_manager/micro_manager_base.py | 2 + ...ger-config-global-adaptivity-parallel.json | 3 +- ...icro-manager-config-global-adaptivity.json | 3 +- ...micro-manager-config-local-adaptivity.json | 3 +- .../micro-manager-config-parallel-1.json | 3 +- .../micro-manager-config-parallel-2.json | 3 +- 13 files changed, 63 insertions(+), 31 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index d2243f29..873531ce 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -16,7 +16,8 @@ The Micro Manager is configured with a JSON file. An example configuration file "config_file_name": "precice-config.xml", "macro_mesh_name": "macro-mesh", "read_data_names": {"temperature": "scalar", "heat-flux": "vector"}, - "write_data_names": {"porosity": "scalar", "conductivity": "vector"} + "write_data_names": {"porosity": "scalar", "conductivity": "vector"}, + "micro_time_window_size": 1.0 }, "simulation_params": { "macro_domain_bounds": [0.0, 1.0, 0.0, 1.0, 0.0, 1.0], @@ -41,6 +42,7 @@ Parameter | Description `macro_mesh_name` | Name of the macro mesh as stated in the preCICE configuration. `read_data_names` | A Python dictionary with the names of the data to be read from preCICE as keys and `"scalar"` or `"vector"` as values depending on the nature of the data. `write_data_names` | A Python dictionary with the names of the data to be written to preCICE as keys and `"scalar"` or `"vector"` as values depending on the nature of the data. +`micro_time_window_size` | Initial time window size (dt) of the micro simulation. ## Simulation Parameters diff --git a/examples/micro-manager-cpp-adaptivity-config.json b/examples/micro-manager-cpp-adaptivity-config.json index c657d11c..7d1644c2 100644 --- a/examples/micro-manager-cpp-adaptivity-config.json +++ b/examples/micro-manager-cpp-adaptivity-config.json @@ -4,7 +4,8 @@ "config_file_name": "precice-config-adaptivity.xml", "macro_mesh_name": "macro-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, - "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"} + "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, + "micro_time_window_size": 1.0 }, "simulation_params": { "macro_domain_bounds": [0.0, 25.0, 0.0, 25.0, 0.0, 25.0], diff --git a/examples/micro-manager-cpp-config.json b/examples/micro-manager-cpp-config.json index 3114de7f..33a87d02 100644 --- a/examples/micro-manager-cpp-config.json +++ b/examples/micro-manager-cpp-config.json @@ -4,7 +4,8 @@ "config_file_name": "precice-config.xml", "macro_mesh_name": "macro-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, - "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"} + "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, + "micro_time_window_size": 1.0 }, "simulation_params": { "macro_domain_bounds": [0.0, 25.0, 0.0, 25.0, 0.0, 25.0] diff --git a/examples/micro-manager-python-adaptivity-config.json b/examples/micro-manager-python-adaptivity-config.json index 3a81d828..f3ad55a2 100644 --- a/examples/micro-manager-python-adaptivity-config.json +++ b/examples/micro-manager-python-adaptivity-config.json @@ -4,7 +4,8 @@ "config_file_name": "precice-config-adaptivity.xml", "macro_mesh_name": "macro-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, - "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"} + "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, + "micro_time_window_size": 1.0 }, "simulation_params": { "macro_domain_bounds": [0.0, 25.0, 0.0, 25.0, 0.0, 25.0], diff --git a/examples/micro-manager-python-config.json b/examples/micro-manager-python-config.json index e59ec20c..2d581d06 100644 --- a/examples/micro-manager-python-config.json +++ b/examples/micro-manager-python-config.json @@ -4,7 +4,8 @@ "config_file_name": "precice-config.xml", "macro_mesh_name": "macro-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, - "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"} + "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, + "micro_time_window_size": 1.0 }, "simulation_params": { "macro_domain_bounds": [0.0, 25.0, 0.0, 25.0, 0.0, 25.0] diff --git a/micro_manager/config.py b/micro_manager/config.py index 4024b059..e44b5df2 100644 --- a/micro_manager/config.py +++ b/micro_manager/config.py @@ -30,6 +30,7 @@ def __init__(self, logger, config_filename): self._macro_mesh_name = None self._read_data_names = dict() self._write_data_names = dict() + self._micro_time_window = None self._macro_domain_bounds = None self._ranks_per_axis = None @@ -123,6 +124,8 @@ def read_json(self, config_filename): "Domain decomposition is not specified, so the Micro Manager will expect to be run in serial." ) + self._micro_time_window = data["simulation_params"]["micro_time_window_size"] + try: if data["simulation_params"]["adaptivity"] == "True": self._adaptivity = True @@ -431,3 +434,14 @@ def is_adaptivity_required_in_every_implicit_iteration(self): True if adaptivity needs to be calculated in every time iteration, False otherwise. """ return self._adaptivity_every_implicit_iteration + + def get_micro_time_window(self): + """ + Get the size of the micro time window. + + Returns + ------- + micro_time_window : float + Size of the micro time window. + """ + return self._micro_time_window diff --git a/micro_manager/micro_manager.py b/micro_manager/micro_manager.py index e18c3827..b933be83 100644 --- a/micro_manager/micro_manager.py +++ b/micro_manager/micro_manager.py @@ -70,7 +70,6 @@ def __init__(self, config_file: str) -> None: self._crash_threshold = 0.2 self._number_of_nearest_neighbors = 4 - self._dt = 0 self._mesh_vertex_ids = None # IDs of macro vertices as set by preCICE self._micro_n_out = self._config.get_micro_output_n() @@ -117,6 +116,8 @@ def solve(self) -> None: sim_is_associated_to_cp = None sim_states_cp = [None] * self._local_number_of_sims + dt = min(self._participant.get_max_time_step_size(), self._micro_dt) + if self._is_adaptivity_on: similarity_dists = np.zeros( ( @@ -140,7 +141,7 @@ def solve(self) -> None: is_sim_active, sim_is_associated_to, ) = self._adaptivity_controller.compute_adaptivity( - self._dt, + dt, self._micro_sims, similarity_dists, is_sim_active, @@ -150,9 +151,7 @@ def solve(self) -> None: while self._participant.is_coupling_ongoing(): - self._dt = ( - self._participant.get_max_time_step_size() - ) # ask preCICE at beginning of time step for allowed time step size + dt = min(self._participant.get_max_time_step_size(), self._micro_dt) # Write a checkpoint if self._participant.requires_writing_checkpoint(): @@ -168,7 +167,7 @@ def solve(self) -> None: is_sim_active, sim_is_associated_to, ) = self._adaptivity_controller.compute_adaptivity( - self._dt, + dt, self._micro_sims, similarity_dists, is_sim_active, @@ -206,7 +205,7 @@ def solve(self) -> None: is_sim_active, sim_is_associated_to, ) = self._adaptivity_controller.compute_adaptivity( - self._dt, + dt, self._micro_sims, similarity_dists, is_sim_active, @@ -230,10 +229,10 @@ def solve(self) -> None: self._micro_sims_active_steps[active_id] += 1 micro_sims_output = self._solve_micro_simulations_with_adaptivity( - micro_sims_input, is_sim_active, sim_is_associated_to + micro_sims_input, is_sim_active, sim_is_associated_to, dt ) else: - micro_sims_output = self._solve_micro_simulations(micro_sims_input) + micro_sims_output = self._solve_micro_simulations(micro_sims_input, dt) # Check if more than a certain percentage of the micro simulations have crashed and terminate if threshold is exceeded crashed_sims_on_all_ranks = np.zeros(self._size, dtype=np.int64) @@ -257,11 +256,11 @@ def solve(self) -> None: self._write_data_to_precice(micro_sims_output) - t += self._dt # increase internal time when time step is done. + t += dt # increase internal time when time step is done. n += 1 # increase counter self._participant.advance( - self._dt - ) # notify preCICE that time step of size self._dt is complete + dt + ) # notify preCICE that time step of size dt is complete # Revert micro simulations to their last checkpoints if required if self._participant.requires_reading_checkpoint(): @@ -556,16 +555,19 @@ def initialize(self) -> None: ): self._micro_sims_have_output = True - self._dt = self._participant.get_max_time_step_size() - # *************** # Private methods # *************** - def _read_data_from_precice(self) -> list: + def _read_data_from_precice(self, dt) -> list: """ Read data from preCICE. + Parameters + ---------- + dt : float + Time step size at which data is to be read from preCICE. + Returns ------- local_read_data : list @@ -579,7 +581,7 @@ def _read_data_from_precice(self) -> list: read_data.update( { name: self._participant.read_data( - self._macro_mesh_name, name, self._mesh_vertex_ids, self._dt + self._macro_mesh_name, name, self._mesh_vertex_ids, dt ) } ) @@ -621,7 +623,7 @@ def _write_data_to_precice(self, data: list) -> None: self._macro_mesh_name, dname, [], np.array([]) ) - def _solve_micro_simulations(self, micro_sims_input: list) -> list: + def _solve_micro_simulations(self, micro_sims_input: list, dt: float) -> list: """ Solve all micro simulations and assemble the micro simulations outputs in a list of dicts format. @@ -630,6 +632,8 @@ def _solve_micro_simulations(self, micro_sims_input: list) -> list: micro_sims_input : list List of dicts in which keys are names of data and the values are the data which are required inputs to solve a micro simulation. + dt : float + Time step size. Returns ------- @@ -645,9 +649,7 @@ def _solve_micro_simulations(self, micro_sims_input: list) -> list: # Attempt to solve the micro simulation try: start_time = time.time() - micro_sims_output[count] = sim.solve( - micro_sims_input[count], self._dt - ) + micro_sims_output[count] = sim.solve(micro_sims_input[count], dt) end_time = time.time() # Write solve time of the macro simulation if required and the simulation has not crashed if self._is_micro_solve_time_required: @@ -689,6 +691,7 @@ def _solve_micro_simulations_with_adaptivity( micro_sims_input: list, is_sim_active: np.ndarray, sim_is_associated_to: np.ndarray, + dt: float, ) -> list: """ Solve all micro simulations and assemble the micro simulations outputs in a list of dicts format. @@ -702,6 +705,8 @@ def _solve_micro_simulations_with_adaptivity( 1D array having state (active or inactive) of each micro simulation sim_is_associated_to : numpy array 1D array with values of associated simulations of inactive simulations. Active simulations have None + dt : float + Time step size. Returns ------- @@ -741,7 +746,7 @@ def _solve_micro_simulations_with_adaptivity( try: start_time = time.time() micro_sims_output[active_id] = self._micro_sims[active_id].solve( - micro_sims_input[active_id], self._dt + micro_sims_input[active_id], dt ) end_time = time.time() # Write solve time of the macro simulation if required and the simulation has not crashed diff --git a/micro_manager/micro_manager_base.py b/micro_manager/micro_manager_base.py index 3db8ec65..31610e48 100644 --- a/micro_manager/micro_manager_base.py +++ b/micro_manager/micro_manager_base.py @@ -76,6 +76,8 @@ def __init__(self, config_file): self._logger.info("Provided configuration file: {}".format(config_file)) self._config = Config(self._logger, config_file) + self._micro_dt = self._config.get_micro_time_window() + def initialize(self): """ Initialize micro simulations. Not implemented diff --git a/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity-parallel.json b/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity-parallel.json index 62f2006d..81a49fc8 100644 --- a/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity-parallel.json +++ b/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity-parallel.json @@ -4,7 +4,8 @@ "config_file_name": "precice-config.xml", "macro_mesh_name": "macro-cube-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, - "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"} + "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, + "micro_time_window_size": 1.0 }, "simulation_params": { "macro_domain_bounds": [0, 1, 0, 1, 0, 1], diff --git a/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity.json b/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity.json index 43e63601..6f5a52a8 100644 --- a/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity.json +++ b/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity.json @@ -4,7 +4,8 @@ "config_file_name": "precice-config.xml", "macro_mesh_name": "macro-cube-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, - "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"} + "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, + "micro_time_window_size": 1.0 }, "simulation_params": { "macro_domain_bounds": [0, 1, 0, 1, 0, 1], diff --git a/tests/integration/test_unit_cube/micro-manager-config-local-adaptivity.json b/tests/integration/test_unit_cube/micro-manager-config-local-adaptivity.json index acd0563c..ad252374 100644 --- a/tests/integration/test_unit_cube/micro-manager-config-local-adaptivity.json +++ b/tests/integration/test_unit_cube/micro-manager-config-local-adaptivity.json @@ -4,7 +4,8 @@ "config_file_name": "precice-config.xml", "macro_mesh_name": "macro-cube-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, - "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"} + "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, + "micro_time_window_size": 1.0 }, "simulation_params": { "macro_domain_bounds": [0, 1, 0, 1, 0, 1], diff --git a/tests/integration/test_unit_cube/micro-manager-config-parallel-1.json b/tests/integration/test_unit_cube/micro-manager-config-parallel-1.json index bcbe34b6..af33f505 100644 --- a/tests/integration/test_unit_cube/micro-manager-config-parallel-1.json +++ b/tests/integration/test_unit_cube/micro-manager-config-parallel-1.json @@ -4,7 +4,8 @@ "config_file_name": "precice-config.xml", "macro_mesh_name": "macro-cube-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, - "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"} + "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, + "micro_time_window_size": 1.0 }, "simulation_params": { "macro_domain_bounds": [0, 1, 0, 1, 0, 1], diff --git a/tests/integration/test_unit_cube/micro-manager-config-parallel-2.json b/tests/integration/test_unit_cube/micro-manager-config-parallel-2.json index 63b5c1f0..b97d8199 100644 --- a/tests/integration/test_unit_cube/micro-manager-config-parallel-2.json +++ b/tests/integration/test_unit_cube/micro-manager-config-parallel-2.json @@ -4,7 +4,8 @@ "config_file_name": "precice-config.xml", "macro_mesh_name": "macro-cube-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, - "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"} + "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, + "micro_time_window_size": 1.0 }, "simulation_params": { "macro_domain_bounds": [0, 1, 0, 1, 0, 1], From 4f62fff0ff0e1f2d439e71602a06e64aa3c466fa Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Mon, 10 Jun 2024 18:36:43 +0200 Subject: [PATCH 2/8] Put config parameter micro_time_window_size in coupling_params group --- micro_manager/config.py | 10 +++++----- micro_manager/micro_manager_base.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/micro_manager/config.py b/micro_manager/config.py index e44b5df2..40b2d9a1 100644 --- a/micro_manager/config.py +++ b/micro_manager/config.py @@ -30,7 +30,7 @@ def __init__(self, logger, config_filename): self._macro_mesh_name = None self._read_data_names = dict() self._write_data_names = dict() - self._micro_time_window = None + self._micro_time_window_size = None self._macro_domain_bounds = None self._ranks_per_axis = None @@ -115,6 +115,8 @@ def read_json(self, config_filename): "No read data names provided. Micro manager will only write data to preCICE." ) + self._micro_time_window_size = data["coupling_params"]["micro_time_window_size"] + self._macro_domain_bounds = data["simulation_params"]["macro_domain_bounds"] try: @@ -124,8 +126,6 @@ def read_json(self, config_filename): "Domain decomposition is not specified, so the Micro Manager will expect to be run in serial." ) - self._micro_time_window = data["simulation_params"]["micro_time_window_size"] - try: if data["simulation_params"]["adaptivity"] == "True": self._adaptivity = True @@ -435,7 +435,7 @@ def is_adaptivity_required_in_every_implicit_iteration(self): """ return self._adaptivity_every_implicit_iteration - def get_micro_time_window(self): + def get_micro_time_window_size(self): """ Get the size of the micro time window. @@ -444,4 +444,4 @@ def get_micro_time_window(self): micro_time_window : float Size of the micro time window. """ - return self._micro_time_window + return self._micro_time_window_size diff --git a/micro_manager/micro_manager_base.py b/micro_manager/micro_manager_base.py index 31610e48..ef6eaa96 100644 --- a/micro_manager/micro_manager_base.py +++ b/micro_manager/micro_manager_base.py @@ -76,7 +76,7 @@ def __init__(self, config_file): self._logger.info("Provided configuration file: {}".format(config_file)) self._config = Config(self._logger, config_file) - self._micro_dt = self._config.get_micro_time_window() + self._micro_dt = self._config.get_micro_time_window_size() def initialize(self): """ From ea56faf9e77553a2c2da0ac8c55eb02a70817773 Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Mon, 10 Jun 2024 18:48:34 +0200 Subject: [PATCH 3/8] Paasing dt correctly --- micro_manager/micro_manager.py | 4 ++-- tests/unit/micro-manager-config.json | 3 ++- tests/unit/micro-manager-config_crash.json | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/micro_manager/micro_manager.py b/micro_manager/micro_manager.py index b933be83..d9c4fc10 100644 --- a/micro_manager/micro_manager.py +++ b/micro_manager/micro_manager.py @@ -196,7 +196,7 @@ def solve(self) -> None: for active_id in active_sim_ids: self._micro_sims_active_steps[active_id] += 1 - micro_sims_input = self._read_data_from_precice() + micro_sims_input = self._read_data_from_precice(dt) if self._is_adaptivity_on: if self._adaptivity_in_every_implicit_step: @@ -426,7 +426,7 @@ def initialize(self) -> None: self._micro_sims_init = False # DECLARATION # Read initial data from preCICE, if it is available - initial_data = self._read_data_from_precice() + initial_data = self._read_data_from_precice(dt=self._micro_dt) if not initial_data: is_initial_data_available = False diff --git a/tests/unit/micro-manager-config.json b/tests/unit/micro-manager-config.json index d1a4bbaf..2e416875 100644 --- a/tests/unit/micro-manager-config.json +++ b/tests/unit/micro-manager-config.json @@ -4,7 +4,8 @@ "config_file_name": "dummy-config.xml", "macro_mesh_name": "dummy-macro-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, - "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"} + "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, + "micro_time_window_size": 1.0 }, "simulation_params": { "macro_domain_bounds": [0.0, 25.0, 0.0, 25.0, 0.0, 25.0], diff --git a/tests/unit/micro-manager-config_crash.json b/tests/unit/micro-manager-config_crash.json index e5b8ac32..104c7699 100644 --- a/tests/unit/micro-manager-config_crash.json +++ b/tests/unit/micro-manager-config_crash.json @@ -4,7 +4,8 @@ "config_file_name": "dummy-config.xml", "macro_mesh_name": "dummy-macro-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, - "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"} + "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, + "micro_time_window_size": 1.0 }, "simulation_params": { "macro_domain_bounds": [0.0, 25.0, 0.0, 25.0, 0.0, 25.0], From a938d77e919e3fe778fc796719e12a5f848802ce Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Mon, 10 Jun 2024 19:00:33 +0200 Subject: [PATCH 4/8] Fix unit tests --- tests/unit/micro-manager-config.json | 2 +- tests/unit/test_micro_manager.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/unit/micro-manager-config.json b/tests/unit/micro-manager-config.json index 2e416875..f5b52fb2 100644 --- a/tests/unit/micro-manager-config.json +++ b/tests/unit/micro-manager-config.json @@ -5,7 +5,7 @@ "macro_mesh_name": "dummy-macro-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, - "micro_time_window_size": 1.0 + "micro_time_window_size": 0.1 }, "simulation_params": { "macro_domain_bounds": [0.0, 25.0, 0.0, 25.0, 0.0, 25.0], diff --git a/tests/unit/test_micro_manager.py b/tests/unit/test_micro_manager.py index 711d8f90..ad8285e8 100644 --- a/tests/unit/test_micro_manager.py +++ b/tests/unit/test_micro_manager.py @@ -67,7 +67,7 @@ def test_initialization(self): manager = micro_manager.MicroManagerCoupling("micro-manager-config.json") manager.initialize() - self.assertEqual(manager._dt, 0.1) # from Interface.initialize + self.assertEqual(manager._micro_dt, 0.1) # from Interface.initialize self.assertEqual(manager._global_number_of_sims, 4) self.assertListEqual(manager._macro_bounds, self.macro_bounds) self.assertListEqual(manager._mesh_vertex_ids.tolist(), [0, 1, 2, 3]) @@ -85,7 +85,7 @@ def test_read_write_data_from_precice(self): manager = micro_manager.MicroManagerCoupling("micro-manager-config.json") manager._write_data_to_precice(self.fake_write_data) - read_data = manager._read_data_from_precice() + read_data = manager._read_data_from_precice(1.0) for data, fake_data in zip(read_data, self.fake_read_data): self.assertEqual(data["macro-scalar-data"], 1) @@ -105,7 +105,7 @@ def test_solve_micro_sims(self): manager._micro_sims = [MicroSimulation(i) for i in range(4)] manager._micro_sims_active_steps = np.zeros(4, dtype=np.int32) - micro_sims_output = manager._solve_micro_simulations(self.fake_read_data) + micro_sims_output = manager._solve_micro_simulations(self.fake_read_data, 1.0) for data, fake_data in zip(micro_sims_output, self.fake_write_data): self.assertEqual(data["micro-scalar-data"], 2) From 6d0357acd6e4d13554a3971e1362cae546e2b393 Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Mon, 10 Jun 2024 19:09:19 +0200 Subject: [PATCH 5/8] Fix crash handling tests --- tests/unit/test_micro_simulation_crash_handling.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_micro_simulation_crash_handling.py b/tests/unit/test_micro_simulation_crash_handling.py index 3474c09a..ff2d63a8 100644 --- a/tests/unit/test_micro_simulation_crash_handling.py +++ b/tests/unit/test_micro_simulation_crash_handling.py @@ -51,7 +51,7 @@ def test_crash_handling(self): ) manager._micro_sims = [MicroSimulation(i) for i in range(4)] - micro_sims_output = manager._solve_micro_simulations(macro_data) + micro_sims_output = manager._solve_micro_simulations(macro_data, 1.0) # Crashed simulation has interpolated value data_crashed = micro_sims_output[2] @@ -99,7 +99,7 @@ def test_crash_handling_with_adaptivity(self): is_sim_active = np.array([True, True, True, True, False]) sim_is_associated_to = np.array([-2, -2, -2, -2, 2]) micro_sims_output = manager._solve_micro_simulations_with_adaptivity( - macro_data, is_sim_active, sim_is_associated_to + macro_data, is_sim_active, sim_is_associated_to, 1.0 ) # Crashed simulation has interpolated value From 630878713697f13ab8d814a8433fe9b3420654e9 Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Mon, 10 Jun 2024 19:16:22 +0200 Subject: [PATCH 6/8] Add CHANGELOG entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 90c80e9c..9746afca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## latest +- Set initial time window size of micro simulation in the configuration, and use it in the coupling https://github.com/precice/micro-manager/pull/112 - Add a base class called `MicroManager` with minimal API and member function definitions, rename the existing `MicroManager` class to `MicroManagerCoupling` https://github.com/precice/micro-manager/pull/111 - Handle calling `initialize()` function of micro simulations written in languages other than Python https://github.com/precice/micro-manager/pull/110 - Check if initial data returned from the micro simulation is the data that the adaptivity computation requires https://github.com/precice/micro-manager/pull/109 From 51e2f9125539b201c7626caecc14f19823eab530 Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Tue, 11 Jun 2024 10:10:14 +0200 Subject: [PATCH 7/8] Use micro_dt instead of micro_time_window_size --- CHANGELOG.md | 2 +- docs/configuration.md | 2 +- examples/micro-manager-cpp-adaptivity-config.json | 2 +- examples/micro-manager-cpp-config.json | 2 +- examples/micro-manager-python-adaptivity-config.json | 2 +- examples/micro-manager-python-config.json | 2 +- micro_manager/config.py | 8 ++++---- micro_manager/micro_manager_base.py | 2 +- .../micro-manager-config-global-adaptivity-parallel.json | 2 +- .../micro-manager-config-global-adaptivity.json | 2 +- .../micro-manager-config-local-adaptivity.json | 2 +- .../test_unit_cube/micro-manager-config-parallel-1.json | 2 +- .../test_unit_cube/micro-manager-config-parallel-2.json | 2 +- tests/unit/micro-manager-config.json | 2 +- tests/unit/micro-manager-config_crash.json | 2 +- 15 files changed, 18 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9746afca..4536e551 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## latest -- Set initial time window size of micro simulation in the configuration, and use it in the coupling https://github.com/precice/micro-manager/pull/112 +- Set time step of micro simulation in the configuration, and use it in the coupling https://github.com/precice/micro-manager/pull/112 - Add a base class called `MicroManager` with minimal API and member function definitions, rename the existing `MicroManager` class to `MicroManagerCoupling` https://github.com/precice/micro-manager/pull/111 - Handle calling `initialize()` function of micro simulations written in languages other than Python https://github.com/precice/micro-manager/pull/110 - Check if initial data returned from the micro simulation is the data that the adaptivity computation requires https://github.com/precice/micro-manager/pull/109 diff --git a/docs/configuration.md b/docs/configuration.md index 873531ce..2575d81d 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -42,7 +42,7 @@ Parameter | Description `macro_mesh_name` | Name of the macro mesh as stated in the preCICE configuration. `read_data_names` | A Python dictionary with the names of the data to be read from preCICE as keys and `"scalar"` or `"vector"` as values depending on the nature of the data. `write_data_names` | A Python dictionary with the names of the data to be written to preCICE as keys and `"scalar"` or `"vector"` as values depending on the nature of the data. -`micro_time_window_size` | Initial time window size (dt) of the micro simulation. +`micro_dt` | Initial time window size (dt) of the micro simulation. ## Simulation Parameters diff --git a/examples/micro-manager-cpp-adaptivity-config.json b/examples/micro-manager-cpp-adaptivity-config.json index 7d1644c2..2f36e07d 100644 --- a/examples/micro-manager-cpp-adaptivity-config.json +++ b/examples/micro-manager-cpp-adaptivity-config.json @@ -5,7 +5,7 @@ "macro_mesh_name": "macro-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, - "micro_time_window_size": 1.0 + "micro_dt": 1.0 }, "simulation_params": { "macro_domain_bounds": [0.0, 25.0, 0.0, 25.0, 0.0, 25.0], diff --git a/examples/micro-manager-cpp-config.json b/examples/micro-manager-cpp-config.json index 33a87d02..01a15e06 100644 --- a/examples/micro-manager-cpp-config.json +++ b/examples/micro-manager-cpp-config.json @@ -5,7 +5,7 @@ "macro_mesh_name": "macro-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, - "micro_time_window_size": 1.0 + "micro_dt": 1.0 }, "simulation_params": { "macro_domain_bounds": [0.0, 25.0, 0.0, 25.0, 0.0, 25.0] diff --git a/examples/micro-manager-python-adaptivity-config.json b/examples/micro-manager-python-adaptivity-config.json index f3ad55a2..595aee8f 100644 --- a/examples/micro-manager-python-adaptivity-config.json +++ b/examples/micro-manager-python-adaptivity-config.json @@ -5,7 +5,7 @@ "macro_mesh_name": "macro-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, - "micro_time_window_size": 1.0 + "micro_dt": 1.0 }, "simulation_params": { "macro_domain_bounds": [0.0, 25.0, 0.0, 25.0, 0.0, 25.0], diff --git a/examples/micro-manager-python-config.json b/examples/micro-manager-python-config.json index 2d581d06..cc170d87 100644 --- a/examples/micro-manager-python-config.json +++ b/examples/micro-manager-python-config.json @@ -5,7 +5,7 @@ "macro_mesh_name": "macro-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, - "micro_time_window_size": 1.0 + "micro_dt": 1.0 }, "simulation_params": { "macro_domain_bounds": [0.0, 25.0, 0.0, 25.0, 0.0, 25.0] diff --git a/micro_manager/config.py b/micro_manager/config.py index 40b2d9a1..55aef232 100644 --- a/micro_manager/config.py +++ b/micro_manager/config.py @@ -30,7 +30,7 @@ def __init__(self, logger, config_filename): self._macro_mesh_name = None self._read_data_names = dict() self._write_data_names = dict() - self._micro_time_window_size = None + self._micro_dt = None self._macro_domain_bounds = None self._ranks_per_axis = None @@ -115,7 +115,7 @@ def read_json(self, config_filename): "No read data names provided. Micro manager will only write data to preCICE." ) - self._micro_time_window_size = data["coupling_params"]["micro_time_window_size"] + self._micro_dt = data["coupling_params"]["micro_dt"] self._macro_domain_bounds = data["simulation_params"]["macro_domain_bounds"] @@ -435,7 +435,7 @@ def is_adaptivity_required_in_every_implicit_iteration(self): """ return self._adaptivity_every_implicit_iteration - def get_micro_time_window_size(self): + def get_micro_dt(self): """ Get the size of the micro time window. @@ -444,4 +444,4 @@ def get_micro_time_window_size(self): micro_time_window : float Size of the micro time window. """ - return self._micro_time_window_size + return self._micro_dt diff --git a/micro_manager/micro_manager_base.py b/micro_manager/micro_manager_base.py index ef6eaa96..29dfdf86 100644 --- a/micro_manager/micro_manager_base.py +++ b/micro_manager/micro_manager_base.py @@ -76,7 +76,7 @@ def __init__(self, config_file): self._logger.info("Provided configuration file: {}".format(config_file)) self._config = Config(self._logger, config_file) - self._micro_dt = self._config.get_micro_time_window_size() + self._micro_dt = self._config.get_micro_dt() def initialize(self): """ diff --git a/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity-parallel.json b/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity-parallel.json index 81a49fc8..50da60fb 100644 --- a/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity-parallel.json +++ b/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity-parallel.json @@ -5,7 +5,7 @@ "macro_mesh_name": "macro-cube-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, - "micro_time_window_size": 1.0 + "micro_dt": 1.0 }, "simulation_params": { "macro_domain_bounds": [0, 1, 0, 1, 0, 1], diff --git a/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity.json b/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity.json index 6f5a52a8..835b9835 100644 --- a/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity.json +++ b/tests/integration/test_unit_cube/micro-manager-config-global-adaptivity.json @@ -5,7 +5,7 @@ "macro_mesh_name": "macro-cube-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, - "micro_time_window_size": 1.0 + "micro_dt": 1.0 }, "simulation_params": { "macro_domain_bounds": [0, 1, 0, 1, 0, 1], diff --git a/tests/integration/test_unit_cube/micro-manager-config-local-adaptivity.json b/tests/integration/test_unit_cube/micro-manager-config-local-adaptivity.json index ad252374..5a6581ca 100644 --- a/tests/integration/test_unit_cube/micro-manager-config-local-adaptivity.json +++ b/tests/integration/test_unit_cube/micro-manager-config-local-adaptivity.json @@ -5,7 +5,7 @@ "macro_mesh_name": "macro-cube-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, - "micro_time_window_size": 1.0 + "micro_dt": 1.0 }, "simulation_params": { "macro_domain_bounds": [0, 1, 0, 1, 0, 1], diff --git a/tests/integration/test_unit_cube/micro-manager-config-parallel-1.json b/tests/integration/test_unit_cube/micro-manager-config-parallel-1.json index af33f505..aaece104 100644 --- a/tests/integration/test_unit_cube/micro-manager-config-parallel-1.json +++ b/tests/integration/test_unit_cube/micro-manager-config-parallel-1.json @@ -5,7 +5,7 @@ "macro_mesh_name": "macro-cube-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, - "micro_time_window_size": 1.0 + "micro_dt": 1.0 }, "simulation_params": { "macro_domain_bounds": [0, 1, 0, 1, 0, 1], diff --git a/tests/integration/test_unit_cube/micro-manager-config-parallel-2.json b/tests/integration/test_unit_cube/micro-manager-config-parallel-2.json index b97d8199..7c8b065d 100644 --- a/tests/integration/test_unit_cube/micro-manager-config-parallel-2.json +++ b/tests/integration/test_unit_cube/micro-manager-config-parallel-2.json @@ -5,7 +5,7 @@ "macro_mesh_name": "macro-cube-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, - "micro_time_window_size": 1.0 + "micro_dt": 1.0 }, "simulation_params": { "macro_domain_bounds": [0, 1, 0, 1, 0, 1], diff --git a/tests/unit/micro-manager-config.json b/tests/unit/micro-manager-config.json index f5b52fb2..e5c5aa72 100644 --- a/tests/unit/micro-manager-config.json +++ b/tests/unit/micro-manager-config.json @@ -5,7 +5,7 @@ "macro_mesh_name": "dummy-macro-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, - "micro_time_window_size": 0.1 + "micro_dt": 0.1 }, "simulation_params": { "macro_domain_bounds": [0.0, 25.0, 0.0, 25.0, 0.0, 25.0], diff --git a/tests/unit/micro-manager-config_crash.json b/tests/unit/micro-manager-config_crash.json index 104c7699..455bb1de 100644 --- a/tests/unit/micro-manager-config_crash.json +++ b/tests/unit/micro-manager-config_crash.json @@ -5,7 +5,7 @@ "macro_mesh_name": "dummy-macro-mesh", "read_data_names": {"macro-scalar-data": "scalar", "macro-vector-data": "vector"}, "write_data_names": {"micro-scalar-data": "scalar", "micro-vector-data": "vector"}, - "micro_time_window_size": 1.0 + "micro_dt": 1.0 }, "simulation_params": { "macro_domain_bounds": [0.0, 25.0, 0.0, 25.0, 0.0, 25.0], From adc84d2883493387172c16293df590d5af6d95f4 Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Tue, 11 Jun 2024 11:13:13 +0200 Subject: [PATCH 8/8] Use dt=0 when reading initial data --- micro_manager/micro_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micro_manager/micro_manager.py b/micro_manager/micro_manager.py index d9c4fc10..f75fc6b6 100644 --- a/micro_manager/micro_manager.py +++ b/micro_manager/micro_manager.py @@ -426,7 +426,7 @@ def initialize(self) -> None: self._micro_sims_init = False # DECLARATION # Read initial data from preCICE, if it is available - initial_data = self._read_data_from_precice(dt=self._micro_dt) + initial_data = self._read_data_from_precice(dt=0) if not initial_data: is_initial_data_available = False