femethods 0.1.7a2__py3-none-any.whl → 0.1.8__py3-none-any.whl

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.
@@ -1,262 +1,281 @@
1
- Metadata-Version: 2.1
2
- Name: femethods
3
- Version: 0.1.7a2
4
- Summary: Implementation of Finite Element Analysis
5
- Home-page: https://femethods.readthedocs.io/en/latest/index.html
6
- Author: Joseph Contreras
7
- Author-email: 26684136+JosephJContreras@users.noreply.github.com
8
- License: UNKNOWN
9
- Platform: UNKNOWN
10
- Classifier: Programming Language :: Python :: 3
11
- Classifier: License :: OSI Approved :: MIT License
12
- Classifier: Operating System :: OS Independent
13
- Description-Content-Type: text/markdown
14
- Requires-Dist: numpy
15
- Requires-Dist: matplotlib
16
- Requires-Dist: scipy
17
-
18
- # FEmethods
19
-
20
- [![PyPI version](https://badge.fury.io/py/femethods.svg)](https://badge.fury.io/py/femethods)
21
- [![Build Status](https://travis-ci.org/josephjcontreras/FEMethods.svg?branch=master)](https://travis-ci.org/josephjcontreras/FEMethods)
22
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/josephjcontreras/FEMethods/blob/master/License.txt)
23
- [![Coverage Status](https://coveralls.io/repos/github/josephjcontreras/FEMethods/badge.svg?branch=master)](https://coveralls.io/github/josephjcontreras/FEMethods?branch=master)
24
- [![Documentation Status](https://readthedocs.org/projects/femethods/badge/?version=latest)](https://femethods.readthedocs.io/en/latest/?badge=latest)
25
-
26
-
27
- ## Introduction
28
- _FEmethods_ is a python module that uses Finite Element Methods to determine the
29
- reactions, and plot the shear, moment, and deflection along the length of a beam.
30
-
31
- Using Finite elements has the advantage over using exact solutions because it
32
- can be used as a general analysis, and can analyze beams that are statically
33
- indeterminate. The downside of this numerical approach is it will be less
34
- accurate than the exact approach.
35
-
36
- The official documentation is on [Read the Docs](https://femethods.readthedocs.io/en/latest/).
37
-
38
- ## Installation
39
-
40
- __FEMethods__ is hosted on PyPi, so installation is simple.
41
-
42
- `pip install femethods`
43
-
44
-
45
- ## General Layout
46
-
47
- `FEMethods` is made up of several sub-classes to make it easy to define loads
48
- and reaction types.
49
-
50
- ### femethods.loads
51
- There are currently only two different load types that are implemented.
52
-
53
- * `PointLoad`, a normal force acting with a constant magnitude on a single point
54
- * `MomentLoad`, a rotational moment acting with a constant magnitude acting at a single point
55
-
56
- All loads are defined by a `location` along the element, and a `magnitude`.
57
- The `location` must be positive, and must lie on the length of the beam,
58
- or it will raise a `ValueError`
59
-
60
- _Future goals are to add a library of standard distributed loads
61
- (constant, ramp, etc) as well as functionality that will allow a distributed
62
- load function to be the input._
63
-
64
- #### femethods.loads.PointLoad
65
- The `PointLoad` class describes a standard point load. A normal load acting at
66
- a single point with a constant value. It is defined with a location and a
67
- magnitude.
68
-
69
- ```python
70
- >>> PointLoad(-10, 5)
71
- PointLoad(magnitude=-10, location=5)
72
- ```
73
-
74
- The `location` must be a positive value, and less than or equal to the length
75
- of the beam, otherwise it raise a `ValueError`.
76
-
77
- #### femethods.loads.MomentLoad
78
- A `MomentLoad` class describes a standard moment load. A moment acting at a
79
- single point with a constant value. It is defined with a location and a value.
80
-
81
- ```python
82
- >>> MomentLoad(2, 5)
83
- MomentLoad(magnitude=2, location=5)
84
- ```
85
-
86
- The `location` must be a positive value, and less than or equal to the length
87
- of the beam, otherwise it raise a `ValueError`.
88
-
89
- ### femethods.reactions
90
-
91
- There are two different reactions that can be used to support an element.
92
-
93
- * `FixedReaction` does not allow vertical or rotational displacement
94
- * `PinnedReaction` does not allow vertical displacement but does allow rotational displacement
95
-
96
- All reactions have two properties, a `force` and a `moment`. They represent
97
- the numerical value for the resistive force or moment acting on the element
98
- to support the load(s). These properties are set to `None` when the reaction
99
- is instantiated (ie, they are unknown). They are calculated and set when
100
- analyzing a element. Note that the `moment` property of a `PinnedReaction`
101
- will always be `None` because it does not resist a moment.
102
-
103
- The `value` property is a read-only combination of the `force` and `moment`
104
- properties, and is in the form `value = (force, moment)`
105
-
106
- All reactions have an `invalidate` method that will set the `force` and
107
- `moment` back to `None`. This is useful when changing parameters and the
108
- calculated reactions are no longer valid.
109
-
110
- #### femethods.reactions.FixedReaction
111
- The `FixedReaction` is a reaction class that prevents both vertical and angular
112
- (rotational displacement). It has boundary conditions of `bc = (0, 0)`
113
-
114
- ```python
115
- >>> FixedReaction(3)
116
- FixedReaction(location=3)
117
-
118
- >>> print(FixedReaction(3))
119
- FixedReaction
120
- Location: 3
121
- Force: None
122
- Moment: None
123
- ```
124
-
125
- The `location` must be a positive value, and less than or equal to the length
126
- of the beam, otherwise it raise a `ValueError`.
127
-
128
- #### femethods.reactions.PinnedReaction
129
- The `PinnedReaction` is a reaction class that prevents vertical displacement,
130
- but allows angular (rotational) displacement. It has boundary conditions of `bc = (0, None)`
131
-
132
- ```python
133
- >>> PinnedReaction(7)
134
- PinnedReaction(location=7)
135
- >>> print(PinnedReaction(7))
136
- PinnedReaction
137
- Location: 7
138
- Force: None
139
- Moment: None
140
- ```
141
-
142
- The `location` must be a positive value, and less than or equal to the length
143
- of the beam, otherwise it raise a `ValueError`.
144
-
145
- ### femethods.elements.Beam
146
- Defines a beam as a finite element. This class will handle the bulk of the
147
- analysis, populating properties (such as meshing and values for the reactions).
148
-
149
- To create a `Beam` object, write the following:
150
-
151
- ```python
152
- b = Beam(length, loads, reactions, E=1, Ixx=1)
153
- ```
154
-
155
- Where the loads and reactions are a list of `loads` and `reactions` respectively.
156
-
157
- **Note**
158
- Loads and reactions must be a list, even when there is only one.
159
-
160
- The `E` and `Ixx` parameters are Young's modulus and the polar moment of
161
- inertia about the bending axis. They both default to `1`.
162
-
163
- ## Examples
164
-
165
- This section contains several different examples of how to use the beam
166
- element, and their results.
167
-
168
- For all examples, the following have been imported:
169
-
170
- ```python
171
- from femethods.elements import Beam
172
- from femethods.reactions import FixedReaction, PinnedReaction
173
- from femethods.loads import PointLoad, MomentLoad
174
- ```
175
-
176
- ### Example 1: Cantilevered Beam with Fixed Support and End Loading
177
-
178
- ```python
179
- beam_len = 10
180
- # Note that both the reaction and load are both lists. They must always be
181
- # given to Beam as a list,
182
- r = [FixedReaction(0)] # define reactions as list
183
- p = [PointLoad(magnitude=-2, location=beam_len)] # define loads as list
184
-
185
- b = Beam(beam_len, loads=p, reactions=r, E=29e6, Ixx=125)
186
-
187
- # an explicit solve is required to calculate the reaction values
188
- b.solve()
189
- print(b)
190
- ```
191
-
192
- The output of the program is
193
- ```
194
- PARAMETERS
195
- Length (length): 10
196
- Young's Modulus (E): 29000000.0
197
- Area moment of inertia (Ixx): 125
198
- LOADING
199
- Type: point load
200
- Location: 10
201
- Magnitude: -2
202
-
203
- REACTIONS
204
- Type: fixed
205
- Location: 0
206
- Force: 2.0
207
- Moment: 20.0
208
- ```
209
-
210
- ### Example 2: Cantilevered Beam with 3 Pinned Supports and End Loading
211
-
212
- ```python
213
- beam_len = 10
214
-
215
- # Note that both the reaction and load are both lists. They must always be
216
- # given to Beam as a list,
217
- r = [PinnedReaction(0), PinnedReaction(2), PinnedReaction(6)] # define reactions
218
- p = [PointLoad(magnitude=-2, location=beam_len)] # define loads
219
-
220
- b = Beam(beam_len, loads=p, reactions=r, E=29e6, Ixx=125)
221
-
222
- # an explicit solve is required to calculate the reaction values
223
- b.solve()
224
- print(b)
225
- ```
226
-
227
- The output of the program is
228
- ```
229
- PARAMETERS
230
- Length (length): 10
231
- Young's Modulus (E): 29000000.0
232
- Area moment of inertia (Ixx): 125
233
- LOADING
234
- Type: point load
235
- Location: 10
236
- Magnitude: -2
237
-
238
- REACTIONS
239
- Type: pinned
240
- Location: 0
241
- Force: 1.3333333333333346
242
- Moment: 0.0
243
- Type: pinned
244
- Location: 2
245
- Force: -4.000000000000004
246
- Moment: 0.0
247
- Type: pinned
248
- Location: 6
249
- Force: 4.666666666666671
250
- Moment: 0.0
251
- ```
252
-
253
- ## TODO
254
- * Add a more thorough documentation for all the features, limitations and FE fundamentals for each section
255
- * Add additional element types, such as the bar element
256
-
257
- ## Acknowledgements
258
- [Derivation of stiffness matrix for a beam](https://www.12000.org/my_notes/stiffness_matrix/stiffness_matrix_report.htm#x1-50002.1.1) by Nasser M. Abbasi
259
- [An idiot’s guide to Python documentation with Sphinx and ReadTheDocs](https://samnicholls.net/2016/06/15/how-to-sphinx-readthedocs) by [Sam Nicholls](https://samnicholls.net/about/) for
260
- a very helpful guide on how to get sphinx set up
261
-
262
-
1
+ Metadata-Version: 2.4
2
+ Name: femethods
3
+ Version: 0.1.8
4
+ Summary: Implementation of Finite Element Analysis
5
+ Author-email: Joseph Contreras <26684136+JosephJContreras@users.noreply.github.com>
6
+ Project-URL: Homepage, https://femethods.readthedocs.io/en/latest/index.html
7
+ Project-URL: Source, https://github.com/JJCoding01/FEmethods
8
+ Classifier: Development Status :: 2 - Pre-Alpha
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: Operating System :: OS Independent
11
+ Classifier: Programming Language :: Python :: 3 :: Only
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Programming Language :: Python :: 3.14
16
+ Requires-Python: >=3.11
17
+ Description-Content-Type: text/markdown
18
+ License-File: License.txt
19
+ Requires-Dist: matplotlib
20
+ Requires-Dist: numpy
21
+ Provides-Extra: dev
22
+ Requires-Dist: black; extra == "dev"
23
+ Requires-Dist: coverage; extra == "dev"
24
+ Requires-Dist: coveralls; extra == "dev"
25
+ Requires-Dist: flake8; extra == "dev"
26
+ Requires-Dist: isort; extra == "dev"
27
+ Requires-Dist: mypy; extra == "dev"
28
+ Requires-Dist: pip-tools; extra == "dev"
29
+ Requires-Dist: pre-commit; extra == "dev"
30
+ Requires-Dist: pylint; extra == "dev"
31
+ Requires-Dist: pyproject-fmt; extra == "dev"
32
+ Requires-Dist: pytest; extra == "dev"
33
+ Requires-Dist: pytest-cov; extra == "dev"
34
+ Requires-Dist: validate-pyproject[all]; extra == "dev"
35
+ Provides-Extra: docs
36
+ Requires-Dist: sphinx; extra == "docs"
37
+ Dynamic: license-file
38
+
39
+ # FEmethods
40
+
41
+ [![PyPI version](https://badge.fury.io/py/femethods.svg)](https://badge.fury.io/py/femethods)
42
+ [![Build Status](https://travis-ci.org/josephjcontreras/FEMethods.svg?branch=master)](https://travis-ci.org/josephjcontreras/FEMethods)
43
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/josephjcontreras/FEMethods/blob/master/License.txt)
44
+ [![Coverage Status](https://coveralls.io/repos/github/josephjcontreras/FEMethods/badge.svg?branch=master)](https://coveralls.io/github/josephjcontreras/FEMethods?branch=master)
45
+ [![Documentation Status](https://readthedocs.org/projects/femethods/badge/?version=latest)](https://femethods.readthedocs.io/en/latest/?badge=latest)
46
+
47
+
48
+ ## Introduction
49
+ _FEmethods_ is a python module that uses Finite Element Methods to determine the
50
+ reactions, and plot the shear, moment, and deflection along the length of a beam.
51
+
52
+ Using Finite elements has the advantage over using exact solutions because it
53
+ can be used as a general analysis, and can analyze beams that are statically
54
+ indeterminate. The downside of this numerical approach is it will be less
55
+ accurate than the exact approach.
56
+
57
+ The official documentation is on [Read the Docs](https://femethods.readthedocs.io/en/latest/).
58
+
59
+ ## Installation
60
+
61
+ __FEMethods__ is hosted on PyPi, so installation is simple.
62
+
63
+ `pip install femethods`
64
+
65
+
66
+ ## General Layout
67
+
68
+ `FEMethods` is made up of several sub-classes to make it easy to define loads
69
+ and reaction types.
70
+
71
+ ### femethods.loads
72
+ There are currently only two different load types that are implemented.
73
+
74
+ * `PointLoad`, a normal force acting with a constant magnitude on a single point
75
+ * `MomentLoad`, a rotational moment acting with a constant magnitude acting at a single point
76
+
77
+ All loads are defined by a `location` along the element, and a `magnitude`.
78
+ The `location` must be positive, and must lie on the length of the beam,
79
+ or it will raise a `ValueError`
80
+
81
+ _Future goals are to add a library of standard distributed loads
82
+ (constant, ramp, etc) as well as functionality that will allow a distributed
83
+ load function to be the input._
84
+
85
+ #### femethods.loads.PointLoad
86
+ The `PointLoad` class describes a standard point load. A normal load acting at
87
+ a single point with a constant value. It is defined with a location and a
88
+ magnitude.
89
+
90
+ ```python
91
+ >>> PointLoad(-10, 5)
92
+ PointLoad(magnitude=-10, location=5)
93
+ ```
94
+
95
+ The `location` must be a positive value, and less than or equal to the length
96
+ of the beam, otherwise it raise a `ValueError`.
97
+
98
+ #### femethods.loads.MomentLoad
99
+ A `MomentLoad` class describes a standard moment load. A moment acting at a
100
+ single point with a constant value. It is defined with a location and a value.
101
+
102
+ ```python
103
+ >>> MomentLoad(2, 5)
104
+ MomentLoad(magnitude=2, location=5)
105
+ ```
106
+
107
+ The `location` must be a positive value, and less than or equal to the length
108
+ of the beam, otherwise it raise a `ValueError`.
109
+
110
+ ### femethods.reactions
111
+
112
+ There are two different reactions that can be used to support an element.
113
+
114
+ * `FixedReaction` does not allow vertical or rotational displacement
115
+ * `PinnedReaction` does not allow vertical displacement but does allow rotational displacement
116
+
117
+ All reactions have two properties, a `force` and a `moment`. They represent
118
+ the numerical value for the resistive force or moment acting on the element
119
+ to support the load(s). These properties are set to `None` when the reaction
120
+ is instantiated (ie, they are unknown). They are calculated and set when
121
+ analyzing a element. Note that the `moment` property of a `PinnedReaction`
122
+ will always be `None` because it does not resist a moment.
123
+
124
+ The `value` property is a read-only combination of the `force` and `moment`
125
+ properties, and is in the form `value = (force, moment)`
126
+
127
+ All reactions have an `invalidate` method that will set the `force` and
128
+ `moment` back to `None`. This is useful when changing parameters and the
129
+ calculated reactions are no longer valid.
130
+
131
+ #### femethods.reactions.FixedReaction
132
+ The `FixedReaction` is a reaction class that prevents both vertical and angular
133
+ (rotational displacement). It has boundary conditions of `bc = (0, 0)`
134
+
135
+ ```python
136
+ >>> FixedReaction(3)
137
+ FixedReaction(location=3)
138
+
139
+ >>> print(FixedReaction(3))
140
+ FixedReaction
141
+ Location: 3
142
+ Force: None
143
+ Moment: None
144
+ ```
145
+
146
+ The `location` must be a positive value, and less than or equal to the length
147
+ of the beam, otherwise it raise a `ValueError`.
148
+
149
+ #### femethods.reactions.PinnedReaction
150
+ The `PinnedReaction` is a reaction class that prevents vertical displacement,
151
+ but allows angular (rotational) displacement. It has boundary conditions of `bc = (0, None)`
152
+
153
+ ```python
154
+ >>> PinnedReaction(7)
155
+ PinnedReaction(location=7)
156
+ >>> print(PinnedReaction(7))
157
+ PinnedReaction
158
+ Location: 7
159
+ Force: None
160
+ Moment: None
161
+ ```
162
+
163
+ The `location` must be a positive value, and less than or equal to the length
164
+ of the beam, otherwise it raise a `ValueError`.
165
+
166
+ ### femethods.elements.Beam
167
+ Defines a beam as a finite element. This class will handle the bulk of the
168
+ analysis, populating properties (such as meshing and values for the reactions).
169
+
170
+ To create a `Beam` object, write the following:
171
+
172
+ ```python
173
+ b = Beam(length, loads, reactions, E=1, Ixx=1)
174
+ ```
175
+
176
+ Where the loads and reactions are a list of `loads` and `reactions` respectively.
177
+
178
+ **Note**
179
+ Loads and reactions must be a list, even when there is only one.
180
+
181
+ The `E` and `Ixx` parameters are Young's modulus and the polar moment of
182
+ inertia about the bending axis. They both default to `1`.
183
+
184
+ ## Examples
185
+
186
+ This section contains several different examples of how to use the beam
187
+ element, and their results.
188
+
189
+ For all examples, the following have been imported:
190
+
191
+ ```python
192
+ from femethods.elements import Beam
193
+ from femethods.reactions import FixedReaction, PinnedReaction
194
+ from femethods.loads import PointLoad, MomentLoad
195
+ ```
196
+
197
+ ### Example 1: Cantilevered Beam with Fixed Support and End Loading
198
+
199
+ ```python
200
+ beam_len = 10
201
+ # Note that both the reaction and load are both lists. They must always be
202
+ # given to Beam as a list,
203
+ r = [FixedReaction(0)] # define reactions as list
204
+ p = [PointLoad(magnitude=-2, location=beam_len)] # define loads as list
205
+
206
+ b = Beam(beam_len, loads=p, reactions=r, E=29e6, Ixx=125)
207
+
208
+ # an explicit solve is required to calculate the reaction values
209
+ b.solve()
210
+ print(b)
211
+ ```
212
+
213
+ The output of the program is
214
+ ```
215
+ PARAMETERS
216
+ Length (length): 10
217
+ Young's Modulus (E): 29000000.0
218
+ Area moment of inertia (Ixx): 125
219
+ LOADING
220
+ Type: point load
221
+ Location: 10
222
+ Magnitude: -2
223
+
224
+ REACTIONS
225
+ Type: fixed
226
+ Location: 0
227
+ Force: 2.0
228
+ Moment: 20.0
229
+ ```
230
+
231
+ ### Example 2: Cantilevered Beam with 3 Pinned Supports and End Loading
232
+
233
+ ```python
234
+ beam_len = 10
235
+
236
+ # Note that both the reaction and load are both lists. They must always be
237
+ # given to Beam as a list,
238
+ r = [PinnedReaction(0), PinnedReaction(2), PinnedReaction(6)] # define reactions
239
+ p = [PointLoad(magnitude=-2, location=beam_len)] # define loads
240
+
241
+ b = Beam(beam_len, loads=p, reactions=r, E=29e6, Ixx=125)
242
+
243
+ # an explicit solve is required to calculate the reaction values
244
+ b.solve()
245
+ print(b)
246
+ ```
247
+
248
+ The output of the program is
249
+ ```
250
+ PARAMETERS
251
+ Length (length): 10
252
+ Young's Modulus (E): 29000000.0
253
+ Area moment of inertia (Ixx): 125
254
+ LOADING
255
+ Type: point load
256
+ Location: 10
257
+ Magnitude: -2
258
+
259
+ REACTIONS
260
+ Type: pinned
261
+ Location: 0
262
+ Force: 1.3333333333333346
263
+ Moment: 0.0
264
+ Type: pinned
265
+ Location: 2
266
+ Force: -4.000000000000004
267
+ Moment: 0.0
268
+ Type: pinned
269
+ Location: 6
270
+ Force: 4.666666666666671
271
+ Moment: 0.0
272
+ ```
273
+
274
+ ## TODO
275
+ * Add a more thorough documentation for all the features, limitations and FE fundamentals for each section
276
+ * Add additional element types, such as the bar element
277
+
278
+ ## Acknowledgements
279
+ [Derivation of stiffness matrix for a beam](https://www.12000.org/my_notes/stiffness_matrix/stiffness_matrix_report.htm#x1-50002.1.1) by Nasser M. Abbasi
280
+ [An idiot’s guide to Python documentation with Sphinx and ReadTheDocs](https://samnicholls.net/2016/06/15/how-to-sphinx-readthedocs) by [Sam Nicholls](https://samnicholls.net/about/) for
281
+ a very helpful guide on how to get sphinx set up
@@ -0,0 +1,9 @@
1
+ femethods/__init__.py,sha256=xvvRPFDSbD9_WbXaaKSI2b2yvhAsVNzXqFNeneAx8QE,134
2
+ femethods/mesh.py,sha256=V8f2meFKpDgwu-C9SU-0o5Ek94WUV62ot-aualQSB-c,8485
3
+ femethods/validation.py,sha256=e9ZddLLXNt_GQrInuzDB1udp5MOCjMlYb9yPBHk5jEs,3049
4
+ femethods/core/__init__.py,sha256=9McZwOESz45AUDkntE0VOtYf4Iugrwd7EAeqNN1SQfg,65
5
+ femethods-0.1.8.dist-info/licenses/License.txt,sha256=1UYEPSlECd63wcIh0U6hnkfLAyVsmhz_uqmjldOqABs,1065
6
+ femethods-0.1.8.dist-info/METADATA,sha256=3dQxhDP2huziEOiv4Yb7IgstSuhnQxZu_6Lwx--HXqU,9898
7
+ femethods-0.1.8.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
8
+ femethods-0.1.8.dist-info/top_level.txt,sha256=AMnFtlePLymKrqOG6guX3D3ftwY8TBxpPZbkgQLRC9U,10
9
+ femethods-0.1.8.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.35.1)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,7 @@
1
+ Copyright 2019 Joseph Contreras Jr.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.