Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .flake8
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[flake8]
extend-ignore = E741, E302, E128, E501
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
.venv/

*.project
*.pydevproject
*.settings
Expand Down
1 change: 1 addition & 0 deletions .python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.14
38 changes: 38 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# pycopan-more

This repository contains additional model components and example models using the [copan:CORE modelling framework](http://www.pik-potsdam.de/copan), developed at the Potsdam Institute for Climate Impact Research.

The base reference implementation can be found in [pik-copan/pycopancore](https://github.com/pik-copan/pycopancore).

## Running the models

To run the models, first, setup your environment. The recommended way is using [uv](https://docs.astral.sh/uv/) for that:

```console
$ uv sync
$ uv pip install .
```

However, you can also set up using pure Python:

```console
$ python -m venv .venv
$ source .venv/bin/activate
$ pip install .
```

You can then run the models with `uv`. For example, for the seven dwarfs model, run: `uv run studies/seven_dwarfs.py`.

## Known issues

Some of the models showcased here have since fallen out of date and are no longer maintained to the current version of [pik-copan/pycopancore](https://github.com/pik-copan/pycopancore). Models which we know do not work:

- `models/exploit.py`
- `models/adaptive_voter_model.py`
- `models/carbon_voters_anderies_model.py`
- `models/example*.py`
- `models/coccon`

Other models will be fixed, once https://github.com/pik-copan/pycopancore/issues/213 and https://github.com/pik-copan/pycopancore/issues/211 are addressed.

For more information on current problems and to track the progress on fixing them, see https://github.com/pik-copan/pycopanmodels/issues/2.
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@
# License: BSD 2-clause license

from .. import interface as I
#from .... import master_data_model as D
from .... import Step
#from pycopancore.data_model import master_data_model as D
from pycopancore.process_types import Step

from ....runners import Hooks
from pycopancore.runners import Hooks

# from blist import sortedlist # more performant for large list modifications

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@
# License: BSD 2-clause license

from .. import interface as I
#from .... import master_data_model as D

import random
#from pycopancore.data_model import master_data_model as D


class Individual (I.Individual):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,12 @@
# License: BSD 2-clause license

# TODO: use variables from the master data model wherever possible:
from ... import master_data_model as D
from pycopancore.data_model import master_data_model as D
# TODO: uncomment and adjust of you need further variables from another
# model component:
# import ..BBB.interface as BBB
# TODO: uncomment and adjust only if you really need other variables:
from ... import Variable # used for opinion here, maybe that should be included in the master data model? But I wouldn't know how? something like discrete opinion
from ..base import interface as baseI
from pycopancore.data_model import Variable # used for opinion here, maybe that should be included in the master data model? But I wouldn't know how? something like discrete opinion


class Model (object):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,12 @@
# Contact: core@pik-potsdam.de
# License: BSD 2-clause license

from .... import Explicit, ODE
from .... import master_data_model as D
from ...base import interface as B
from pycopancore.process_types import Explicit, ODE
from pycopancore.data_model import master_data_model as D
from pycopancore.model_components.base import interface as B

from .. import interface as I

import numpy as np
import sympy as sp


class Cell (I.Cell):
"""Jobst: write docstring."""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@
# License: BSD 2-clause license

from .. import interface as I
from ....data_model.master_data_model.dimensions_and_units import \
gigatonnes_carbon, years, square_kilometers, kelvins
from pycopancore.data_model.master_data_model.dimensions_and_units import DimensionsAndUnits as D


class Environment (I.Environment):
Expand All @@ -22,24 +21,24 @@ class Environment (I.Environment):

def __init__(self,
*, # TODO: uncomment when adding named args behind here
ocean_atmosphere_diffusion_coefficient=0.05 / years, # Anderies
ocean_atmosphere_diffusion_coefficient=0.05 / D.years, # Anderies
carbon_solubility_in_sea_water=1, # Anderies
basic_photosynthesis_productivity=26.4 / years / \
(gigatonnes_carbon /
square_kilometers)**.5, # see Nitzbon 2016
basic_photosynthesis_productivity=26.4 / D.years / \
(D.gigatonnes_carbon /
D.square_kilometers)**.5, # see Nitzbon 2016
photosynthesis_sensitivity_on_atmospheric_carbon=0 \
# 1.1e6 \
/ years / (gigatonnes_carbon / square_kilometers)**.5
/ kelvins, # see Nitzbon 2016
/ D.years / (D.gigatonnes_carbon / D.square_kilometers)**.5
/ D.kelvins, # see Nitzbon 2016
terrestrial_carbon_capacity_per_area=5000 / 1.5e8 * \
gigatonnes_carbon / square_kilometers, # ca. 2 times current value
basic_respiration_rate=0.0298 / years, # see Nitzbon 2016
D.gigatonnes_carbon / D.square_kilometers, # ca. 2 times current value
basic_respiration_rate=0.0298 / D.years, # see Nitzbon 2016
respiration_sensitivity_on_atmospheric_carbon=0 \
# 3200 \
/ years / (gigatonnes_carbon / square_kilometers), # see Nitzbon 2016
temperature_offset=0.2 * kelvins, # Anderies
/ D.years / (D.gigatonnes_carbon / D.square_kilometers), # see Nitzbon 2016
temperature_offset=0.2 * D.kelvins, # Anderies
temperature_sensitivity_on_atmospheric_carbon=0.8 * \
kelvins / gigatonnes_carbon, # Anderies
D.kelvins / D.gigatonnes_carbon, # Anderies
scaling_factor_temperature_respiration=110, # Anderies
exponent_for_increase_in_respiration_low_T=4, # Anderies
exponent_for_increase_in_respiration_high_T=5, # Anderies
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
# License: BSD 2-clause license

from .. import interface as I
#from .... import master_data_model as D
#from pycopancore.data_model import master_data_model as D


class SocialSystem (I.SocialSystem):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
# Contact: core@pik-potsdam.de
# License: BSD 2-clause license

from .... import Explicit, ODE
from pycopancore.process_types import Explicit, ODE
from .. import interface as I
from ...base import interface as B
from .... import master_data_model as D
from pycopancore.model_components.base import interface as B
from pycopancore.data_model import master_data_model as D

import sympy as sp

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
# Contact: core@pik-potsdam.de
# License: BSD 2-clause license

from ... import master_data_model as D
from ...data_model.master_data_model import ENV, MET, CUL, W, S, C, I
from ... import Variable
from pycopancore.data_model import master_data_model as D
from pycopancore.data_model.master_data_model import ENV, MET, CUL, W, S, C, I
from pycopancore.data_model import Variable


class Model (object):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
# License: BSD 2-clause license

from .. import interface as I
# from .... import master_data_model as D
from .... import Explicit
# from pycopancore.data_model import master_data_model as D
from pycopancore.process_types import Explicit
import sympy as sp
import random

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,8 @@
# License: BSD 2-clause license

from .. import interface as I
from ...base import interface as B
# from .... import master_data_model as D
from .... import Explicit
import sympy as sp
# from pycopancore.data_model import master_data_model as D
from pycopancore.process_types import Explicit


class SocialSystem (I.SocialSystem):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
# License: BSD 2-clause license

from .. import interface as I
# from .... import master_data_model as D
# from pycopancore.data_model import master_data_model as D


class World (I.World):
Expand Down
4 changes: 2 additions & 2 deletions pycopan_more/model_components/carbon_voters/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@
# License: BSD 2-clause license

# TODO: use variables from the master data model wherever possible:
from ... import master_data_model as D
from pycopancore.data_model import master_data_model as D
# TODO: uncomment and adjust of you need further variables from another
# model component:
# import ..BBB.interface as BBB
from .. import adaptive_voter_opinion_formation as avof
from .. import majority_decision as md
from .. import anderies_carbon_cycle as cc
# TODO: uncomment and adjust only if you really need other variables:
from ... import Variable
from pycopancore.data_model import Variable


class Model (object):
Expand Down
17 changes: 17 additions & 0 deletions pycopan_more/model_components/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"""Config module for configuring generic components such as generic_imitation.
In any model definition using a component that needs configuration,
first import this module and set its attributes
before (!) importing the respective component(s).

Example:

from ..model_components import config
from ...model_components import environmental_awareness as aware
...
config.generic_imitation = {'variables': [aware.interface.Individual.is_environmentally_friendly]}
from ...model_components import generic_imitation as imi
...
"""

variables = None
"""list of Variable objects that will be imitated in the model"""
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
# License: BSD 2-clause license


from .... import Explicit, ODE
from ...base import interface as B
from pycopancore.process_types import Explicit, ODE
from pycopancore.model_components.base import interface as B

from .. import interface as I

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,9 @@
# Contact: core@pik-potsdam.de
# License: BSD 2-clause license

from .... import Explicit, ODE
from pycopancore.process_types import Explicit, ODE
from .. import interface as I
from ...base import interface as B
from .... import master_data_model as D
from pycopancore.model_components.base import interface as B


class World (I.World):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
# Contact: core@pik-potsdam.de
# License: BSD 2-clause license

from ... import master_data_model as D
from ...data_model.master_data_model import ENV, W, C
from ... import Variable
from pycopancore.data_model import master_data_model as D
from pycopancore.data_model.master_data_model import ENV, W, C
from pycopancore.data_model import Variable


class Model (object):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
# License: BSD 2-clause license

from .. import interface as I
from .... import Explicit, ODE
from ...base import interface as B
from pycopancore.process_types import Explicit, ODE
from pycopancore.model_components.base import interface as B


class SocialSystem (I.SocialSystem):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
# Contact: core@pik-potsdam.de
# License: BSD 2-clause license

from .... import Explicit
from pycopancore.process_types import Explicit
from .. import interface as I
from ...base import interface as B
from pycopancore.model_components.base import interface as B


class World (I.World):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
# Contact: core@pik-potsdam.de
# License: BSD 2-clause license

from ... import master_data_model as D
from ...data_model.master_data_model import MET, S, W
from pycopancore.data_model import master_data_model as D
from pycopancore.data_model.master_data_model import MET, S, W


class Model (object):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
# Contact: core@pik-potsdam.de
# License: BSD 2-clause license

from .... import Explicit, ODE
from ...base import interface as B
from .... import master_data_model as D
from pycopancore.process_types import Explicit, ODE
from pycopancore.model_components.base import interface as B
from pycopancore.data_model import master_data_model as D

from .. import interface as I

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
# License: BSD 2-clause license

# TODO: use variables from the master data model wherever possible:
from ... import master_data_model as D
from ...data_model.master_data_model import MET, S
from ... import Variable
from pycopancore.data_model import master_data_model as D
from pycopancore.data_model.master_data_model import MET, S
from pycopancore.data_model import Variable


class Model (object):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@
# Contact: core@pik-potsdam.de
# License: BSD 2-clause license

from .... import Explicit, ITE
from .... import master_data_model as D
from pycopancore.process_types import Explicit
from pycopancore.util import ITE
from pycopancore.data_model import master_data_model as D
from .. import interface as I
from ...base import interface as B
from pycopancore.model_components.base import interface as B
from sympy import Min, Max


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
# Contact: core@pik-potsdam.de
# License: BSD 2-clause license

from .... import Explicit, ODE
from pycopancore.process_types import Explicit, ODE
from .. import interface as I
from ...base import interface as B
from pycopancore.model_components.base import interface as B

import numpy as np

Expand Down
Loading