Exemple #1
0
  def run_simulation(self):
    if not isinstance(self.weather_data, dict):
      print("Fetching NASA weather...")
      self.wdp = NASAPowerWeatherDataProvider(self.location.lat, self.location.lon)
    else:
      print("Weather data is cached...")
      if (self.location.lat != self.weather_data['latitude']) or (self.location.lon != self.weather_data['longitude']):
        print("Location changed, fetching NASA weather again")
        self.wdp = NASAPowerWeatherDataProvider(self.location.lat, self.location.lon)
      else:
        self.wdp = WeatherDataProvider()
        self.wdp.store = self.weather_data['store']
        self.wdp.elevation = self.weather_data['elevation']
        self.wdp.longitude = self.weather_data['longitude']
        self.wdp.latitude = self.weather_data['latitude']
        self.wdp.description = self.weather_data['description']
        self.wdp.ETmodel = self.weather_data['ETmodel']
    print(self.wdp)
    amgt = default_amgt
    soil = default_soil
    site = default_site
    crop = default_crop

    amgt[0][self.start_date] = amgt[0].pop(amgt[0].keys()[0])

    amgt[0][self.start_date]['CropCalendar']['crop_start_date'] = self.sowing_date
    amgt[0][self.start_date]['CropCalendar']['crop_end_date'] = self.end_date

    parvalues = ParameterProvider(sitedata=site, soildata=soil, cropdata=crop)
    crop['TSUM1'] = self.tsum1
    crop['TSUM2'] = self.tsum2
    soil.update(self.soil_attributes)
    wofsim = Wofost71_WLP_FD(parvalues, self.wdp, agromanagement=amgt)
    wofsim.run_till_terminate()
    output = wofsim.get_output()

    results_dict = {}
    for a in output:
        results_dict[a.pop('day').isoformat()] = a
    self.simulation_dict = results_dict
    return results_dict
def run(crop: str, soil: str, agro: str, day: int, weather_filename: str,
        saved_name="output"):
    # load argo from directory
    agromanagement = YAMLAgroManagementReader(f"{base_dir}/{agro}")
    sitedata = WOFOST71SiteDataProvider(WAV=100, CO2=360)
    # load soil from directory
    soildata = CABOFileReader(f"{base_dir}/{soil}")
    # load crop from directory
    cropdata = CABOFileReader(f"{base_dir}/{crop}")
    # load weather data from directory
    wdp = CABOWeatherDataProvider(fname=weather_filename, fpath=base_dir)
    # packaing parameters
    parameters = ParameterProvider(cropdata=cropdata, soildata=soildata,
                                   sitedata=sitedata)
    # create model
    wofost = Wofost71_WLP_FD(parameters, wdp, agromanagement)
    # run till [day]
    wofost.run(day)

    # save output az a csv in OUT directory
    model_out_put = wofost.get_output()
    df = pd.DataFrame(model_out_put)
    df.to_csv(f"{out_dir}/{saved_name}.csv")
print(cropdata)

# read soil file
from pcse.fileinput import CABOFileReader
soildata = CABOFileReader("soildata.soil")
print(soildata)

#site parameters
from pcse.util import WOFOST71SiteDataProvider
sitedata = WOFOST71SiteDataProvider(WAV=100, CO2=360)
print(sitedata)

#pack the different sets of parameters
from pcse.base_classes import ParameterProvider
parameters = ParameterProvider(cropdata=cropdata,
                               soildata=soildata,
                               sitedata=sitedata)  #cropdata = cropd

#agromanagement control the start date and end date
#there are two files, one is defalut, the other one is for excel weather data
from pcse.fileinput import YAMLAgroManagementReader
agromanagement = YAMLAgroManagementReader("sugarbeet_c.agro")
print(agromanagement)

#using modeul to read weather data
from pcse.db import NASAPowerWeatherDataProvider
wdp = NASAPowerWeatherDataProvider(latitude=52, longitude=5)
print(wdp)

#from pcse.fileinput import ExcelWeatherDataProvider
#wdp = ExcelWeatherDataProvider ("weather04.xlsx")
Exemple #4
0
def main():

    parser = create_parser()
    args = parser.parse_args()
    if None in [args.crop, args.year, args.dsn, args.db_version]:
        parser.print_help()
        return
    db.version = args.db_version

    # labels for soil columns which differ across database versions
    lbl_smu, lbl_smu_area, lbl_stu, lbl_stu_perc = soil_identifiers[
        args.db_version]

    engine = sa.create_engine(args.dsn)
    if args.grid is None:
        grids = dp.get_grids(engine, args.cropd, args.year)
    else:
        grids = [
            args.grid,
        ]

    for grid in grids:
        agro = dp.get_agromanagement(engine, grid, args.crop, args.year)
        # Fix the campaign start/end onto dekad boundaries
        start_dekad = get_preceeding_dekad(agro.campaign_start_date)
        end_dekad = get_preceeding_dekad(agro.campaign_end_date)
        agro.set_campaign_start_date(start_dekad)
        agro.campaign_end_date = end_dekad

        # We want to pull 180 days of additional weather data to allow water balance initialization
        # with the --use-isw option
        start_date_weather = start_dekad - dt.timedelta(days=180)
        weatherdata = dp.get_weatherdata(engine,
                                         grid,
                                         start=start_date_weather,
                                         end=end_dekad)

        # Fetch or define crop, soil and site data
        cropd = dp.get_cropdata(engine, grid, args.crop, args.year)
        sited = WOFOST71SiteDataProvider(WAV=100)
        soild = DummySoilDataProvider()
        parameters = ParameterProvider(cropdata=cropd,
                                       soildata=soild,
                                       sitedata=sited)

        # Run WOFOST potential production and convert output to Pandas DataFrame
        mconf = os.path.join(os.path.dirname(__file__), "Wofost71_PP.conf")
        wofost = CGMSEngine(parameters, weatherdata, agro, config=mconf)
        # Run till end of the campaign year or date provided by --run_until
        if args.run_till is not None:
            wofost.run_till(args.run_till)
        else:
            wofost.run_till(agro.campaign_end_date)
        df_simyield_pp = pd.DataFrame(wofost.get_output())
        df_simyield_pp_summary = pd.DataFrame(wofost.get_summary_output())

        # First add grid number and simulation type to the dataframe
        df_simyield_pp_summary["grid"] = grid
        df_simyield_pp["grid"] = grid
        df_simyield_pp_summary["sim_type"] = "pp"
        df_simyield_pp["sim_type"] = "pp"

        # Pull in soil data for water-limited run
        soil_iterator = dp.get_soiliterator(engine, grid)
        suitable_stu = dp.get_suitability(engine, args.crop)

        # Placeholders for simulation_results at stu level
        df_simyield_wlp = None
        df_simyield_wlp_summary = None

        # Run water-limited simulation results
        for smu_no, area, stu_no, percentage, soild in soil_iterator:
            # Check if this is a suitable STU
            if stu_no not in suitable_stu:
                print("Skipping stu: %s" % stu_no)
                continue
            print("Processing grid: %i, smu: %i, stu: %i" %
                  (grid, smu_no, stu_no))
            sited = dp.get_sitedata(engine, grid, args.crop, args.year, stu_no)
            if args.use_isw_date:
                agro.set_campaign_start_date(sited.start_date_waterbalance)
            parameters = ParameterProvider(cropdata=cropd,
                                           soildata=soild,
                                           sitedata=sited)
            mconf = os.path.join(os.path.dirname(__file__),
                                 "Wofost71_WLP_FD.conf")
            wofost = CGMSEngine(parameters, weatherdata, agro, config=mconf)
            # Run till end of the campaign year or date provided by --run_until
            if args.run_till is not None:
                wofost.run_till(args.run_till)
            else:
                wofost.run_till(agro.campaign_end_date)

            # Get output
            df = pd.DataFrame(wofost.get_output())
            # remove simulation days before start_dekad due to soil moisture initialization
            ix = df.day >= start_dekad
            df = df[ix]
            # Add soil identifiers for weighted averaging
            df[lbl_smu] = smu_no
            df[lbl_stu] = stu_no
            df[lbl_smu_area] = area
            df[lbl_stu_perc] = percentage
            if df_simyield_wlp is None:
                df_simyield_wlp = df
            else:
                df_simyield_wlp = pd.concat([df_simyield_wlp, df])

            # Get summary output
            df_summary = pd.DataFrame(wofost.get_summary_output())
            df_summary[lbl_smu] = smu_no
            df_summary[lbl_stu] = stu_no
            df_summary[lbl_smu_area] = area
            df_summary[lbl_stu_perc] = percentage
            if df_simyield_wlp_summary is None:
                df_simyield_wlp_summary = df_summary
            else:
                df_simyield_wlp_summary = pd.concat(
                    [df_simyield_wlp_summary, df_summary])

        # Start aggregating simulation results

        # First add grid number and simulation type to the dataframes
        df_simyield_wlp_summary["grid"] = grid
        df_simyield_wlp["grid"] = grid

        # First aggregate all STU's into SMU's by using the 'stu_perc' percentages as weights
        if args.aggr_level in ("smu", "grid"):
            df_simyield_wlp = \
                group_dataframe(df_simyield_wlp, groupby=["grid", "day", lbl_smu], weightby=lbl_stu_perc,
                                excluding=["grid", "day", lbl_smu, lbl_stu, lbl_stu_perc])
            df_simyield_wlp_summary = \
                group_dataframe(df_simyield_wlp_summary, groupby=["grid", lbl_smu], weightby=lbl_stu_perc,
                                excluding=["grid", lbl_smu, lbl_stu, lbl_stu_perc] + date_type_variables)

            # Next aggregate all SMU's to the grid level by using the 'smu_area' as weights
            if args.aggr_level == 'grid':
                df_simyield_wlp = \
                    group_dataframe(df_simyield_wlp, groupby=["grid", "day"], weightby=lbl_smu_area,
                                    excluding=["grid", "day", lbl_smu, lbl_smu_area])
                df_simyield_wlp_summary = \
                    group_dataframe(df_simyield_wlp_summary, groupby=["grid"], weightby=lbl_smu_area,
                                    excluding=["grid", lbl_smu, lbl_smu_area])

        df_simyield_wlp_summary["sim_type"] = "wlp"
        df_simyield_wlp["sim_type"] = "wlp"

        # combine potential (pp) and water-limited production (wlp) in a single dataframe
        df_simyield = pd.concat([df_simyield_pp, df_simyield_wlp], sort=True)
        df_simyield_summary = pd.concat(
            [df_simyield_pp_summary, df_simyield_wlp_summary], sort=True)

        # Write timeseries output file
        fname_ts = "{grid}_{crop}_{year}.{type}".format(grid=grid,
                                                        crop=args.crop,
                                                        year=args.year,
                                                        type=args.output_type)
        fname_sum = "{grid}_{crop}_{year}_summary.{type}".format(
            grid=grid, crop=args.crop, year=args.year, type=args.output_type)
        fname_ts = os.path.join(args.output, fname_ts)
        fname_sum = os.path.join(args.output, fname_sum)
        if args.output_type == "csv":
            df_simyield.to_csv(fname_ts, header=True, index=False)
            df_simyield_summary.to_csv(fname_sum, header=True, index=False)
        elif args.output_type == "xls":
            df_simyield.to_excel(fname_ts, index=False)
            df_simyield_summary.to_excel(fname_sum, index=False)
        elif args.output_type == "hdf5":
            df_simyield.to_hdf(fname_ts,
                               mode="w",
                               complevel=9,
                               complib="blosc")
            df_simyield_summary.to_hdf(fname_sum,
                                       mode="w",
                                       complevel=9,
                                       complib="blosc")
        elif args.output_type == "json":
            df_simyield.to_json(fname_ts,
                                orient="records",
                                date_format="iso",
                                lines=True)
            df_simyield_summary.to_json(fname_sum,
                                        orient="records",
                                        date_format="iso",
                                        lines=True)
Exemple #5
0
db_location = os.path.join(settings.PCSE_USER_HOME, "pcse.db")
db_location = os.path.normpath(db_location)
dsn = "sqlite:///" + db_location

db_engine = sa.create_engine(dsn)
db_metadata = sa.MetaData(db_engine)

grid = 31031
crop = 1
year = 2000

# Get input parameters from database
with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    sited = fetch_sitedata(db_metadata, grid, year)
    cropd = fetch_cropdata(db_metadata, grid, year, crop)
    soild = fetch_soildata(db_metadata, grid)
    parameters = ParameterProvider(sitedata=sited,
                                   cropdata=cropd,
                                   soildata=soild)

    # Get Agromanagement
    agromanagement = AgroManagementDataProvider(db_engine, grid, crop, year)

    start_date = list(agromanagement[0].keys())[0]
    end_date = start_date + dt.timedelta(days=365)
    weather = GridWeatherDataProvider(db_engine,
                                      grid_no=grid,
                                      start_date=start_date,
                                      end_date=end_date)