{"id":298519,"name":"ClimODE","description":"Models precise weather evolution with value-conserving dynamics, learning global weather transport as a neural flow, which also enables estimating the uncertainty in predictions.","url":"https://github.com/aalto-quml/climode","last_synced_at":"2026-05-14T20:30:31.470Z","repository":{"id":227620313,"uuid":"724630628","full_name":"Aalto-QuML/ClimODE","owner":"Aalto-QuML","description":"ClimODE: Climate and Weather Forecasting With Physics-informed Neural ODEs","archived":false,"fork":false,"pushed_at":"2025-03-18T17:12:27.000Z","size":12557,"stargazers_count":118,"open_issues_count":9,"forks_count":16,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-02T11:33:26.424Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://yogeshverma1998.github.io/ClimODE/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Aalto-QuML.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-11-28T13:28:52.000Z","updated_at":"2026-01-12T18:59:19.000Z","dependencies_parsed_at":"2024-09-01T07:30:22.717Z","dependency_job_id":"fbe7d8f4-f8ec-48f3-9ded-2f216c694674","html_url":"https://github.com/Aalto-QuML/ClimODE","commit_stats":{"total_commits":58,"total_committers":1,"mean_commits":58.0,"dds":0.0,"last_synced_commit":"921d539dfd421b4e4e351a36a909e3cc1d265b13"},"previous_names":["aalto-quml/climode"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Aalto-QuML/ClimODE","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aalto-QuML%2FClimODE","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aalto-QuML%2FClimODE/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aalto-QuML%2FClimODE/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aalto-QuML%2FClimODE/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Aalto-QuML","download_url":"https://codeload.github.com/Aalto-QuML/ClimODE/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aalto-QuML%2FClimODE/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32652812,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-05T11:29:49.557Z","status":"ssl_error","status_checked_at":"2026-05-05T11:29:48.587Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"Aalto-QuML","name":"Aalto-QuML","uuid":"107996420","kind":"organization","description":null,"email":null,"website":null,"location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/107996420?v=4","repositories_count":2,"last_synced_at":"2023-03-07T01:01:53.137Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/Aalto-QuML","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2023-03-07T01:01:53.148Z","updated_at":"2023-03-07T01:01:53.148Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Aalto-QuML","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Aalto-QuML/repositories"},"packages":[],"commits":{"id":1642201,"full_name":"aalto-quml/climode","default_branch":"main","total_commits":59,"total_committers":1,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":59.0,"dds":0.0,"past_year_total_commits":1,"past_year_total_committers":1,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":1.0,"past_year_dds":0.0,"last_synced_at":"2026-03-01T17:20:48.175Z","last_synced_commit":"e729d23e8799ce0e075699e76d60227d848d8d0c","created_at":"2024-08-17T00:11:53.362Z","updated_at":"2026-03-01T17:20:48.126Z","committers":[{"name":"Yogesh Verma","email":"yverma132@gmail.com","login":"yogeshverma1998","count":59}],"past_year_committers":[{"name":"Yogesh Verma","email":"yverma132@gmail.com","login":"yogeshverma1998","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/aalto-quml%2Fclimode/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-03-02T00:00:12.164Z","repositories_count":6184063,"commits_count":930411702,"contributors_count":36036592,"owners_count":1146208,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"aalto-quml/climode","html_url":"https://github.com/aalto-quml/climode","last_synced_at":"2026-02-26T07:00:39.984Z","status":"error","issues_count":10,"pull_requests_count":2,"avg_time_to_close_issue":4873565.0,"avg_time_to_close_pull_request":null,"issues_closed_count":3,"pull_requests_closed_count":0,"pull_request_authors_count":1,"issue_authors_count":10,"avg_comments_per_issue":1.3,"avg_comments_per_pull_request":0.0,"merged_pull_requests_count":0,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":3,"past_year_pull_requests_count":0,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":0,"past_year_issue_authors_count":3,"past_year_avg_comments_per_issue":1.3333333333333333,"past_year_avg_comments_per_pull_request":null,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"created_at":"2024-08-17T00:11:54.949Z","updated_at":"2026-02-26T07:00:39.985Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/aalto-quml%2Fclimode","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/aalto-quml%2Fclimode/issues","issue_labels_count":{},"pull_request_labels_count":{},"issue_author_associations_count":{"NONE":10},"pull_request_author_associations_count":{"NONE":2},"issue_authors":{"plyu3":1,"dgm2":1,"Kongwp":1,"Hank0626":1,"tung-nd":1,"Yumenomae":1,"shadowyact":1,"marvingabler":1,"JimengShi":1,"PiComLab":1},"pull_request_authors":{"einzigsue":2},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-03-02T00:00:10.048Z","repositories_count":13538218,"issues_count":34997657,"pull_requests_count":114042654,"authors_count":11178144,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"NONE":2},"past_year_pull_request_author_associations_count":{},"past_year_issue_authors":{"dgm2":1,"shadowyact":1},"past_year_pull_request_authors":{},"maintainers":[],"active_maintainers":[]},"events":{"total":{"ForkEvent":11,"IssuesEvent":1,"WatchEvent":33,"IssueCommentEvent":3,"PushEvent":1},"last_year":{"ForkEvent":4,"WatchEvent":15,"IssueCommentEvent":1,"PushEvent":1}},"keywords":[],"dependencies":[],"score":4.844187086458591,"created_at":"2024-08-17T00:11:52.079Z","updated_at":"2026-05-14T20:30:31.471Z","avatar_url":"https://github.com/Aalto-QuML.png","language":"Python","category":"Climate Change","sub_category":"Earth and Climate Modeling","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# ClimODE: Climate and Weather Forecasting With Physics-informed Neural ODEs\n\n [Yogesh verma](https://yoverma.github.io/yoerma.github.io/) | [Markus Heinonen](https://users.aalto.fi/~heinom10/) |  [Vikas Garg](https://www.mit.edu/~vgarg/)\n \nThe code repository for the paper ClimODE: Climate and Weather Forecasting With Physics-informed Neural ODEs. More information can be found on the project [website](https://yogeshverma1998.github.io/ClimODE/). \n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/Aalto-QuML/ClimODE/blob/main/workflow_final_climate_v6.png\" /\u003e\n\u003c/p\u003e\n\n## Citation\nIf you find this repository useful in your research, please consider citing the following paper:\n ```\n@inproceedings{\nverma2024climode,\ntitle={Clim{ODE}: Climate and Weather Forecasting with Physics-informed Neural {ODE}s},\nauthor={Yogesh Verma and Markus Heinonen and Vikas Garg},\nbooktitle={The Twelfth International Conference on Learning Representations},\nyear={2024},\nurl={https://openreview.net/forum?id=xuY33XhEGR}\n}\n\n```\n\n## Prerequisites\n\n- torchdiffeq : https://github.com/rtqichen/torchdiffeq.\n- pytorch \u003e= 1.12.0\n- torch-scatter \n- torch-sparse \n- torch-cluster \n- torch-spline-conv \n- torchcubicspline: https://github.com/patrick-kidger/torchcubicspline\n- properscoring (for CRPS scores) : https://pypi.org/project/properscoring/\n\n## Data Preparation\n\nFirst, download ERA5 data with 5.625deg from [WeatherBench](https://dataserv.ub.tum.de/index.php/s/m1524895). The data directory should look like the following\n```\nera5_data\n   |-- 10m_u_component_of_wind\n   |-- 10m_v_component_of_wind\n   |-- 2m_temperature\n   |-- constants\n   |-- geopotential_500\n   |-- temperature_850\n```\n\n## Training ERA5\n\n### Global Forecast\n\nTo train ClimODE for global forecast use,\n\n```\npython train_global.py --scale 0 --batch_size 8 --spectral 0 --solver \"euler\" \n```\n\n### Global Monthly Forecast\n\nTo train ClimODE for global monthly forecast use,\n\n```\npython train_monthly.py --scale 0 --batch_size 4 --spectral 0 --solver \"euler\" \n```\n\n\n### Regional Forecast\n\nTo train ClimODE for regional forecasts among various regions of earth use,\n```\npython train_region.py --scale 0 --batch_size 8 --spectral 0 --solver \"euler\" --region 'NorthAmerica/SouthAmerica/Australia'\n```\n\n## Evaluation ERA5\n\n### Global Forecast\n\nTo evaluate ClimODE for global forecast on Lat. weighted RMSE and ACC use, (Make sure to change the model path in the file)\n\n```\npython evaluation_global.py --spectral 0 --scale 0 --batch_size 8 \n```\n\n### Global Monthly Forecast\n\nTo evaluate ClimODE for global monthly forecast on Lat. weighted RMSE and ACC use, (Make sure to change the model path in the file)\n\n```\npython evaluation_monthly.py --spectral 0 --scale 0 --batch_size 4 \n```\n\n### Regional Forecast\n\nTo evaluate ClimODE for regional forecast on Lat. weighted RMSE and ACC use, (Make sure to change the model path in the file)\n\n```\npython evaluation_region.py --spectral 0 --scale 0 --region 'NorthAmerica/SouthAmerica/Australia' --batch_size 8 \n```\n\n## Training on a different custom dataset\n\nTo train on a custom dataset, you need to follow the below guidelines\n\n- **Data Loading**: You might want to change the data loading scheme depending on your data (e.g. seasonal, daily, etc., and with many different input channels), which can be found in ```utils.py``` in the data-loading function.\n- **Fitting initial velocity**: Depending on the data, you need to estimate the initial velocity to train and test the model (For more details, see the manuscript) via the ```fit_velocity``` function. \n- **Model Function**: Depending on the input observable quantities, you might need to modify the number of input channels to model function in ```model_function.py```.\n- **Training and evaluation**: Depending on your dataset, you might want to fine-tune and change the various hyper-parameters in training and evaluation files. Make sure to make them consistent in both of them. Also, we report CRPS scores for global hourly forecast only, if you want to compute them for every task please include the ```evaluation_crps_mm``` function.\n\n\n\nNote: We are also constantly updating and revising the repo to make it more adaptable in a general way, and finidng bugs and removing them and modifying certain parts.\n\n\n\n\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/298519","html_url":"https://ost.ecosyste.ms/projects/298519"}