state_test.py 3.34 KB
Newer Older
mashun1's avatar
veros  
mashun1 committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import pytest

from veros.state import VerosSettings, VerosVariables, VerosState


@pytest.fixture
def dummy_state():
    from veros.variables import VARIABLES, DIM_TO_SHAPE_VAR
    from veros.settings import SETTINGS

    return VerosState(VARIABLES, SETTINGS, DIM_TO_SHAPE_VAR)


@pytest.fixture
def dummy_settings():
    from veros.settings import SETTINGS

    return VerosSettings(SETTINGS)


@pytest.fixture
def dummy_variables():
    from veros.variables import VARIABLES, DIM_TO_SHAPE_VAR
    from veros.settings import SETTINGS

    dummy_state = VerosState(VARIABLES, SETTINGS, DIM_TO_SHAPE_VAR)
    dummy_state.initialize_variables()
    return dummy_state.variables


def test_lock_settings(dummy_settings):
    orig_val = dummy_settings.dt_tracer

    with pytest.raises(RuntimeError):
        dummy_settings.dt_tracer = 0

    assert dummy_settings.dt_tracer == orig_val

    with dummy_settings.unlock():
        dummy_settings.dt_tracer = 1

    assert dummy_settings.dt_tracer == 1


def test_settings_repr(dummy_settings):
    with dummy_settings.unlock():
        dummy_settings.dt_tracer = 1

    assert "dt_tracer = 1.0," in repr(dummy_settings)


def test_variables_repr(dummy_variables):
    from veros.core.operators import numpy as npx

    array_type = type(npx.array([]))
    assert f"tau = {array_type} with shape (), dtype int32," in repr(dummy_variables)


def test_to_xarray(dummy_state):
    pytest.importorskip("xarray")

    dummy_state.initialize_variables()
    ds = dummy_state.to_xarray()

    # settings
    assert tuple(ds.attrs.keys()) == tuple(dummy_state.settings.fields())
    assert tuple(ds.attrs.values()) == tuple(dummy_state.settings.values())

    # dimensions
    used_dims = set()
    for var, meta in dummy_state.var_meta.items():
        if var in dummy_state.variables:
            if meta.dims is None:
                continue

            used_dims |= set(meta.dims)

    assert set(ds.coords.keys()) == used_dims

    for dim in used_dims:
        assert int(ds.dims[dim]) == dummy_state.dimensions[dim]

    # variables
    for var in dummy_state.variables.fields():
        assert var in ds


def test_variable_init(dummy_state):
    with pytest.raises(RuntimeError):
        dummy_state.variables

    dummy_state.initialize_variables()

    assert isinstance(dummy_state.variables, VerosVariables)

    with pytest.raises(RuntimeError):
        dummy_state.initialize_variables()


def test_set_dimension(dummy_state):
    with dummy_state.settings.unlock():
        dummy_state.settings.nx = 10

    assert dummy_state.dimensions["xt"] == 10

    dummy_state.dimensions["foobar"] = 42
    assert dummy_state.dimensions["foobar"] == 42

    with pytest.raises(RuntimeError):
        dummy_state.dimensions["xt"] = 11

    assert dummy_state._dimensions["xt"] == "nx"


def test_resize_dimension(dummy_state):
    from veros.state import resize_dimension

    with dummy_state.settings.unlock():
        dummy_state.settings.nx = 10

    dummy_state.initialize_variables()

    assert dummy_state.dimensions["xt"] == 10
    assert dummy_state.variables.dxt.shape == (14,)

    resize_dimension(dummy_state, "xt", 100)

    assert dummy_state.dimensions["xt"] == 100
    assert dummy_state.variables.dxt.shape == (104,)


def test_timers(dummy_state):
    from veros.timer import Timer

    timer = dummy_state.timers["foobar"]
    assert isinstance(timer, Timer)