From fe39cab23fcfe8daeb6156544a95da65fc5e8d29 Mon Sep 17 00:00:00 2001 From: Jiwoo Lee Date: Thu, 14 Mar 2024 16:49:30 -0700 Subject: [PATCH 1/4] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 8048f9811..2f94d0da7 100755 --- a/README.md +++ b/README.md @@ -104,6 +104,7 @@ Release Notes and History |
[Versions]
| Update summary | | ------------- | ------------------------------------- | +| [v3.3.3] | Technical update | [v3.3.2] | Technical update | [v3.3.1] | Technical update | [v3.3] | New metric added: **Sea-Ice** @@ -134,6 +135,7 @@ Release Notes and History [Versions]: https://github.com/PCMDI/pcmdi_metrics/releases +[v3.3.3]: https://github.com/PCMDI/pcmdi_metrics/releases/tag/v3.3.2 [v3.3.2]: https://github.com/PCMDI/pcmdi_metrics/releases/tag/v3.3.2 [v3.3.1]: https://github.com/PCMDI/pcmdi_metrics/releases/tag/v3.3.1 [v3.3]: https://github.com/PCMDI/pcmdi_metrics/releases/tag/v3.3 From 0f78e06a3722f1c9d39da67e11bf448c626dcdf3 Mon Sep 17 00:00:00 2001 From: Jiwoo Lee Date: Mon, 18 Mar 2024 14:17:49 -0600 Subject: [PATCH 2/4] enable custom season capability --- .../variability_mode/lib/eof_analysis.py | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/pcmdi_metrics/variability_mode/lib/eof_analysis.py b/pcmdi_metrics/variability_mode/lib/eof_analysis.py index d367716d3..14f729997 100644 --- a/pcmdi_metrics/variability_mode/lib/eof_analysis.py +++ b/pcmdi_metrics/variability_mode/lib/eof_analysis.py @@ -298,7 +298,13 @@ def gain_pcs_fraction(full_field, eof_pattern, pcs, debug=False): print("from gain_pcs_fraction:") print("full_field.shape (before grower): ", full_field.shape) print("eof_pattern.shape (before grower): ", eof_pattern.shape) - # Extend eof_pattern (add 3rd dimension as time then copy same 2d value for all time step) + print("pcs.shape: ", pcs.shape) + print("pcs[0:5]:", pcs[0:5]) + print("full_field: max, min:", np.max(full_field), np.min(full_field)) + print("eof_pattern: max, min:", np.max(eof_pattern), np.min(eof_pattern)) + print( + "pcs: max, min:", np.max(pcs), np.min(pcs) + ) # Extend eof_pattern (add 3rd dimension as time then copy same 2d value for all time step) reconstructed_field = genutil.grower(full_field, eof_pattern)[ 1 ] # Matching dimension (add time axis) @@ -313,11 +319,28 @@ def gain_pcs_fraction(full_field, eof_pattern, pcs, debug=False): fraction = MV2.divide(variance_partial_area_ave, variance_total_area_ave) # debugging if debug: + print( + "reconstructed_field: max, min:", + np.max(reconstructed_field), + np.min(reconstructed_field), + ) + print( + "variance_partial: max, min:", + np.max(variance_partial), + np.min(variance_partial), + ) + print("full_field.shape (after grower): ", full_field.shape) print("reconstructed_field.shape: ", reconstructed_field.shape) print("variance_partial_area_ave: ", variance_partial_area_ave) print("variance_total_area_ave: ", variance_total_area_ave) print("fraction: ", fraction) + """ + ftest = cdms2.open('gain_pseudo_fraction_test.nc', 'w') + ftest.write(full_field, id='full_field') + ftest.write(pcs, id='pcs') + ftest.write(reconstructed_field, id='reconstructed_field') + """ print("from gain_pcs_fraction done") # return result return fraction @@ -381,9 +404,16 @@ def get_anomaly_timeseries(timeseries, season): if season != "monthly": # Get seasonal mean time series # each season chunk should have 100% of data - timeseries_ano = getattr(cdutil, season)( - timeseries_ano, criteriaarg=[1.0, None] - ) + if season.upper() in ["DJF", "MAM", "JJA", "SON"]: + timeseries_ano = getattr(cdutil, season)( + timeseries_ano, criteriaarg=[1.0, None] + ) + else: + custom_season_accessor = cdutil.times.Seasons(season.upper()) + timeseries_ano = custom_season_accessor( + timeseries_ano, criteriaarg=[1.0, None] + ) + # return result return timeseries_ano From c70405b090d780a65334bc174861ad5afec0be02 Mon Sep 17 00:00:00 2001 From: Jiwoo Lee Date: Mon, 18 Mar 2024 14:23:00 -0600 Subject: [PATCH 3/4] pre-commit clean up --- .../variability_mode/lib/eof_analysis.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/pcmdi_metrics/variability_mode/lib/eof_analysis.py b/pcmdi_metrics/variability_mode/lib/eof_analysis.py index 14f729997..86eb62915 100644 --- a/pcmdi_metrics/variability_mode/lib/eof_analysis.py +++ b/pcmdi_metrics/variability_mode/lib/eof_analysis.py @@ -302,14 +302,15 @@ def gain_pcs_fraction(full_field, eof_pattern, pcs, debug=False): print("pcs[0:5]:", pcs[0:5]) print("full_field: max, min:", np.max(full_field), np.min(full_field)) print("eof_pattern: max, min:", np.max(eof_pattern), np.min(eof_pattern)) - print( - "pcs: max, min:", np.max(pcs), np.min(pcs) - ) # Extend eof_pattern (add 3rd dimension as time then copy same 2d value for all time step) - reconstructed_field = genutil.grower(full_field, eof_pattern)[ - 1 - ] # Matching dimension (add time axis) + print("pcs: max, min:", np.max(pcs), np.min(pcs)) + + # Extend eof_pattern (add 3rd dimension as time then copy same 2d value for all time step) + reconstructed_field = genutil.grower(full_field, eof_pattern)[1] + + # Matching dimension (add time axis) for t in range(0, len(pcs)): reconstructed_field[t] = MV2.multiply(reconstructed_field[t], pcs[t]) + # 2-2) Get variance of reconstructed field variance_partial = genutil.statistics.variance(reconstructed_field, axis="t") variance_partial_area_ave = cdutil.averager( @@ -335,12 +336,6 @@ def gain_pcs_fraction(full_field, eof_pattern, pcs, debug=False): print("variance_partial_area_ave: ", variance_partial_area_ave) print("variance_total_area_ave: ", variance_total_area_ave) print("fraction: ", fraction) - """ - ftest = cdms2.open('gain_pseudo_fraction_test.nc', 'w') - ftest.write(full_field, id='full_field') - ftest.write(pcs, id='pcs') - ftest.write(reconstructed_field, id='reconstructed_field') - """ print("from gain_pcs_fraction done") # return result return fraction From d3ff5b3f9d79bb6c605dc9b77e91a1216b6895f1 Mon Sep 17 00:00:00 2001 From: Jiwoo Lee Date: Mon, 18 Mar 2024 14:24:18 -0600 Subject: [PATCH 4/4] clean up --- pcmdi_metrics/variability_mode/lib/eof_analysis.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pcmdi_metrics/variability_mode/lib/eof_analysis.py b/pcmdi_metrics/variability_mode/lib/eof_analysis.py index 86eb62915..e8864bbe3 100644 --- a/pcmdi_metrics/variability_mode/lib/eof_analysis.py +++ b/pcmdi_metrics/variability_mode/lib/eof_analysis.py @@ -305,13 +305,14 @@ def gain_pcs_fraction(full_field, eof_pattern, pcs, debug=False): print("pcs: max, min:", np.max(pcs), np.min(pcs)) # Extend eof_pattern (add 3rd dimension as time then copy same 2d value for all time step) + # Matching dimension (add time axis) reconstructed_field = genutil.grower(full_field, eof_pattern)[1] - # Matching dimension (add time axis) + # Reconstruct field for t in range(0, len(pcs)): reconstructed_field[t] = MV2.multiply(reconstructed_field[t], pcs[t]) - # 2-2) Get variance of reconstructed field + # 2-2) Get variance of the reconstructed field variance_partial = genutil.statistics.variance(reconstructed_field, axis="t") variance_partial_area_ave = cdutil.averager( variance_partial, axis="xy", weights="weighted"