Esempio n. 1
0
 def test_create_tag_name(self):
     """
     Test create_tag when site_name is given.
     """
     single_point = SinglePointCase(
         plat=self.plat,
         plon=self.plon,
         site_name=self.site_name,
         create_domain=self.create_domain,
         create_surfdata=self.create_surfdata,
         create_landuse=self.create_landuse,
         create_datm=self.create_datm,
         create_user_mods=self.create_user_mods,
         dom_pft=self.dom_pft,
         pct_pft=self.pct_pft,
         num_pft=self.num_pft,
         include_nonveg=self.include_nonveg,
         uni_snow=self.uni_snow,
         cap_saturation=self.cap_saturation,
         out_dir=self.out_dir,
         overwrite=self.overwrite,
     )
     single_point.site_name = "foo"
     single_point.create_tag()
     self.assertEqual(single_point.tag, "foo")
Esempio n. 2
0
 def test_check_dom_pft_too_big(self):
     """
     Test check_dom_pft
     When one of the given dom_pft(s) are bigger than 78
     """
     single_point = SinglePointCase(
         plat=self.plat,
         plon=self.plon,
         site_name=self.site_name,
         create_domain=self.create_domain,
         create_surfdata=self.create_surfdata,
         create_landuse=self.create_landuse,
         create_datm=self.create_datm,
         create_user_mods=self.create_user_mods,
         dom_pft=self.dom_pft,
         pct_pft=self.pct_pft,
         num_pft=self.num_pft,
         include_nonveg=self.include_nonveg,
         uni_snow=self.uni_snow,
         cap_saturation=self.cap_saturation,
         out_dir=self.out_dir,
         overwrite=self.overwrite,
     )
     single_point.dom_pft = [16, 36, 79]
     with self.assertRaisesRegex(argparse.ArgumentTypeError,
                                 "values for --dompft should*"):
         single_point.check_dom_pft()
Esempio n. 3
0
    def test_modify_surfdata_atpoint_crop_1pft_wetland(self):
        """
        Test modify_surfdata_atpoint
        Checks WETLAND for one pft
        """
        single_point = SinglePointCase(
            plat=self.plat,
            plon=self.plon,
            site_name=self.site_name,
            create_domain=self.create_domain,
            create_surfdata=self.create_surfdata,
            create_landuse=self.create_landuse,
            create_datm=self.create_datm,
            create_user_mods=self.create_user_mods,
            dom_pft=self.dom_pft,
            pct_pft=self.pct_pft,
            num_pft=self.num_pft,
            include_nonveg=self.include_nonveg,
            uni_snow=self.uni_snow,
            cap_saturation=self.cap_saturation,
            out_dir=self.out_dir,
            overwrite=self.overwrite,
        )
        single_point.dom_pft = [17]

        ds_out = single_point.modify_surfdata_atpoint(self.ds_test)

        self.assertEqual(ds_out["PCT_WETLAND"].data[:, :], 0)
Esempio n. 4
0
    def test_modify_surfdata_atpoint_crop_1pft_unisnow(self):
        """
        Test modify_surfdata_atpoint for crop cases
        Checks STD_ELV for one pft and unisnow
        """
        single_point = SinglePointCase(
            plat=self.plat,
            plon=self.plon,
            site_name=self.site_name,
            create_domain=self.create_domain,
            create_surfdata=self.create_surfdata,
            create_landuse=self.create_landuse,
            create_datm=self.create_datm,
            create_user_mods=self.create_user_mods,
            dom_pft=self.dom_pft,
            pct_pft=self.pct_pft,
            num_pft=self.num_pft,
            include_nonveg=self.include_nonveg,
            uni_snow=self.uni_snow,
            cap_saturation=self.cap_saturation,
            out_dir=self.out_dir,
            overwrite=self.overwrite,
        )
        single_point.dom_pft = [17]
        single_point.uni_snow = True
        ds_out = single_point.modify_surfdata_atpoint(self.ds_test)

        self.assertEqual(ds_out["STD_ELEV"].data[:, :], 20)
Esempio n. 5
0
    def test_modify_surfdata_atpoint_crop_1pft_pctnatpft(self):
        """
        Test modify_surfdata_atpoint
        Checks PCT_NAT_PFT for one pft
        """
        single_point = SinglePointCase(
            plat=self.plat,
            plon=self.plon,
            site_name=self.site_name,
            create_domain=self.create_domain,
            create_surfdata=self.create_surfdata,
            create_landuse=self.create_landuse,
            create_datm=self.create_datm,
            create_user_mods=self.create_user_mods,
            dom_pft=self.dom_pft,
            pct_pft=self.pct_pft,
            num_pft=self.num_pft,
            include_nonveg=self.include_nonveg,
            uni_snow=self.uni_snow,
            cap_saturation=self.cap_saturation,
            out_dir=self.out_dir,
            overwrite=self.overwrite,
        )
        single_point.dom_pft = [19]
        ds_out = single_point.modify_surfdata_atpoint(self.ds_test)

        expected_out = np.zeros((1, 1, 64))
        expected_out[:, :, 4] = 100

        # self.assertEqual(ds_out['PCT_NAT_PFT'].data[:,:,5], 100)
        np.testing.assert_array_equal(ds_out["PCT_CFT"].data, expected_out)
Esempio n. 6
0
    def test_modify_surfdata_atpoint_nocrop_nopft_include_nonveg(self):
        """
        Test modify_surfdata_atpoint
        Checks PCT_CROP for no pft and include nonveg
        """
        single_point = SinglePointCase(
            plat=self.plat,
            plon=self.plon,
            site_name=self.site_name,
            create_domain=self.create_domain,
            create_surfdata=self.create_surfdata,
            create_landuse=self.create_landuse,
            create_datm=self.create_datm,
            create_user_mods=self.create_user_mods,
            dom_pft=self.dom_pft,
            pct_pft=self.pct_pft,
            num_pft=self.num_pft,
            include_nonveg=self.include_nonveg,
            uni_snow=self.uni_snow,
            cap_saturation=self.cap_saturation,
            out_dir=self.out_dir,
            overwrite=self.overwrite,
        )
        single_point.dom_pft = None
        single_point.include_nonveg = True
        self.ds_test['PCT_CROP'].values = [[40]]
        self.ds_test['PCT_LAKE'].values = [[10]]
        self.ds_test['PCT_WETLAND'].values = [[10]]
        self.ds_test['PCT_NATVEG'].values = [[40]]
        ds_out = single_point.modify_surfdata_atpoint(self.ds_test)

        self.assertEqual(ds_out["PCT_CROP"].data[:, :], 40)
Esempio n. 7
0
    def test_modify_surfdata_atpoint_crop_lake_include_nonveg(self):
        """
        Test modify_surfdata_atpoint for crop cases
        Checks PCT_LAKE for one pft to make sure it is not zerod-out
        """
        single_point = SinglePointCase(
            plat=self.plat,
            plon=self.plon,
            site_name=self.site_name,
            create_domain=self.create_domain,
            create_surfdata=self.create_surfdata,
            create_landuse=self.create_landuse,
            create_datm=self.create_datm,
            create_user_mods=self.create_user_mods,
            dom_pft=self.dom_pft,
            pct_pft=self.pct_pft,
            num_pft=self.num_pft,
            include_nonveg=self.include_nonveg,
            uni_snow=self.uni_snow,
            cap_saturation=self.cap_saturation,
            out_dir=self.out_dir,
            overwrite=self.overwrite,
        )
        single_point.include_nonveg = True
        single_point.dom_pft = [17]

        ds_out = single_point.modify_surfdata_atpoint(self.ds_test)

        self.assertNotEqual(ds_out["PCT_LAKE"].data[:, :], 0)
Esempio n. 8
0
    def test_modify_surfdata_atpoint_nocrop_urban_nononveg(self):
        """
        Test modify_surfdata_atpoint for crop cases
        Checks URBAN for one pft
        """
        single_point = SinglePointCase(
            plat=self.plat,
            plon=self.plon,
            site_name=self.site_name,
            create_domain=self.create_domain,
            create_surfdata=self.create_surfdata,
            create_landuse=self.create_landuse,
            create_datm=self.create_datm,
            create_user_mods=self.create_user_mods,
            dom_pft=self.dom_pft,
            pct_pft=self.pct_pft,
            num_pft=self.num_pft,
            include_nonveg=self.include_nonveg,
            uni_snow=self.uni_snow,
            cap_saturation=self.cap_saturation,
            out_dir=self.out_dir,
            overwrite=self.overwrite,
        )
        single_point.include_nonveg = False
        single_point.dom_pft = [7]
        single_point.plat = [34.05]
        single_point.plon = [118.25]
        ds_out = single_point.modify_surfdata_atpoint(self.ds_test)

        expected_out = np.zeros((1, 1, 3))

        # self.assertEqual(ds_out['PCT_NAT_PFT'].data[:,:,5], 100)
        np.testing.assert_array_equal(ds_out["PCT_URBAN"].data, expected_out)
Esempio n. 9
0
 def test_check_pct_pft_fraction_topct(self):
     """
     Test check_pct_pft
     Check if pct_pft is corretly converted to percent.
     """
     single_point = SinglePointCase(
         plat=self.plat,
         plon=self.plon,
         site_name=self.site_name,
         create_domain=self.create_domain,
         create_surfdata=self.create_surfdata,
         create_landuse=self.create_landuse,
         create_datm=self.create_datm,
         create_user_mods=self.create_user_mods,
         dom_pft=self.dom_pft,
         pct_pft=self.pct_pft,
         num_pft=self.num_pft,
         include_nonveg=self.include_nonveg,
         uni_snow=self.uni_snow,
         cap_saturation=self.cap_saturation,
         out_dir=self.out_dir,
         overwrite=self.overwrite,
     )
     single_point.dom_pft = [1, 5, 8]
     single_point.pct_pft = [0.5, 0.4, 0.1]
     single_point.check_pct_pft()
     self.assertEqual(single_point.pct_pft, [50, 40, 10])
Esempio n. 10
0
 def test_check_pct_pft_sum_not1(self):
     """
     Test check_pct_pft
     Check if pct_pft adds up to 1 or 100.
     """
     single_point = SinglePointCase(
         plat=self.plat,
         plon=self.plon,
         site_name=self.site_name,
         create_domain=self.create_domain,
         create_surfdata=self.create_surfdata,
         create_landuse=self.create_landuse,
         create_datm=self.create_datm,
         create_user_mods=self.create_user_mods,
         dom_pft=self.dom_pft,
         pct_pft=self.pct_pft,
         num_pft=self.num_pft,
         include_nonveg=self.include_nonveg,
         uni_snow=self.uni_snow,
         cap_saturation=self.cap_saturation,
         out_dir=self.out_dir,
         overwrite=self.overwrite,
     )
     single_point.dom_pft = [1, 5]
     single_point.pct_pft = [0.1, 0.5]
     with self.assertRaisesRegex(
             argparse.ArgumentTypeError,
             "Sum of --pctpft values should be equal to 1*"):
         single_point.check_pct_pft()
Esempio n. 11
0
 def test_check_pct_pft_notsamenumbers(self):
     """
     Test check_pct_pft
     Check if pct_pft is the same length as dom_pft
     """
     single_point = SinglePointCase(
         plat=self.plat,
         plon=self.plon,
         site_name=self.site_name,
         create_domain=self.create_domain,
         create_surfdata=self.create_surfdata,
         create_landuse=self.create_landuse,
         create_datm=self.create_datm,
         create_user_mods=self.create_user_mods,
         dom_pft=self.dom_pft,
         pct_pft=self.pct_pft,
         num_pft=self.num_pft,
         include_nonveg=self.include_nonveg,
         uni_snow=self.uni_snow,
         cap_saturation=self.cap_saturation,
         out_dir=self.out_dir,
         overwrite=self.overwrite,
     )
     single_point.dom_pft = [1, 5]
     single_point.pct_pft = [0.5]
     with self.assertRaisesRegex(
             argparse.ArgumentTypeError,
             "Please provide the same number of inputs*"):
         single_point.check_pct_pft()
Esempio n. 12
0
 def test_check_nonveg_nodompft(self):
     """
     Test check_nonveg
     If include_nonveg =False and no dompft it should complain.
     """
     single_point = SinglePointCase(
         plat=self.plat,
         plon=self.plon,
         site_name=self.site_name,
         create_domain=self.create_domain,
         create_surfdata=self.create_surfdata,
         create_landuse=self.create_landuse,
         create_datm=self.create_datm,
         create_user_mods=self.create_user_mods,
         dom_pft=self.dom_pft,
         pct_pft=self.pct_pft,
         num_pft=self.num_pft,
         include_nonveg=self.include_nonveg,
         uni_snow=self.uni_snow,
         cap_saturation=self.cap_saturation,
         out_dir=self.out_dir,
         overwrite=self.overwrite,
     )
     single_point.dom_pft = None
     single_point.include_nonveg = False
     with self.assertRaisesRegex(
             argparse.ArgumentTypeError,
             "To include non-veg land units, you need to specify*",
     ):
         single_point.check_nonveg()
Esempio n. 13
0
 def test_check_dom_pft_mixed_range(self):
     """
     Test check_dom_pft
     Test if all dom_pft(s) are in the same range of either 1-15 or 16-78
     """
     single_point = SinglePointCase(
         plat=self.plat,
         plon=self.plon,
         site_name=self.site_name,
         create_domain=self.create_domain,
         create_surfdata=self.create_surfdata,
         create_landuse=self.create_landuse,
         create_datm=self.create_datm,
         create_user_mods=self.create_user_mods,
         dom_pft=self.dom_pft,
         pct_pft=self.pct_pft,
         num_pft=self.num_pft,
         include_nonveg=self.include_nonveg,
         uni_snow=self.uni_snow,
         cap_saturation=self.cap_saturation,
         out_dir=self.out_dir,
         overwrite=self.overwrite,
     )
     single_point.dom_pft = [1, 5, 15]
     single_point.num_pft = 78
     with self.assertRaisesRegex(argparse.ArgumentTypeError,
                                 "mixed land units is not possible*"):
         single_point.check_dom_pft()
Esempio n. 14
0
 def test_check_dom_pft_numpft(self):
     """
     Test check_dom_pft
     When dom_pft > 15 but no crop (aka num_pft =<15)
     """
     single_point = SinglePointCase(
         plat=self.plat,
         plon=self.plon,
         site_name=self.site_name,
         create_domain=self.create_domain,
         create_surfdata=self.create_surfdata,
         create_landuse=self.create_landuse,
         create_datm=self.create_datm,
         create_user_mods=self.create_user_mods,
         dom_pft=self.dom_pft,
         pct_pft=self.pct_pft,
         num_pft=self.num_pft,
         include_nonveg=self.include_nonveg,
         uni_snow=self.uni_snow,
         cap_saturation=self.cap_saturation,
         out_dir=self.out_dir,
         overwrite=self.overwrite,
     )
     single_point.dom_pft = [15, 53]
     single_point.num_pft = 16
     with self.assertRaisesRegex(argparse.ArgumentTypeError,
                                 "Please use --crop*"):
         single_point.check_dom_pft()
Esempio n. 15
0
def subset_point(args, file_dict: dict):
    """
    Subsets surface, domain, land use, and/or DATM files at a single point
    """

    logger.info(
        "----------------------------------------------------------------------------"
    )
    logger.info(
        "This script extracts a single point from the global CTSM datasets.")

    num_pft = int(determine_num_pft(args.crop_flag))

    # --  Create SinglePoint Object
    single_point = SinglePointCase(
        plat=args.plat,
        plon=args.plon,
        site_name=args.site_name,
        create_domain=args.create_domain,
        create_surfdata=args.create_surfdata,
        create_landuse=args.create_landuse,
        create_datm=args.create_datm,
        create_user_mods=args.create_user_mods,
        dom_pft=args.dom_pft,
        pct_pft=args.pct_pft,
        num_pft=num_pft,
        include_nonveg=args.include_nonveg,
        uni_snow=args.uni_snow,
        cap_saturation=args.cap_saturation,
        out_dir=args.out_dir,
        overwrite=args.overwrite,
    )

    logger.debug(single_point)

    # --  Create CTSM domain file
    if single_point.create_domain:
        single_point.create_domain_at_point(file_dict["main_dir"],
                                            file_dict["fdomain_in"])

    # --  Create CTSM surface data file
    if single_point.create_surfdata:
        single_point.create_surfdata_at_point(file_dict["fsurf_dir"],
                                              file_dict["fsurf_in"],
                                              args.user_mods_dir)

    # --  Create CTSM transient landuse data file
    if single_point.create_landuse:
        single_point.create_landuse_at_point(file_dict["fluse_dir"],
                                             file_dict["fluse_in"],
                                             args.user_mods_dir)

    # --  Create single point atmospheric forcing data
    if single_point.create_datm:
        # subset DATM domain file
        single_point.create_datmdomain_at_point(file_dict["datm_tuple"])

        # subset the DATM data
        nl_datm = os.path.join(args.user_mods_dir, "user_nl_datm_streams")
        single_point.create_datm_at_point(file_dict['datm_tuple'],
                                          args.datm_syr, args.datm_eyr,
                                          nl_datm)

    # -- Write shell commands
    if single_point.create_user_mods:
        single_point.write_shell_commands(
            os.path.join(args.user_mods_dir, "shell_commands"))

    logger.info("Successfully ran script for single point.")