From bf0c53d671ba1b78d884799d0fce5130db5ff1e4 Mon Sep 17 00:00:00 2001 From: Jorge Sicacha Date: Mon, 1 Sep 2025 14:31:40 +0200 Subject: [PATCH 1/6] Explore new migration time property --- src/ccs_scripts/aggregate/_migration_time.py | 14 +++++++++++++- src/ccs_scripts/aggregate/grid3d_migration_time.py | 7 ++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/ccs_scripts/aggregate/_migration_time.py b/src/ccs_scripts/aggregate/_migration_time.py index 9532d976..34007695 100644 --- a/src/ccs_scripts/aggregate/_migration_time.py +++ b/src/ccs_scripts/aggregate/_migration_time.py @@ -23,14 +23,26 @@ def generate_migration_time_property( prop_name = co2_props[0].name.split("--")[0] t_prop = co2_props[0].copy(newname=MIGRATION_TIME_PNAME + "_" + prop_name) t_prop.values[~t_prop.values.mask] = np.inf + t_prop_alt = co2_props[0].copy(newname=MIGRATION_TIME_PNAME + "_" + prop_name + "_alt") + t_prop_alt.values[~t_prop_alt.values.mask] = np.inf for co2, dt in zip( co2_props, time_since_start, ): above_threshold = co2.values > co2_threshold t_prop.values[above_threshold] = np.minimum(t_prop.values[above_threshold], dt) + for co2, dt in zip( + co2_props[1:], + time_since_start[1:], + ): + diff_prop = co2.values - co2_props[0].values + above_threshold_alt = diff_prop > co2_threshold + t_prop_alt.values[above_threshold_alt] = np.minimum(t_prop_alt.values[above_threshold_alt], dt) # Mask inf values if not isinstance(t_prop.values.mask, np.ndarray): t_prop.values.mask = np.asarray(t_prop.values.mask) t_prop.values.mask[np.isinf(t_prop.values)] = 1 - return t_prop + if not isinstance(t_prop_alt.values.mask, np.ndarray): + t_prop_alt.values.mask = np.asarray(t_prop_alt.values.mask) + t_prop_alt.values.mask[np.isinf(t_prop_alt.values)] = 1 + return t_prop, t_prop_alt diff --git a/src/ccs_scripts/aggregate/grid3d_migration_time.py b/src/ccs_scripts/aggregate/grid3d_migration_time.py index 2dfbd2c4..372886cd 100644 --- a/src/ccs_scripts/aggregate/grid3d_migration_time.py +++ b/src/ccs_scripts/aggregate/grid3d_migration_time.py @@ -126,13 +126,13 @@ def calculate_migration_time_property( grid3d_aggregate_map._log_properties_info(properties) timer.start("generate_migration_time_property") - t_prop = _migration_time.generate_migration_time_property( + t_prop, t_prop_alt = _migration_time.generate_migration_time_property( properties, lower_threshold ) timer.stop("generate_migration_time_property") _log_t_prop(t_prop, property_name) - return t_prop + return t_prop, t_prop_alt def migration_time_property_to_map( @@ -212,7 +212,7 @@ def main(arguments=None): logging.info(f"\nMaking temporary directory for 3D grids: {temp_dir}") try: for prop in config_.input.properties: - t_prop = calculate_migration_time_property( + t_prop, t_prop_alt = calculate_migration_time_property( prop.source, prop.name, prop.lower_threshold, @@ -221,6 +221,7 @@ def main(arguments=None): ) temp_path = os.path.join(temp_dir, prop.name) migration_time_property_to_map(config_, t_prop, temp_path) + migration_time_property_to_map(config_, t_prop_alt, temp_path) finally: logging.info(f"\nDeleting temporary directory for 3D grids: {temp_dir}") shutil.rmtree(temp_dir) From 088af05aef2ff792b5158d399f8d824ae89faf20 Mon Sep 17 00:00:00 2001 From: Jorge Sicacha Date: Thu, 11 Sep 2025 08:37:36 +0200 Subject: [PATCH 2/6] Fix migration time maps --- src/ccs_scripts/aggregate/_migration_time.py | 17 +++-------------- .../aggregate/grid3d_migration_time.py | 7 +++---- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/ccs_scripts/aggregate/_migration_time.py b/src/ccs_scripts/aggregate/_migration_time.py index 34007695..10f8a11d 100644 --- a/src/ccs_scripts/aggregate/_migration_time.py +++ b/src/ccs_scripts/aggregate/_migration_time.py @@ -23,26 +23,15 @@ def generate_migration_time_property( prop_name = co2_props[0].name.split("--")[0] t_prop = co2_props[0].copy(newname=MIGRATION_TIME_PNAME + "_" + prop_name) t_prop.values[~t_prop.values.mask] = np.inf - t_prop_alt = co2_props[0].copy(newname=MIGRATION_TIME_PNAME + "_" + prop_name + "_alt") - t_prop_alt.values[~t_prop_alt.values.mask] = np.inf - for co2, dt in zip( - co2_props, - time_since_start, - ): - above_threshold = co2.values > co2_threshold - t_prop.values[above_threshold] = np.minimum(t_prop.values[above_threshold], dt) for co2, dt in zip( co2_props[1:], time_since_start[1:], ): diff_prop = co2.values - co2_props[0].values - above_threshold_alt = diff_prop > co2_threshold - t_prop_alt.values[above_threshold_alt] = np.minimum(t_prop_alt.values[above_threshold_alt], dt) + above_threshold = np.abs(diff_prop) > co2_threshold + t_prop.values[above_threshold] = np.minimum(t_prop.values[above_threshold], dt) # Mask inf values if not isinstance(t_prop.values.mask, np.ndarray): t_prop.values.mask = np.asarray(t_prop.values.mask) t_prop.values.mask[np.isinf(t_prop.values)] = 1 - if not isinstance(t_prop_alt.values.mask, np.ndarray): - t_prop_alt.values.mask = np.asarray(t_prop_alt.values.mask) - t_prop_alt.values.mask[np.isinf(t_prop_alt.values)] = 1 - return t_prop, t_prop_alt + return t_prop diff --git a/src/ccs_scripts/aggregate/grid3d_migration_time.py b/src/ccs_scripts/aggregate/grid3d_migration_time.py index 372886cd..2dfbd2c4 100644 --- a/src/ccs_scripts/aggregate/grid3d_migration_time.py +++ b/src/ccs_scripts/aggregate/grid3d_migration_time.py @@ -126,13 +126,13 @@ def calculate_migration_time_property( grid3d_aggregate_map._log_properties_info(properties) timer.start("generate_migration_time_property") - t_prop, t_prop_alt = _migration_time.generate_migration_time_property( + t_prop = _migration_time.generate_migration_time_property( properties, lower_threshold ) timer.stop("generate_migration_time_property") _log_t_prop(t_prop, property_name) - return t_prop, t_prop_alt + return t_prop def migration_time_property_to_map( @@ -212,7 +212,7 @@ def main(arguments=None): logging.info(f"\nMaking temporary directory for 3D grids: {temp_dir}") try: for prop in config_.input.properties: - t_prop, t_prop_alt = calculate_migration_time_property( + t_prop = calculate_migration_time_property( prop.source, prop.name, prop.lower_threshold, @@ -221,7 +221,6 @@ def main(arguments=None): ) temp_path = os.path.join(temp_dir, prop.name) migration_time_property_to_map(config_, t_prop, temp_path) - migration_time_property_to_map(config_, t_prop_alt, temp_path) finally: logging.info(f"\nDeleting temporary directory for 3D grids: {temp_dir}") shutil.rmtree(temp_dir) From 555010af312785d6011a5fed53883b7dfdab4f73 Mon Sep 17 00:00:00 2001 From: Jorge Sicacha Date: Wed, 17 Sep 2025 10:01:54 +0200 Subject: [PATCH 3/6] Minor fix --- src/ccs_scripts/aggregate/_migration_time.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ccs_scripts/aggregate/_migration_time.py b/src/ccs_scripts/aggregate/_migration_time.py index 10f8a11d..cdd8ea80 100644 --- a/src/ccs_scripts/aggregate/_migration_time.py +++ b/src/ccs_scripts/aggregate/_migration_time.py @@ -28,7 +28,7 @@ def generate_migration_time_property( time_since_start[1:], ): diff_prop = co2.values - co2_props[0].values - above_threshold = np.abs(diff_prop) > co2_threshold + above_threshold = np.abs(diff_prop - co2_threshold) > 0 t_prop.values[above_threshold] = np.minimum(t_prop.values[above_threshold], dt) # Mask inf values if not isinstance(t_prop.values.mask, np.ndarray): From 33265805b01886c65b22e51ac2c00bc217e66610 Mon Sep 17 00:00:00 2001 From: Jorge Sicacha Date: Wed, 17 Sep 2025 10:43:28 +0200 Subject: [PATCH 4/6] Fix typo --- src/ccs_scripts/aggregate/_migration_time.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ccs_scripts/aggregate/_migration_time.py b/src/ccs_scripts/aggregate/_migration_time.py index cdd8ea80..10f8a11d 100644 --- a/src/ccs_scripts/aggregate/_migration_time.py +++ b/src/ccs_scripts/aggregate/_migration_time.py @@ -28,7 +28,7 @@ def generate_migration_time_property( time_since_start[1:], ): diff_prop = co2.values - co2_props[0].values - above_threshold = np.abs(diff_prop - co2_threshold) > 0 + above_threshold = np.abs(diff_prop) > co2_threshold t_prop.values[above_threshold] = np.minimum(t_prop.values[above_threshold], dt) # Mask inf values if not isinstance(t_prop.values.mask, np.ndarray): From 901512751001d2803d4d9c07cf72bcd87e9aa361 Mon Sep 17 00:00:00 2001 From: Jorge Sicacha Date: Wed, 24 Sep 2025 15:45:59 +0200 Subject: [PATCH 5/6] Fix in migration map definition --- src/ccs_scripts/aggregate/_migration_time.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ccs_scripts/aggregate/_migration_time.py b/src/ccs_scripts/aggregate/_migration_time.py index 10f8a11d..4ecaaa5b 100644 --- a/src/ccs_scripts/aggregate/_migration_time.py +++ b/src/ccs_scripts/aggregate/_migration_time.py @@ -28,7 +28,7 @@ def generate_migration_time_property( time_since_start[1:], ): diff_prop = co2.values - co2_props[0].values - above_threshold = np.abs(diff_prop) > co2_threshold + above_threshold = diff_prop > co2_threshold t_prop.values[above_threshold] = np.minimum(t_prop.values[above_threshold], dt) # Mask inf values if not isinstance(t_prop.values.mask, np.ndarray): From 7d65fcb930db6060cd069ef576d626da281f82e5 Mon Sep 17 00:00:00 2001 From: Jorge Sicacha Date: Wed, 24 Sep 2025 15:47:02 +0200 Subject: [PATCH 6/6] Fix in migration map definition --- src/ccs_scripts/aggregate/_migration_time.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ccs_scripts/aggregate/_migration_time.py b/src/ccs_scripts/aggregate/_migration_time.py index 4ecaaa5b..0adb2b01 100644 --- a/src/ccs_scripts/aggregate/_migration_time.py +++ b/src/ccs_scripts/aggregate/_migration_time.py @@ -13,8 +13,8 @@ def generate_migration_time_property( ) -> xtgeo.GridProperty: """ Calculates a 3D grid property reflecting the migration time. Migration time is - defined as the first time step at which the property value exceeds the provided - `lower_threshold`. + defined as the first time step at which the property value exceeds its initial + condition """ # Calculate time since simulation start times = [datetime.datetime.strptime(_prop.date, "%Y%m%d") for _prop in co2_props]