Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Code style fix for precip variabliity codes #822

Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions pcmdi_metrics/precip_variability/README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# Precip variability across time scales

## Driver code:
./variability_across_timescales_PS_3hr_driver.py
./variability_across_timescales_PS_3hr_driver.py

## Parameter codes:
./param/variability_across_timescales_PS_3hr_params_IMERG.py
./param/variability_across_timescales_PS_3hr_params_TRMM.py
./param/variability_across_timescales_PS_3hr_params_CMORPH.py
./param/variability_across_timescales_PS_3hr_params_cmip5.py
./param/variability_across_timescales_PS_3hr_params_cmip6.py
./param/variability_across_timescales_PS_3hr_params_IMERG.py
./param/variability_across_timescales_PS_3hr_params_TRMM.py
./param/variability_across_timescales_PS_3hr_params_CMORPH.py
./param/variability_across_timescales_PS_3hr_params_cmip5.py
./param/variability_across_timescales_PS_3hr_params_cmip6.py

## Run scripts:
./scripts_pcmdi/run_obs.bash
./scripts_pcmdi/run_cmip5.bash
./scripts_pcmdi/run_cmip6.bash
./scripts_pcmdi/run_obs.bash
./scripts_pcmdi/run_cmip5.bash
./scripts_pcmdi/run_cmip6.bash
11 changes: 10 additions & 1 deletion pcmdi_metrics/precip_variability/lib/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,11 @@
from .argparse_functions import AddParserArgument # noqa
from .lib_variability_across_timescales import (Regrid2deg, ClimAnom, Powerspectrum, lag1_autocorrelation, rednoise, RedNoiseSignificanceLevel, Avg_PS_DomFrq, prdday_to_frqidx) # noqa
from .lib_variability_across_timescales import ( # noqa
Avg_PS_DomFrq,
ClimAnom,
Powerspectrum,
RedNoiseSignificanceLevel,
Regrid2deg,
lag1_autocorrelation,
prdday_to_frqidx,
rednoise,
)
140 changes: 69 additions & 71 deletions pcmdi_metrics/precip_variability/lib/argparse_functions.py
Original file line number Diff line number Diff line change
@@ -1,75 +1,73 @@
def AddParserArgument(P):
P.add_argument("--mip",
type=str,
dest='mip',
default=None,
help="cmip5, cmip6 or other mip")
P.add_argument("--mod",
type=str,
dest='mod',
default=None,
help="model")
P.add_argument("--var",
type=str,
dest='var',
default=None,
help="pr or other variable")
P.add_argument("--frq",
type=str,
dest='frq',
default=None,
help="day, 3hr or other frequency")
P.add_argument("--modpath",
type=str,
dest='modpath',
default=None,
help="data directory path")
P.add_argument("--results_dir",
type=str,
dest='results_dir',
default=None,
help="results directory path")
P.add_argument("--case_id",
type=str,
dest='case_id',
default=None,
help="case_id with date")
P.add_argument("--prd",
type=int,
dest='prd',
nargs='+',
default=None,
help="start- and end-year for analysis (e.g., 1985 2004)")
P.add_argument("--fac",
type=str,
dest='fac',
default=None,
help="factor to make unit of [mm/day]")
P.add_argument("--nperseg",
type=int,
dest='nperseg',
default=None,
help="length of segment in power spectra")
P.add_argument("--noverlap",
type=int,
dest='noverlap',
default=None,
help="length of overlap between segments in power spectra")
P.add_argument("--ref",
type=str,
dest='ref',
default=None,
help="reference data path")
P.add_argument("--cmec",
dest="cmec",
default=False,
action="store_true",
help="Use to save CMEC format metrics JSON")
P.add_argument("--no_cmec",
dest="cmec",
default=False,
action="store_false",
help="Do not save CMEC format metrics JSON")
P.add_argument(
"--mip", type=str, dest="mip", default=None, help="cmip5, cmip6 or other mip"
)
P.add_argument("--mod", type=str, dest="mod", default=None, help="model")
P.add_argument(
"--var", type=str, dest="var", default=None, help="pr or other variable"
)
P.add_argument(
"--frq", type=str, dest="frq", default=None, help="day, 3hr or other frequency"
)
P.add_argument(
"--modpath", type=str, dest="modpath", default=None, help="data directory path"
)
P.add_argument(
"--results_dir",
type=str,
dest="results_dir",
default=None,
help="results directory path",
)
P.add_argument(
"--case_id", type=str, dest="case_id", default=None, help="case_id with date"
)
P.add_argument(
"--prd",
type=int,
dest="prd",
nargs="+",
default=None,
help="start- and end-year for analysis (e.g., 1985 2004)",
)
P.add_argument(
"--fac",
type=str,
dest="fac",
default=None,
help="factor to make unit of [mm/day]",
)
P.add_argument(
"--nperseg",
type=int,
dest="nperseg",
default=None,
help="length of segment in power spectra",
)
P.add_argument(
"--noverlap",
type=int,
dest="noverlap",
default=None,
help="length of overlap between segments in power spectra",
)
P.add_argument(
"--ref", type=str, dest="ref", default=None, help="reference data path"
)
P.add_argument(
"--cmec",
dest="cmec",
default=False,
action="store_true",
help="Use to save CMEC format metrics JSON",
)
P.add_argument(
"--no_cmec",
dest="cmec",
default=False,
action="store_false",
help="Do not save CMEC format metrics JSON",
)
P.set_defaults(cmec=False)

return P
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import math
import sys

import cdms2 as cdms
import MV2 as MV
import cdutil
import genutil
import MV2 as MV
import numpy as np
import pandas as pd
from regrid2 import Horizontal
from scipy import signal
from scipy.stats import chi2
import pandas as pd
import math
import sys


# ==================================================================================
Expand Down Expand Up @@ -74,8 +75,7 @@ def ClimAnom(d, ntd, syr, eyr):
)
)
yrtmpseg = MV.reshape(
yrtmp, (int(yrtmp.shape[0] / ntd), ntd,
yrtmp.shape[1], yrtmp.shape[2])
yrtmp, (int(yrtmp.shape[0] / ntd), ntd, yrtmp.shape[1], yrtmp.shape[2])
)
if yrtmpseg.shape[0] == 365:
dseg[iyr, 0:59] = yrtmpseg[0:59]
Expand All @@ -99,8 +99,7 @@ def ClimAnom(d, ntd, syr, eyr):
)
)
yrtmpseg = MV.reshape(
yrtmp, (int(yrtmp.shape[0] / ntd), ntd,
yrtmp.shape[1], yrtmp.shape[2])
yrtmp, (int(yrtmp.shape[0] / ntd), ntd, yrtmp.shape[1], yrtmp.shape[2])
)
dseg[iyr] = yrtmpseg

Expand Down Expand Up @@ -128,8 +127,7 @@ def ClimAnom(d, ntd, syr, eyr):
if yrtmp.shape[0] == 365 * ntd:
anom = np.append(
anom,
(np.delete(dseg[iyr], 59, axis=0) -
np.delete(clim, 59, axis=0)),
(np.delete(dseg[iyr], 59, axis=0) - np.delete(clim, 59, axis=0)),
)
else:
anom = np.append(anom, (dseg[iyr] - clim))
Expand Down Expand Up @@ -251,8 +249,7 @@ def rednoise(VAR, NUMHAR, R1):
RN = []
for K in range(NUMHAR):
RN.append(
WHITENOISE *
(TOP / (BOT - R1X2 * float(math.cos(math.pi * K / NUMHAR))))
WHITENOISE * (TOP / (BOT - R1X2 * float(math.cos(math.pi * K / NUMHAR))))
)
return RN

Expand Down Expand Up @@ -289,28 +286,42 @@ def Avg_PS_DomFrq(d, frequency, ntd, dat, mip, frc):
Output
- psdmfm: Domain and Frequency averaged of spectral power (json)
"""
domains = ["Total_50S50N", "Ocean_50S50N", "Land_50S50N",
"Total_30N50N", "Ocean_30N50N", "Land_30N50N",
"Total_30S30N", "Ocean_30S30N", "Land_30S30N",
"Total_50S30S", "Ocean_50S30S", "Land_50S30S"]
domains = [
"Total_50S50N",
"Ocean_50S50N",
"Land_50S50N",
"Total_30N50N",
"Ocean_30N50N",
"Land_30N50N",
"Total_30S30N",
"Ocean_30S30N",
"Land_30S30N",
"Total_50S30S",
"Ocean_50S30S",
"Land_50S30S",
]

if ntd == 8: # 3-hourly data
frqs_forced = ["semi-diurnal", "diurnal", "semi-annual", "annual"]
frqs_unforced = ["sub-daily", "synoptic",
"sub-seasonal", "seasonal-annual", "interannual"]
frqs_unforced = [
"sub-daily",
"synoptic",
"sub-seasonal",
"seasonal-annual",
"interannual",
]
elif ntd == 1: # daily data
frqs_forced = ["semi-annual", "annual"]
frqs_unforced = ["synoptic", "sub-seasonal",
"seasonal-annual", "interannual"]
frqs_unforced = ["synoptic", "sub-seasonal", "seasonal-annual", "interannual"]
else:
sys.exit("ERROR: ntd "+ntd+" is not defined!")
sys.exit("ERROR: ntd " + ntd + " is not defined!")

if frc == "forced":
frqs = frqs_forced
elif frc == "unforced":
frqs = frqs_unforced
else:
sys.exit("ERROR: frc "+frc+" is not defined!")
sys.exit("ERROR: frc " + frc + " is not defined!")

mask = cdutil.generateLandSeaMask(d[0])
d, mask2 = genutil.grower(d, mask)
Expand All @@ -329,52 +340,48 @@ def Avg_PS_DomFrq(d, frequency, ntd, dat, mip, frc):
dmask = d

if "50S50N" in dom:
am = cdutil.averager(
dmask(latitude=(-50, 50)), axis="xy")
am = cdutil.averager(dmask(latitude=(-50, 50)), axis="xy")
if "30N50N" in dom:
am = cdutil.averager(
dmask(latitude=(30, 50)), axis="xy")
am = cdutil.averager(dmask(latitude=(30, 50)), axis="xy")
if "30S30N" in dom:
am = cdutil.averager(
dmask(latitude=(-30, 30)), axis="xy")
am = cdutil.averager(dmask(latitude=(-30, 30)), axis="xy")
if "50S30S" in dom:
am = cdutil.averager(
dmask(latitude=(-50, -30)), axis="xy")
am = cdutil.averager(dmask(latitude=(-50, -30)), axis="xy")
am = np.array(am)

for frq in frqs:
if (frq == 'semi-diurnal'): # pr=0.5day
if frq == "semi-diurnal": # pr=0.5day
idx = prdday_to_frqidx(0.5, frequency, ntd)
amfm = am[idx]
elif (frq == 'diurnal'): # pr=1day
elif frq == "diurnal": # pr=1day
idx = prdday_to_frqidx(1, frequency, ntd)
amfm = am[idx]
elif (frq == 'semi-annual'): # 180day=<pr=<183day
elif frq == "semi-annual": # 180day=<pr=<183day
idx2 = prdday_to_frqidx(180, frequency, ntd)
idx1 = prdday_to_frqidx(183, frequency, ntd)
amfm = np.amax(am[idx1:idx2+1])
elif (frq == 'annual'): # 360day=<pr=<366day
amfm = np.amax(am[idx1 : idx2 + 1])
elif frq == "annual": # 360day=<pr=<366day
idx2 = prdday_to_frqidx(360, frequency, ntd)
idx1 = prdday_to_frqidx(366, frequency, ntd)
amfm = np.amax(am[idx1:idx2+1])
elif (frq == 'sub-daily'): # pr<1day
amfm = np.amax(am[idx1 : idx2 + 1])
elif frq == "sub-daily": # pr<1day
idx1 = prdday_to_frqidx(1, frequency, ntd)
amfm = cdutil.averager(am[idx1+1:], weights='unweighted')
elif (frq == 'synoptic'): # 1day=<pr<20day
amfm = cdutil.averager(am[idx1 + 1 :], weights="unweighted")
elif frq == "synoptic": # 1day=<pr<20day
idx2 = prdday_to_frqidx(1, frequency, ntd)
idx1 = prdday_to_frqidx(20, frequency, ntd)
amfm = cdutil.averager(am[idx1+1:idx2+1], weights='unweighted')
elif (frq == 'sub-seasonal'): # 20day=<pr<90day
amfm = cdutil.averager(am[idx1 + 1 : idx2 + 1], weights="unweighted")
elif frq == "sub-seasonal": # 20day=<pr<90day
idx2 = prdday_to_frqidx(20, frequency, ntd)
idx1 = prdday_to_frqidx(90, frequency, ntd)
amfm = cdutil.averager(am[idx1+1:idx2+1], weights='unweighted')
elif (frq == 'seasonal-annual'): # 90day=<pr<365day
amfm = cdutil.averager(am[idx1 + 1 : idx2 + 1], weights="unweighted")
elif frq == "seasonal-annual": # 90day=<pr<365day
idx2 = prdday_to_frqidx(90, frequency, ntd)
idx1 = prdday_to_frqidx(365, frequency, ntd)
amfm = cdutil.averager(am[idx1+1:idx2+1], weights='unweighted')
elif (frq == 'interannual'): # 365day=<pr
amfm = cdutil.averager(am[idx1 + 1 : idx2 + 1], weights="unweighted")
elif frq == "interannual": # 365day=<pr
idx2 = prdday_to_frqidx(365, frequency, ntd)
amfm = cdutil.averager(am[:idx2+1], weights='unweighted')
amfm = cdutil.averager(am[: idx2 + 1], weights="unweighted")
psdmfm[dom][frq] = amfm.tolist()

print("Complete domain and frequency average of spectral power")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@
infile = "*.nc"

case_id = "{:v%Y%m%d}".format(datetime.datetime.now())
pmpdir = "/work/ahn6/pr/variability_across_timescales/power_spectrum/"+ver+"_test/"
pmpdir = "/work/ahn6/pr/variability_across_timescales/power_spectrum/" + ver + "_test/"
results_dir = os.path.join(
pmpdir, '%(output_type)', 'precip_variability', '%(mip)', '%(case_id)')
pmpdir, "%(output_type)", "precip_variability", "%(mip)", "%(case_id)"
)

xmldir = "./xml_obs/"
if not (os.path.isdir(xmldir)):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@
infile = "*.nc"

case_id = "{:v%Y%m%d}".format(datetime.datetime.now())
pmpdir = "/work/ahn6/pr/variability_across_timescales/power_spectrum/"+ver+"_test/"
pmpdir = "/work/ahn6/pr/variability_across_timescales/power_spectrum/" + ver + "_test/"
results_dir = os.path.join(
pmpdir, '%(output_type)', 'precip_variability', '%(mip)', '%(case_id)')
pmpdir, "%(output_type)", "precip_variability", "%(mip)", "%(case_id)"
)

xmldir = "./xml_obs/"
if not (os.path.isdir(xmldir)):
Expand Down
Loading