elasticipy 6.0.1__tar.gz → 6.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. elasticipy-6.1.0/.github/FUNDING.yml +1 -0
  2. {elasticipy-6.0.1 → elasticipy-6.1.0}/.github/workflows/Codecov.yml +1 -1
  3. {elasticipy-6.0.1/src/elasticipy.egg-info → elasticipy-6.1.0}/PKG-INFO +6 -4
  4. {elasticipy-6.0.1 → elasticipy-6.1.0}/README.md +4 -3
  5. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/API/API.rst +5 -4
  6. elasticipy-6.1.0/docs/source/API/Elasticipy.crystal_texture.rst +8 -0
  7. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/FourthOrderTensors.rst +1 -1
  8. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/Tutorial_AveragingMethods.rst +15 -7
  9. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/Tutorial_StiffnessTensor.rst +4 -4
  10. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/Tutorial_StressStrain.rst +1 -1
  11. elasticipy-6.1.0/docs/source/Tutorials/texture.rst +188 -0
  12. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials.rst +2 -1
  13. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/index.rst +2 -2
  14. {elasticipy-6.0.1 → elasticipy-6.1.0}/pyproject.toml +4 -10
  15. elasticipy-6.1.0/requirements.txt +18 -0
  16. elasticipy-6.1.0/src/elasticipy/crystal_texture.py +849 -0
  17. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/gui/about.py +12 -10
  18. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/gui/gui.py +4 -7
  19. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/interfaces/FEPX.py +3 -3
  20. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/interfaces/PRISMS.py +3 -3
  21. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/plasticity.py +1 -1
  22. elasticipy-6.1.0/src/elasticipy/resources/logo_text.png +0 -0
  23. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/spherical_function.py +5 -3
  24. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/tensors/elasticity.py +149 -18
  25. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/tensors/fourth_order.py +32 -11
  26. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/tensors/second_order.py +119 -18
  27. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/tensors/stress_strain.py +41 -25
  28. {elasticipy-6.0.1 → elasticipy-6.1.0/src/elasticipy.egg-info}/PKG-INFO +6 -4
  29. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy.egg-info/SOURCES.txt +6 -6
  30. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy.egg-info/requires.txt +1 -0
  31. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/test_StiffnessTensor.py +15 -2
  32. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/test_StressStrainTensors.py +55 -0
  33. elasticipy-6.1.0/tests/test_crystaltexture.py +294 -0
  34. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/test_interfaces_FEPX.py +2 -2
  35. elasticipy-6.0.1/CITATION.bib +0 -17
  36. elasticipy-6.0.1/Elasticipy_for_the_Impatient.ipynb +0 -1283
  37. elasticipy-6.0.1/docs/index.rst +0 -6
  38. elasticipy-6.0.1/postBuild +0 -1
  39. elasticipy-6.0.1/requirements.txt +0 -6
  40. elasticipy-6.0.1/runtime.txt +0 -1
  41. elasticipy-6.0.1/src/elasticipy/resources/logo_text.svg +0 -126
  42. {elasticipy-6.0.1 → elasticipy-6.1.0}/.github/workflows/JOSS build.yml +0 -0
  43. {elasticipy-6.0.1 → elasticipy-6.1.0}/.github/workflows/cloc.yml +0 -0
  44. {elasticipy-6.0.1 → elasticipy-6.1.0}/.github/workflows/python-publish.yml +0 -0
  45. {elasticipy-6.0.1 → elasticipy-6.1.0}/.readthedocs.yaml +0 -0
  46. {elasticipy-6.0.1 → elasticipy-6.1.0}/CITATION.cff +0 -0
  47. {elasticipy-6.0.1 → elasticipy-6.1.0}/CODE_OF_CONDUCT.md +0 -0
  48. {elasticipy-6.0.1 → elasticipy-6.1.0}/CONTRIBUTING.md +0 -0
  49. {elasticipy-6.0.1 → elasticipy-6.1.0}/Examples/Elasticipy_vs_pymatgen.py +0 -0
  50. {elasticipy-6.0.1 → elasticipy-6.1.0}/Examples/Elate_vs_Elasticipy.py +0 -0
  51. {elasticipy-6.0.1 → elasticipy-6.1.0}/Examples/Example_Stiffness_tensor.py +0 -0
  52. {elasticipy-6.0.1 → elasticipy-6.1.0}/Examples/Example_StressStrain_arrays.py +0 -0
  53. {elasticipy-6.0.1 → elasticipy-6.1.0}/Examples/Example_WaveVelocity.py +0 -0
  54. {elasticipy-6.0.1 → elasticipy-6.1.0}/Examples/MaterialsProject.json +0 -0
  55. {elasticipy-6.0.1 → elasticipy-6.1.0}/Examples/Multiple_phases.py +0 -0
  56. {elasticipy-6.0.1 → elasticipy-6.1.0}/Examples/SelfConsistent.py +0 -0
  57. {elasticipy-6.0.1 → elasticipy-6.1.0}/Examples/essai_plasticity.py +0 -0
  58. {elasticipy-6.0.1 → elasticipy-6.1.0}/Examples/example_readwrite.py +0 -0
  59. {elasticipy-6.0.1 → elasticipy-6.1.0}/JOSS/ElasticipyVSpymatgen.png +0 -0
  60. {elasticipy-6.0.1 → elasticipy-6.1.0}/JOSS/Nye.png +0 -0
  61. {elasticipy-6.0.1 → elasticipy-6.1.0}/JOSS/Plot_E.png +0 -0
  62. {elasticipy-6.0.1 → elasticipy-6.1.0}/JOSS/YoungModulus.png +0 -0
  63. {elasticipy-6.0.1 → elasticipy-6.1.0}/JOSS/paper.bib +0 -0
  64. {elasticipy-6.0.1 → elasticipy-6.1.0}/JOSS/paper.md +0 -0
  65. {elasticipy-6.0.1 → elasticipy-6.1.0}/LICENSE +0 -0
  66. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/_static/images/HyperSphericalCoordinates.png +0 -0
  67. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/API/Elasticipy.interfaces.FEPX.rst +0 -0
  68. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/API/Elasticipy.interfaces.PRISMS.rst +0 -0
  69. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/API/Elasticipy.plasticity.rst +0 -0
  70. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/API/Elasticipy.spherical_function.rst +0 -0
  71. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/API/Elasticipy.tensors.elasticity.rst +0 -0
  72. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/API/Elasticipy.tensors.fourth_order.rst +0 -0
  73. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/API/Elasticipy.tensors.mapping.rst +0 -0
  74. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/API/Elasticipy.tensors.second_order.rst +0 -0
  75. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/API/Elasticipy.tensors.stress_strain.rst +0 -0
  76. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/API/Elasticipy.tensors.thermal_expansion.rst +0 -0
  77. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/GUI.rst +0 -0
  78. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/Plasticity.rst +0 -0
  79. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/Tutorial_MultiplePhases.rst +0 -0
  80. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/Tutorial_ReadWriteFiles.rst +0 -0
  81. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/Tutorial_ThermalExpansion.rst +0 -0
  82. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/Tutorial_wave-velocities.rst +0 -0
  83. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/Cyclic.png +0 -0
  84. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/E_PF.png +0 -0
  85. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/E_VRH_sections.png +0 -0
  86. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/E_hill_fiber.png +0 -0
  87. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/E_plot3D.png +0 -0
  88. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/E_xyz_sections.png +0 -0
  89. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/GUI.png +0 -0
  90. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/G_plot3D.png +0 -0
  91. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/G_plot3D_min.png +0 -0
  92. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/G_xyz_sections.png +0 -0
  93. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/Incremental.png +0 -0
  94. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/Mohr.png +0 -0
  95. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/Nye.png +0 -0
  96. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/Shear.png +0 -0
  97. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/Stress-controlled.png +0 -0
  98. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/StressStrain-controlled.png +0 -0
  99. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/WaveVelocities.png +0 -0
  100. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/Tutorials/images/plot_volumeFraction.png +0 -0
  101. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/citation.rst +0 -0
  102. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/conf.py +0 -0
  103. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/install.rst +0 -0
  104. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/logo/favicon.png +0 -0
  105. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/logo/logo.png +0 -0
  106. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/logo/logo.svg +0 -0
  107. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/logo/logo_text.png +0 -0
  108. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/logo/logo_text.svg +0 -0
  109. {elasticipy-6.0.1 → elasticipy-6.1.0}/docs/source/logo/logo_text_whitebg.png +0 -0
  110. {elasticipy-6.0.1 → elasticipy-6.1.0}/setup.cfg +0 -0
  111. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/FourthOrderTensor.py +0 -0
  112. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/StressStrainTensors.py +0 -0
  113. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/ThermalExpansion.py +0 -0
  114. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/__init__.py +0 -0
  115. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/crystal_symmetries.py +0 -0
  116. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/gui/__init__.py +0 -0
  117. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/gui/rotate_window.py +0 -0
  118. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/interfaces/__init__.py +0 -0
  119. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/polefigure.py +0 -0
  120. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/resources/favicon.png +0 -0
  121. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/tensors/__init__.py +0 -0
  122. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/tensors/mapping.py +0 -0
  123. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy/tensors/thermal_expansion.py +0 -0
  124. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy.egg-info/dependency_links.txt +0 -0
  125. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy.egg-info/entry_points.txt +0 -0
  126. {elasticipy-6.0.1 → elasticipy-6.1.0}/src/elasticipy.egg-info/top_level.txt +0 -0
  127. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/MaterialsProject.json +0 -0
  128. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/__init__.py +0 -0
  129. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/.sim +0 -0
  130. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/defrate/defrate.step0 +0 -0
  131. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/defrate/defrate.step1 +0 -0
  132. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/defrate/defrate.step2 +0 -0
  133. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/ori/ori.step0 +0 -0
  134. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/ori/ori.step1 +0 -0
  135. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/ori/ori.step2 +0 -0
  136. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/spinrate/spinrate.step0 +0 -0
  137. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/spinrate/spinrate.step1 +0 -0
  138. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/spinrate/spinrate.step2 +0 -0
  139. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/strain/strain.step0 +0 -0
  140. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/strain/strain.step1 +0 -0
  141. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/strain/strain.step2 +0 -0
  142. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/stress/stress.step0 +0 -0
  143. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/stress/stress.step1 +0 -0
  144. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/stress/stress.step2 +0 -0
  145. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/velgrad/velgrad.step0 +0 -0
  146. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/velgrad/velgrad.step1 +0 -0
  147. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/FEPX/simulation.sim/results/elts/velgrad/velgrad.step2 +0 -0
  148. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/PRISMS/QuadratureOutputs.csv +0 -0
  149. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/interfaces/PRISMS/stressstrain.txt +0 -0
  150. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/test_FourthOrderTensors.py +0 -0
  151. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/test_SphericalFunction.py +0 -0
  152. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/test_ThermalExpansion.py +0 -0
  153. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/test_interfaces_prisms.py +0 -0
  154. {elasticipy-6.0.1 → elasticipy-6.1.0}/tests/test_plasticity.py +0 -0
@@ -0,0 +1 @@
1
+ ko_fi: doriandepriester
@@ -34,7 +34,7 @@ jobs:
34
34
  env:
35
35
  MP_API_KEY: ${{ secrets.MP_TOKEN }}
36
36
 
37
- run: pytest tests
37
+ run: pytest --cov=elasticipy --cov-report xml:coverage.xml --cov-report term tests
38
38
 
39
39
  - name: Upload results to Codecov
40
40
  uses: codecov/codecov-action@v5
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: elasticipy
3
- Version: 6.0.1
3
+ Version: 6.1.0
4
4
  Summary: A Python library for elasticity tensor computations
5
5
  Author-email: Dorian Depriester <dorian.dep@gmail.com>
6
6
  License: MIT
@@ -25,6 +25,7 @@ Requires-Dist: matplotlib
25
25
  Requires-Dist: qtpy
26
26
  Requires-Dist: pyqt5
27
27
  Requires-Dist: pandas
28
+ Requires-Dist: orix
28
29
  Provides-Extra: dev
29
30
  Requires-Dist: pytest; extra == "dev"
30
31
  Requires-Dist: pytest-cov; extra == "dev"
@@ -44,7 +45,7 @@ Dynamic: license-file
44
45
  [![codecov](https://codecov.io/gh/DorianDepriester/Elasticipy/graph/badge.svg?token=VUZPEUPBH1)](https://codecov.io/gh/DorianDepriester/Elasticipy)
45
46
  ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/Elasticipy)
46
47
  [![DOI](https://joss.theoj.org/papers/10.21105/joss.07940/status.svg)](https://doi.org/10.21105/joss.07940)
47
- [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/DorianDepriester/Elasticipy/HEAD?urlpath=%2Fdoc%2Ftree%2FElasticipy_for_the_Impatient.ipynb)
48
+ [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/DorianDepriester/elasticipy-notebook/HEAD?urlpath=%2Fdoc%2Ftree%2FElasticipy.ipynb)
48
49
 
49
50
 
50
51
  # ![Elasticipy](https://raw.githubusercontent.com/DorianDepriester/Elasticipy/refs/heads/main/docs/source/logo/logo_text.svg)
@@ -82,7 +83,7 @@ Tutorials and full documentation are available on [ReadTheDoc](https://elasticip
82
83
 
83
84
  ## ⏱️ Elasticipy in a nutshell
84
85
  Take a 5-minute tour through Elasticipy's main features by running the online Jupyter Notebook, hosted on
85
- [Binder](https://mybinder.org/v2/gh/DorianDepriester/Elasticipy/HEAD?urlpath=%2Fdoc%2Ftree%2FElasticipy_for_the_Impatient.ipynb).
86
+ [Binder](https://mybinder.org/v2/gh/DorianDepriester/elasticipy-notebook/HEAD?urlpath=%2Fdoc%2Ftree%2FElasticipy.ipynb).
86
87
 
87
88
 
88
89
  ## 🔍 Sources
@@ -113,7 +114,8 @@ You can use the following BibTeX entry:
113
114
  number = {115},
114
115
  pages = {7940},
115
116
  author = {Depriester, Dorian and Kubler, Régis},
116
- title = {elasticipy: A Python package for linear elasticity and tensor analysis},
117
+ title = {Elasticipy: A Python package for linear elasticity and tensor analysis},
117
118
  journal = {Journal of Open Source Software}
118
119
  }
119
120
  ````
121
+ Alternatively, you can by me a coffee on [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/W7W11S5TCH)
@@ -9,7 +9,7 @@
9
9
  [![codecov](https://codecov.io/gh/DorianDepriester/Elasticipy/graph/badge.svg?token=VUZPEUPBH1)](https://codecov.io/gh/DorianDepriester/Elasticipy)
10
10
  ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/Elasticipy)
11
11
  [![DOI](https://joss.theoj.org/papers/10.21105/joss.07940/status.svg)](https://doi.org/10.21105/joss.07940)
12
- [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/DorianDepriester/Elasticipy/HEAD?urlpath=%2Fdoc%2Ftree%2FElasticipy_for_the_Impatient.ipynb)
12
+ [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/DorianDepriester/elasticipy-notebook/HEAD?urlpath=%2Fdoc%2Ftree%2FElasticipy.ipynb)
13
13
 
14
14
 
15
15
  # ![Elasticipy](https://raw.githubusercontent.com/DorianDepriester/Elasticipy/refs/heads/main/docs/source/logo/logo_text.svg)
@@ -47,7 +47,7 @@ Tutorials and full documentation are available on [ReadTheDoc](https://elasticip
47
47
 
48
48
  ## ⏱️ Elasticipy in a nutshell
49
49
  Take a 5-minute tour through Elasticipy's main features by running the online Jupyter Notebook, hosted on
50
- [Binder](https://mybinder.org/v2/gh/DorianDepriester/Elasticipy/HEAD?urlpath=%2Fdoc%2Ftree%2FElasticipy_for_the_Impatient.ipynb).
50
+ [Binder](https://mybinder.org/v2/gh/DorianDepriester/elasticipy-notebook/HEAD?urlpath=%2Fdoc%2Ftree%2FElasticipy.ipynb).
51
51
 
52
52
 
53
53
  ## 🔍 Sources
@@ -78,7 +78,8 @@ You can use the following BibTeX entry:
78
78
  number = {115},
79
79
  pages = {7940},
80
80
  author = {Depriester, Dorian and Kubler, Régis},
81
- title = {elasticipy: A Python package for linear elasticity and tensor analysis},
81
+ title = {Elasticipy: A Python package for linear elasticity and tensor analysis},
82
82
  journal = {Journal of Open Source Software}
83
83
  }
84
84
  ````
85
+ Alternatively, you can by me a coffee on [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/W7W11S5TCH)
@@ -4,12 +4,13 @@ API documentation
4
4
  .. toctree::
5
5
  :maxdepth: 5
6
6
 
7
+ Elasticipy.crystal_texture
8
+ Elasticipy.interfaces.PRISMS
9
+ Elasticipy.interfaces.FEPX
10
+ Elasticipy.plasticity
11
+ Elasticipy.spherical_function
7
12
  Elasticipy.tensors.elasticity
8
13
  Elasticipy.tensors.fourth_order
9
14
  Elasticipy.tensors.second_order
10
15
  Elasticipy.tensors.stress_strain
11
16
  Elasticipy.tensors.thermal_expansion
12
- Elasticipy.plasticity
13
- Elasticipy.spherical_function
14
- Elasticipy.interfaces.PRISMS
15
- Elasticipy.interfaces.FEPX
@@ -0,0 +1,8 @@
1
+ Elasticipy.crystal_texture
2
+ ======================================
3
+
4
+ .. automodule:: elasticipy.crystal_texture
5
+ :members:
6
+ :undoc-members:
7
+ :show-inheritance:
8
+ :inherited-members:
@@ -189,7 +189,7 @@ representation. Indeed, one can check that their components as full representati
189
189
 
190
190
  Actually, a more direct way to check this equality is:
191
191
 
192
- >>> I_kelvin == I_voigt
192
+ >>> print(I_kelvin == I_voigt)
193
193
  True
194
194
 
195
195
  As said above, the two tensors above can `mixed`, although they are not represented the same way. E.g.:
@@ -59,6 +59,7 @@ As a comparison, let's see how the underlying assumption impair the Young moduli
59
59
  >>> print(E_Voigt.mean(), E_Reuss.mean(), E_Hill.mean())
60
60
  145.66862361382908 76.13802022165395 111.67690532486962
61
61
 
62
+ .. _rotations:
62
63
 
63
64
  Finite number of orientations
64
65
  =============================
@@ -66,6 +67,11 @@ If one wants to consider a finite set of orientations, or consider that these or
66
67
  over the SO3 (i.e. if we have a crystallographic texture), the first steps consists in estimating the mean of all the
67
68
  rotated stiffnesses/compliances (depending on the model).
68
69
 
70
+ .. note::
71
+
72
+ Elasticipy now handles *textures* to compute the "exact" averages (i.e. based on sampling). See :ref:`textures`.
73
+
74
+
69
75
  As an example, we assume that the material displays a perfect fiber texture along **z**. In terms of Bunge-Euler angles,
70
76
  it means that we have Phi=0 for each orientation:
71
77
 
@@ -93,6 +99,11 @@ Let's see how the Young modulus is distributed over space:
93
99
 
94
100
  It is thus clear that the fiber along the *z* axis results in a transverse-isotropic behavior in the X-Y plane.
95
101
 
102
+ Actually, a quicker way to compute the average from a finite set of orientations is to pass them as the averaging
103
+ function, e.g.:
104
+
105
+ >>> Chill = C.Hill_average(C, orientations=rotations)
106
+
96
107
  Plotting Voigt, Reuss and Hill averages at once
97
108
  ===============================================
98
109
 
@@ -105,22 +116,19 @@ sections (see :ref:`here<plotting>` for details) for each of the aforementioned
105
116
  from scipy.spatial.transform import Rotation
106
117
  import numpy as np
107
118
  from elasticipy.tensors.elasticity import StiffnessTensor
119
+ from elasticipy.crystal_texture import FibreTexture
120
+
108
121
  C = StiffnessTensor.monoclinic(phase_name='TiNi',
109
122
  C11=231, C12=127, C13=104,
110
123
  C22=240, C23=131, C33=175,
111
124
  C44=81, C55=11, C66=85,
112
125
  C15=-18, C25=1, C35=-3, C46=3)
113
- phi1 = np.random.random(10000)*2*np.pi # Random sampling from 0 to 2pi
114
- Phi = phi2 = np.zeros(10000)
115
- Euler_angles = np.array([phi1, Phi, phi2]).T
116
- rotations = Rotation.from_euler('ZXZ', Euler_angles) # Bunge-Euler angles
117
- C_rotated = C * rotations
126
+ texture = FibreTexture.from_Euler(Phi=0, phi2=0)
118
127
  for method in ['Reuss', 'Hill', 'Voigt']:
119
- C_avg = C_rotated.average(method)
128
+ C_avg = C.average(method, orientations = texture)
120
129
  if method == 'Reuss':
121
130
  fig, axs = C_avg.Young_modulus.plot_xyz_sections(label='Reuss') # Create fig and axes (sections)
122
131
  else:
123
132
  fig, axs = C_avg.Young_modulus.plot_xyz_sections(fig=fig, axs=axs, label=method) # Use existing axes
124
133
  axs[-1].legend()
125
- fig.tight_layout()
126
134
  fig.show()
@@ -40,7 +40,7 @@ shear and bulk moduli
40
40
  Hyperspherical function
41
41
  Min=83999.99999999991, Max=84000.00000000007
42
42
 
43
- >>> C.bulk_modulus
43
+ >>> print(C.bulk_modulus)
44
44
  140000.0
45
45
 
46
46
  .. note::
@@ -51,7 +51,7 @@ shear and bulk moduli
51
51
  One can check that both approaches yield the same tensor:
52
52
 
53
53
  >>> C2 = StiffnessTensor.isotropic(G=84e3, K=140e3)
54
- >>> C2 == C
54
+ >>> print(C2 == C)
55
55
  True
56
56
 
57
57
 
@@ -84,7 +84,7 @@ let's see its value along the x, y and z directions:
84
84
  >>> Ey = E.eval([0,1,0])
85
85
  >>> Ez = E.eval([0,0,1])
86
86
  >>> print((Ex, Ey, Ez))
87
- (124.52232440357189, 120.92120854784433, 96.13750721721384)
87
+ (np.float64(124.52232440357189), np.float64(120.92120854784433), np.float64(96.13750721721384))
88
88
 
89
89
  .. note::
90
90
 
@@ -113,7 +113,7 @@ deviation of the Young modulus:
113
113
 
114
114
  Another way to evidence anisotropy is to use the universal anisotropy factor [Ranganathan]_:
115
115
 
116
- >>> C.universal_anisotropy
116
+ >>> print(C.universal_anisotropy)
117
117
  5.141009551641412
118
118
 
119
119
  Shear moduli and Poisson ratios
@@ -141,7 +141,7 @@ that the maximum shear stress is around 0.849. Those can be checked by:
141
141
 
142
142
  >>> s.principal_stresses()
143
143
  array([ 1.51167769, 0.3519979 , -0.18566326])
144
- >>> s.Tresca() / 2
144
+ >>> print(s.Tresca() / 2)
145
145
  0.848670477704235
146
146
 
147
147
 
@@ -0,0 +1,188 @@
1
+ .. _textures:
2
+
3
+ Working with crystallographic textures
4
+ ---------------------------------------
5
+
6
+ With the help of `orix <https://orix.readthedocs.io/en/stable/index.html>`_, Elasticipy allows to compute averages based
7
+ on crystallographic texture (in addition to single orientations; see :ref:`rotations`).
8
+
9
+ Define and compose textures
10
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11
+
12
+ Discrete textures
13
+ =================
14
+ A series of "usual" texture components (e.g. Goss, cube, Brass etc.) are already implemented in Elasticipy:
15
+
16
+ .. doctest::
17
+
18
+ >>> from elasticipy.crystal_texture import DiscreteTexture
19
+ >>> goss = DiscreteTexture.Goss()
20
+ >>> goss
21
+ Crystallographic texture
22
+ φ1=0.00°, ϕ=45.00°, φ2=0.00°
23
+
24
+ This texture actually consists in a single orientation (as opposed to fibre textures, see below). It can be used to
25
+ rotate a stiffness tensor as follows:
26
+
27
+ >>> from elasticipy.tensors.elasticity import StiffnessTensor
28
+ >>> C = StiffnessTensor.cubic(C11=186, C12=134, C44=77) # Copper, mp-30
29
+ >>> C * goss
30
+ Stiffness tensor (in Voigt mapping):
31
+ [[ 1.86000000e+02 1.34000000e+02 1.34000000e+02 0.00000000e+00
32
+ 0.00000000e+00 0.00000000e+00]
33
+ [ 1.34000000e+02 2.37000000e+02 8.30000000e+01 1.42108547e-14
34
+ 0.00000000e+00 0.00000000e+00]
35
+ [ 1.34000000e+02 8.30000000e+01 2.37000000e+02 -7.10542736e-15
36
+ 0.00000000e+00 0.00000000e+00]
37
+ [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.60000000e+01
38
+ 0.00000000e+00 0.00000000e+00]
39
+ [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
40
+ 7.70000000e+01 0.00000000e+00]
41
+ [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
42
+ 0.00000000e+00 7.70000000e+01]]
43
+
44
+ Fibre textures
45
+ ==============
46
+ Fibre textures are defined as uniformly distributed orientations around a given axis, leading to a single line when
47
+ plotting an Orientation Distribution Function (ODF), hence the name. Therefore, there are three ways to define such
48
+ textures.
49
+
50
+ The first one consists in defining the *uvw* direction to align with a given axis (related to the sample coordinate
51
+ system). For instance, let's consider the texture such that the <111> direction is aligned with the Z axis:
52
+
53
+ >>> from elasticipy.crystal_texture import FibreTexture
54
+ >>> from orix.crystal_map import Phase
55
+ >>> from orix.vector.miller import Miller
56
+ >>>
57
+ >>> phase = Phase(point_group='m-3m') # Cubic symmetry
58
+ >>> m = Miller(uvw=[1,1,1], phase=phase)
59
+ >>> fibre_111 = FibreTexture.from_Miller_axis(m, [0,0,1])
60
+ >>> fibre_111
61
+ Fibre texture
62
+ <1. 1. 1.> || [0, 0, 1]
63
+
64
+ Actually, this texture is usually referred to as the γ fibre; therefore, a quicker way to define it is to use:
65
+
66
+ >>> gamma = FibreTexture.gamma()
67
+
68
+ This kind of shortcut also exists for alpha and epsilon textures
69
+ (see `here <http://pajarito.materials.cmu.edu/lectures/L23-Metal_Textures-Torsion_BCC-part2.pdf>`_) for details).
70
+
71
+ The third way is to use two (out of the three) Bunge-Euler angles to define the fix angles (assuming that the
72
+ orientations are uniformly distributed over the remaining angle). E.g.:
73
+
74
+ >>> fibre_phi2 = FibreTexture.from_Euler(phi1=0., Phi=0.)
75
+ >>> fibre_phi2
76
+ Fibre texture
77
+ φ1= 0.0°, ϕ= 0.0°
78
+
79
+ Then, the average stiffness resulting from such orientation distribution can be estimated from Voigt, Reuss or Hill
80
+ method by integration over the all possible rotations. E.g.:
81
+
82
+ >>> Chill = C.Hill_average(orientations=fibre_phi2)
83
+
84
+ One can check that this results in a transversely isotropic behaviour by plotting the values of the Young modulus in
85
+ planar sections. The full code is:
86
+
87
+ .. plot::
88
+
89
+ >>> from elasticipy.tensors.elasticity import StiffnessTensor
90
+ >>> from elasticipy.crystal_texture import FibreTexture
91
+ >>>
92
+ >>> C = StiffnessTensor.cubic(C11=186, C12=134, C44=77)
93
+ >>> fibre_phi2 = FibreTexture.from_Euler(phi1=0., Phi=0.)
94
+ >>> Chill = C.Hill_average(orientations=fibre_phi2)
95
+ >>> E = Chill.Young_modulus
96
+ >>> fig, ax = E.plot_xyz_sections()
97
+ >>> fig.show()
98
+
99
+ Composite textures
100
+ ==================
101
+ Different textures can be composed together to create a ``CompositeTexture`` object. For instance, if we consider a
102
+ a cubic material which exhibits 40% of uniform texture, 30% of <111>||[0,0,1] and balanced copper texture, we can do the
103
+ following:
104
+
105
+ >>> from elasticipy.crystal_texture import UniformTexture
106
+ >>> t = 0.4 * UniformTexture() + 0.3 * fibre_111 + 0.3 * DiscreteTexture.copper()
107
+ >>> t
108
+ Mixture of crystallographic textures
109
+ Wgt. Type Component
110
+ ------------------------------------------------------------
111
+ 0.40 uniform Uniform distribution over SO(3)
112
+ 0.30 fibre <1. 1. 1.> || [0, 0, 1]
113
+ 0.30 discrete φ1=90.00°, ϕ=35.26°, φ2=45.00°
114
+
115
+ Again, the Hill average can be computed as follows:
116
+
117
+ >>> C.Hill_average(orientations=t)
118
+ Stiffness tensor (in Voigt mapping):
119
+ [[ 2.29927005e+02 1.15004605e+02 1.09068390e+02 8.38850529e-16
120
+ 1.68295444e-01 -1.42501837e-15]
121
+ [ 1.15004605e+02 2.24466802e+02 1.14528593e+02 -2.58759922e-15
122
+ 6.02903899e+00 9.94342227e-16]
123
+ [ 1.09068390e+02 1.14528593e+02 2.30403016e+02 -2.87690846e-16
124
+ -6.19733443e+00 -2.35261749e-15]
125
+ [ 9.65499494e-16 -2.35273493e-15 -1.02889997e-15 3.85692073e+01
126
+ -7.04774156e-17 5.34392791e+00]
127
+ [ 1.68295444e-01 6.02903899e+00 -6.19733443e+00 -5.84888929e-16
128
+ 3.50396705e+01 -8.30517047e-16]
129
+ [ 5.75037319e-16 3.35378009e-15 -2.73847961e-16 5.34392791e+00
130
+ 2.89814218e-16 3.85229349e+01]]
131
+
132
+ Random sampling
133
+ ~~~~~~~~~~~~~~
134
+ Sample of orientations can be drawn from all kind of textures. While a "random" sample from a single discrete texture
135
+ does not make any sense, it can be of great interest for fibres or composite textures.
136
+
137
+ For instance, a sample of 10 orientations can be drawn from the composite texture defined above as follows:
138
+
139
+ >>> sample = t.sample(num=10, seed=123) # Seed here is used to ensure reproducibility
140
+ >>> sample
141
+ Orientation (10,) 1
142
+ [[ 0.1157 0.5901 0.2194 -0.7683]
143
+ [ 0.3954 -0.6714 -0.421 0.4644]
144
+ [ 0.9571 -0.1986 -0.2022 0.0609]
145
+ [ 0.0802 -0.7012 0.3947 -0.5883]
146
+ [ 0.1952 -0.8854 0.3814 0.1802]
147
+ [-0.4814 0.4494 0.097 0.7463]
148
+ [ 0.3647 -0.2798 -0.1159 -0.8805]
149
+ [ 0.3647 -0.2798 -0.1159 -0.8805]
150
+ [ 0.3647 -0.2798 -0.1159 -0.8805]
151
+ [ 0.3647 -0.2798 -0.1159 -0.8805]]
152
+
153
+ One may note that here, the 4 last orientations are the same. This is because it relates to the copper texture:
154
+
155
+ >>> DiscreteTexture.copper().orientation
156
+ Orientation (1,) 1
157
+ [[ 0.3647 -0.2798 -0.1159 -0.8805]]
158
+
159
+ Plotting
160
+ ~~~~~~~~
161
+ Pole figures can be drawn to evidence how each texture works. For instance, the (pure) Goss texture results in the
162
+ following pole figure:
163
+
164
+ .. plot::
165
+
166
+ >>> from elasticipy.crystal_texture import DiscreteTexture
167
+ >>> from orix.crystal_map import Phase
168
+ >>> from orix.vector.miller import Miller
169
+ >>>
170
+ >>> phase = Phase(point_group='m-3m') # Cubic symmetry
171
+ >>> m = Miller(uvw=[1,0,0], phase=phase)
172
+ >>> Goss = DiscreteTexture.Goss()
173
+ >>> fig, ax = Goss.plot_as_pole_figure(m.symmetrise(unique=True))
174
+ >>> fig.show()
175
+
176
+ Fibre textures can be drawn in a simular way. E.g.:
177
+
178
+ .. plot::
179
+
180
+ >>> from elasticipy.crystal_texture import FibreTexture
181
+ >>> from orix.crystal_map import Phase
182
+ >>> from orix.vector.miller import Miller
183
+ >>>
184
+ >>> gamma = FibreTexture.gamma()
185
+ >>> point_group = 'm3m' # BCC symmetry
186
+ >>> m = Miller(uvw=[1,0,0], phase=Phase(point_group=point_group))
187
+ >>> fig, ax = gamma.plot_as_pole_figure(m.symmetrise(unique=True))
188
+ >>> fig.show()
@@ -13,4 +13,5 @@ Tutorials
13
13
  ./Tutorials/Tutorial_MultiplePhases.rst
14
14
  ./Tutorials/Tutorial_ReadWriteFiles.rst
15
15
  ./Tutorials/Plasticity.rst
16
- ./Tutorials/FourthOrderTensors.rst
16
+ ./Tutorials/FourthOrderTensors.rst
17
+ ./Tutorials/texture.rst
@@ -3,7 +3,7 @@ Elasticipy Documentation
3
3
 
4
4
  .. |binder| image:: https://mybinder.org/badge_logo.svg
5
5
  :alt: Binder
6
- :target: https://mybinder.org/v2/gh/DorianDepriester/Elasticipy/HEAD?urlpath=%2Fdoc%2Ftree%2FElasticipy_for_the_Impatient.ipynb
6
+ :target: https://mybinder.org/v2/gh/DorianDepriester/elasticipy-notebook/HEAD?urlpath=%2Fdoc%2Ftree%2FElasticipy.ipynb
7
7
 
8
8
  .. |joss| image:: https://joss.theoj.org/papers/10.21105/joss.07940/status.svg
9
9
  :alt: doi:10.21105/joss.07940
@@ -49,7 +49,7 @@ Elasticipy Documentation
49
49
 
50
50
  |pypi| |pypi-downloads| |conda| |conda-downloads|
51
51
  |github-commit| |github-stars| |license|
52
- |doc| |coverage| |pypi-version| |joss|
52
+ |doc| |coverage| |pypi-version| |joss| |binder|
53
53
 
54
54
 
55
55
  Purpose of this package
@@ -26,7 +26,8 @@ dependencies = [
26
26
  "matplotlib",
27
27
  "qtpy",
28
28
  "pyqt5",
29
- "pandas"
29
+ "pandas",
30
+ "orix"
30
31
  ]
31
32
  requires-python = ">=3.9"
32
33
 
@@ -56,15 +57,8 @@ addopts = "--cov=src/Elasticipy --cov-report=xml"
56
57
 
57
58
  [tool.coverage.run]
58
59
  omit = [
59
- "src/elasticipy/gui.py",
60
+ "src/elasticipy/gui/*",
60
61
  ]
61
62
 
62
- [tool.poetry]
63
- name = "jupyter-notebook-tutorial"
64
- version = "0.1.0"
65
- description = "Short tutorial for Elasticipy"
66
- authors = ["Dorian DEPRIESTER <dorian.dep@gmail.com>"]
67
- readme = "README.md"
68
-
69
63
  [project.gui-scripts]
70
- elasticipy-gui = "elasticipy.gui:crystal_elastic_plotter"
64
+ elasticipy-gui = "elasticipy.gui:crystal_elastic_plotter"
@@ -0,0 +1,18 @@
1
+ numpy
2
+ scipy
3
+ matplotlib
4
+ setuptools
5
+ pandas
6
+ qtpy
7
+ PyQt5
8
+ orix
9
+ pytest
10
+ pymatgen
11
+ requests
12
+ seaborn
13
+ scikit-learn
14
+ emmet-core
15
+ ase
16
+ matscipy
17
+ paraqus
18
+ sympy