|
23 | 23 |
|
24 | 24 | import sys |
25 | 25 | import os |
| 26 | +import copy |
26 | 27 | import types |
27 | 28 | from typing import Union, List |
28 | 29 | import traceback |
@@ -241,8 +242,7 @@ def __init__(self, |
241 | 242 | # List to store GeoJSON dicts of seeding commands |
242 | 243 | self.seed_geojson = [] |
243 | 244 |
|
244 | | - self.required_variables = self.required_variables.copy() # Avoid modifying the class variable |
245 | | - |
| 245 | + self.required_variables = copy.deepcopy(self.required_variables) # Avoid modifying the class variable |
246 | 246 | self.env = Environment(self.required_variables, self._config) |
247 | 247 |
|
248 | 248 | # Make copies of dictionaries so that they are private to each instance |
@@ -579,16 +579,26 @@ def post_run(self): |
579 | 579 | def update_previous_state(self): |
580 | 580 | """Store some properties and variables, for access at next time step""" |
581 | 581 |
|
582 | | - # Retrieve previous from storage |
| 582 | + if self.newly_seeded_IDs is not None: # For newly seeded elements, we set previous equal to present |
| 583 | + newly_seeded_rel_indices = np.where(self.elements.age_seconds==self.time_step.total_seconds())[0] |
| 584 | + |
| 585 | + # Environment variables |
583 | 586 | if self._environment_previous is not None: |
584 | 587 | # Update previous environment |
| 588 | + if self.newly_seeded_IDs is not None: |
| 589 | + for var in self._environment_previous: |
| 590 | + self._environment_previous[var][newly_seeded_rel_indices] = self.environment[var][newly_seeded_rel_indices] |
585 | 591 | self.environment_previous = self._environment_previous.isel(trajectory=self.elements.ID) |
586 | 592 | # Store present environment variables |
587 | 593 | for var in self._environment_previous: |
588 | 594 | self._environment_previous[var][self.elements.ID] = self.environment[var] |
589 | 595 |
|
| 596 | + # Element properties |
590 | 597 | if self._elements_previous is not None: |
591 | 598 | # Update previous elements |
| 599 | + if self.newly_seeded_IDs is not None: # For new elements there is no previous, so using present |
| 600 | + for var in self._elements_previous: |
| 601 | + self._elements_previous[var][newly_seeded_rel_indices] = getattr(self.elements, var)[newly_seeded_rel_indices] |
592 | 602 | self.elements_previous = self._elements_previous.isel(trajectory=self.elements.ID) |
593 | 603 | # Store present element properties |
594 | 604 | for var in self._elements_previous: |
@@ -1722,16 +1732,26 @@ def run(self, |
1722 | 1732 | logger.info(f'Skipping environment variable {vn} because of condition {var["skip_if"]}') |
1723 | 1733 | self.required_variables.pop(vn) |
1724 | 1734 |
|
1725 | | - #################################################################################### |
1726 | | - # Evaluate conditionals to determine if previous element properties shall be stored |
1727 | | - #################################################################################### |
| 1735 | + ######################################################################################### |
| 1736 | + # Evaluate conditionals to determine if previous properties or variables shall be stored |
| 1737 | + ######################################################################################### |
| 1738 | + # Element properties |
1728 | 1739 | for en, prop in self.elements.variables.copy().items(): |
1729 | 1740 | if 'store_previous_if' in prop: |
1730 | 1741 | store = evaluate_conditional(*prop['store_previous_if'], self) |
1731 | 1742 | if store is True: |
1732 | 1743 | logger.info(f'Storing previous values of element property {en} because of condition {prop["store_previous_if"]}') |
1733 | 1744 | self.elements.variables[en]['store_previous'] = True |
1734 | 1745 | del self.elements.variables[en]['store_previous_if'] # To avoid writing this to netCDF metadata |
| 1746 | + # Environment variables |
| 1747 | + for en, var in self.required_variables.copy().items(): |
| 1748 | + if 'store_previous_if' in var: |
| 1749 | + store = evaluate_conditional(*var['store_previous_if'], self) |
| 1750 | + if store is True: |
| 1751 | + logger.info(f'Storing previous values of environment variable {en} because of condition {var["store_previous_if"]}') |
| 1752 | + self.required_variables[en]['store_previous'] = True |
| 1753 | + del self.required_variables[en]['store_previous_if'] # To avoid writing this to netCDF metadata |
| 1754 | + |
1735 | 1755 |
|
1736 | 1756 | ######################## |
1737 | 1757 | # Simulation time step |
|
0 commit comments