예제 #1
0
def get_sp_tasks(tasks, autofilter):
    global ifs_spectral_file_
    tasks_by_freq = cmor_utils.group(tasks, lambda task: task.target.frequency)
    result = []
    for freq, task_group in tasks_by_freq.iteritems():
        tasks3d = [
            t for t in task_group
            if "alevel" in getattr(t.target, cmor_target.dims_key).split()
        ]
        if not any(tasks3d):
            continue
        surf_pressure_tasks = [
            t for t in task_group
            if t.source.get_grib_code() == surface_pressure
            and getattr(t, "time_operator", "point") in ["mean", "point"]
        ]
        surf_pressure_task = surf_pressure_tasks[0] if any(
            surf_pressure_tasks) else None
        if surf_pressure_task:
            result.append(surf_pressure_task)
        else:
            source = cmor_source.ifs_source(surface_pressure)
            surf_pressure_task = cmor_task.cmor_task(
                source, cmor_target.cmor_target("sp", freq))
            setattr(surf_pressure_task.target, cmor_target.freq_key, freq)
            setattr(surf_pressure_task.target, "time_operator", ["point"])
            find_sp_variable(surf_pressure_task, autofilter)
            result.append(surf_pressure_task)
        for task3d in tasks3d:
            setattr(task3d, "sp_task", surf_pressure_task)
    return result
예제 #2
0
def get_sp_tasks(tasks):
    tasks_by_freq = cmor_utils.group(
        tasks, lambda task: (task.target.frequency, '_'.join(
            getattr(task.target, "time_operator", ["mean"]))))
    result = []
    for freq, task_group in tasks_by_freq.iteritems():
        tasks3d = [
            t for t in task_group
            if "alevel" in getattr(t.target, cmor_target.dims_key).split()
        ]
        if not any(tasks3d):
            continue
        surf_pressure_tasks = [
            t for t in task_group
            if t.source.get_grib_code() == surface_pressure
        ]
        if len(surf_pressure_tasks) > 0:
            surf_pressure_task = surf_pressure_tasks[0]
            result.append(surf_pressure_task)
        else:
            source = cmor_source.ifs_source(surface_pressure)
            surf_pressure_task = cmor_task.cmor_task(
                source, cmor_target.cmor_target("sp", tasks3d[0].target.table))
            setattr(surf_pressure_task.target, cmor_target.freq_key, freq[0])
            setattr(surf_pressure_task.target, "time_operator",
                    freq[1].split('_'))
            setattr(surf_pressure_task.target, cmor_target.dims_key,
                    "latitude longitude")
            find_sp_variable(surf_pressure_task)
            result.append(surf_pressure_task)
        for task3d in tasks3d:
            setattr(task3d, "sp_task", surf_pressure_task)
    return result
예제 #3
0
def get_mask_tasks(tasks):
    global log, masks
    selected_masks = []
    for task in tasks:
        msk = getattr(task.target, cmor_target.mask_key, None)
        if msk:
            if msk not in masks:
                log.warning(
                    "Mask %s is not supported as an IFS mask, skipping masking"
                    % msk)
                delattr(task.target, cmor_target.mask_key)
            else:
                selected_masks.append(msk)
            continue
        for area_operator in getattr(task.target, "area_operator", []):
            words = area_operator.split()
            if len(words) == 3 and words[1] == "where":
                mask_name = words[2]
                if mask_name not in masks:
                    log.warning(
                        "Mask %s is not supported as an IFS mask, skipping masking"
                        % mask_name)
                else:
                    selected_masks.append(mask_name)
                    setattr(task.target, cmor_target.mask_key, mask_name)
    result = []
    for m in set(selected_masks):
        target = cmor_target.cmor_target(m, "fx")
        setattr(target, cmor_target.freq_key, 0)
        setattr(target, "time_operator", ["point"])
        result_task = cmor_task.cmor_task(masks[m]["source"], target)
        setattr(result_task, cmor_task.output_path_key, ifs_gridpoint_file_)
        result.append(result_task)
    return result
예제 #4
0
 def test_cmor_single_task3d(self):
     tab_dir = get_table_path()
     conf_path = os.path.join(os.path.dirname(nemo2cmor.__file__), "resources", "metadata-template.json")
     cmor.setup(tab_dir)
     cmor.dataset_json(conf_path)
     nemo2cmor.initialize(self.data_dir, "exp", os.path.join(tab_dir, "CMIP6"), datetime.datetime(1990, 3, 1),
                          datetime.timedelta(days=365))
     src = cmor_source.netcdf_source("to", "nemo")
     tgt = cmor_target.cmor_target("thetao", "Omon")
     setattr(tgt, "frequency", "mon")
     setattr(tgt, "dimensions", "longitude latitude olevel time")
     setattr(tgt, "time_operator", ["mean"])
     tgt.dims = 3
     tsk = cmor_task.cmor_task(src, tgt)
     nemo2cmor.execute([tsk])
     nemo2cmor.finalize()
     cmor.close()
예제 #5
0
 def test_cmor_single_task3d(self):
     tab_dir = init_cmor()
     nemo2cmor.initialize(self.data_dir,
                          "expn",
                          os.path.join(tab_dir, "CMIP6"),
                          datetime.datetime(1990, 3, 1),
                          testmode=True)
     src = cmor_source.netcdf_source("to", "nemo")
     tgt = cmor_target.cmor_target("thetao", "Omon")
     setattr(tgt, "frequency", "mon")
     setattr(tgt, "dimensions", "longitude latitude olevel time")
     setattr(tgt, "time_operator", ["mean"])
     tgt.space_dims = {"latitude", "longitude"}
     tsk = cmor_task.cmor_task(src, tgt)
     nemo2cmor.execute([tsk])
     nemo2cmor.finalize()
     cmor.close()
예제 #6
0
 def test_cmor_single_task3d(self):
     tab_dir = get_table_path()
     conf_path = ece2cmorlib.conf_path_default
     cmor.setup(tab_dir)
     cmor.dataset_json(conf_path)
     cmor.set_cur_dataset_attribute("calendar", "proleptic_gregorian")
     nemo2cmor.initialize(self.data_dir, "exp",
                          os.path.join(tab_dir, "CMIP6"),
                          datetime.datetime(1990, 3, 1))
     src = cmor_source.netcdf_source("to", "nemo")
     tgt = cmor_target.cmor_target("thetao", "Omon")
     setattr(tgt, "frequency", "mon")
     setattr(tgt, "dimensions", "longitude latitude olevel time")
     setattr(tgt, "time_operator", ["mean"])
     tgt.space_dims = {"latitude", "longitude"}
     tsk = cmor_task.cmor_task(src, tgt)
     nemo2cmor.execute([tsk])
     nemo2cmor.finalize()
     cmor.close()
예제 #7
0
 def test_constructor(self):
     src=cmor_source.ifs_source.read("79.128")
     tgt=cmor_target.cmor_target("clwvi","Amon")
     task=cmor_task.cmor_task(src,tgt)
     eq_(task.source,src)
     eq_(task.target,tgt)
예제 #8
0
 def test_invalid_source(self):
     src="invalid"
     tgt=cmor_target.cmor_target("huss","Amon")
     task=cmor_task.cmor_task(src,tgt)
예제 #9
0
 def test_constructor():
     src = cmor_source.ifs_source.read("79.128")
     tgt = cmor_target.cmor_target("clwvi", "Amon")
     task = cmor_task.cmor_task(src, tgt)
     assert task.source == src
     assert task.target == tgt
예제 #10
0
 def test_invalid_source():
     src = "invalid"
     tgt = cmor_target.cmor_target("huss", "Amon")
     with pytest.raises(Exception, match=r"Invalid source*"):
         task = cmor_task.cmor_task(src, tgt)