etengine

Calculation engine for the Energy Transition Model

https://github.com/quintel/etengine

Science Score: 26.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
  • Academic publication links
  • Committers with academic emails
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (13.8%) to scientific vocabulary
Last synced: 11 months ago · JSON representation

Repository

Calculation engine for the Energy Transition Model

Basic Info
Statistics
  • Stars: 15
  • Watchers: 19
  • Forks: 8
  • Open Issues: 52
  • Releases: 1
Created about 15 years ago · Last pushed 11 months ago
Metadata Files
Readme License

README.markdown

Energy Transition Engine (ETE)

This is the source code for the Calculation Engine that is used by the Energy Transition Model and its various interfaces (clients).

It is an online web app that lets you create a future energy scenario for various countries. This software is open source, so you can fork it and alter at your will.

ETEngine does not contain an easy-to-use frontend for creating and editing these energy scenarios; that role is instead fulfilled by separate applications such as ETModel, ETFlex, and the EnergyMixer, which each use ETEngine's REST API for manipulating and calculating scenarios.

Build Status

License

The ETE is released under the MIT License.

Installation with Docker

New users are recommended to use Docker to run ETEngine. Doing so will avoid the need to install additional dependencies.

  1. Get a copy of ETEngine and ETSource; placing them in the same parent directory:

    ├─ parent_dir │ ├─ etengine │ └─ etsource

    Place the ETSource decryption password in a file called .password in the ETSource directory. This is required to decrypt a small number of datasets for which we're not authorised to publicly release the source data.

    ├─ parent_dir │ ├─ etengine │ └─ etsource │ ├─ .password # <- password goes here │ ├─ carriers │ ├─ config │ ├─ datasets │ ├─ ...

  2. Build the ETEngine image:

    sh docker-compose build

  3. Install dependencies and seed the database:

sh docker-compose run --rm web bash -c 'bin/rails db:drop && bin/setup'

The command drops any existing ETEngine database; be sure only to run this during the initial setup! This step will also provide you with an e-mail address and password for an administrator account.

  1. Launch the containers:

sh docker-compose up

After starting application will become available at http://localhost:3000 after a few seconds. This is indicated by the message "Listening on http://0.0.0.0:3000".

Before the application can start serving scenarios, it must calculate the default dataset (Netherlands). This process will begin the first time a scenario is requested and will take several seconds. Signing in to the administrator account will also begin the calculation. Please be patient! Further requests to ETEngine will happen much faster.

Installation without Docker

Installing ETEngine on a local machine can be a bit involved, owing to the number of dependencies. Assuming you can run a 'normal' rails application on your local machine, you have to follow these steps to run ETEngine.

  1. Install the "Graphviz" library

    • Mac users with Homebrew: brew install graphviz
    • Ubuntu: sudo apt-get install graphviz libgraphviz-dev
  2. Install "MySQL" server

    • Mac: Install latest version using the Native Package (choose the 64-bit DMG version), or install via brew: brew install mysql
    • Ubuntu: sudo apt-get install mysql-server-5.5 libmysqlclient-dev
  3. Clone this repository with git clone git@github.com:quintel/etengine.git

  4. Run bundle install to install the dependencies required by ETEngine.

  5. Clone a copy of ETSource –– which contains the data for each region:

    1. cd ..; git clone git@github.com:quintel/etsource.git
    2. cd etsource; bundle install
  6. Create the database you specified in your "database.yml" file, and

    1. run bundle exec rake db:setup to create the tables and add an administrator account –– whose name and password will be output at the end –– OR
    2. run bundle exec rake db:create to create your database and contact the private Quintel slack channel to fill your database with records from staging server
  7. You're now ready-to-go! Fire up the Rails process with rails s or better bin/dev.

  8. If you run into an dataset error, check out this explanation on CSV files

Technical Design

Caching

The ETEngine uses heavily caching of calculated values by using the fetch function that stores and retrieves calculated values. This has some drawbacks, but is necessary to keep performance up.

Scenario

When the user starts a new scenario, the user has to choose the end_year and the area for which this scenario applies. This can/should not be altered later.

Present and future

The ETEngine uses two graphs that store all the data: one for the present year and one for the future year. In this sense, the ETengine is a 'two state' model: everything is calculated twice: once for the start year, and once for the end year. It is important to note that ETengine therefor does not calculate intermediate years. An exception to this is Merit, a module for ETengine (that can also be used independently which contains time series at a one hour resolution for one year.

Inputs

A user can alter the start scenario with the use of inputs. Every input has a key and a value can be sent to ETEngine. For example a user can tell ETengine:

number_of_energy_power_nuclear_gen3_uranium_oxide = 2

This means that the user wants to 'set' the number of nuclear power plants to 2 in his/her current scenario.

The current set of inputs can be found on ETSource.

Every times the user requests some output, all the inputs that have been touched by that user for that scenario are applied again. The order in which they are applied can be controlled if necessary.

The priority of every input defaults to 0, and can be set a manual value (e.g. 100) on inputs which need to be executed first. For example, an input with priority=100 gets executed before an input with priority=99, etc...

This is someting to keep in mind when designing your input statements.

Competing inputs

For example, when you have two inputs:

  • input A: update attribute X to have value 1
  • input B: update attribute X to have value 2

The outcome of this X will be 1 or 2 depending on the priority of these inputs (if they both have no priority or the same priority), this will be randomly determined.

Complementary inputs

For example, when you have two inputs:

  • input A: update attribute X to increase with 1%
  • input B: update attribute X to increase with 2%

Then the outcome of the X will be 1.01 * 1.02.

Output

The user can request output from his/her scenario with the use of gqueries. A gquery always returns the present and the future output value, although there are exceptions to this.

E.g. when the user sends the dashboard_co2_emissions query to ETEngine, it will receive the following feedback:

  • present: 123
  • future: 456
  • unit: MJ

A gquery is nothing more then a stored statement. These statements are written in our own language called the Graph Query Language (GQL) and a recent list can be found on ETSource.

Auto-reloading your changes to etsource

Sometimes you want to play around or tweak some gqueries. Then, you don't want to create commits every time and import them. Because when you are satisfied, you'll probably have 10 commits, that needs to be cleaned up, squashed.

You can add the option etsource_live_reload: true in your config.yml file.

Change queries, inputs, datasets, gqueries, inputs or topology directory in your etsourceexport folder, and Etengine reloads your changes automatically!

B.t.w. By default your etsource_export directory is not under version control. In order to gain the advantages of Git, just point etsource_export to the etsource directory, either by using a symbolic link or using the same directory in your config.yml file. But be carefull NOT to use the interface's 'import' action on /etsource: that will delete/overwrite your etsource_export directory!

GQL

GQL Functions

Node methods

Screencasts

Password for all the screencasts below is quintel.

GQL Console

GQL Docs

How to use this documentation.

GQL Console and ETSource

How to work with different etsource directories, make changes and load them in the gql console.

ETSource: Create a new basic etmodel

We build a new etmodel with 3 nodes from scratch. This helps you understand how the etsource works.

The result you can find in: etsource/models/sample

Owner

  • Name: Quintel
  • Login: quintel
  • Kind: organization
  • Email: info@quintel.com
  • Location: Amsterdam

GitHub Events

Total
  • Create event: 87
  • Commit comment event: 1
  • Release event: 1
  • Issues event: 78
  • Watch event: 1
  • Delete event: 72
  • Issue comment event: 179
  • Push event: 327
  • Pull request review comment event: 34
  • Pull request review event: 95
  • Pull request event: 138
Last Year
  • Create event: 87
  • Commit comment event: 1
  • Release event: 1
  • Issues event: 78
  • Watch event: 1
  • Delete event: 72
  • Issue comment event: 179
  • Push event: 328
  • Pull request review comment event: 34
  • Pull request review event: 95
  • Pull request event: 138

Committers

Last synced: 11 months ago

All Time
  • Total Commits: 5,375
  • Total Committers: 56
  • Avg Commits per committer: 95.982
  • Development Distribution Score (DDS): 0.774
Past Year
  • Commits: 170
  • Committers: 8
  • Avg Commits per committer: 21.25
  • Development Distribution Score (DDS): 0.588
Top Committers
Name Email Commits
Sebi Burkhard s****d@g****m 1,213
Anthony Williams hi@a****v 929
Paolo Zaccagnini p****c@g****m 887
Anthony Williams hi@a****o 529
Anthony Williams hi@a****e 423
noracato n****l@g****m 301
Chael Kruip c****p@q****m 143
Dennis Schoenmakers d****s@q****m 137
Gerard Westerhof g****d@g****l 79
louispt1 l****1@g****m 78
Michiel den Haan m****n@q****m 64
wmeyers w****s@q****m 57
marliekeverweij m****j@q****m 53
dependabot[bot] 4****]@u****m 52
Mathijs Bijkerk m****k@q****m 49
Robbert Dol r****l@q****m 49
Peter Lohmann p****n@q****m 46
Wouter van Lelyveld w****d@q****m 32
Joris Berkhout j****t@q****m 29
Roos de Kok r****k@q****m 27
Rob Terwel r****l@q****m 26
Thomas t****g@q****m 23
louispt1 8****1@u****m 16
Andre Medeiros me@a****o 14
Jesse Kerkhoven j****n@z****l 13
Dorine van der Vlies d****s@q****m 11
Kas Kranenburg k****g@q****m 10
Frans van Camp f****p@x****l 9
Kyra de Haan k****n@q****m 9
mabijkerk 6****k@u****m 9
and 26 more...
Committer Domains (Top 20 + Academic)

Issues and Pull Requests

Last synced: 11 months ago

All Time
  • Total issues: 1,043
  • Total pull requests: 655
  • Average time to close issues: 8 months
  • Average time to close pull requests: 15 days
  • Total issue authors: 43
  • Total pull request authors: 31
  • Average comments per issue: 2.84
  • Average comments per pull request: 0.7
  • Merged pull requests: 531
  • Bot issues: 0
  • Bot pull requests: 99
Past Year
  • Issues: 59
  • Pull requests: 164
  • Average time to close issues: 16 days
  • Average time to close pull requests: 12 days
  • Issue authors: 6
  • Pull request authors: 6
  • Average comments per issue: 0.59
  • Average comments per pull request: 0.93
  • Merged pull requests: 106
  • Bot issues: 0
  • Bot pull requests: 34
Top Authors
Issue Authors
  • dennisquintel (254)
  • ChaelKruip (138)
  • WvanLelyveld (66)
  • hasclass (64)
  • mabijkerk (56)
  • wmeyers (48)
  • antw (42)
  • grdw (39)
  • noracato (38)
  • markquintel (37)
  • AlexanderWirtz (31)
  • pzac (28)
  • louispt1 (26)
  • michieldenhaan (24)
  • cjlaumans (21)
Pull Request Authors
  • dependabot[bot] (99)
  • louispt1 (95)
  • antw (71)
  • noracato (71)
  • grdw (50)
  • marliekeverweij (38)
  • mabijkerk (36)
  • ChaelKruip (30)
  • michieldenhaan (28)
  • jorisberkhout (22)
  • RobTerwel (17)
  • redekok (12)
  • kndehaan (11)
  • kaskranenburgQ (11)
  • thomas-qah (10)
Top Labels
Issue Labels
Bug (239) Clean up (169) New features (148) Admin interface (96) Priority (78) Stale (67) On hold (46) Pinned (44) airbrake (22) Enhancement (19) Tests (16) API (16) Question (15) effort:3 (9) effort:1 (8) effort:7 (7) Minor issue (6) effort:2 (4) Not ETEngine ಠ_ಠ (4) coupled-markets (3) effort:13 (2) compatibility (2) discussion (1)
Pull Request Labels
dependencies (99) ruby (16) Stale (14) Pinned (8) Enhancement (4) Clean up (3) On hold (3) Minor issue (2)

Dependencies

Gemfile rubygems
  • better_errors >= 0 development
  • binding_of_caller >= 0 development
  • factory_bot_rails >= 0 development
  • listen >= 0 development
  • pry-byebug >= 0 development
  • pry-rails >= 0 development
  • rails-controller-testing >= 0 development
  • rspec-rails ~> 5.0 development
  • rubocop ~> 1.27 development
  • rubocop-performance >= 0 development
  • rubocop-rails >= 0 development
  • rubocop-rspec >= 0 development
  • shoulda-matchers >= 0 development
  • simplecov ~> 0.7.1 development
  • watchr >= 0 development
  • atlas >= 0
  • bootsnap >= 0
  • cancancan ~> 3.0
  • coffee-rails >= 0
  • dalli >= 0
  • devise ~> 4.7
  • dotenv-rails >= 0
  • fever >= 0
  • fnv >= 0
  • gctools >= 0
  • git >= 0
  • haml ~> 5.0
  • highline >= 0
  • ice_nine >= 0
  • jquery-rails ~> 4.0
  • json >= 0
  • kaminari >= 0
  • mini_racer >= 0
  • msgpack >= 0
  • mysql2 >= 0
  • newrelic_rpm >= 0
  • numo-narray >= 0
  • osmosis >= 0
  • parallel >= 0
  • puma >= 0
  • quintel_merit >= 0
  • rack-cors >= 0
  • rails ~> 7.0.0
  • rake >= 0
  • refinery >= 0
  • rest-client >= 0
  • rubel >= 0
  • ruby-graphviz >= 0
  • ruby-progressbar >= 0
  • ruby_deep_clone ~> 0.8
  • sass-rails >= 0
  • sentry-raven >= 0
  • simple_form >= 0
  • term-ansicolor = 1.0.7
  • text-table >= 0
  • turbine-graph >= 0.1
Gemfile.lock rubygems
  • 161 dependencies
.github/workflows/stale.yml actions
  • actions/stale v3 composite
Dockerfile docker
  • ruby 3.1-slim build
docker-compose.yml docker
  • mariadb 10