|pytest| |Docs Status| |zenodo|
FLife - Vibration Fatigue by Spectral Methods
---------------------------------------------
Obtaining vibration fatigue life in the spectral domain. For general theoretical
background on vibration fatigue (structural dynamics, uniaxial/multiaxial fatigue,
non-Gaussianity, non-stationarity, etc), please see Slavič et al. [1], for
theoretical background on different spectral domain methods, please see the review
article by Zorman et al. [2] or original articles as given in the docstring
of the methods.
The review article [2] results are completely reproducible with ipynb file:
https://github.com/ladisk/FLife/blob/main/data/Vibration%20fatigue%20by%20spectral%20methods%20-%20a%20review%20with%20open-source%20support.ipynb
See the `documentation <https://flife.readthedocs.io/en/latest/index.html>`_ for more information.
Installing this package
-----------------------
Use `pip` to install it by:
.. code-block:: console
$ pip install FLife
Supported methods in the frequency-domain
-----------------------------------------
- Narrowband,
- Wirsching Light,
- Ortiz Chen,
- Alpha 0.75,
- Tovo Benasciutti,
- Dirlik,
- Zhao Baker,
- Park,
- Jun Park,
- Jiao Moan,
- Sakai Okamura,
- Fu Cebon,
- modified Fu Cebon,
- Low's bimodal,
- Low 2014,
- Lotsberg,
- Huang Moan,
- Gao Moan,
- Single moment,
- Bands method
Rainflow (time-domain) is supported using the `fatpack` (four-points algorithm) and `rainflow` (three-points algorithm) packages.
Simple example
---------------
Here is a simple example on how to use the code:
.. code-block:: python
import FLife
import numpy as np
dt = 1e-4
x = np.random.normal(scale=100, size=10000)
C = 1.8e+22 # S-N curve intercept [MPa**k]
k = 7.3 # S-N curve inverse slope [/]
# Spectral data
sd = FLife.SpectralData(input=(x, dt))
# Rainflow reference fatigue life
# (do not be confused here, spectral data object also holds the time domain data)
rf = FLife.Rainflow(sd)
# Spectral methods
dirlik = FLife.Dirlik(sd)
tb = FLife.TovoBenasciutti(sd)
print(f' Rainflow: {rf.get_life(C = C, k=k):4.0f} s')
print(f' Dirlik: {dirlik.get_life(C = C, k=k):4.0f} s')
print(f'Tovo Benasciutti 2: {tb.get_life(C = C, k=k, method="method 2"):4.0f} s')
SpectralData
-------------
SpectralData object contains data, required for fatigue-life estimation: power spectral density (PSD), spectral moments, spectral band estimators and others parameters.
SpectralData is instantiated with `input` parameter:
- `input` = 'GUI' - PSD is provided by user via GUI (graphically and tabulary)
- `input` = (PSD, freq) - tuple of PSD and frequency vector is provided.
- `input` = (x, dt) - tuple of time history and sampling period is provided.
GUI
***
.. code-block:: python
sd1 = FLife.SpectralData(input='GUI')
sd2 = FLife.SpectralData()
This is default argument. User is prompted to enter PSD graphically and/or tabulary.
|GUI_img|
Stationary Gaussian time-history is generated, if parameters `T` and `fs` are provided. Otherwise, time-history is generated subsequently, when Rainflow fatigue-life is calculated.
Optional parameter for time-history is random generator instance `rg` (numpy.random._generator.Generator), which determines phase of random process.
.. code-block:: python
seed = 111
rg = np.random.default_rng(seed)
# time-history can be generated at SpectralData object instantiation. Sampling frequency `fs` and signal length `T` parameter are needed.
sd3 = FLife.SpectralData(input='GUI', T=1, fs=1e5, rg=rg)
time_history = sd3.data
# time-history duration and sampling period are dependent on frequency vector length and step
T = sd3.t # time-history duration
dt = sd3.dt # sampling period
time = np.arange(0, T, dt)
plt.plot(time, time_history)
(PSD, freq)
***********
PSD and frequency arrays are given as input. Both arrays must be of type np.ndarray.
Stationary Gaussian time-history is generated, if parameters `T` and `fs` are provided. Otherwise, time-history is generated subsequently, when Rainflow fatigue-life is calculated.
Optional parameter for time-history is random generator instance `rg` (numpy.random._generator.Generator), which determines phase of random process.
.. code-block:: python
seed = 111
rg = np.random.default_rng(seed)
freq = np.arange(0,300)
f_low, f_high = 100, 120
A = 1 # PSD value
PSD = np.interp(freq, [f_low, f_high], [A,A], left=0, right=0) # Flat-shaped one-sided PSD
sd4 = FLife.SpectralData(input = (PSD, freq))
# time-history can be generated at SpectralData object instantiation. Sampling frequency `fs` and signal length `T` parameter are needed.
sd5 = FLife.SpectralData(input = (PSD, freq), T=1, fs=1e5, rg=rg)
time_history = sd5.data
# time-history duration and sampling period are dependent on frequency vector length and step
T = sd5.t # time-history duration
dt = sd5.dt # sampling period
time = np.arange(0, T, dt)
plt.plot(time, time_history)
(x, dt)
*******
Time history `x` and sampling period `dt` are given as input. `x` must be of type np.ndarray and `dt` of type float, int.
.. code-block:: python
seed = 111
rg = np.random.default_rng(seed)
freq = np.arange(0,100)
f_low, f_high = 40, 70
A = 1 # PSD value
PSD = np.interp(freq, [f_low, f_high], [A,A], left=0, right=0) # Flat-shaped one-sided PSD
time, signal = FLife.tools.random_gaussian(freq=freq, PSD=PSD, T=10, fs=1e3, rg=rg)
dt = time[1]
sd6 = FLife.SpectralData(input=(signal,dt))
# Get PSD data from spectralData object
freq = sd6.psd[:,0]
PSD = sd6.psd[:,1]
plt.plot(freq, PSD)
Spectral Methods
-----------------
Currently 20 spectral methods are supported. Methods for broadband process are organized into 4 subgroups:
- Narrowband correction factor; methods are based on narrowband approximation, accounting for broadband procces with correction factor.
- RFC PDF approximation; methods are based on approximation of Rainflow Probability Density Function.
- Combined fatigue damage - cycle damage combination; methods are based on splitting of PSD of broadband process into N narrowband approximations and accounting the formation of distinct categories of cycles.
- Combined fatigue damage - narrowband damage combination; methods are based on splitting of PSD of broadband process into N narrowband approximations and summing narrowband damages by suitable damage conbination rule.
|SpectralMethods_img|
SpectralData instance is prerequisite for spectral method instantiation. For multimodal spectral methods, PSD splitting type can be specified:
- PSD_splitting=('equalAreaBands', N) - PSD is divided into N equal area bands.
- PSD_splitting=('userDefinedBands', [f_1_ub, f_2_ub, ..., f_i_ub, ..., f_N_ub])) - Band upper boundary frequency f_i_ub is taken as boundary between two bands, i.e. i-th upper boundary frequency equals i+1-th lower boundary frequency.
.. code-block:: python
nb = FLife.Narrowband(sd)
dirlik = FLife.Dirlik(sd)
tb = FLife.TovoBenasciutti(sd)
jm1 = FLife.JiaoMoan(sd)
jm2 = FLife.JiaoMoan(sd, PSD_splitting=('equalAreaBands', 2)) # same as jm1, PSD is divided in 2 bands with equal area
jm3 = FLife.JiaoMoan(sd, PSD_splitting=('userDefinedBands', [80,150])) #80 and 150 are bands upper limits [Hz]
PDF
***
Some spectral methods supports PDF stress cycle amplitude via get_PDF(s, \**kwargs) function:
.. code-block:: python
s = np.arange(0,np.max(x),.001)
plt.plot(s,nb.get_PDF(s), label='Narrowband')
plt.plot(s,dirlik.get_PDF(s), label='Dirlik')
plt.plot(s,tb.get_PDF(s, method='method 2'), label='Tovo-Benasciutti')
plt.legend()
plt.show()
Vibration-fatigue life
**********************
Vibration-fatigue life is returned by function get_life(C,k,\**kwargs):
.. code-block:: python
C = 1.8e+22 # S-N curve intercept [MPa**k]
k = 7.3 # S-N curve inverse slope [/]
life_nb = nb.get_life(C = C, k=k)
life_dirlik = dirlik.get_life(C = C, k=k)
life_tb = tb.get_life(C = C, k=k, method='method 1')
Rainflow
--------
Vibration-fatigue life can be compared to rainflow method. When Rainflow class is instantiated, time-history is generated and assigned to SpectralData instance, if not already exist. By providing optional parameter `rg` (numpy.random._generator.Generator instance) phase of stationary Gaussian time history is controlled.
.. code-block:: python
sd = FLife.SpectralData(input='GUI') # time history is not generated at this point
seed = 111
rg = np.random.default_rng(seed)
rf1 = FLife.Rainflow(sd T=100, fs=1e3) # time history is generated and assigned to parameter SpectralData.data
rf2 = FLife.Rainflow(sd, T=100, fs =1e3, rg=rg) # time history is generated and assigned to parameter SpectralData.data, signal phase is defined by random generator
rf_life_3pt = rf2.get_life(C, k, algorithm='three-point')
rf_life_4pt = rf2.get_life(C, k, algorithm='four-point', nr_load_classes=1024)
error_nb = FLife.tools.relative_error(life_nb, rf_life_3pt)
error_dirlik = FLife.tools.relative_error(life_dirlik, rf_life_3pt)
error_tb = FLife.tools.relative_error(life_tb, rf_life_3pt)
References:
1. Janko Slavič, Matjaž Mršnik, Martin Česnik, Jaka Javh, Miha Boltežar.
Vibration Fatigue by Spectral Methods, From Structural Dynamics to Fatigue Damage – Theory and Experiments,
ISBN: 9780128221907, Elsevier, 1st September 2020,
`see Elsevier page. <https://www.elsevier.com/books/Vibration%20Fatigue%20by%20Spectral%20Methods/9780128221907?utm_campaign=ELS%20STBK%20AuthorConnect%20Release&utm_campaignPK=1695759095&utm_term=OP66802&utm_content=1695850484&utm_source=93&BID=1212165450>`_
2. Aleš Zorman and Janko Slavič and Miha Boltežar.
Vibration fatigue by spectral methods—A review with open-source support,
Mechanical Systems and Signal Processing, 2023,
`see https://doi.org/10.1016/j.ymssp.2023.110149`
.. |Docs Status| image:: https://readthedocs.org/projects/flife/badge/
:target: https://flife.readthedocs.io
.. |pytest| image:: https://github.com/ladisk/flife/actions/workflows/python-package.yml/badge.svg
:target: https://github.com/ladisk/flife/actions
.. |GUI_img| image:: PSDinput.png
:target: https://github.com/ladisk/FLife
:alt: GUI - PSD input
.. |SpectralMethods_img| image:: FreqMethodsTree.png
:target: https://github.com/ladisk/FLife/tree/main/FLife/freq_domain
:alt: Spectral methods
.. |zenodo| image:: https://zenodo.org/badge/DOI/10.5281/zenodo.7417587.svg?
:target: https://doi.org/10.5281/zenodo.7417587
Raw data
{
"_id": null,
"home_page": null,
"name": "FLife",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": "\"Janko Slavi\u010d, Domen Gorjup\" <janko.slavic@fs.uni-lj.si>",
"keywords": "fatigue, spectral methods, structural dynamics, vibration",
"author": null,
"author_email": "\"Ale\u0161 Zorman, Matja\u017e Mr\u0161nik, Janko Slavi\u010d\" <janko.slavic@fs.uni-lj.si>",
"download_url": "https://files.pythonhosted.org/packages/fe/78/000247a8928f61cda38d858f7fbd87db868e4134121924f815dd2a20ff5a/flife-1.4.4.tar.gz",
"platform": null,
"description": "|pytest| |Docs Status| |zenodo|\n\nFLife - Vibration Fatigue by Spectral Methods\n---------------------------------------------\n\nObtaining vibration fatigue life in the spectral domain. For general theoretical\nbackground on vibration fatigue (structural dynamics, uniaxial/multiaxial fatigue, \nnon-Gaussianity, non-stationarity, etc), please see Slavi\u010d et al. [1], for \ntheoretical background on different spectral domain methods, please see the review \narticle by Zorman et al. [2] or original articles as given in the docstring\nof the methods.\n\nThe review article [2] results are completely reproducible with ipynb file:\nhttps://github.com/ladisk/FLife/blob/main/data/Vibration%20fatigue%20by%20spectral%20methods%20-%20a%20review%20with%20open-source%20support.ipynb\n\nSee the `documentation <https://flife.readthedocs.io/en/latest/index.html>`_ for more information.\n\nInstalling this package\n-----------------------\n\nUse `pip` to install it by:\n\n.. code-block:: console\n\n $ pip install FLife\n\n\nSupported methods in the frequency-domain\n-----------------------------------------\n\n - Narrowband,\n - Wirsching Light,\n - Ortiz Chen,\n - Alpha 0.75,\n - Tovo Benasciutti,\n - Dirlik,\n - Zhao Baker,\n - Park,\n - Jun Park,\n - Jiao Moan,\n - Sakai Okamura,\n - Fu Cebon,\n - modified Fu Cebon,\n - Low's bimodal,\n - Low 2014,\n - Lotsberg,\n - Huang Moan,\n - Gao Moan,\n - Single moment,\n - Bands method\n\nRainflow (time-domain) is supported using the `fatpack` (four-points algorithm) and `rainflow` (three-points algorithm) packages.\n\n\nSimple example\n---------------\n\nHere is a simple example on how to use the code:\n\n.. code-block:: python\n\n import FLife\n import numpy as np\n\n\n dt = 1e-4\n x = np.random.normal(scale=100, size=10000)\n\n C = 1.8e+22 # S-N curve intercept [MPa**k]\n k = 7.3 # S-N curve inverse slope [/]\n\n # Spectral data\n sd = FLife.SpectralData(input=(x, dt))\n\n # Rainflow reference fatigue life \n # (do not be confused here, spectral data object also holds the time domain data)\n rf = FLife.Rainflow(sd)\n\n # Spectral methods\n dirlik = FLife.Dirlik(sd)\n tb = FLife.TovoBenasciutti(sd)\n print(f' Rainflow: {rf.get_life(C = C, k=k):4.0f} s')\n print(f' Dirlik: {dirlik.get_life(C = C, k=k):4.0f} s')\n print(f'Tovo Benasciutti 2: {tb.get_life(C = C, k=k, method=\"method 2\"):4.0f} s')\n\nSpectralData\n-------------\nSpectralData object contains data, required for fatigue-life estimation: power spectral density (PSD), spectral moments, spectral band estimators and others parameters. \n\nSpectralData is instantiated with `input` parameter:\n\n - `input` = 'GUI' - PSD is provided by user via GUI (graphically and tabulary)\n - `input` = (PSD, freq) - tuple of PSD and frequency vector is provided.\n - `input` = (x, dt) - tuple of time history and sampling period is provided.\n\nGUI\n***\n.. code-block:: python\n\n sd1 = FLife.SpectralData(input='GUI')\n sd2 = FLife.SpectralData()\n \nThis is default argument. User is prompted to enter PSD graphically and/or tabulary.\n\n|GUI_img| \n\nStationary Gaussian time-history is generated, if parameters `T` and `fs` are provided. Otherwise, time-history is generated subsequently, when Rainflow fatigue-life is calculated.\nOptional parameter for time-history is random generator instance `rg` (numpy.random._generator.Generator), which determines phase of random process.\n\n.. code-block:: python\n\n seed = 111\n rg = np.random.default_rng(seed)\n # time-history can be generated at SpectralData object instantiation. Sampling frequency `fs` and signal length `T` parameter are needed.\n sd3 = FLife.SpectralData(input='GUI', T=1, fs=1e5, rg=rg) \n \n time_history = sd3.data\n # time-history duration and sampling period are dependent on frequency vector length and step\n T = sd3.t # time-history duration\n dt = sd3.dt # sampling period \n time = np.arange(0, T, dt)\n plt.plot(time, time_history)\n\n(PSD, freq)\n***********\nPSD and frequency arrays are given as input. Both arrays must be of type np.ndarray. \n\nStationary Gaussian time-history is generated, if parameters `T` and `fs` are provided. Otherwise, time-history is generated subsequently, when Rainflow fatigue-life is calculated.\nOptional parameter for time-history is random generator instance `rg` (numpy.random._generator.Generator), which determines phase of random process.\n\n.. code-block:: python\n\n seed = 111\n rg = np.random.default_rng(seed)\n freq = np.arange(0,300)\n f_low, f_high = 100, 120\n A = 1 # PSD value\n PSD = np.interp(freq, [f_low, f_high], [A,A], left=0, right=0) # Flat-shaped one-sided PSD\n \n sd4 = FLife.SpectralData(input = (PSD, freq))\n # time-history can be generated at SpectralData object instantiation. Sampling frequency `fs` and signal length `T` parameter are needed.\n sd5 = FLife.SpectralData(input = (PSD, freq), T=1, fs=1e5, rg=rg)\n\n time_history = sd5.data\n # time-history duration and sampling period are dependent on frequency vector length and step\n T = sd5.t # time-history duration\n dt = sd5.dt # sampling period \n time = np.arange(0, T, dt)\n plt.plot(time, time_history)\n\n(x, dt)\n*******\nTime history `x` and sampling period `dt` are given as input. `x` must be of type np.ndarray and `dt` of type float, int.\n\n.. code-block:: python\n\n seed = 111\n rg = np.random.default_rng(seed)\n freq = np.arange(0,100)\n f_low, f_high = 40, 70\n A = 1 # PSD value\n PSD = np.interp(freq, [f_low, f_high], [A,A], left=0, right=0) # Flat-shaped one-sided PSD\n\n time, signal = FLife.tools.random_gaussian(freq=freq, PSD=PSD, T=10, fs=1e3, rg=rg)\n dt = time[1]\n\n sd6 = FLife.SpectralData(input=(signal,dt))\n\n # Get PSD data from spectralData object\n freq = sd6.psd[:,0]\n PSD = sd6.psd[:,1]\n plt.plot(freq, PSD)\n\nSpectral Methods\n-----------------\nCurrently 20 spectral methods are supported. Methods for broadband process are organized into 4 subgroups: \n\n - Narrowband correction factor; methods are based on narrowband approximation, accounting for broadband procces with correction factor.\n - RFC PDF approximation; methods are based on approximation of Rainflow Probability Density Function.\n - Combined fatigue damage - cycle damage combination; methods are based on splitting of PSD of broadband process into N narrowband approximations and accounting the formation of distinct categories of cycles.\n - Combined fatigue damage - narrowband damage combination; methods are based on splitting of PSD of broadband process into N narrowband approximations and summing narrowband damages by suitable damage conbination rule.\n\n|SpectralMethods_img|\n\nSpectralData instance is prerequisite for spectral method instantiation. For multimodal spectral methods, PSD splitting type can be specified:\n\n - PSD_splitting=('equalAreaBands', N) - PSD is divided into N equal area bands. \n - PSD_splitting=('userDefinedBands', [f_1_ub, f_2_ub, ..., f_i_ub, ..., f_N_ub])) - Band upper boundary frequency f_i_ub is taken as boundary between two bands, i.e. i-th upper boundary frequency equals i+1-th lower boundary frequency.\n\n.. code-block:: python\n \n nb = FLife.Narrowband(sd)\n dirlik = FLife.Dirlik(sd)\n tb = FLife.TovoBenasciutti(sd)\n jm1 = FLife.JiaoMoan(sd)\n jm2 = FLife.JiaoMoan(sd, PSD_splitting=('equalAreaBands', 2)) # same as jm1, PSD is divided in 2 bands with equal area\n jm3 = FLife.JiaoMoan(sd, PSD_splitting=('userDefinedBands', [80,150])) #80 and 150 are bands upper limits [Hz]\n \nPDF\n***\nSome spectral methods supports PDF stress cycle amplitude via get_PDF(s, \\**kwargs) function:\n\n.. code-block:: python\n\n s = np.arange(0,np.max(x),.001)\n plt.plot(s,nb.get_PDF(s), label='Narrowband')\n plt.plot(s,dirlik.get_PDF(s), label='Dirlik')\n plt.plot(s,tb.get_PDF(s, method='method 2'), label='Tovo-Benasciutti')\n plt.legend()\n plt.show()\n\nVibration-fatigue life\n**********************\nVibration-fatigue life is returned by function get_life(C,k,\\**kwargs):\n\n.. code-block:: python\n\n C = 1.8e+22 # S-N curve intercept [MPa**k]\n k = 7.3 # S-N curve inverse slope [/]\n \n life_nb = nb.get_life(C = C, k=k)\n life_dirlik = dirlik.get_life(C = C, k=k)\n life_tb = tb.get_life(C = C, k=k, method='method 1')\n\nRainflow\n--------\nVibration-fatigue life can be compared to rainflow method. When Rainflow class is instantiated, time-history is generated and assigned to SpectralData instance, if not already exist. By providing optional parameter `rg` (numpy.random._generator.Generator instance) phase of stationary Gaussian time history is controlled.\n\n \n.. code-block:: python\n\n sd = FLife.SpectralData(input='GUI') # time history is not generated at this point\n \n seed = 111\n rg = np.random.default_rng(seed)\n rf1 = FLife.Rainflow(sd T=100, fs=1e3) # time history is generated and assigned to parameter SpectralData.data\n rf2 = FLife.Rainflow(sd, T=100, fs =1e3, rg=rg) # time history is generated and assigned to parameter SpectralData.data, signal phase is defined by random generator\n rf_life_3pt = rf2.get_life(C, k, algorithm='three-point')\n rf_life_4pt = rf2.get_life(C, k, algorithm='four-point', nr_load_classes=1024) \n \n error_nb = FLife.tools.relative_error(life_nb, rf_life_3pt)\n error_dirlik = FLife.tools.relative_error(life_dirlik, rf_life_3pt)\n error_tb = FLife.tools.relative_error(life_tb, rf_life_3pt)\n\n\nReferences:\n 1. Janko Slavi\u010d, Matja\u017e Mr\u0161nik, Martin \u010cesnik, Jaka Javh, Miha Bolte\u017ear. \n Vibration Fatigue by Spectral Methods, From Structural Dynamics to Fatigue Damage \u2013 Theory and Experiments, \n ISBN: 9780128221907, Elsevier, 1st September 2020, \n `see Elsevier page. <https://www.elsevier.com/books/Vibration%20Fatigue%20by%20Spectral%20Methods/9780128221907?utm_campaign=ELS%20STBK%20AuthorConnect%20Release&utm_campaignPK=1695759095&utm_term=OP66802&utm_content=1695850484&utm_source=93&BID=1212165450>`_\n 2. Ale\u0161 Zorman and Janko Slavi\u010d and Miha Bolte\u017ear. \n Vibration fatigue by spectral methods\u2014A review with open-source support, \n Mechanical Systems and Signal Processing, 2023, \n `see https://doi.org/10.1016/j.ymssp.2023.110149`\n\n\n.. |Docs Status| image:: https://readthedocs.org/projects/flife/badge/\n :target: https://flife.readthedocs.io\n\n.. |pytest| image:: https://github.com/ladisk/flife/actions/workflows/python-package.yml/badge.svg\n :target: https://github.com/ladisk/flife/actions\n \n.. |GUI_img| image:: PSDinput.png\n :target: https://github.com/ladisk/FLife\n :alt: GUI - PSD input\n \n.. |SpectralMethods_img| image:: FreqMethodsTree.png\n :target: https://github.com/ladisk/FLife/tree/main/FLife/freq_domain\n :alt: Spectral methods\n\n.. |zenodo| image:: https://zenodo.org/badge/DOI/10.5281/zenodo.7417587.svg?\n :target: https://doi.org/10.5281/zenodo.7417587\n",
"bugtrack_url": null,
"license": null,
"summary": "Vibration Fatigue by Spectral Methods.",
"version": "1.4.4",
"project_urls": {
"documentation": "https://flife.readthedocs.io/en/latest/index.html",
"homepage": "https://github.com/ladisk/FLife",
"source": "https://github.com/ladisk/FLife"
},
"split_keywords": [
"fatigue",
" spectral methods",
" structural dynamics",
" vibration"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "6a2a3104a227bab591e8640b6b5122060174b7da703493f56cd83583de5ff4b9",
"md5": "f06a6b670fdb4c30d4e5ac92f0207cd7",
"sha256": "cc6cceac381ccf569e745d15d0a16821617f2e9ed13cda6906dee0bbf7175851"
},
"downloads": -1,
"filename": "flife-1.4.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "f06a6b670fdb4c30d4e5ac92f0207cd7",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 68828,
"upload_time": "2024-12-23T09:51:24",
"upload_time_iso_8601": "2024-12-23T09:51:24.622131Z",
"url": "https://files.pythonhosted.org/packages/6a/2a/3104a227bab591e8640b6b5122060174b7da703493f56cd83583de5ff4b9/flife-1.4.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "fe78000247a8928f61cda38d858f7fbd87db868e4134121924f815dd2a20ff5a",
"md5": "8d44ac5b4d6896266eb40eca53188d1c",
"sha256": "64fcf8424ea22205b795a89e3900878ed9e3170e2ed0bc1edd6188beee0f7a1c"
},
"downloads": -1,
"filename": "flife-1.4.4.tar.gz",
"has_sig": false,
"md5_digest": "8d44ac5b4d6896266eb40eca53188d1c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 34924,
"upload_time": "2024-12-23T09:51:26",
"upload_time_iso_8601": "2024-12-23T09:51:26.058337Z",
"url": "https://files.pythonhosted.org/packages/fe/78/000247a8928f61cda38d858f7fbd87db868e4134121924f815dd2a20ff5a/flife-1.4.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-23 09:51:26",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "ladisk",
"github_project": "FLife",
"travis_ci": true,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "numpy",
"specs": []
},
{
"name": "scipy",
"specs": []
},
{
"name": "fatpack",
"specs": []
},
{
"name": "rainflow",
"specs": []
},
{
"name": "pylint",
"specs": []
},
{
"name": "pytest",
"specs": []
},
{
"name": "lvm_read",
"specs": []
},
{
"name": "matplotlib",
"specs": [
[
">=",
"3.3"
]
]
},
{
"name": "pyExSi",
"specs": []
}
],
"lcname": "flife"
}