Skip to content

Commit 1a4251c

Browse files
authored
Merge pull request #439 from OceanParcels/updating_tools_dir
Updating tools dir
2 parents 526af07 + 5a7fb30 commit 1a4251c

16 files changed

Lines changed: 157 additions & 149 deletions

parcels/codegenerator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from parcels.field import Field, VectorField, SummedField, SummedVectorField
2-
from parcels.loggers import logger
2+
from parcels.tools.loggers import logger
33
import ast
44
import cgen as c
55
from collections import OrderedDict

parcels/field.py

Lines changed: 7 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -1,145 +1,19 @@
1-
from parcels.loggers import logger
1+
from parcels.tools.loggers import logger
2+
from parcels.tools.converters import unitconverters_map, UnitConverter, Geographic, GeographicPolar
3+
from parcels.tools.error import FieldSamplingError, TimeExtrapolationError
24
from collections import Iterable
35
from py import path
46
import numpy as np
57
from ctypes import Structure, c_int, c_float, POINTER, pointer
68
import xarray as xr
7-
from math import cos, pi
9+
from math import cos
810
import datetime
911
import math
1012
from .grid import (RectilinearZGrid, RectilinearSGrid, CurvilinearZGrid,
1113
CurvilinearSGrid, CGrid, GridCode)
1214

1315

14-
__all__ = ['Field', 'VectorField', 'SummedField', 'SummedVectorField',
15-
'Geographic', 'GeographicPolar', 'GeographicSquare', 'GeographicPolarSquare']
16-
17-
18-
class FieldSamplingError(RuntimeError):
19-
"""Utility error class to propagate erroneous field sampling"""
20-
21-
def __init__(self, x, y, z, field=None):
22-
self.field = field
23-
self.x = x
24-
self.y = y
25-
self.z = z
26-
message = "%s sampled at (%f, %f, %f)" % (
27-
field.name if field else "Field", self.x, self.y, self.z
28-
)
29-
super(FieldSamplingError, self).__init__(message)
30-
31-
32-
class TimeExtrapolationError(RuntimeError):
33-
"""Utility error class to propagate erroneous time extrapolation sampling"""
34-
35-
def __init__(self, time, field=None):
36-
if field is not None and field.grid.time_origin and time is not None:
37-
time = field.grid.time_origin + np.timedelta64(int(time), 's')
38-
message = "%s sampled outside time domain at time %s." % (
39-
field.name if field else "Field", time)
40-
message += " Try setting allow_time_extrapolation to True"
41-
super(TimeExtrapolationError, self).__init__(message)
42-
43-
44-
class UnitConverter(object):
45-
""" Interface class for spatial unit conversion during field sampling
46-
that performs no conversion.
47-
"""
48-
source_unit = None
49-
target_unit = None
50-
51-
def to_target(self, value, x, y, z):
52-
return value
53-
54-
def ccode_to_target(self, x, y, z):
55-
return "1.0"
56-
57-
def to_source(self, value, x, y, z):
58-
return value
59-
60-
def ccode_to_source(self, x, y, z):
61-
return "1.0"
62-
63-
64-
class Geographic(UnitConverter):
65-
""" Unit converter from geometric to geographic coordinates (m to degree) """
66-
source_unit = 'm'
67-
target_unit = 'degree'
68-
69-
def to_target(self, value, x, y, z):
70-
return value / 1000. / 1.852 / 60.
71-
72-
def to_source(self, value, x, y, z):
73-
return value * 1000. * 1.852 * 60.
74-
75-
def ccode_to_target(self, x, y, z):
76-
return "(1.0 / (1000.0 * 1.852 * 60.0))"
77-
78-
def ccode_to_source(self, x, y, z):
79-
return "(1000.0 * 1.852 * 60.0)"
80-
81-
82-
class GeographicPolar(UnitConverter):
83-
""" Unit converter from geometric to geographic coordinates (m to degree)
84-
with a correction to account for narrower grid cells closer to the poles.
85-
"""
86-
source_unit = 'm'
87-
target_unit = 'degree'
88-
89-
def to_target(self, value, x, y, z):
90-
return value / 1000. / 1.852 / 60. / cos(y * pi / 180)
91-
92-
def to_source(self, value, x, y, z):
93-
return value * 1000. * 1.852 * 60. * cos(y * pi / 180)
94-
95-
def ccode_to_target(self, x, y, z):
96-
return "(1.0 / (1000. * 1.852 * 60. * cos(%s * M_PI / 180)))" % y
97-
98-
def ccode_to_source(self, x, y, z):
99-
return "(1000. * 1.852 * 60. * cos(%s * M_PI / 180))" % y
100-
101-
102-
class GeographicSquare(UnitConverter):
103-
""" Square distance converter from geometric to geographic coordinates (m2 to degree2) """
104-
source_unit = 'm2'
105-
target_unit = 'degree2'
106-
107-
def to_target(self, value, x, y, z):
108-
return value / pow(1000. * 1.852 * 60., 2)
109-
110-
def to_source(self, value, x, y, z):
111-
return value * pow(1000. * 1.852 * 60., 2)
112-
113-
def ccode_to_target(self, x, y, z):
114-
return "pow(1.0 / (1000.0 * 1.852 * 60.0), 2)"
115-
116-
def ccode_to_source(self, x, y, z):
117-
return "pow((1000.0 * 1.852 * 60.0), 2)"
118-
119-
120-
class GeographicPolarSquare(UnitConverter):
121-
""" Square distance converter from geometric to geographic coordinates (m2 to degree2)
122-
with a correction to account for narrower grid cells closer to the poles.
123-
"""
124-
source_unit = 'm2'
125-
target_unit = 'degree2'
126-
127-
def to_target(self, value, x, y, z):
128-
return value / pow(1000. * 1.852 * 60. * cos(y * pi / 180), 2)
129-
130-
def to_source(self, value, x, y, z):
131-
return value * pow(1000. * 1.852 * 60. * cos(y * pi / 180), 2)
132-
133-
def ccode_to_target(self, x, y, z):
134-
return "pow(1.0 / (1000. * 1.852 * 60. * cos(%s * M_PI / 180)), 2)" % y
135-
136-
def ccode_to_source(self, x, y, z):
137-
return "pow((1000. * 1.852 * 60. * cos(%s * M_PI / 180)), 2)" % y
138-
139-
140-
unitconverters = {'U': GeographicPolar(), 'V': Geographic(),
141-
'Kh_zonal': GeographicPolarSquare(),
142-
'Kh_meridional': GeographicSquare()}
16+
__all__ = ['Field', 'VectorField', 'SummedField', 'SummedVectorField']
14317

14418

14519
class Field(object):
@@ -196,10 +70,10 @@ def __init__(self, name, data, lon=None, lat=None, depth=None, time=None, grid=N
19670
self.depth = self.grid.depth
19771
self.time = self.grid.time
19872
fieldtype = self.name if fieldtype is None else fieldtype
199-
if self.grid.mesh == 'flat' or (fieldtype not in unitconverters.keys()):
73+
if self.grid.mesh == 'flat' or (fieldtype not in unitconverters_map.keys()):
20074
self.units = UnitConverter()
20175
elif self.grid.mesh == 'spherical':
202-
self.units = unitconverters[fieldtype]
76+
self.units = unitconverters_map[fieldtype]
20377
else:
20478
raise ValueError("Unsupported mesh type. Choose either: 'spherical' or 'flat'")
20579
if type(interp_method) is dict:

parcels/fieldset.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from parcels.field import Field, VectorField, SummedField, SummedVectorField
22
from parcels.gridset import GridSet
33
from parcels.grid import RectilinearZGrid
4-
from parcels.loggers import logger
4+
from parcels.tools.loggers import logger
55
import numpy as np
66
from os import path
77
from glob import glob

parcels/grid.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from parcels.loggers import logger
1+
from parcels.tools.loggers import logger
22
import numpy as np
33
from ctypes import Structure, c_int, c_float, c_double, POINTER, cast, c_void_p, pointer
44
from enum import IntEnum

parcels/kernel.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from parcels.codegenerator import KernelGenerator, LoopGenerator
22
from parcels.compiler import get_cache_dir
3-
from parcels.kernels.error import ErrorCode, recovery_map as recovery_base_map
3+
from parcels.tools.error import ErrorCode, recovery_map as recovery_base_map
44
from parcels.field import FieldSamplingError
5-
from parcels.loggers import logger
5+
from parcels.tools.loggers import logger
66
from parcels.kernels.advection import AdvectionRK4_3D
77
from os import path, remove
88
import numpy as np

parcels/kernels/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
from .advection import * # noqa
22
from .diffusion import * # noqa
3-
from .error import * # noqa

parcels/kernels/advection.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""Collection of pre-built advection kernels"""
2-
from parcels.kernels.error import ErrorCode
2+
from parcels.tools.error import ErrorCode
33
import math
44

55

parcels/particle.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from parcels.kernels.error import ErrorCode
1+
from parcels.tools.error import ErrorCode
22
from parcels.field import Field
3-
from parcels.loggers import logger
3+
from parcels.tools.loggers import logger
44
from operator import attrgetter
55
import numpy as np
66
from ctypes import c_void_p

parcels/particlefile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import numpy as np
33
import netCDF4
44
from datetime import timedelta as delta
5-
from parcels.loggers import logger
5+
from parcels.tools.loggers import logger
66
from os import path
77
try:
88
from parcels._version import version as parcels_version

parcels/particleset.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from parcels.compiler import GNUCompiler
44
from parcels.kernels.advection import AdvectionRK4
55
from parcels.particlefile import ParticleFile
6-
from parcels.loggers import logger
6+
from parcels.tools.loggers import logger
77
from parcels.grid import GridCode
88
import numpy as np
99
import progressbar
@@ -257,7 +257,7 @@ def execute(self, pyfunc=AdvectionRK4, endtime=None, runtime=None, dt=1.,
257257
It is either a timedelta object or a positive double.
258258
None value means no animation.
259259
:param output_file: :mod:`parcels.particlefile.ParticleFile` object for particle output
260-
:param recovery: Dictionary with additional `:mod:parcels.kernels.error`
260+
:param recovery: Dictionary with additional `:mod:parcels.tools.error`
261261
recovery kernels to allow custom recovery behaviour in case of
262262
kernel errors.
263263
:param movie_background_field: field plotted as background in the movie if moviedt is set.

0 commit comments

Comments
 (0)