diff --git a/experiments/rdmsol_generate.py b/experiments/rdmsol_generate.py index 0c085e0..311ffc0 100644 --- a/experiments/rdmsol_generate.py +++ b/experiments/rdmsol_generate.py @@ -50,10 +50,8 @@ def run_pcse(soildata_and_depth: tuple[fpcup.soil.SoilType, int], *, soildata = copy(_soildata) soildata["RDMSOL"] = depth - run_id = f"{args.crop}_{_soildata.name}_RDMSOL-{depth:d}_dos{sowdate:%Y%j}_lat{coordinates[0]:.7f}-lon{coordinates[1]:.7f}" - # Combine input data - run = fpcup.model.RunData(sitedata=sitedata, soildata=soildata, cropdata=cropdata, weatherdata=weatherdata, agromanagement=agromanagement, geometry=coordinates, crs=crs, run_id=run_id) + run = fpcup.model.RunData(sitedata=sitedata, soildata=soildata, cropdata=cropdata, weatherdata=weatherdata, agromanagement=agromanagement, geometry=coordinates, crs=crs, suffix=f"RDMSOL-{depth:d}") # Run model output = fpcup.model.run_pcse_single(run) @@ -72,6 +70,9 @@ def run_pcse(soildata_and_depth: tuple[fpcup.soil.SoilType, int], *, if __name__ == "__main__": fpcup.multiprocessing.freeze_support() ### Setup + # Make the output folder if it does not exist yet + fpcup.io.makedirs(args.output_dir, exist_ok=True) + # Feedback on constants if args.verbose: print(f"Save folder: {args.output_dir.absolute()}") diff --git a/fpcup/model.py b/fpcup/model.py index 59c5e9b..35baa91 100644 --- a/fpcup/model.py +++ b/fpcup/model.py @@ -61,7 +61,8 @@ def __new__(cls, sitedata: PCSESiteDataProvider, soildata: SoilType, cropdata: M return super().__new__(cls, (parameters, weatherdata, agromanagement)) def __init__(self, sitedata: PCSESiteDataProvider, soildata: SoilType, cropdata: MultiCropDataProvider, weatherdata: WeatherDataProvider, agromanagement: AgromanagementData, *, - run_id: Optional[str]=None, geometry: Optional[shapely.Geometry | tuple]=None, crs=None): + run_id: Optional[str]=None, prefix: Optional[str]="", suffix: Optional[str]="", + geometry: Optional[shapely.Geometry | tuple]=None, crs=None): # Easier access self.sitedata = sitedata self.soildata = soildata @@ -87,6 +88,7 @@ def __init__(self, sitedata: PCSESiteDataProvider, soildata: SoilType, cropdata: # Assign a run_id, either from user input or from the run parameters if run_id is None: run_id = self.generate_run_id() + run_id = "_".join(s for s in (prefix, run_id, suffix) if s) self.run_id = run_id def __repr__(self) -> str: @@ -137,7 +139,8 @@ class RunDataBRP(RunData): """ Same as RunData but specific to the BRP. """ - def __init__(self, sitedata: PCSESiteDataProvider, soildata: CABOFileReader, cropdata: MultiCropDataProvider, weatherdata: WeatherDataProvider, agromanagement: AgromanagementData, brpdata: pd.Series, brpyear: int, crs=CRS_AMERSFOORT): + def __init__(self, sitedata: PCSESiteDataProvider, soildata: CABOFileReader, cropdata: MultiCropDataProvider, weatherdata: WeatherDataProvider, agromanagement: AgromanagementData, brpdata: pd.Series, brpyear: int, *, + crs=CRS_AMERSFOORT, **kwargs): """ Use a BRP data series to initialise the RunData object. `brpyear` is the BRP year, not the weatherdata year, so that e.g. a plot from the 2021 BRP can be simulated in 2022. @@ -151,7 +154,7 @@ def __init__(self, sitedata: PCSESiteDataProvider, soildata: CABOFileReader, cro self.brpyear = brpyear - super().__init__(sitedata, soildata, cropdata, weatherdata, agromanagement, geometry=brpdata["geometry"], crs=crs) + super().__init__(sitedata, soildata, cropdata, weatherdata, agromanagement, geometry=brpdata["geometry"], crs=crs, **kwargs) def generate_run_id(self) -> str: sowdate = self.agromanagement.crop_start_date diff --git a/test/batch_locations.py b/test/batch_locations.py index b2f8268..724e01a 100644 --- a/test/batch_locations.py +++ b/test/batch_locations.py @@ -59,6 +59,9 @@ def run_pcse(coordinates: fpcup._typing.Coordinates) -> bool | fpcup.model.RunDa if __name__ == "__main__": fpcup.multiprocessing.freeze_support() ### Setup + # Make the output folder if it does not exist yet + fpcup.io.makedirs(args.output_dir, exist_ok=True) + # Feedback on constants if args.verbose: print("Loaded soil data")