PyCCX


NamePyCCX JSON
Version 0.2.0 PyPI version JSON
download
home_pageNone
SummarySimulation and FEA environment for Python built upon Calculix and GMSH
upload_time2025-08-17 20:30:49
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseCopyright (c) 2025, Luke Parry Copyright (c) 2025, Luktug Ltd. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
keywords calculix fea finite element analysis gmsh simulation
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            PyCCX - Python Library for Calculix
=======================================

.. image:: https://github.com/drlukeparry/pyccx/workflows/Python%20application/badge.svg
    :target: https://github.com/drlukeparry/pyccx/actions
.. image:: https://readthedocs.org/projects/pyccx/badge/?version=latest
    :target: https://pyccx.readthedocs.io/en/latest/?badge=latest
    :alt: Documentation Status
.. image:: https://badge.fury.io/py/PyCCX.svg
    :target: https://badge.fury.io
.. image:: https://img.shields.io/badge/Made%20with-Python-1f425f.svg
   :target: https://www.python.org/
.. image:: https://img.shields.io/pypi/l/pyccx.svg
   :target: https://pypi.python.org/pypi/pyccx/
..  image:: https://img.shields.io/pypi/pyversions/pyccx.svg
   :target: https://pypi.python.org/pypi/pyccx/

PyCCX - a library for creating and running 3D FEA simulations using the opensource Calculix FEA Package.

The aim of this project was to provide a framework for implemented 3D FEA Analysis using the opensource
`Calculix <http://www.calculix.de>`_ solver. The analysis is complimented by use of the recent introduction of the
`GMSH-SDK <http://https://gitlab.onelab.info/gmsh/gmsh/api>`_ , an extension to `GMSH <http://gmsh.info/>`_ to provide
API bindings for different programming languages by the project authors to provide sophisticated 3D FEA mesh
generation outside of the GUI implementation.

This project aims to provide an integrated approach for generating full
2D and 3D structural and thermal FEA analysis for use in research, development and prototyping all inside a
Python environment. The functionality targets the delivery of automated scripted approaches for performing FEA simulations,
in particular for use assessing the sensitivity of design and material inputs on the response of a system structure, that
can be used as part of parametric optimisation studies.

This intends to remove requirement to setup each analysis manually using a GUI such as prepromax or GMSH.

Along with setting up and processing the analysis, numerous convenience functions are included to consistently interface
between both the Calculix and GMSH functionality within a single python environment.

Structure
##############

PyCCX framework consists of classes for specifying common components on the pre-processing stage, including the following
common FE workflow for performing a simulation:

* Generation of both 2D and 3D compatible analysis meshes for use with Calculix via GMSH
* Creation and assignment of thermal and mechanical boundary conditions for use in analyses
* Creation of multiple time (in)-dependent load cases
* Creation and assignment of multiple material models and element types through a single analysis
* Control and monitoring the Calculix simulation execution
* Processing and extraction of results obtained from Calculix

A meshing infrastructure provides an interface with GMSH for performing the meshing routines and for associating
physical boundary conditions with the elements/faces generated from geometrical entities obtained from CAD models,
typically by importing .step files.

The simulation class assembles the mesh and corresponding mesh identifier sets (Element, Nodal and Surfaces)
in conjunction with the applied boundary conditions for each specified load-case within an analysis. The analysis
is then exported as a Calculix input deck, and then performs the execution to the Calculix solver. The simulation
can be additionally monitored within the Python environment.

The results obtained upon completion of the analysis can be processes, to extract individual nodal and elemental quantities
predicted in the analysis output. The results can also be exported to an unstructured VTK format for visualisation in
Paraview.

Currently the analysis is unit-less, therefore the user should ensure that all constant, material parameters, boundary
conditions, and geometric lengths are consistent - by default GMSH assumes 'mm' units when importing BRep CAD models.

Current Features
******************

Meshing:
---------
Meshing is performed using the GMSH-SDK, which provides a Python interface to the GMSH meshing library. The features
within pyccx provided higher-level functionality building across existing GMSH functionality. The library mainly
facilitates setting up the analysis consistently within a single environment, such as mapping geometrical FE elements
into compatible Calculix types with consistent nodal ordering. Additional features available for meshing include:

* Integration with GMSH for generation 3D FEA Meshes
* Cleaning and merging of CAD assemblies using internal functionality provided by GMSH
* Creation and assignment of NodeSet, ElementSet, SurfaceSet from mesh features applied for boundary conditions
* Attachment of boundary conditions to geometrical CAD entities via GMSH (native .step import supported via OCC)

FEA Capabilities:
-------------------

* **Boundary Conditions**: (Acceleration, Convection, Fixed Displacements, Forces, Fluxes, Pressure, Radiation)
* **Loadcase Types** (Structural Static, Thermal, Coupled Thermo-Mechanical)
* **Materials** (Non-linear Elasto-Plastic Material) with user defined stress-strain curves and physical properties
* **Results** (Selection of exported results for nodal and element data per loadcase)
* **Analysis Types** configurable solver control (:auto-incrementing timestep, non-linear analysis)

Results Processing:
----------------------
* Element and Nodal Results can be obtained across each timesteps
* Results can be processed and visualised using the `pyccx.results` module
* Extraction of node and element results directly from the Calculix .frd and datafile
* Export of results to VTK file format for visualisation directly in Paraview


Installation
*************
PyCCX is multi-platform as a source based pythonpackage. This can be installed along with dependencies for GMSH automatically
using the following commands:

.. code:: bash

    pip install gmsh
    pip install pyccx

alternatively, the package can be installed using the uv library:

.. code:: bash

    uv pip install gmsh
    uv pip install pyccx

Calculix Solver
*****************

Depending on your environment, you will need to install the latest version of Calculix. This can be done through
conda-forge `calculix package <https://anaconda.org/conda-forge/calculix>`_ in the Anaconda distribution,

.. code:: bash

    conda install -c conda-forge calculix

However, it is suggested that the most reliable mode is downloading the latest distribution of Calculix directly.

**Windows:**

The solver be separately obtained from within the distribution of `prepromax <https://prepomax.fs.um.si>`_

**Linux:**

The latest version of Calculix can be installed from the packages available within your linux distribution

**Mac OS X:**

Calculix can be installed using the `Homebrew <https://brew.sh/>`_ package manager. This requires the appropriate XCode
compiler environment to be installed. Once this is done, Calculix can be installed using the following command:

.. code:: bash

    brew tap costerwi/homebrew-calculix
    brew install calculix-ccx

The path of the installed Calculix solver executable should be obtained, which is dependent on the configuration of the
brew installation.

Usage
*************

The Calculix solver executable needs to be available in the system path, or the path to the executable needs to be manually
specified. Across all platforms the direct path of the calculix solver executable needs to be initialised before any
further use.

.. code:: python

    from pyccx.core import Simulation

    # Set the path for Calculix in Windows
    Simulation.setCalculixPath('Path')


The following code excerpt shows part of an example for creating and running a steady state thermal analysis of model
using PyCCX of an existing mesh generated using the `pyccx.mesh.mesher` class.

.. code:: python

    from pyccx.core import DOF, ElementSet, NodeSet, SurfaceSet, Simulation
    from pyccx.results import ElementResult, NodalResult, ResultProcessor
    from pyccx.loadcase import  LoadCase, LoadCaseType
    from pyccx.material import ElastoPlasticMaterial

    # Set the path for Calculix in Windows
    Simulation.setCalculixPath('Path')

    # Create a Simulation object based on the supplied mesh model (defined separately)
    analysis = Simulation(myMeshModel)

    # Optionally set the working the base working directory
    analysis.setWorkingDirectory('.')


    # Create an ElementSet  and NodeSet for the entire volume of named model ('PartA')
    myMeshModel.setEntityName((Ent.Volume, 1), 'PartA') # Set the name of the GMSH volume to 'PartA'
    volElSet = ElementSet('volElSet', myMeshModel.getElementIds((Ent.Volume,1)))
    volNodeSet = NodeSet('VolumeNodeSet', myMeshModel.getNodesFromVolumeByName('PartA'))

    analysis.initialConditions.append({'type': 'temperature', 'set': 'VolumeNodeSet', 'value': 0.0})

    # Create a thermal load case and set the timesettings
    thermalLoadCase = LoadCase('Thermal_Load_Case')

    # Set the loadcase type to thermal - eventually this will be individual analysis classes with defaults
    thermalLoadCase.setLoadCaseType(LoadCaseType.THERMAL)

    # Set the thermal analysis to be a steady state simulation
    thermalLoadCase.isSteadyState = True
    thermalLoadCase.setTimeStep(0.5, 0.5, 5.0)

    # Attach the nodal and element result options to each loadcase
    # Set the nodal and element variables to record in the results (.frd) file
    nodeThermalPostResult = NodalResult('volNodeSet')
    nodeThermalPostResult.temperature = True

    elThermalPostResult = ElementResult('Volume1')
    elThermalPostResult.heatFlux = True

    # Add the result configurations to the loadcase
    thermalLoadCase.resultSet = [nodeThermalPostResult, elThermalPostResult]

    # Set thermal boundary conditions for the loadcase using specific NodeSets
    thermalLoadCase.boundaryConditions.append(
        {'type': 'fixed', 'nodes': 'surfaceNodesA', 'dof': [DOF.T], 'value': [60]})

    thermalLoadCase.boundaryConditions.append(
        {'type': 'fixed', 'nodes': 'surfaceNodesB', 'dof': [DOF.T], 'value': [20]})

    # Material
    # Add a elastic material and assign it to the volume.
    # Note ensure that the units correctly correspond with the geometry length scales
    steelMat = ElastoPlasticMaterial('Steel')
    steelMat.E = 210000.      # [MPa] Young's Modulus
    steelMat.alpha_CTE = [25e-6, 23e-6, 24e-6]  # Thermal Expansion Coefficient
    steelMat.density = 1.0    # Density
    steelMat.cp =  1.0        # Specific Heat
    steelMat.k = 1.0          # Thermal Conductivity


    # The material and material type is assigned to the elements across the part
    analysis.materialAssignments = [
        SolidMaterialAssignment("solid_material", elementSet=volElSet, material=steelMat)
    ]

    # Set the loadcases used in sequential order
    analysis.loadCases = [thermalLoadCase]

    # Run the analysis #
    analysis.run()

    # Open the results  file ('input') is currently the file that is generated by PyCCX
    results = analysis.results()
    results.load()

    # Export the results to VTK format as a significant timestep for post-processing
    import pyccx.utils.exporters as exporters
    exporters.exportToVTK('result.vtu', results, inc=-1)


The basic usage is split between the meshing facilities provided by GMSH and analysing a problem using the Calculix
Solver. Further documented examples are provided in `examples <https://github.com/drlukeparry/pyccx/tree/master/examples>`_ .

The current changelog is found in the `CHANGELOG <https://github.com/drlukeparry/pyccx/tree/dev/CHANGELOG.md'>`_ .
            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "PyCCX",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "Calculix, FEA, Finite Element Analysis, GMSH, Simulation",
    "author": null,
    "author_email": "Luke Parry <dev@lukeparry.uk>, Luktug <contact@luktug.co.uk>",
    "download_url": "https://files.pythonhosted.org/packages/bc/f9/a0804301091222ccdee5c5a363e5dfa9f6d59cb546e2127c95249fad258e/pyccx-0.2.0.tar.gz",
    "platform": null,
    "description": "PyCCX - Python Library for Calculix\n=======================================\n\n.. image:: https://github.com/drlukeparry/pyccx/workflows/Python%20application/badge.svg\n    :target: https://github.com/drlukeparry/pyccx/actions\n.. image:: https://readthedocs.org/projects/pyccx/badge/?version=latest\n    :target: https://pyccx.readthedocs.io/en/latest/?badge=latest\n    :alt: Documentation Status\n.. image:: https://badge.fury.io/py/PyCCX.svg\n    :target: https://badge.fury.io\n.. image:: https://img.shields.io/badge/Made%20with-Python-1f425f.svg\n   :target: https://www.python.org/\n.. image:: https://img.shields.io/pypi/l/pyccx.svg\n   :target: https://pypi.python.org/pypi/pyccx/\n..  image:: https://img.shields.io/pypi/pyversions/pyccx.svg\n   :target: https://pypi.python.org/pypi/pyccx/\n\nPyCCX - a library for creating and running 3D FEA simulations using the opensource Calculix FEA Package.\n\nThe aim of this project was to provide a framework for implemented 3D FEA Analysis using the opensource\n`Calculix <http://www.calculix.de>`_ solver. The analysis is complimented by use of the recent introduction of the\n`GMSH-SDK <http://https://gitlab.onelab.info/gmsh/gmsh/api>`_ , an extension to `GMSH <http://gmsh.info/>`_ to provide\nAPI bindings for different programming languages by the project authors to provide sophisticated 3D FEA mesh\ngeneration outside of the GUI implementation.\n\nThis project aims to provide an integrated approach for generating full\n2D and 3D structural and thermal FEA analysis for use in research, development and prototyping all inside a\nPython environment. The functionality targets the delivery of automated scripted approaches for performing FEA simulations,\nin particular for use assessing the sensitivity of design and material inputs on the response of a system structure, that\ncan be used as part of parametric optimisation studies.\n\nThis intends to remove requirement to setup each analysis manually using a GUI such as prepromax or GMSH.\n\nAlong with setting up and processing the analysis, numerous convenience functions are included to consistently interface\nbetween both the Calculix and GMSH functionality within a single python environment.\n\nStructure\n##############\n\nPyCCX framework consists of classes for specifying common components on the pre-processing stage, including the following\ncommon FE workflow for performing a simulation:\n\n* Generation of both 2D and 3D compatible analysis meshes for use with Calculix via GMSH\n* Creation and assignment of thermal and mechanical boundary conditions for use in analyses\n* Creation of multiple time (in)-dependent load cases\n* Creation and assignment of multiple material models and element types through a single analysis\n* Control and monitoring the Calculix simulation execution\n* Processing and extraction of results obtained from Calculix\n\nA meshing infrastructure provides an interface with GMSH for performing the meshing routines and for associating\nphysical boundary conditions with the elements/faces generated from geometrical entities obtained from CAD models,\ntypically by importing .step files.\n\nThe simulation class assembles the mesh and corresponding mesh identifier sets (Element, Nodal and Surfaces)\nin conjunction with the applied boundary conditions for each specified load-case within an analysis. The analysis\nis then exported as a Calculix input deck, and then performs the execution to the Calculix solver. The simulation\ncan be additionally monitored within the Python environment.\n\nThe results obtained upon completion of the analysis can be processes, to extract individual nodal and elemental quantities\npredicted in the analysis output. The results can also be exported to an unstructured VTK format for visualisation in\nParaview.\n\nCurrently the analysis is unit-less, therefore the user should ensure that all constant, material parameters, boundary\nconditions, and geometric lengths are consistent - by default GMSH assumes 'mm' units when importing BRep CAD models.\n\nCurrent Features\n******************\n\nMeshing:\n---------\nMeshing is performed using the GMSH-SDK, which provides a Python interface to the GMSH meshing library. The features\nwithin pyccx provided higher-level functionality building across existing GMSH functionality. The library mainly\nfacilitates setting up the analysis consistently within a single environment, such as mapping geometrical FE elements\ninto compatible Calculix types with consistent nodal ordering. Additional features available for meshing include:\n\n* Integration with GMSH for generation 3D FEA Meshes\n* Cleaning and merging of CAD assemblies using internal functionality provided by GMSH\n* Creation and assignment of NodeSet, ElementSet, SurfaceSet from mesh features applied for boundary conditions\n* Attachment of boundary conditions to geometrical CAD entities via GMSH (native .step import supported via OCC)\n\nFEA Capabilities:\n-------------------\n\n* **Boundary Conditions**: (Acceleration, Convection, Fixed Displacements, Forces, Fluxes, Pressure, Radiation)\n* **Loadcase Types** (Structural Static, Thermal, Coupled Thermo-Mechanical)\n* **Materials** (Non-linear Elasto-Plastic Material) with user defined stress-strain curves and physical properties\n* **Results** (Selection of exported results for nodal and element data per loadcase)\n* **Analysis Types** configurable solver control (:auto-incrementing timestep, non-linear analysis)\n\nResults Processing:\n----------------------\n* Element and Nodal Results can be obtained across each timesteps\n* Results can be processed and visualised using the `pyccx.results` module\n* Extraction of node and element results directly from the Calculix .frd and datafile\n* Export of results to VTK file format for visualisation directly in Paraview\n\n\nInstallation\n*************\nPyCCX is multi-platform as a source based pythonpackage. This can be installed along with dependencies for GMSH automatically\nusing the following commands:\n\n.. code:: bash\n\n    pip install gmsh\n    pip install pyccx\n\nalternatively, the package can be installed using the uv library:\n\n.. code:: bash\n\n    uv pip install gmsh\n    uv pip install pyccx\n\nCalculix Solver\n*****************\n\nDepending on your environment, you will need to install the latest version of Calculix. This can be done through\nconda-forge `calculix package <https://anaconda.org/conda-forge/calculix>`_ in the Anaconda distribution,\n\n.. code:: bash\n\n    conda install -c conda-forge calculix\n\nHowever, it is suggested that the most reliable mode is downloading the latest distribution of Calculix directly.\n\n**Windows:**\n\nThe solver be separately obtained from within the distribution of `prepromax <https://prepomax.fs.um.si>`_\n\n**Linux:**\n\nThe latest version of Calculix can be installed from the packages available within your linux distribution\n\n**Mac OS X:**\n\nCalculix can be installed using the `Homebrew <https://brew.sh/>`_ package manager. This requires the appropriate XCode\ncompiler environment to be installed. Once this is done, Calculix can be installed using the following command:\n\n.. code:: bash\n\n    brew tap costerwi/homebrew-calculix\n    brew install calculix-ccx\n\nThe path of the installed Calculix solver executable should be obtained, which is dependent on the configuration of the\nbrew installation.\n\nUsage\n*************\n\nThe Calculix solver executable needs to be available in the system path, or the path to the executable needs to be manually\nspecified. Across all platforms the direct path of the calculix solver executable needs to be initialised before any\nfurther use.\n\n.. code:: python\n\n    from pyccx.core import Simulation\n\n    # Set the path for Calculix in Windows\n    Simulation.setCalculixPath('Path')\n\n\nThe following code excerpt shows part of an example for creating and running a steady state thermal analysis of model\nusing PyCCX of an existing mesh generated using the `pyccx.mesh.mesher` class.\n\n.. code:: python\n\n    from pyccx.core import DOF, ElementSet, NodeSet, SurfaceSet, Simulation\n    from pyccx.results import ElementResult, NodalResult, ResultProcessor\n    from pyccx.loadcase import  LoadCase, LoadCaseType\n    from pyccx.material import ElastoPlasticMaterial\n\n    # Set the path for Calculix in Windows\n    Simulation.setCalculixPath('Path')\n\n    # Create a Simulation object based on the supplied mesh model (defined separately)\n    analysis = Simulation(myMeshModel)\n\n    # Optionally set the working the base working directory\n    analysis.setWorkingDirectory('.')\n\n\n    # Create an ElementSet  and NodeSet for the entire volume of named model ('PartA')\n    myMeshModel.setEntityName((Ent.Volume, 1), 'PartA') # Set the name of the GMSH volume to 'PartA'\n    volElSet = ElementSet('volElSet', myMeshModel.getElementIds((Ent.Volume,1)))\n    volNodeSet = NodeSet('VolumeNodeSet', myMeshModel.getNodesFromVolumeByName('PartA'))\n\n    analysis.initialConditions.append({'type': 'temperature', 'set': 'VolumeNodeSet', 'value': 0.0})\n\n    # Create a thermal load case and set the timesettings\n    thermalLoadCase = LoadCase('Thermal_Load_Case')\n\n    # Set the loadcase type to thermal - eventually this will be individual analysis classes with defaults\n    thermalLoadCase.setLoadCaseType(LoadCaseType.THERMAL)\n\n    # Set the thermal analysis to be a steady state simulation\n    thermalLoadCase.isSteadyState = True\n    thermalLoadCase.setTimeStep(0.5, 0.5, 5.0)\n\n    # Attach the nodal and element result options to each loadcase\n    # Set the nodal and element variables to record in the results (.frd) file\n    nodeThermalPostResult = NodalResult('volNodeSet')\n    nodeThermalPostResult.temperature = True\n\n    elThermalPostResult = ElementResult('Volume1')\n    elThermalPostResult.heatFlux = True\n\n    # Add the result configurations to the loadcase\n    thermalLoadCase.resultSet = [nodeThermalPostResult, elThermalPostResult]\n\n    # Set thermal boundary conditions for the loadcase using specific NodeSets\n    thermalLoadCase.boundaryConditions.append(\n        {'type': 'fixed', 'nodes': 'surfaceNodesA', 'dof': [DOF.T], 'value': [60]})\n\n    thermalLoadCase.boundaryConditions.append(\n        {'type': 'fixed', 'nodes': 'surfaceNodesB', 'dof': [DOF.T], 'value': [20]})\n\n    # Material\n    # Add a elastic material and assign it to the volume.\n    # Note ensure that the units correctly correspond with the geometry length scales\n    steelMat = ElastoPlasticMaterial('Steel')\n    steelMat.E = 210000.      # [MPa] Young's Modulus\n    steelMat.alpha_CTE = [25e-6, 23e-6, 24e-6]  # Thermal Expansion Coefficient\n    steelMat.density = 1.0    # Density\n    steelMat.cp =  1.0        # Specific Heat\n    steelMat.k = 1.0          # Thermal Conductivity\n\n\n    # The material and material type is assigned to the elements across the part\n    analysis.materialAssignments = [\n        SolidMaterialAssignment(\"solid_material\", elementSet=volElSet, material=steelMat)\n    ]\n\n    # Set the loadcases used in sequential order\n    analysis.loadCases = [thermalLoadCase]\n\n    # Run the analysis #\n    analysis.run()\n\n    # Open the results  file ('input') is currently the file that is generated by PyCCX\n    results = analysis.results()\n    results.load()\n\n    # Export the results to VTK format as a significant timestep for post-processing\n    import pyccx.utils.exporters as exporters\n    exporters.exportToVTK('result.vtu', results, inc=-1)\n\n\nThe basic usage is split between the meshing facilities provided by GMSH and analysing a problem using the Calculix\nSolver. Further documented examples are provided in `examples <https://github.com/drlukeparry/pyccx/tree/master/examples>`_ .\n\nThe current changelog is found in the `CHANGELOG <https://github.com/drlukeparry/pyccx/tree/dev/CHANGELOG.md'>`_ .",
    "bugtrack_url": null,
    "license": "Copyright (c) 2025, Luke Parry\n        Copyright (c) 2025, Luktug Ltd.\n        \n        All rights reserved.\n        \n        Redistribution and use in source and binary forms, with or without modification, are permitted provided that the\n        following conditions are met:\n        \n        Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n        Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following\n        disclaimer in the documentation and/or other materials provided with the distribution.\n        \n        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n        INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n        DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n        SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n        SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n        WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n        THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.",
    "summary": "Simulation and FEA environment for Python built upon Calculix and GMSH",
    "version": "0.2.0",
    "project_urls": {
        "Documentation": "https://pyccx.readthedocs.io/en/latest/",
        "Homepage": "https://github.com/drlukeparry/pyccx",
        "Source": "https://github.com/drlukeparry/pyccx/",
        "Tracker": "https://github.com/drlukeparry/pyccx/issues"
    },
    "split_keywords": [
        "calculix",
        " fea",
        " finite element analysis",
        " gmsh",
        " simulation"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e158802f749e68fb19ae9a5e1d15212fb0eaa75d005f814ba40f9e749727c8bd",
                "md5": "b014bed1686550b12aac8fb29ffb2271",
                "sha256": "2732e933703a11a8df2c9ebd562cc8856108af09463807bc3389f35fde7f9350"
            },
            "downloads": -1,
            "filename": "pyccx-0.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b014bed1686550b12aac8fb29ffb2271",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 63839,
            "upload_time": "2025-08-17T20:30:48",
            "upload_time_iso_8601": "2025-08-17T20:30:48.688308Z",
            "url": "https://files.pythonhosted.org/packages/e1/58/802f749e68fb19ae9a5e1d15212fb0eaa75d005f814ba40f9e749727c8bd/pyccx-0.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bcf9a0804301091222ccdee5c5a363e5dfa9f6d59cb546e2127c95249fad258e",
                "md5": "735bf3a2e2eb9b2dca5ce97d5af0d67a",
                "sha256": "383ef55ec14b5bf3b6c5645800e2284958a60cf680cac341f4421d210a2ffa72"
            },
            "downloads": -1,
            "filename": "pyccx-0.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "735bf3a2e2eb9b2dca5ce97d5af0d67a",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 54223,
            "upload_time": "2025-08-17T20:30:49",
            "upload_time_iso_8601": "2025-08-17T20:30:49.926396Z",
            "url": "https://files.pythonhosted.org/packages/bc/f9/a0804301091222ccdee5c5a363e5dfa9f6d59cb546e2127c95249fad258e/pyccx-0.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-17 20:30:49",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "drlukeparry",
    "github_project": "pyccx",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "pyccx"
}
        
Elapsed time: 3.47588s