Note: The default ITS GitLab runner is a shared resource and is subject to slowdowns during heavy usage.
You can run your own GitLab runner that is dedicated just to your group if you need to avoid processing delays.

Verified Commit e1673575 authored by Qusai Al Shidi's avatar Qusai Al Shidi 💬
Browse files

Add untested routines

parent d41da915
Pipeline #28526 passed with stage
in 53 seconds
...@@ -31,7 +31,7 @@ setuptools.setup( ...@@ -31,7 +31,7 @@ setuptools.setup(
install_requires=REQUIREMENTS, install_requires=REQUIREMENTS,
python_requires='>=3.6', python_requires='>=3.6',
extras_require={ extras_require={
"tecplottools": "tecplot", "tecplot": "tecplot",
"tecplottools": "h5py", "tecplottools": "h5py",
"hmi": "drms", "hmi": "drms",
}, },
......
...@@ -8,6 +8,118 @@ __email__ = 'qusai@umich.edu' ...@@ -8,6 +8,118 @@ __email__ = 'qusai@umich.edu'
import datetime as dt import datetime as dt
import numpy as np import numpy as np
def limit_growth(vector, factor=1.3, look_ahead=1, extensively=False):
"""This is a growth limiter for 1D vectors. It helps clean out spikes.
Use this to clean out spikes in IMF data for example.
Args:
vector (numpy.array):
A 1D array to clean.
factor (float):
The factor in which to limit growth. (default 1.3)
look_ahead (int):
How many frames to look ahead for growth.
extensively (bool):
Will keep refining until fully limited instead of one pass through.
(default False)
Returns:
(numpy.array): Of limited vector.
Raises:
ValueError: If not given 1D array.
Examples:
```python
from datetime import datetime
import matplotlib.pyplot as plt
from swmfpy.web import get_omni_data
from swmfpy.tools import limit_growth
times = (datetime(2011, 8, 6), datetime(2011, 8, 7))
data = get_omni_data(*times)
plt.plot(data['times'], data['density'])
plt.plot(data['times'], limit_growth(data['density'],
extensively=True)
```
"""
if sum(vector.shape) != vector.size:
raise ValueError('limit_growth() only handles 1D arrays')
limited = np.copy(vector)
for i in range(look_ahead, len(limited)):
if limited[i] > 0 and limited[i-look_ahead] > 0:
limited[i] = min(limited[i-look_ahead]*factor,
max(limited[i], limited[i-look_ahead]/factor)
)
if limited[i] < 0 and limited[i-look_ahead] < 0:
limited[i] = min(limited[i-look_ahead]/factor,
max(limited[i], limited[i-look_ahead]*factor)
)
return limited
def limit_changes(vector, change, constrictor=None, change2=None, look_ahead=1):
"""Limit the changes (jumps) of an array.
This is different from #limit_growth() because growth works on a
multiplication factor but `limit_change()` works on absolute changes.
Args:
vector (numpy.array):
Array in which to limit changes.
change ((float, float)):
Changes to limit `vector` by.
constrictor (numpy.array):
Array of same shape as `vector` in which if it is not growing
then constrict further. This is useful for limiting compression
behind shocks. If None, this won't apply (default None)
change2 ((float, float)):
Just like `change` but after constrictor has not grown. If None,
this won't apply (default None)
look_ahead (int):
How many indeces ahead to check (default 1)
Returns:
(numpy.array): Of constricted `vector`.
Raises:
ValueError: If arrays are of different shapes or not 1D each.
ValueError: If `change` tuple is not (negative, positive)
Examples:
"""
if sum(vector.shape) != vector.size:
raise ValueError('vector must be 1D')
if any(constrictor) and sum(constrictor.shape) != constrictor.size:
raise ValueError('constrictor must be 1D')
if change[0] > 0 or change[1] < 0:
raise ValueError('change must be (negative, positive)')
if change2[0] > 0 or change2[1] < 0:
raise ValueError('change2 must be (negative, positive)')
limited = np.copy(vector)
for i in range(look_ahead, len(vector)):
limited[i] = min(limited[i-1]+change[0],
max(limited[i-1]+change[1],
limited[i])
)
if any(constrictor):
for i in range(look_ahead, len(vector)):
if constrictor[i] <= constrictor[i-1]:
limited[i] = min(limited[i-1]+change2[0],
max(limited[i-1]+change2[1],
limited[i])
)
return limited
def interp_nans(x_vals, y_vals): def interp_nans(x_vals, y_vals):
"""Returns a numpy array with NaNs interpolated. """Returns a numpy array with NaNs interpolated.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment