Skip to content

Implement GLOFAS dataset#498

Open
StuberSimon wants to merge 15 commits into
PyPSA:masterfrom
StuberSimon:glofas-support
Open

Implement GLOFAS dataset#498
StuberSimon wants to merge 15 commits into
PyPSA:masterfrom
StuberSimon:glofas-support

Conversation

@StuberSimon

@StuberSimon StuberSimon commented Apr 6, 2026

Copy link
Copy Markdown

Refs #450

Changes proposed in this Pull Request

  • Implement GLOFAS dataset for hydro functionality
  • Add option to use glofas data for plant inflow

Checklist

  • Code changes are sufficiently documented; i.e. new functions contain docstrings and further explanations may be given in doc.
  • Unit tests for new features were added (if applicable).
  • Newly introduced dependencies are added to environment.yaml, environment_docs.yaml and setup.py (if applicable).
  • A note for the release notes doc/release_notes.rst of the upcoming release is included.
  • I consent to the release of this PR's code under the MIT license.

@StuberSimon

Copy link
Copy Markdown
Author

Hey there, I'm still new to the github workflow, so please let me know how I can improve :)
This is part of my bachelors thesis supervised by @doneachh.
Thank you @ekatef and @euronion for offering your support.
This pr is a work in progress, next step for me is to make river discharge provided by glofas selectable in cutout.hydro()

@ekatef ekatef left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great @StuberSimon! Looks a very good progress, and happy to see GloFAS is being implemented. Have taken a liberty to do a preliminary code review and added a few comments hoping to assist you in getting used to github. My general impression that you are getting things perfectly right and the implementation looks quite neat in general.

Comment thread atlite/datasets/glofas.py
Comment thread atlite/datasets/glofas.py Outdated
Comment thread atlite/datasets/glofas.py Outdated
Comment thread atlite/datasets/glofas.py Outdated
Comment thread atlite/datasets/glofas.py Outdated
Comment thread atlite/datasets/glofas.py
Comment thread atlite/datasets/glofas.py
Comment on lines +308 to +311
monthly_requests : bool, optional
If True, the data is requested on a monthly basis. This is useful for
large cutouts, where the data is requested in smaller chunks. The
default is False

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given EWDS limitations, I'd expect monthly_requests=True could be a more reasonable default. Could be good to test if monthly_requests=False actually works for GloFAS retrieval

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As explained in the comment above, monthly_requests=False does work quite well for GloFAS retrieval.
monthly_requests=True makes the retrieval slower, as atlite has to wait for each api call seperately.
So I would suggest to not change the default to True.
But happy to discuss this further if you want :)

Comment thread atlite/datasets/glofas.py Outdated
Comment thread atlite/convert.py Outdated
Comment thread atlite/convert.py Outdated
Comment on lines +1053 to +1054
Get inflow time-series for `plants` by extracting the discharge time series for
the nearest grid points.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Completely agree that it's worth to make sure the naming reflects different nature of variables in ERA5 and GloFAS datasets.
It could be a good idea also to mention both datasets in docstrings of the respective functions (that is mention here that _hydro_from_discharge is intended for usage on GloFAS data)

@ekatef

ekatef commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

Hey there, I'm still new to the github workflow, so please let me know how I can improve :) This is part of my bachelors thesis supervised by @doneachh. Thank you @ekatef and @euronion for offering your support. This pr is a work in progress, next step for me is to make river discharge provided by glofas selectable in cutout.hydro()

Thank you @StuberSimon, looks a great contribution! From my users' perspective, I strongly confirm that having GloFAS would be an amazing feature 🙂

Have added a few preliminary technical comments while leaving more in-depth analysis for @euronion who has much deeper understanding of atlite architecture.

For the next step, do you need any support?

@ValeMTo

ValeMTo commented Apr 10, 2026

Copy link
Copy Markdown

Hi @StuberSimon, @ekatef, and @euronion

First off, great work on this PR. I completely agree with @ekatef that having GloFAS natively integrated is a fantastic and much-needed feature for the community.

I'm jumping into this conversation since @Asdominet34 and I have worked on improving the hydromodeling in PyPSA-Eur, by firstly connecting it with GloFAS, "calibrating" it, and then validating it with the real hydro production in Europe. Before pushing the work, we would like to finalize the pumped-storage logic and the working paper we had in mind. I think that there is space for collaboration. What do you think about organising a call next week?

@StuberSimon

Copy link
Copy Markdown
Author

Hi @ValeMTo that sounds great!
This week was already quite full, what do you think about next Tuesday, April 21st between 11:45 and 15:15 (UTC+2)?
You can reach me on discord under the name simonstuber.

@Asdominet34

Copy link
Copy Markdown

Hi @ValeMTo that sounds great! This week was already quite full, what do you think about next Tuesday, April 21st between 11:45 and 15:15 (UTC+2)? You can reach me on discord under the name simonstuber.

Hi @simon, thanks for your message!

Unfortunately next week is quite busy on our side as well, so we won’t be available then. We’ll get back to you shortly with our availability starting from the following week.

Sorry again and looking forward to connecting!

@coroa coroa left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for dragging my feet on this PR. Actually, i retract my earlier statement that this has no space within atlite. I think you showed that this can be accommodated here in a way that is useful and backwards compatible.

A couple of changes would be good:

  1. abstract common code shared between era5.py and glofas.py in some cds_helper.py module
  2. clean up the coordinates and variable names in use (ie. comments by @ekatef )
  3. maybe an evaluation of potential heuristics for selecting the correct discharge grid cells

Comment thread atlite/convert.py Outdated
Comment on lines +1069 to +1073
for plant in plants.itertuples():
# Extract the discharge time series for the nearest point
inflow.loc[dict(plant=plant.Index)] = discharge.sel(
x=plant.lon, y=plant.lat, method="nearest"
)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My previous look into these datasets suggested that it is quite easy to miss the correct river cells due to small misalignments in the datasets, so i'd expect one would like to have some more sophisticated find closest river cells which are actually part of the river, rather than find closest cell heuristic. And that this would need testing.

@coroa coroa Jun 3, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After some quick thinking probably the best thing would be a snapping to the largest value in the static uparea map (gridded data with the total catchment area of each cell).

That is available from here: https://confluence.ecmwf.int/display/CEMS/Auxiliary+Data

This could also be a pre-processing step on the powerplant dataset for which we provide a helper function that has to be called before.

The only problem is then that when your plant is right before a fork you would latch onto the larger river.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @coroa thanks for the tip!

I found solving this (especially the fork/larger river problem) quite difficult.
I think I found a working, though not perfect and quite complicated solution.
As the full solution requires some major code additions, I'm not sure if it fits in atlite or this pr.
You can find a first draft and results of these changes here: StuberSimon#1

Note that those changes will still need some preprocessing done in pypsa-earth:

  • Calculating expected upstream area of plants (needs head from GHR)
  • Getting river names for plants and mapping them (from GHR to OSM)
  • Passing those to atlite snapping function, which will combine area matching and river name snapping to find the right glofas cell for each plant

-> This shouldn't be too hard, as GHR and OSM are already used in pypsa-earth. Only the name mapping needs to be done by the user.

I would suggest one of the following options:

  1. Keep snapping to nearest cell, leave it for future improvements to be solved
  2. Option 1, implement solution for this in pypsa-earth
  3. Add only largest upstream area snapping functionality, leave fork/larger river problem to future improvements
  4. Implement whole package (upstream area and river name matching) in this pr
  5. Option 1, but I'll implement the whole package in a follow up pr

I would personally prefer option 5. It would keep this pr small and provide a more accurate river cell snapping. I am planning substantial hydro functionality improvements in pypsa-earth after this, and fixing the snapping problem before would be important for those upgrades too.

I would love to hear what you and others (@ekatef) think about that!

Comment thread atlite/convert.py Outdated
Comment thread atlite/datasets/glofas.py
Comment thread atlite/convert.py Outdated
@ekatef

ekatef commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Hello!
@coroa thank you so much for reviewing! It helps a lot to have your insights.

@StuberSimon if you'd need any support with additional testing, happy to assist. We are currently working with GloFAS for one of the projects, and there is a bit of struggle exactly with finding the river route as @coroa has mentioned.

# Conflicts:
#	.gitignore
#	atlite/convert.py
#	atlite/datasets/era5.py
Comment thread atlite/datasets/glofas.py Outdated
else:
ds = xr.open_dataset(target, chunks=sanitize_chunks(chunks))
if tmpdir is None:
add_finalizer(target)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the signature of add_finalizer suggest that here is a bug, should be add_finalizer(ds, target). encountered while merge the latest master on this branch. will push the fix

@FabianHofmann FabianHofmann left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to give this a little push, I am merging this latest master into here. I will follow up with more comments later

- fix add_finalizer(ds, target) call in glofas retrieve_data (was missing ds)
- make zip extraction tmpdir-safe via Path(target).parent
- align cds_helper helpers with master's typed, lint-clean versions
- add type annotations, Returns/Raises docstrings, and logging/pathlib fixes
@FabianHofmann
FabianHofmann marked this pull request as ready for review July 17, 2026 10:09
- restore hydrobasins as 3rd positional arg, make module/time keyword-only
  so existing positional callers (cutout.hydro(plants, basins)) keep working;
  collapse the duplicated auto/glofas/era5 dispatch into one path
- point era5 request-tracking url back to the CDS server (was pointing at
  the EWDS/GloFAS server)
- drop code-restating comments in glofas retrieve_data
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants