FLife


NameFLife JSON
Version 1.4.1 PyPI version JSON
download
home_pagehttps://github.com/ladisk/FLife
SummaryVibration Fatigue by Spectral Methods.
upload_time2022-12-09 08:15:39
maintainerJanko Slavič, Domen Gorjup, Aleš Zorman
docs_urlNone
authorAleš Zorman, Matjaž Mršnik, Janko Slavič
requires_python
licenseMIT license
keywords vibration fatigue spectral methods structural dynamics
VCS
bugtrack_url
requirements numpy scipy fatpack rainflow pylint pytest lvm_read matplotlib pyExSi
Travis-CI
coveralls test coverage No coveralls.
            FLife - Vibration Fatigue by Spectral Methods
---------------------------------------------

Obtaining vibration fatigue life in the spectral domain.


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)


Reference:
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>`_


|Build Status| |Docs Status| |zenodo|

.. |Docs Status| image:: https://readthedocs.org/projects/flife/badge/
   :target: https://flife.readthedocs.io

.. |Build Status| image:: https://travis-ci.com/ladisk/FLife.svg?branch=master
   :target: https://travis-ci.com/ladisk/FLife
   
.. |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.6816640.svg?
   :target: https://doi.org/10.5281/zenodo.6816640



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ladisk/FLife",
    "name": "FLife",
    "maintainer": "Janko Slavi\u010d, Domen Gorjup, Ale\u0161 Zorman",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "janko.slavic@fs.uni-lj.si",
    "keywords": "vibration fatigue, spectral methods, structural dynamics",
    "author": "Ale\u0161 Zorman, Matja\u017e Mr\u0161nik, Janko Slavi\u010d",
    "author_email": "janko.slavic@fs.uni-lj.si",
    "download_url": "https://files.pythonhosted.org/packages/e8/70/90b229c7316bbd18abfe193201dd66e15bc294fd541f7723105e1d2033d2/FLife-1.4.1.tar.gz",
    "platform": null,
    "description": "FLife - Vibration Fatigue by Spectral Methods\n---------------------------------------------\n\nObtaining vibration fatigue life in the spectral domain.\n\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\nReference:\nJanko Slavi\u010d, Matja\u017e Mr\u0161nik, Martin \u010cesnik, Jaka Javh, Miha Bolte\u017ear. \nVibration Fatigue by Spectral Methods, From Structural Dynamics to Fatigue Damage \u2013 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>`_\n\n\n|Build Status| |Docs Status| |zenodo|\n\n.. |Docs Status| image:: https://readthedocs.org/projects/flife/badge/\n   :target: https://flife.readthedocs.io\n\n.. |Build Status| image:: https://travis-ci.com/ladisk/FLife.svg?branch=master\n   :target: https://travis-ci.com/ladisk/FLife\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.6816640.svg?\n   :target: https://doi.org/10.5281/zenodo.6816640\n\n\n",
    "bugtrack_url": null,
    "license": "MIT license",
    "summary": "Vibration Fatigue by Spectral Methods.",
    "version": "1.4.1",
    "split_keywords": [
        "vibration fatigue",
        " spectral methods",
        " structural dynamics"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "md5": "4a221e7a4d8dd34a0b25f6d11c5a630d",
                "sha256": "0905e0cff27bae18e8d82fd87aaf0e2494de66f03187beef07b8e28dfe00c791"
            },
            "downloads": -1,
            "filename": "FLife-1.4.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "4a221e7a4d8dd34a0b25f6d11c5a630d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 73005,
            "upload_time": "2022-12-09T08:15:26",
            "upload_time_iso_8601": "2022-12-09T08:15:26.061930Z",
            "url": "https://files.pythonhosted.org/packages/ef/0f/3e1a949954d5bddc7e48116e2b3f4233fe765485b8e2a42d77640ed7f380/FLife-1.4.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "8c0eecad7d5b14baf1874558537e026b",
                "sha256": "3b2c883e5425181c10f7cd6baa7aa91d6e4c755d0dbd1b8b9c6ca330a7ed7095"
            },
            "downloads": -1,
            "filename": "FLife-1.4.1.tar.gz",
            "has_sig": false,
            "md5_digest": "8c0eecad7d5b14baf1874558537e026b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 35591,
            "upload_time": "2022-12-09T08:15:39",
            "upload_time_iso_8601": "2022-12-09T08:15:39.425731Z",
            "url": "https://files.pythonhosted.org/packages/e8/70/90b229c7316bbd18abfe193201dd66e15bc294fd541f7723105e1d2033d2/FLife-1.4.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2022-12-09 08:15:39",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "ladisk",
    "github_project": "FLife",
    "travis_ci": true,
    "coveralls": false,
    "github_actions": false,
    "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"
}
        
Elapsed time: 0.01658s