Exemplo n.º 1
0
def main():
    start_year = 1979
    end_year = 2000

    HL_LABEL = "CRCM5_HL"
    NEMO_LABEL = "CRCM5_NEMO"

    sim_label_to_path = OrderedDict([
        (HL_LABEL,
         "/RESCUE/skynet3_rech1/huziy/CNRCWP/C5/2016/2-year-runs/coupled-GL+stfl_oneway/Samples"
         ),
        (NEMO_LABEL,
         "/HOME/huziy/skynet3_rech1/CNRCWP/C5/2016/2-year-runs/coupled-GL+stfl/Samples"
         )
    ])

    var_name_list = ["TT", "PR", "LC", "HR", "HU", "AV", "I5", "AL"]

    season_to_months = commons.season_to_months

    vname_to_level = {
        "TT": 1,
        "PR": -1,
        "SN": -1,
        "LC": -1,
        "HR": 1,
        "HU": 1,
        "AV": -1,
        "I5": -1,
        "AL": -1
    }

    vname_to_level_kind = {
        "TT": level_kinds.HYBRID,
        "PR": level_kinds.ARBITRARY,
        "SN": level_kinds.ARBITRARY,
        "LC": level_kinds.ARBITRARY,
        "HR": level_kinds.HYBRID,
        "HU": level_kinds.HYBRID,
        "AV": level_kinds.ARBITRARY,
        "I5": level_kinds.ARBITRARY,
        "AL": level_kinds.ARBITRARY
    }

    vname_to_file_prefix = {
        "TT": "dm",
        "PR": "pm",
        "SN": "pm",
        "LC": "pm",
        "HR": "dm",
        "HU": "dm",
        "AV": "pm",
        "I5": "pm",
        "AL": "pm"
    }

    # ---> ---->
    avg_mask = get_nemo_lakes_mask(samples_dir=sim_label_to_path[NEMO_LABEL])

    vname = "LC"

    common_params = dict(start_year=start_year,
                         end_year=end_year,
                         filename_prefix=vname_to_file_prefix[vname],
                         level=vname_to_level[vname],
                         level_kind=vname_to_level_kind[vname],
                         varname=vname,
                         mask=avg_mask)

    hl_icefrac = get_area_avg_timeseries(sim_label_to_path[HL_LABEL],
                                         **common_params)
    nemo_icefrac = get_area_avg_timeseries(sim_label_to_path[NEMO_LABEL],
                                           **common_params)

    obs_icefrac = GL_obs_timeseries.get_ts_with_real_dates_from_file(
        path=
        "/RESCUE/skynet3_rech1/huziy/obs_data/Lake_ice_concentration_Great_lakes_timeseries/GLK-30x.TXT",
        start_year=start_year - 1,
        end_year=end_year - 1)

    obs_icefrac /= 100.0

    plot_utils.apply_plot_params(font_size=14)

    # nemo ice fraction from 1-way coupled
    # with MFDataset("/HOME/huziy/skynet3_rech1/CNRCWP/C5/2016/2-year-runs/coupled-GL+stfl_oneway/NEMO/*grid_T.nc") as ds:
    #     timevar = ds.variables["time_counter"]
    #     print(timevar.units)
    #     times = num2date(timevar[:], timevar.units)
    #
    #     print(times[0], times[-1], type(times[0]))
    #
    #     print(times[:10])
    #
    #     print("===== avg_mask ====")
    #     print(avg_mask.min(), avg_mask.max(), avg_mask.shape)
    #
    #     print(ds.variables["soicecov"][0, :, :].shape)
    #     vals = [field.transpose()[20:-20, 20:-20][avg_mask].mean() for field in ds.variables["soicecov"][:]]
    #
    #     assert len(vals) == len(times)
    #
    #     ts_nemo_1way = pd.Series(index=[d for d in times], data=vals)
    #     ts_nemo_1way.sort_index(inplace=True)

    # nemo offline
    with MFDataset(
            "/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/GLK_1d_*_grid_T.nc"
    ) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline.sort_index(inplace=True)

    # nemo offline
    with MFDataset(
            "/HOME/huziy/skynet3_rech1/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min/GLK_1d_*_grid_T.nc"
    ) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline_5min = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_5min.sort_index(inplace=True)

    # nemo offline
    with MFDataset(
            "/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/doubled_snowfall/GLK_1d_*_grid_T.nc"
    ) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline_double_snow = pd.Series(index=[d for d in times],
                                                data=vals)
        ts_nemo_offline_double_snow.sort_index(inplace=True)

    # nemo offline
    with MFDataset(
            "/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30/GLK_1d_*_grid_T.nc"
    ) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf = pd.Series(index=[d for d in times],
                                                     data=vals)
        ts_nemo_offline_dt5min_small_ldf.sort_index(inplace=True)

# nemo offline
    with MFDataset(
            "/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_30min_eddy_tra10_dyn30_traldf3d/GLK_1d_*_grid_T.nc"
    ) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline_dt30min_small_ldf = pd.Series(index=[d for d in times],
                                                      data=vals)
        ts_nemo_offline_dt30min_small_ldf.sort_index(inplace=True)

    # nemo offline
    with MFDataset(
            "/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_sbc_forcing_3hourly/GLK_1d_*_grid_T.nc"
    ) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc3h = pd.Series(
            index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc3h.sort_index(inplace=True)

    # nemo offline
    with MFDataset(
            "/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_sbc_forcing_6hourly_hicrit_0.05m/GLK_1d_*_grid_T.nc"
    ) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc6h = pd.Series(
            index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc6h.sort_index(inplace=True)

    # nemo offline
    with MFDataset(
            "/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_sbc_forcing_6hourly_hicrit_0.05m_noicedyn/GLK_1d_*_grid_T.nc"
    ) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc6h_nodyn = pd.Series(
            index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc6h_nodyn.sort_index(inplace=True)

# nemo offline
    with MFDataset(
            "/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_sbc_forcing_5min_noicedyn/GLK_1d_*_grid_T.nc"
    ) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn = pd.Series(
            index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn.sort_index(inplace=True)

# nemo offline
    with MFDataset(
            "/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_sbc_forcing_5min_noicedyn_notime_interpolation_of_forcing/GLK_1d_*_grid_T.nc"
    ) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn_noforc_tint = pd.Series(
            index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn_noforc_tint.sort_index(
            inplace=True)

# nemo offline
    with MFDataset(
            "/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_sbc5min_lim3_6h/GLK_1d_*_grid_T.nc"
    ) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc5min_lim6h = pd.Series(
            index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc5min_lim6h.sort_index(inplace=True)

    #  nemo offline
    with MFDataset(
            "/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_tke_penetr10m/GLK_1d_*_grid_T.nc"
    ) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc5min_tkepenet_10m = pd.Series(
            index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc5min_tkepenet_10m.sort_index(
            inplace=True)

#  nemo offline
    with MFDataset(
            "/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_tke0.01_penetr10m/GLK_1d_*_grid_T.nc"
    ) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc5min_tke0001penet_10m = pd.Series(
            index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc5min_tke0001penet_10m.sort_index(
            inplace=True)

#  nemo offline
    with MFDataset(
            "/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_sbc_forcing_5min_gls1/GLK_1d_*_grid_T.nc"
    ) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1 = pd.Series(
            index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1.sort_index(inplace=True)

#  nemo offline
    data_folder = Path(
        "/HOME/huziy/skynet3_rech1/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/zdf_gls_dt_and_sbc_5min/"
    )
    with MFDataset([
            str(f) for f in sorted(data_folder.iterdir(), key=lambda p: p.name)
            if f.name.endswith("_grid_T.nc")
    ]) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))
        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [
            field.transpose()[avg_mask].mean()
            for field in ds.variables["soicecov"][:]
        ]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1_5year = pd.Series(
            index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1_5year.sort_index(
            inplace=True)

    fig = plt.figure()

    print("hl_icefrac :", hl_icefrac.index[0], hl_icefrac.index[-1],
          type(hl_icefrac))
    print("nemo_icefrac :", nemo_icefrac.index[0], nemo_icefrac.index[-1])

    ax = plt.gca()

    # ax = hl_icefrac.plot(lw=2, color="k", label=HL_LABEL)
    # nemo_icefrac.plot(lw=2, color="r", ax=ax, label=NEMO_LABEL)
    # ts_nemo_1way.plot(lw=2, color="g", label="CRCM5_NEMO_oneway", ax=ax, zorder=5)
    # obs_icefrac.plot(lw=2, color="b", ax=ax, label="Obs.")

    ax.plot(hl_icefrac.index,
            hl_icefrac.values,
            lw=2,
            color="b",
            label=HL_LABEL)
    ax.plot(nemo_icefrac.index,
            nemo_icefrac.values,
            lw=2,
            color="r",
            label=NEMO_LABEL)
    # ax.plot(ts_nemo_1way.index, ts_nemo_1way.values, lw=2, color="g", label="CRCM5_NEMO_oneway")
    ax.plot(obs_icefrac.index,
            obs_icefrac.values,
            lw=2,
            color="k",
            label="Obs.")
    #ax.plot(ts_nemo_offline.index, ts_nemo_offline.values, lw=2, color="#FFA500", label="NEMO-offline")
    #ax.plot(ts_nemo_offline_5min.index, ts_nemo_offline_5min.values, lw=2, color="g", label="NEMO-offline-5min")
    #ax.plot(ts_nemo_offline_double_snow.index, ts_nemo_offline_double_snow.values, lw=2, color="m", label="NEMO-offline-doublesnow")

    ax.plot(ts_nemo_offline_dt5min_small_ldf.index,
            ts_nemo_offline_dt5min_small_ldf.values,
            lw=2,
            color="g",
            label="NEMO-offline dt=5min, small ldf")
    # ax.plot(ts_nemo_offline_dt30min_small_ldf.index, ts_nemo_offline_dt30min_small_ldf.values, lw=2, color="y", label="NEMO-offline dt=30min,traldf3d, small ldf")
    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc3h.index, ts_nemo_offline_dt5min_small_ldf_sbc3h.values, lw=2, color="c", label="NEMO-offline dt=5min,traldf3d, small ldf, sbc3h")
    ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc6h.index,
            ts_nemo_offline_dt5min_small_ldf_sbc6h.values,
            lw=2,
            color="#6ACC65",
            label="NEMO-offline dt=5min,traldf3d, small ldf, sbc6h, hicr5cm")
    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc6h_nodyn.index, ts_nemo_offline_dt5min_small_ldf_sbc6h_nodyn.values, lw=2, color="#6ACEEE", label="NEMO-offline dt=5min,traldf3d, small ldf, sbc6h, noicedyn")
    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn.index, ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn.values, lw=2, color="#9ABF12", label="NEMO-offline dt=5min,traldf3d, small ldf, sbc5min, noicedyn")
    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn_noforc_tint.index, ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn_noforc_tint.values, lw=2, color="#111111", label="NEMO-offline dt=5min,traldf3d,small ldf,sbc5min,noicedyn,noforctint")

    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc5min_lim6h.index, ts_nemo_offline_dt5min_small_ldf_sbc5min_lim6h.values, lw=2,
    #         color="m", label="NEMO-offline dt=5min,traldf3d, small ldf, sbc5min, lim 6h")
    #
    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc5min_tkepenet_10m.index, ts_nemo_offline_dt5min_small_ldf_sbc5min_tkepenet_10m.values, lw=2,
    #         color="y", label="NEMO-offline dt=5min,traldf3d,small ldf,sbc5min,tke penet 10m")
    #
    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc5min_tke0001penet_10m.index, ts_nemo_offline_dt5min_small_ldf_sbc5min_tke0001penet_10m.values, lw=2,
    #         color="#ccceee", label="NEMO-offline dt=5min,traldf3d,small ldf,sbc5min,tke penet0.01 10m")
    #
    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1.index, ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1.values, lw=2,
    #         color="#aaa111", label="NEMO-offline dt=5min,traldf3d,small ldf,sbc5min,GLS1m")

    ax.plot(
        ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1_5year.index,
        ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1_5year.values,
        lw=2,
        color="#aaa111",
        label="NEMO-offline dt=5min,traldf3d,small ldf,sbc5min,GLS1m,5year")

    # ax.set_xlim([date2num(datetime(1979, 10, 1)), date2num(datetime(1980, 12, 31))])

    ax.xaxis.set_major_locator(YearLocator())

    fig.autofmt_xdate()

    ax.legend()
    ax.grid()

    if not os.path.isdir(img_folder):
        os.mkdir(img_folder)

    fig.tight_layout()
    fig.savefig(os.path.join(
        img_folder, "lake_icefr_ts_{}-{}.png".format(start_year, end_year)),
                dpi=commons.dpi,
                transparent=True,
                bbox_inches="tight")
Exemplo n.º 2
0
def main():

    start_year = 1980
    end_year = 2003

    months_of_obs = [12, 1, 2, 3, 4, 5]

    r_config = RunConfig(
        data_path="/RESCUE/skynet3_rech1/huziy/hdf_store/quebec_0.1_crcm5-hcd-rl.hdf5",
        start_year=start_year, end_year=end_year, label="ERAI-CRCM5-L"
    )

    var_name = "LC"
    bmp_info = analysis.get_basemap_info(r_config=r_config)
    lkid_to_mask = get_lake_masks(bmp_info.lons, bmp_info.lats)


    cell_area_m2 = analysis.get_array_from_file(path=r_config.data_path, var_name="cell_area_m2")


    # read the model data
    lkid_to_ts_model = {}
    for lkid, the_mask in lkid_to_mask.items():
        lkid_to_ts_model[lkid] = analysis.get_area_mean_timeseries(r_config.data_path, var_name=var_name, the_mask=the_mask * cell_area_m2,
                                                                   start_year=start_year, end_year=end_year)

        df = lkid_to_ts_model[lkid]

        # remove the last December
        df = df.select(lambda d: not (d.year == end_year and d.month == 12))

        # remove the first Jan and Feb
        df = df.select(lambda d: not (d.year == start_year and d.month in [1, 2]))

        # remove the Feb 29th
        df = df.select(lambda d: not (d.month == 2 and d.day == 29))

        # select months of interest
        df = df.select(lambda d: d.month in months_of_obs)

        # calculate the climatology
        df = df.groupby(lambda d: datetime(2001 if d.month == 12 else 2002, d.month, d.day)).mean()
        df.sort_index(inplace=True)


        lkid_to_ts_model[lkid] = df * 100


    # read obs data and calculate climatology
    lkid_to_ts_obs = {}
    for lkid in LAKE_IDS:
        lkid_to_ts_obs[lkid] = GL_obs_timeseries.get_ts_from_file(path=os.path.join(OBS_DATA_FOLDER, "{}-30x.TXT".format(lkid)),
                                                                  start_year=start_year, end_year=end_year - 1)

        # get the climatology
        dfm = lkid_to_ts_obs[lkid].mean(axis=1)

        dfm.index = [datetime(2001, 1, 1) + timedelta(days=int(jd - 1)) for jd in dfm.index]

        lkid_to_ts_obs[lkid] = dfm


    # plotting
    plot_utils.apply_plot_params(font_size=10)
    fig = plt.figure()
    gs = GridSpec(nrows=len(lkid_to_ts_model), ncols=2)

    for row, lkid in enumerate(lkid_to_ts_model):

        ax = fig.add_subplot(gs[row, 0])

        mod = lkid_to_ts_model[lkid]
        obs = lkid_to_ts_obs[lkid]

        print(obs.index)
        print(obs.values)

        ax.plot(mod.index, mod.values, label=r_config.label, color="r", lw=2)
        ax.plot(obs.index, obs.values, label="NOAA NIC/CIS", color="k", lw=2)

        if row == 0:
            ax.legend()

        ax.set_title(lkid)

        ax.xaxis.set_major_formatter(DateFormatter("%b"))


    fig.tight_layout()
    fig.savefig(os.path.join(img_folder, "GL_ice-cover-validation.png"), bbox_inches="tight", dpi=common_plot_params.FIG_SAVE_DPI)
Exemplo n.º 3
0
def main():
    start_year = 1979
    end_year = 2000

    HL_LABEL = "CRCM5_HL"
    NEMO_LABEL = "CRCM5_NEMO"

    sim_label_to_path = OrderedDict(
        [(HL_LABEL, "/RESCUE/skynet3_rech1/huziy/CNRCWP/C5/2016/2-year-runs/coupled-GL+stfl_oneway/Samples"),
         (NEMO_LABEL, "/HOME/huziy/skynet3_rech1/CNRCWP/C5/2016/2-year-runs/coupled-GL+stfl/Samples")]
    )

    var_name_list = ["TT", "PR", "LC", "HR", "HU", "AV", "I5", "AL"]

    season_to_months = commons.season_to_months

    vname_to_level = {
        "TT": 1, "PR": -1, "SN": -1, "LC": -1, "HR": 1, "HU": 1, "AV": -1, "I5": -1, "AL": -1
    }

    vname_to_level_kind = {
        "TT": level_kinds.HYBRID, "PR": level_kinds.ARBITRARY, "SN": level_kinds.ARBITRARY,
        "LC": level_kinds.ARBITRARY, "HR": level_kinds.HYBRID, "HU": level_kinds.HYBRID, "AV": level_kinds.ARBITRARY,
        "I5": level_kinds.ARBITRARY, "AL": level_kinds.ARBITRARY
    }

    vname_to_file_prefix = {
        "TT": "dm",
        "PR": "pm",
        "SN": "pm",
        "LC": "pm",
        "HR": "dm",
        "HU": "dm",
        "AV": "pm",
        "I5": "pm",
        "AL": "pm"
    }

    # ---> ---->
    avg_mask = get_nemo_lakes_mask(samples_dir=sim_label_to_path[NEMO_LABEL])

    vname = "LC"

    common_params = dict(start_year=start_year, end_year=end_year,
                         filename_prefix=vname_to_file_prefix[vname], level=vname_to_level[vname],
                         level_kind=vname_to_level_kind[vname], varname=vname, mask=avg_mask)

    hl_icefrac = get_area_avg_timeseries(sim_label_to_path[HL_LABEL], **common_params)
    nemo_icefrac = get_area_avg_timeseries(sim_label_to_path[NEMO_LABEL], **common_params)

    obs_icefrac = GL_obs_timeseries.get_ts_with_real_dates_from_file(
        path="/RESCUE/skynet3_rech1/huziy/obs_data/Lake_ice_concentration_Great_lakes_timeseries/GLK-30x.TXT",
        start_year=start_year - 1, end_year=end_year - 1)

    obs_icefrac /= 100.0


    plot_utils.apply_plot_params(font_size=14)

    # nemo ice fraction from 1-way coupled
    # with MFDataset("/HOME/huziy/skynet3_rech1/CNRCWP/C5/2016/2-year-runs/coupled-GL+stfl_oneway/NEMO/*grid_T.nc") as ds:
    #     timevar = ds.variables["time_counter"]
    #     print(timevar.units)
    #     times = num2date(timevar[:], timevar.units)
    #
    #     print(times[0], times[-1], type(times[0]))
    #
    #     print(times[:10])
    #
    #     print("===== avg_mask ====")
    #     print(avg_mask.min(), avg_mask.max(), avg_mask.shape)
    #
    #     print(ds.variables["soicecov"][0, :, :].shape)
    #     vals = [field.transpose()[20:-20, 20:-20][avg_mask].mean() for field in ds.variables["soicecov"][:]]
    #
    #     assert len(vals) == len(times)
    #
    #     ts_nemo_1way = pd.Series(index=[d for d in times], data=vals)
    #     ts_nemo_1way.sort_index(inplace=True)


    # nemo offline
    with MFDataset("/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/GLK_1d_*_grid_T.nc") as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline.sort_index(inplace=True)


    # nemo offline
    with MFDataset("/HOME/huziy/skynet3_rech1/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min/GLK_1d_*_grid_T.nc") as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline_5min = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_5min.sort_index(inplace=True)

    # nemo offline
    with MFDataset("/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/doubled_snowfall/GLK_1d_*_grid_T.nc") as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline_double_snow = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_double_snow.sort_index(inplace=True)

    # nemo offline
    with MFDataset("/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30/GLK_1d_*_grid_T.nc") as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf.sort_index(inplace=True)


   # nemo offline
    with MFDataset("/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_30min_eddy_tra10_dyn30_traldf3d/GLK_1d_*_grid_T.nc") as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline_dt30min_small_ldf = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_dt30min_small_ldf.sort_index(inplace=True)

    # nemo offline
    with MFDataset("/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_sbc_forcing_3hourly/GLK_1d_*_grid_T.nc") as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc3h = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc3h.sort_index(inplace=True)


    # nemo offline
    with MFDataset("/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_sbc_forcing_6hourly_hicrit_0.05m/GLK_1d_*_grid_T.nc") as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc6h = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc6h.sort_index(inplace=True)



    # nemo offline
    with MFDataset("/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_sbc_forcing_6hourly_hicrit_0.05m_noicedyn/GLK_1d_*_grid_T.nc") as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc6h_nodyn = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc6h_nodyn.sort_index(inplace=True)


   # nemo offline
    with MFDataset("/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_sbc_forcing_5min_noicedyn/GLK_1d_*_grid_T.nc") as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn.sort_index(inplace=True)



   # nemo offline
    with MFDataset("/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_sbc_forcing_5min_noicedyn_notime_interpolation_of_forcing/GLK_1d_*_grid_T.nc") as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn_noforc_tint = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn_noforc_tint.sort_index(inplace=True)


   # nemo offline
    with MFDataset("/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_sbc5min_lim3_6h/GLK_1d_*_grid_T.nc") as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc5min_lim6h = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc5min_lim6h.sort_index(inplace=True)


    #  nemo offline
    with MFDataset("/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_tke_penetr10m/GLK_1d_*_grid_T.nc") as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc5min_tkepenet_10m = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc5min_tkepenet_10m.sort_index(inplace=True)

   #  nemo offline
    with MFDataset("/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_tke0.01_penetr10m/GLK_1d_*_grid_T.nc") as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc5min_tke0001penet_10m = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc5min_tke0001penet_10m.sort_index(inplace=True)


   #  nemo offline
    with MFDataset("/RESCUE/skynet3_rech1/huziy/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/dt_5min_eddy_tra10_dyn30_sbc_forcing_5min_gls1/GLK_1d_*_grid_T.nc") as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))

        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1 = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1.sort_index(inplace=True)


   #  nemo offline
    data_folder = Path("/HOME/huziy/skynet3_rech1/NEMO_OFFICIAL/dev_v3_4_STABLE_2012/NEMOGCM/CONFIG/GLK_LIM3/EXP_GLK_LIM3_1980/outputs_nemo_offline/zdf_gls_dt_and_sbc_5min/")
    with MFDataset([str(f) for f in sorted(data_folder.iterdir(), key=lambda p: p.name) if f.name.endswith("_grid_T.nc")]) as ds:
        timevar = ds.variables["time_counter"]
        print(timevar.units)
        times = num2date(timevar[:], timevar.units)

        print(times[0], times[-1], type(times[0]))
        print(times[:10])

        print("===== avg_mask ====")
        print(avg_mask.min(), avg_mask.max(), avg_mask.shape)

        print(ds.variables["soicecov"][0, :, :].shape)
        vals = [field.transpose()[avg_mask].mean() for field in ds.variables["soicecov"][:]]

        assert len(vals) == len(times)

        ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1_5year = pd.Series(index=[d for d in times], data=vals)
        ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1_5year.sort_index(inplace=True)



    fig = plt.figure()

    print("hl_icefrac :", hl_icefrac.index[0], hl_icefrac.index[-1], type(hl_icefrac))
    print("nemo_icefrac :", nemo_icefrac.index[0], nemo_icefrac.index[-1])

    ax = plt.gca()

    # ax = hl_icefrac.plot(lw=2, color="k", label=HL_LABEL)
    # nemo_icefrac.plot(lw=2, color="r", ax=ax, label=NEMO_LABEL)
    # ts_nemo_1way.plot(lw=2, color="g", label="CRCM5_NEMO_oneway", ax=ax, zorder=5)
    # obs_icefrac.plot(lw=2, color="b", ax=ax, label="Obs.")

    ax.plot(hl_icefrac.index, hl_icefrac.values, lw=2, color="b", label=HL_LABEL)
    ax.plot(nemo_icefrac.index, nemo_icefrac.values, lw=2, color="r", label=NEMO_LABEL)
    # ax.plot(ts_nemo_1way.index, ts_nemo_1way.values, lw=2, color="g", label="CRCM5_NEMO_oneway")
    ax.plot(obs_icefrac.index, obs_icefrac.values, lw=2, color="k", label="Obs.")
    #ax.plot(ts_nemo_offline.index, ts_nemo_offline.values, lw=2, color="#FFA500", label="NEMO-offline")
    #ax.plot(ts_nemo_offline_5min.index, ts_nemo_offline_5min.values, lw=2, color="g", label="NEMO-offline-5min")
    #ax.plot(ts_nemo_offline_double_snow.index, ts_nemo_offline_double_snow.values, lw=2, color="m", label="NEMO-offline-doublesnow")

    ax.plot(ts_nemo_offline_dt5min_small_ldf.index, ts_nemo_offline_dt5min_small_ldf.values, lw=2, color="g", label="NEMO-offline dt=5min, small ldf")
    # ax.plot(ts_nemo_offline_dt30min_small_ldf.index, ts_nemo_offline_dt30min_small_ldf.values, lw=2, color="y", label="NEMO-offline dt=30min,traldf3d, small ldf")
    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc3h.index, ts_nemo_offline_dt5min_small_ldf_sbc3h.values, lw=2, color="c", label="NEMO-offline dt=5min,traldf3d, small ldf, sbc3h")
    ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc6h.index, ts_nemo_offline_dt5min_small_ldf_sbc6h.values, lw=2, color="#6ACC65", label="NEMO-offline dt=5min,traldf3d, small ldf, sbc6h, hicr5cm")
    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc6h_nodyn.index, ts_nemo_offline_dt5min_small_ldf_sbc6h_nodyn.values, lw=2, color="#6ACEEE", label="NEMO-offline dt=5min,traldf3d, small ldf, sbc6h, noicedyn")
    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn.index, ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn.values, lw=2, color="#9ABF12", label="NEMO-offline dt=5min,traldf3d, small ldf, sbc5min, noicedyn")
    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn_noforc_tint.index, ts_nemo_offline_dt5min_small_ldf_sbc5min_nodyn_noforc_tint.values, lw=2, color="#111111", label="NEMO-offline dt=5min,traldf3d,small ldf,sbc5min,noicedyn,noforctint")


    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc5min_lim6h.index, ts_nemo_offline_dt5min_small_ldf_sbc5min_lim6h.values, lw=2,
    #         color="m", label="NEMO-offline dt=5min,traldf3d, small ldf, sbc5min, lim 6h")
    #
    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc5min_tkepenet_10m.index, ts_nemo_offline_dt5min_small_ldf_sbc5min_tkepenet_10m.values, lw=2,
    #         color="y", label="NEMO-offline dt=5min,traldf3d,small ldf,sbc5min,tke penet 10m")
    #
    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc5min_tke0001penet_10m.index, ts_nemo_offline_dt5min_small_ldf_sbc5min_tke0001penet_10m.values, lw=2,
    #         color="#ccceee", label="NEMO-offline dt=5min,traldf3d,small ldf,sbc5min,tke penet0.01 10m")
    #
    # ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1.index, ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1.values, lw=2,
    #         color="#aaa111", label="NEMO-offline dt=5min,traldf3d,small ldf,sbc5min,GLS1m")

    ax.plot(ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1_5year.index, ts_nemo_offline_dt5min_small_ldf_sbc5min_gls1_5year.values, lw=2,
            color="#aaa111", label="NEMO-offline dt=5min,traldf3d,small ldf,sbc5min,GLS1m,5year")

    # ax.set_xlim([date2num(datetime(1979, 10, 1)), date2num(datetime(1980, 12, 31))])

    ax.xaxis.set_major_locator(YearLocator())

    fig.autofmt_xdate()

    ax.legend()
    ax.grid()


    if not os.path.isdir(img_folder):
        os.mkdir(img_folder)

    fig.tight_layout()
    fig.savefig(os.path.join(img_folder, "lake_icefr_ts_{}-{}.png".format(start_year, end_year)), dpi=commons.dpi, transparent=True, bbox_inches="tight")