├── .gitignore
├── LICENSE.txt
├── README.md
├── dist
├── beamframe-0.0.1-py3-none-any.whl
├── beamframe-0.0.1.tar.gz
├── beamframe-0.0.2-py3-none-any.whl
├── beamframe-0.0.2.tar.gz
├── beamframe-0.1.0-py3-none-any.whl
├── beamframe-0.1.0.tar.gz
├── beamframe-0.1.1-py3-none-any.whl
└── beamframe-0.1.1.tar.gz
├── setup.config
├── setup.py
├── src
└── beamframe
│ ├── SingularityFunction.py
│ ├── __init__.py
│ └── beam.py
└── tests
├── __pycache__
└── beam.cpython-38.pyc
├── generated_images
├── page_53_example_2-16.py.png
├── page_56_example_2-12.py.png
├── page_56_example_2-13.py.png
├── page_61_example_2-15.py.png
├── pg_28_1.py.png
├── test.png
├── test.py.png
├── test_cantilever.py.png
├── test_hinge_inclined_load.py.png
└── testtt.png
├── page_53_example_2-16.py
├── page_56_example_2-12.py
├── page_56_example_2-13.py
├── page_61_example_2-15.py
├── page_83_examle_2-23_uvl.py
├── page_85_example_2-24.py
├── pg_28_1.py
├── sympy_test.py
├── test.py
├── test_cantilever.py
├── test_data.txt
├── test_hinge.py
├── test_hinge_inclined_load.py
├── test_pointload.py
├── test_question.py
├── test_udl.py
├── test_udl_point.py
├── test_uvl.py
├── test_uvl_class_attribute.py
└── uvl_both.py
/.gitignore:
--------------------------------------------------------------------------------
1 | # general things to ignore
2 | *.egg-info/
3 | *.egg
4 | *.py[cod]
5 | __pycache__/
6 | *.so
7 | # due to using tox and pytest
8 | .tox
9 | .cache
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright (c) 2022 - Ashim Paudel
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of
4 | this software and associated documentation files (the "Software"), to deal in
5 | the Software without restriction, including without limitation the rights to
6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7 | of the Software, and to permit persons to whom the Software is furnished to do
8 | so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in all
11 | copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Contents:
2 | - [Introduction](#introduction)
3 | - [About Module](#about-the-module)
4 | - [Program Motivation](#program-motivation)
5 | - [Installation](#installation)
6 | - [Documentation](#documentation)
7 | - [Units and Conventions](#units-and-conventions)
8 | - [Table of all classes and arguments](#list-of-all-classes-and-arguments)
9 | - [Beam](#beam)
10 | - [Methods in Beam class](#methods)
11 | - [Load](#load)
12 | - [Point Load](#pointload)
13 | - [Uniformly Distributed Load(UDL)](#udl)
14 | - [Uniformly Varying Load(UVL)](#uvl)
15 | - [Reaction](#reaction)
16 | - [Point Moment](#pointmoment)
17 | - [Hinge](#hinge)
18 | - [Examples](#examples)
19 |
20 |
21 | # Introduction
22 | A beam is a structural element that primarily resists loads applied laterally to the beam's axis (an element designed to carry primarily axial load would be a strut or column). Its mode of deflection is primarily by bending. The loads applied to the beam result in reaction forces at the beam's support points. The total effect of all the forces acting on the beam is to produce shear forces and bending moments within the beams, that in turn induce internal stresses, strains and deflections of the beam.
23 | *Source: [Wikipedia](https://en.wikipedia.org/wiki/Beam_(structure))*
24 |
25 | ### About the module
26 | This module is aimed to solve Statically Determinate, Geometrically Stable two dimensional Beam just by using 3 equations of static equilibrium.
27 | $F_x = 0, F_y = 0 \text{ and } M_{point} = 0$.
28 |
29 | This module supports:
30 | - determinate 2D beam with Point Loads, Uniformly Distributed Loads, Uniformly Varying Loads, Point Moments
31 | - Fixed or Hinged or Roller types of support conditions
32 | - A Beam with Internal Hinge
33 | - Bending Moment Diagram and Shear Force Diagram
34 |
35 | ### Program Motivation
36 | > I studied about Beams first time in my second semester which had an included course of *Applied Mechanics - I (Statics)*. About 10-15 marks question were sure from beams and frames in board examination. But, while practicing beam analysis questions, from past question collection, one thing that collection was lacking was solution to those questions. Not even reaction values were given. So, it would cost us 15 minutes for even simple reaction calculation error. So, I thought of making this library from that period. And, I turned this thought into action in my 3rd semester's vacation.
37 |
38 | # Installation and usage
39 | ```
40 | pip install beamframe
41 | ```
42 |
43 | **Requirements**
44 |
45 | ```
46 | "numpy>=1.19",
47 | "sympy>=1",
48 | "matplotlib>=3"
49 | ```
50 | > **Note** All requirements will be installed automatically while installing this module.
51 |
52 | - [PyPi link](https://pypi.org/project/beamframe/)
53 |
54 | ### Importing the module
55 | Any one way of importing can be adopted
56 | ```
57 | from beamframe import beam
58 | #or
59 | from beamframe.beam import *
60 | ```
61 |
62 | # Documentation
63 |
64 | ## Units and Conventions
65 | One can use and follow thier own sign conventions in this module. But, default values will have following units and sign conventions.
66 | ### Sign Conventions:
67 | - Positive x-axis for beam: increases in right hand side.
68 | - Positive y-axis for beam: increases upward direction.
69 | - Positive angle direction: Counter clockwise with respect to positive x-axis of beam.
70 | - Positive moment: Counter clockwise
71 |
72 | ### Standard Units:
73 | - Length: meter
74 | - Angle: degrees
75 | - Load: kN
76 | - Moment: kNm
77 | - Load per meter: kN/m
78 |
79 | ## List of all classes and arguments
80 | | class | required arguments | optional arguments |
81 | | -- | -- | -- |
82 | | `Beam` | `length: float` | `E: float, I:float` |
83 | | `Load` | `pos: float, load: float` | `inverted:bool=False` |
84 | | `PointLoad` | `pos: float, load: float` | `inverted:bool = False, inclination:float=90` |
85 | | `UDL`| `start: float, loadpm: float, span: float` | `inverted:bool = True` |
86 | | `UVL`| ` start: float, startload: float, span: float, endload: float` | `inverted: bool = True` |
87 | | `Reaction` | `pos: float, type: str, pos_sym: str` | none |
88 | | `PointMoment` | `pos: float, mom: float` | `ccw: bool = True` |
89 | | `Hinge` | `pos: float` | `side: str = 'l'` |
90 |
91 |
92 | # Beam:
93 | `Beam` is the main class to represent a beam object and perform various calculations.
94 |
95 | ### Arguments
96 |
97 | - `length(float)`: length of a beam
98 | - `ndivs(int)` : number of divisions of beam. This specifies number of points along beam in which shear force and bending moment values will be calculated.
99 |
100 | Here are few optional keyword arguments
101 | - `E(float)` = Modulus of Elasticity of beam material
102 | - `I(float)` = 2nd moment of area of the cross section of beam
103 |
104 | ### Methods
105 |
106 | |S.N | Method | Arguments | Description |
107 | |-- | -- | -- | -- |
108 | | 1. | `fast_solve`| `loads_list` | Pass list (or tuple) of all load, moment, reaction and hinge elements present in beam.
This method will:
1. Calculate Reactions
2. Generate Shear and Bending Moment Equation |
109 | |2.| `generate_graph` | `which:str = 'both' , save_fig:bool = False , show_graph:bool = True, res:str = 'low'` | By default this generate will both Bending Moment Diagram(BMD) and Shear Force Diagram (SFD) stacked vertically.
To obtain seperate graphs change default value `which = 'both'` to `'sfd'` or `'bmd'`
To change resolution use `res` and accepted values are `('low', 'medium', 'high') or ('l', 'm', 'h')`
**Note:** *Don't use `res`(values other than `'low'`) and `show_graph=True` together. It will create render error.*|
110 | |3. | `add_loads` | `load_list`| Pass list of force generating objects. This will add the net loads in x and y direction.
Possible loads are `(PointLoad, Reaction, UDL, UVL)` |
111 | | 4. | `add_moments` | `momgen_list`
**optional:** `about=0` | Pass in list of moment generating objects like `(PointLoad,Reaction, UDL, UVL, PointMoment)`
By default this function takes moment about origin.
If you want to take moment about any other point, use Optional argument `about` and pass any x-coordinate value. |
112 | | 5. | `add_hinge` | `hinge, mom_gens` | This method must be used iff there is hinge object in beam. A hinge object and list(or tuple) of moment generating objects are expected arguments |
113 | | 6. | `calculate_reactions` | `reaction_list` | Pass in list(or tuple) of unknown reactions object to solve and assign reaction values |
114 | | 7. | `generate_shear_equation` | `loads` | Pass in list(or tuple) of load generators to generate shear equation |
115 | | 8. | `generate_moment_equation` | `loads` | Pass in list(or tuple) of load generators to generate moment equation |
116 | | 9. | `generate_shear_values` | `loads` | Pass in list(or tuple) of load generators to generate shear force values along various points in beam specified by `ndivs` argument while creating beam object |
117 | | 10. | `generate_moment_values` | `loads`| Pass in list(or tuple) of load generators to generate bending moment values along various points in beam specified by `ndivs` argument while creating beam object |
118 | | 11. | `save_data` | `fname:str, fformat:str='txt'` | Saves numerical values of Shear Forces and Moment Values in text file for predefined number of points|
119 | | 12. | `generate_significant_values` | - | Generates salient values like maximum and minimum bending moment and shear force, contraflexures and other |
120 |
121 |
122 | **Note**
123 | > Just first and second methods are sufficient to solve beam and generate graph. But, to keep track of ongoing process use other methods. *Remember not to use `fast_solve` and other methods(excluding method no. 2). Doing this will re-add all those loads you've passed again.*
124 |
125 |
126 |
127 | **Example**
128 | ```
129 | #importing the module
130 | from beamframe.beam import *
131 |
132 | # to create a beam of length 5m:
133 | b = Beam(5)
134 | ```
135 |
136 | ---
137 |
138 | # Load
139 | ### Arguments:
140 | - `pos(float)`: position of that netload with respect to beam coordinates's origin
141 | - `load(float)`: net load of that load type(for point load that is point load value,
142 | but it will be different
143 | for other loads like uvl and udl)
144 | - `inverted(bool)=False`: Default direction of positive net load is in positive direction of y-axes
145 | - by default: `inverted = False` (Positive Load)
146 | - use `inverted=True` (indicates negative Load)
147 |
148 | # PointLoad
149 | ### Description
150 | Subclass of class `Load`
151 |
152 | ### Arguments
153 | - `pos, load, inverted`: inherit from super class `Load`
154 | - `inclination(float)=90`: `unit=degree` represents angle made by direction of net load with positive direction of beam's x axis
155 | - inclination will be positive for counter clockwise direction
156 | - put negative inclination if you want to take angle in clockwise direction
157 |
158 | ### Attributes
159 | - `load_x`: component of net load value in positive direciton of beam's x-axis
160 | - `load_y`: component of net load value in positive y-direciton(upward direction)
161 |
162 | # UDL
163 | UDL(Uniformly Distributed Load) is type of load that is combinaiton of infinite points load over certain length acting transverse to beam
164 | ### Arguments:
165 | - `start(float)`:Start position of UDL
166 | - `loadpm(float)`: Load Per meter of udl
167 | - `span(float)`: Total length of udl
168 | - `inverted(bool) = True`: UDL facing downwards on beam
169 | - use `inverted=False` for upside udl
170 | ### Attributes
171 | - `netload(float)`: total effective load of udl
172 | - `pos(float)`: position of effective load from - beam origin
173 |
174 | # UVL
175 | It is that load whose magnitude varies along the loading length with a constant rate.
176 | Uniformly varying load is further divided into two types:
177 |
178 | 1. Triangular Load
179 | 2. Trapezoidal Load
180 |
181 | ### Arguments
182 | - `start:float` = Start position of uvl from beam's origin along x-axis of beam coordinate system
183 | - `startload:float` = `unit: kN/m` = Starting load/m value of uvl
184 | - `span:float` = Total length of uvl object
185 | - `endload:float` = Ending load/m value of uvl object
186 | - `inverted:bool= True` : Default=`True` Inverts the uvl object
187 |
188 | ### Attributes
189 | - `end` = End coordinate of uvl object
190 | - `tload` = Net load value of upper triangular part of trapezoidal or triangular load
191 | - `rload` = Net load value of lower rectangular part of trapezoidal load itself
192 | - `netload` = Net load of whole uvl object itself. `netload = tload + rload`
193 | - `netpos` = Net position(coordinates) where net load of uvl acts
194 |
195 | # Reaction
196 | Reactions are given by supports. 3 types of supports are defined for now:
197 | `hinge`, `roller` and `fixed` support.
198 |
199 | ### Arguments
200 | - `pos(float)`: position of reaction
201 | - `type(str)`: any one of `('roller'`,`'hinge'`,`'fixed')` or `('r'`,`'h'`,`'f')` Representing support condition at that point.
202 | - `pos_sym(str)`: Symbolic variable to represent support location name
203 |
204 | ### Attributes
205 | - `rx_val, ry_val, mom_val`: variables to store numerical values for reaction loads and moments
206 | - `rx_var, ry_var, mom_var`: symbolic variables to store symbolic values for reactions
207 |
208 | # PointMoment
209 | Pure moment that act at point
210 |
211 | ### Arguments
212 | - `pos` : location of that point moment from beam's origin
213 | - `mom` : value of that point moment
214 | - `ccw(bool) = False` : counterclockwise direciton is positive value of moment,
215 | - by defalut: `ccw = False` and given moment is positive
216 |
217 | # Hinge
218 | Internal hinges are provided in a structure to reduce statical indeterminacy of the structure.
219 | Bending moment at internal hinge is always zero.
220 | Internal hinge makes structure more flexible.
221 | It allows structure to move which reduces the reactive stresses.
222 |
223 | ### Arguments
224 | - `pos:float` = Position of that internal hinge from origin of beam coordinate system
225 | - `side:str = 'l'` : Accepted Values = `('r', 'right', 'l', 'left')`
226 | - Default Value = `'l'`
227 | - This side specifies which side of loads to take in order to take moment of that loads about hinge.
228 |
229 |
230 | # Examples
231 | ### Example-1: Solving Simplest Beam
232 | The simplest possible code to solve simply supported beam with pointload at middle of span.
233 | ```
234 | #import module
235 | from beamframe.beam import *
236 |
237 | # create a beam of length 5m
238 | b = Beam(5)
239 |
240 | # create reaction and pointload objects
241 | ra = Reaction(0, 'r', 'A')
242 | rb = Reaction(b.length, 'h', 'B')
243 | p = PointLoad(b.length/2, 10, inverted=True)
244 |
245 | b.fast_solve((ra, rb, p))
246 | b.generate_graph()
247 |
248 | ```
249 | **Graph:**
250 |
251 | 
252 |
253 | ### Example-2: Cantilever beam with udl
254 |
255 | ```
256 | from beamframe.beam import *
257 |
258 | # create a beam of length 5m
259 | b = Beam(5)
260 |
261 | # create reaction and udl object
262 | ra = Reaction(0, 'f', 'A')
263 | udl = UDL(0, 5, 5)
264 |
265 | b.fast_solve((ra, udl))
266 | b.generate_graph()
267 |
268 | ```
269 | **Graph:**
270 |
271 | 
272 |
273 | ### Example-3: Overhanging beam with internal hinge, and 3 supports
274 | > *Note*: In `b.generate_graph`: use `details=True` to show details like max and min bending moment, max and minimum shear force. `save_fig=True` to save figure of desired quality specified by quality in `res`
275 | ```
276 | from beamframe.beam import *
277 |
278 | b = Beam(10)
279 | ra = Reaction(0, 'h', 'A')
280 | p1 = PointLoad(1,100, inverted=True, inclination=40)
281 | m1 = PointMoment(2.5,20, ccw=False)
282 | rd = Reaction(3.5, 'r', 'D')
283 | h = Hinge(5, side='r')
284 | udl = UDL(5,10,2)
285 | rf = Reaction(7, 'r', 'F')
286 | p2 = PointLoad(b.length, 50, inverted=True)
287 |
288 | lds = (ra, p1, m1, rd, h, udl, rf, p2)
289 | b.fast_solve(lds)
290 | b.generate_graph(which='both', details=True, save_fig=True, show_graph=False, res='h')
291 | ```
292 | **Graph**:
293 |
294 | 
295 |
296 |
297 | ## Any more examples required?
298 | > Contact [Here](https://www.ashimp.com.np/#contact)
--------------------------------------------------------------------------------
/dist/beamframe-0.0.1-py3-none-any.whl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/dist/beamframe-0.0.1-py3-none-any.whl
--------------------------------------------------------------------------------
/dist/beamframe-0.0.1.tar.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/dist/beamframe-0.0.1.tar.gz
--------------------------------------------------------------------------------
/dist/beamframe-0.0.2-py3-none-any.whl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/dist/beamframe-0.0.2-py3-none-any.whl
--------------------------------------------------------------------------------
/dist/beamframe-0.0.2.tar.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/dist/beamframe-0.0.2.tar.gz
--------------------------------------------------------------------------------
/dist/beamframe-0.1.0-py3-none-any.whl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/dist/beamframe-0.1.0-py3-none-any.whl
--------------------------------------------------------------------------------
/dist/beamframe-0.1.0.tar.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/dist/beamframe-0.1.0.tar.gz
--------------------------------------------------------------------------------
/dist/beamframe-0.1.1-py3-none-any.whl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/dist/beamframe-0.1.1-py3-none-any.whl
--------------------------------------------------------------------------------
/dist/beamframe-0.1.1.tar.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/dist/beamframe-0.1.1.tar.gz
--------------------------------------------------------------------------------
/setup.config:
--------------------------------------------------------------------------------
1 | [metadata]
2 | # This includes the license file(s) in the wheel.
3 | # https://wheel.readthedocs.io/en/stable/user_guide.html#including-license-files-in-the-generated-wheel-file
4 | license_files = LICENSE.txt
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | from setuptools import setup, find_packages
2 | import pathlib
3 |
4 | here = pathlib.Path(__file__).parent.resolve()
5 |
6 | long_description = (here / "README.md").read_text(encoding="utf-8")
7 |
8 | setup(
9 | name="beamframe",
10 | version="0.1.1",
11 | description="A python module to solve and analyse determinate 2d Beams.",
12 | long_description=long_description,
13 | long_description_content_type="text/markdown",
14 | url="https://ashimp.com.np/beamframe/",
15 | author="Ashim Paudel",
16 | author_email="paudelashim111@gmail.com",
17 | classifiers=[
18 | "Development Status :: 3 - Alpha",
19 | "Topic :: Scientific/Engineering :: Visualization",
20 | "Topic :: Scientific/Engineering :: Physics",
21 | "License :: OSI Approved :: MIT License",
22 | ],
23 | keywords="beams, frames, structure, civil engineering, structural engineering, applied mechanics",
24 | package_dir={"": "src"},
25 | packages=find_packages(where="src"),
26 | python_requires=">=3.4, <4",
27 | install_requires=["numpy>=1.19",
28 | "sympy>=1",
29 | "matplotlib>=3"
30 | ],
31 | project_urls={
32 | "Source": "https://github.com/Ashim-Paudel/Python-Beam-Analysis",
33 | "Bug Reports": "https://github.com/Ashim-Paudel/Python-Beam-Analysis/issues",
34 | "Funding": "https://ashimp.com.np/beamframe/",
35 | "Say Thanks!": "http://ashimp.com.np/#contact",
36 | },
37 | )
--------------------------------------------------------------------------------
/src/beamframe/SingularityFunction.py:
--------------------------------------------------------------------------------
1 | """
2 | Module for singularity function
3 |
4 | """
5 |
6 |
7 | def SingularityFunction(x: float, a: float, n: int):
8 | """
9 | Main singularity function definition
10 | """
11 | shift = float(x-a)
12 | exp = int(n)
13 | if isinstance(shift, complex):
14 | if not shift.imag == 0:
15 | raise ValueError(
16 | "Singularity Functions are valid for real numbers only.")
17 | if isinstance(exp, complex):
18 | if not exp.imag == 0:
19 | raise ValueError(
20 | "Singularity Functions are valid for real exponents only.")
21 | if (exp + 2) < 0:
22 | raise ValueError(
23 | "Singularity Functions are valid for exponents greater than -2 only.")
24 | if shift < 0:
25 | return 0
26 | elif shift >= 0:
27 | if exp < 0:
28 | return 0
29 | else:
30 | return shift**exp
31 |
--------------------------------------------------------------------------------
/src/beamframe/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/src/beamframe/__init__.py
--------------------------------------------------------------------------------
/src/beamframe/beam.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | import __main__
4 | import matplotlib.pyplot as plt
5 | import numpy as np
6 | import sympy as sp
7 |
8 | from .SingularityFunction import SingularityFunction
9 |
10 | """
11 | # About Beam library:
12 | A beam is a structural element that primarily resists loads applied laterally to the beam's axis.
13 | Its mode of deflection is primarily by bending.
14 |
15 | This library has several class and their methods in order to solve a 2d Beam numerically and do beam analysis.
16 |
17 | ## Sign Conventions:
18 | Positive x-axis for beam: increases in right hand side
19 | Positive y-axis for beam: increases upward direction
20 | Positive angle direction: Counter clockwise with respect to beam positive x-axis
21 | Positive moment: Counter clockwise
22 |
23 | ## Units Conventions:
24 | Length: meter
25 | Angle: degrees
26 | Load: kN
27 | Moment: kNm
28 | """
29 |
30 |
31 | class Beam:
32 | """
33 | `Beam` is the main class to represent a beam object and perform various calculations.
34 |
35 | ## Attributes
36 | `length(float)`: length of a beam
37 |
38 | `kwargs`: Here are few optional keyword arguments
39 | - `E(float)` = Modulus of Elasticity of beam material
40 | - `I(float)` = 2nd moment of area of the cross section of beam
41 |
42 | #### Example
43 | ```
44 | # to create a beam of length 5m:
45 | b = Beam(5)
46 | ```
47 | """
48 | # initial kwargs lists for simply supported beam
49 | simply_supported = ('Elasticity', 'MOA')
50 |
51 | def __init__(self, length: float, ndivs=1000, **kwargs):
52 | self.length = length
53 | self.ndivs = ndivs # this is required to create that number of points along which moment and shear values will be calculated
54 | # creating beam fragments of that beam points
55 | self.xbeam, self.dxbeam = np.linspace(-1,
56 | self.length, self.ndivs, retstep=True)
57 | # cause we've initialized beam length from -1, we must keep track of where positive value for beam starts
58 | self.beam_0 = np.argwhere(self.xbeam >= 0)[0][0]
59 |
60 | # modulus of elasticity of the material
61 | self.E = kwargs.get('E') or kwargs.get('Elasticity')
62 | self.I = kwargs.get('I') or kwargs.get('MOA') # second moment of area
63 |
64 | self.supports = kwargs.get('supports')
65 | # self.reactions
66 | # variables initialization for beam:
67 | self.x, self.V_x, self.M_x = sp.symbols('x V_x M_x')
68 |
69 | # intitial fx,fy,moment equations
70 | self.fx = 0 # sp.symbols('fx') #total sum of horizontal force
71 | self.fy = 0 # sp.symbols('fy') #total sum of vertical force
72 | # sp.symbols('m') #total sum of moments about any point on beam
73 | self.m = 0
74 | # total sum of moments about hinge (of one side of beam only)
75 | self.m_hinge = 0
76 |
77 | # initialize variable to store solved reactions, and macaulay's moment and shear function
78 | # initialize variable to store all support reactions in that beam
79 | self.reactions_list = []
80 | self.solved_rxns = None # initialize variable to store solved values for reactions
81 | self.mom_fn = 0 # initialize variable to store bending moment values in numpy array
82 | self.shear_fn = 0 # initialize variable to store shear values in numpy array
83 |
84 | # this variables will hold numpy array of shear and moment values
85 | self.shear_values = None
86 | self.moment_values = None
87 |
88 | self.max_bm, self.posx_maxbm, self.min_bm, self.posx_minbm = 0.0, 0.0, 0.0, 0.0
89 | self.max_sf, self.posx_maxsf, self.min_sf, self.posx_minsf = 0.0, 0.0, 0.0, 0.0
90 |
91 | def add_loads(self, load_list: object):
92 | """
93 | ### Description:
94 | Adds different load values and Reaction variables to generate symbolic expression of all loads
95 | This will add respective component of different netload values.
96 | `self.fx: x-components` and
97 | `self.fy: y-components`
98 |
99 | #### Arguments
100 | `load_list` = List or Tuples of various load objects like `PointLoad, UDL, Reaction`
101 |
102 | """
103 | for loadtype in load_list:
104 | if isinstance(loadtype, PointLoad):
105 | self.fx += loadtype.load_x
106 | self.fy += loadtype.load_y
107 |
108 | elif isinstance(loadtype, Reaction):
109 | if hasattr(loadtype, 'rx_var'):
110 | self.fx += loadtype.rx_var
111 | self.fy += loadtype.ry_var
112 | else:
113 | self.fy += loadtype.ry_var
114 |
115 | elif isinstance(loadtype, UDL):
116 | self.fy += loadtype.netload # adds net load value of udl object
117 |
118 | elif isinstance(loadtype, UVL):
119 | self.fy += loadtype.netload
120 |
121 | def add_moments(self, momgen_list: object, about: float = 0):
122 | """
123 | ### Description
124 | Receives a list or tuple of `PointLoad`, `Reaction`, `UDL` or `PointMoment` objects.
125 | Adds the moment due to those objects about origin.
126 |
127 | #### Sign Convention:
128 | Anticlockwise moment are positively added. So, positive forces will give anticlockwise moments.
129 |
130 | #### Arguments and terms:
131 | - `momgen_list` = List or Tuples of various moment generators like `PointLoad, UDL, Reaction, PointMoment`
132 | - `about = 0`= Take moment about that x-coordinate in beam. `Default = 0, range = (0, self.length)`
133 | - `mom_gen(local variable)` = One which is capable of generating moment.
134 | """
135 | for mom_gen in momgen_list: # takes moment about origin and adds up
136 | if isinstance(mom_gen, PointLoad):
137 | self.m += (mom_gen.pos-about)*mom_gen.load_y
138 | elif isinstance(mom_gen, UDL):
139 | self.m += (mom_gen.pos-about)*mom_gen.netload
140 | elif isinstance(mom_gen, UVL):
141 | self.m += (mom_gen.pos-about)*mom_gen.netload
142 | elif isinstance(mom_gen, Reaction):
143 | self.m += (mom_gen.pos-about)*mom_gen.ry_var
144 | if hasattr(mom_gen, 'mom_var'):
145 | self.m += mom_gen.mom_var
146 | elif isinstance(mom_gen, PointMoment):
147 | self.m += mom_gen.mom
148 |
149 | def add_hinge(self, hinge : object, mom_gens : object):
150 | """
151 | ### Description:
152 | Internal hinges are provided in beam to make structure more flexible and able to resist external moments.
153 | It allows structure to move which reduces the reactive stresses. While, it's contribution in our program is
154 | that it will provide an extra equation for the beam.
155 |
156 | This function will modify `self.m_hinge` property of beam.
157 | Calling this funciton will calculate and add all moments hinge of all the loads to specified side (represented in `hinge.side`)
158 |
159 | ### Arguments:
160 | - `hinge` = object instance of `Hinge` class.
161 | - `mom_gens` = list of moment generators present on the beam.
162 | """
163 | if not isinstance(hinge, Hinge):
164 | raise ValueError(
165 | f"{hinge.__class__.__name__} object cannot be treated as Hinge object")
166 |
167 | # dictionary of loads separated to left and right of hinge
168 | separate_load = {
169 | 'l': [mgen for mgen in mom_gens if mgen.pos < hinge.pos],
170 | # 'l' = moment generators to left of hinge
171 | 'r': [mgen for mgen in mom_gens if mgen.pos > hinge.pos]
172 | # 'r' = moment generators to right of hinge
173 | }
174 |
175 | # now take loads according to side specified in hinge class
176 | for side_mom_gen in separate_load[hinge.side[0]]:
177 | if isinstance(side_mom_gen, PointLoad):
178 | self.m_hinge += (side_mom_gen.pos -
179 | hinge.pos)*side_mom_gen.load_y
180 | elif isinstance(side_mom_gen, Reaction):
181 | self.m_hinge += (side_mom_gen.pos -
182 | hinge.pos)*side_mom_gen.ry_var
183 | if hasattr(side_mom_gen, 'mom_var'):
184 | self.m_hinge += side_mom_gen.mom_var
185 | elif isinstance(side_mom_gen, PointMoment):
186 | self.m_hinge += side_mom_gen.mom
187 | elif isinstance(side_mom_gen, UDL):
188 | if side_mom_gen.end > hinge.pos & side_mom_gen.start < hinge.pos:
189 | # cut and take left portion of udl
190 | if hinge.side[0] == 'l':
191 | cut_udl = UDL(
192 | side_mom_gen.start, side_mom_gen.loadpm, hinge.pos-side_mom_gen.end)
193 | else:
194 | cut_udl = UDL(hinge.pos, side_mom_gen.loadpm,
195 | side_mom_gen.end-hinge.pos)
196 |
197 | self.m_hinge += cut_udl.netload * \
198 | (cut_udl.pos-hinge.pos)
199 | else:
200 | self.m_hinge += side_mom_gen.netload * \
201 | (side_mom_gen.pos-hinge.pos)
202 |
203 | elif isinstance(side_mom_gen, UVL):
204 | # to find the exact load/m value at position where hinge is:
205 | if side_mom_gen.start < hinge.pos & side_mom_gen.end > hinge.pos:
206 | w_x = abs(side_mom_gen.startload +
207 | side_mom_gen.gradient*(hinge.pos-side_mom_gen.start))
208 | if hinge.side[0] == 'l':
209 | cut_uvl = UVL(side_mom_gen.start, abs(
210 | side_mom_gen.startload), hinge.pos-side_mom_gen.start, w_x)
211 | else:
212 | cut_uvl = UVL(hinge.pos, w_x, side_mom_gen.end -
213 | hinge.pos, abs(side_mom_gen.endload))
214 |
215 | self.m_hinge += cut_uvl.netload * (cut_uvl.pos-hinge.pos)
216 | else:
217 | self.m_hinge += side_mom_gen.netload * \
218 | (side_mom_gen.pos-hinge.pos)
219 |
220 | elif isinstance(side_mom_gen, Reaction):
221 | self.m_hinge += (side_mom_gen.pos -
222 | hinge.pos)*side_mom_gen.ry_var
223 | if hasattr(side_mom_gen, 'mom_var'):
224 | self.m_hinge += side_mom_gen.mom_var
225 |
226 | def calculate_reactions(self, reaction_list: object):
227 | """
228 | ### Description
229 | 1. Generates 3 equations of static equilibrium: `self.fx=0 , self.fy=0, self.m=0`.
230 | 2. Uses `sympy.solve` to solve for symbolic variables `'rx_var', 'ry_var', 'mom_var'` in those equations.
231 | 3. Assign those values for unknown value of reactions object: `rx_val, ry_val, mom_val`.
232 |
233 | #### Arguments
234 | List or tuple of unknown reaction objects
235 | """
236 | Fx_eq = sp.Eq(self.fx, 0)
237 | Fy_eq = sp.Eq(self.fy, 0)
238 | M_eq = sp.Eq(self.m, 0)
239 | M_hinge = sp.Eq(self.m_hinge, 0)
240 | self.reactions_list = reaction_list
241 |
242 | eval_values = [] # initialize an empty list to contain reactions variables to be solved
243 | possible_rxn = ['rx_var', 'ry_var', 'mom_var']
244 | possible_values = ['rx_val', 'ry_val', 'mom_val']
245 | for rxn_obj in reaction_list:
246 | for rxn_var in possible_rxn:
247 | if hasattr(rxn_obj, rxn_var):
248 | eval_values.append(getattr(rxn_obj, rxn_var))
249 | print(eval_values)
250 | print([Fx_eq, Fy_eq, M_eq, M_hinge])
251 | self.solved_rxns = sp.solve([Fx_eq, Fy_eq, M_eq, M_hinge], eval_values)
252 | print(self.solved_rxns)
253 | # now assign values to the reaction objects too:
254 | for rxn_obj in reaction_list:
255 | for (rxn_val, rxn_var) in zip(possible_values, possible_rxn):
256 | if hasattr(rxn_obj, rxn_var):
257 | setattr(rxn_obj, rxn_val,
258 | float(self.solved_rxns[getattr(rxn_obj, rxn_var)]))
259 |
260 | def generate_shear_equation(self, loads):
261 | """
262 | ### Description
263 | 1. Generates Macaulay's Equation for Shear Force due to various force generators
264 | 2. Assigns symbolic expression of ShearForce to `self.shear_fn` attribute
265 | 3. Reassigns lambdified expression of ShearForce to `self.shear_fn`
266 | 4. Reassigns `numpy.vectorize()` expression to `self.shear_fn`
267 |
268 | #### Arguments
269 | List or Tuple of various force generating objects:`PointLoad`, `Reaction`, `UDL`
270 | """
271 | for force_gen in loads:
272 | if isinstance(force_gen, PointLoad):
273 | self.shear_fn += force_gen.load_y * \
274 | sp.SingularityFunction('x', force_gen.pos, 0)
275 | elif isinstance(force_gen, Reaction):
276 | self.shear_fn += force_gen.ry_val * \
277 | sp.SingularityFunction('x', force_gen.pos, 0)
278 | elif isinstance(force_gen, UDL):
279 | self.shear_fn += force_gen.loadpm * \
280 | sp.SingularityFunction('x', force_gen.start, 1)
281 | if force_gen.end < self.length: # add udl in opposite direction
282 | self.shear_fn -= force_gen.loadpm * \
283 | sp.SingularityFunction('x', force_gen.end, 1)
284 |
285 | elif isinstance(force_gen, UVL):
286 | self.shear_fn += (force_gen.startload * sp.SingularityFunction('x', force_gen.start,
287 | 1) + force_gen.gradient*sp.SingularityFunction('x', force_gen.start, 2)/2)
288 | if force_gen.end < self.length: # add uvl in opposite direction
289 | self.shear_fn -= (force_gen.endload * sp.SingularityFunction('x', force_gen.end,
290 | 1) + force_gen.gradient*sp.SingularityFunction('x', force_gen.end, 2)/2)
291 |
292 | def generate_moment_equation(self, loads: object):
293 | """
294 | ### Description
295 | 1. Generates Macaulay's Equation for Moment due to various moment generators
296 | 2. Assigns symbolic expression of BM to `self.mom_fn` attribute
297 | 3. Reassigns lambdified expression of BM to `self.mom_fn`
298 | 4. Reassigns `numpy.vectorize()` expression to `self.mom_fn`
299 |
300 | #### Arguments
301 | List or Tuple of various moment generating objects:`PointLoad`, `Reaction`, `UDL` or `PointMoment`
302 | """
303 | for mom_gen in loads:
304 | if isinstance(mom_gen, PointLoad):
305 | self.mom_fn += mom_gen.load_y * \
306 | sp.SingularityFunction('x', mom_gen.pos, 1)
307 | elif isinstance(mom_gen, Reaction):
308 | self.mom_fn += mom_gen.ry_val * \
309 | sp.SingularityFunction('x', mom_gen.pos, 1)
310 | if hasattr(mom_gen, 'mom_val'):
311 | self.mom_fn -= mom_gen.mom_val * \
312 | sp.SingularityFunction('x', mom_gen.pos, 0)
313 | elif isinstance(mom_gen, PointMoment):
314 | self.mom_fn -= mom_gen.mom * \
315 | sp.SingularityFunction('x', mom_gen.pos, 0)
316 | # because we have defined anticlockwise moment positive in PointMoment
317 | elif isinstance(mom_gen, UDL):
318 | self.mom_fn += mom_gen.loadpm * \
319 | sp.SingularityFunction('x', mom_gen.start, 2)/2
320 | if mom_gen.end < self.length:
321 | self.mom_fn -= mom_gen.loadpm * \
322 | sp.SingularityFunction('x', mom_gen.end, 2)/2
323 |
324 | elif isinstance(mom_gen, UVL):
325 | self.mom_fn += mom_gen.startload * sp.SingularityFunction(
326 | 'x', mom_gen.start, 2)/2 + mom_gen.gradient * sp.SingularityFunction('x', mom_gen.start, 3)/6
327 | if mom_gen.end < self.length: # add uvl in opposite direction
328 | self.mom_fn -= (mom_gen.endload * sp.SingularityFunction('x', mom_gen.end, 2) /
329 | 2 + mom_gen.gradient * sp.SingularityFunction('x', mom_gen.end, 3)/6)
330 |
331 | def generate_shear_values(self, loads: object):
332 | """
333 | ### Description
334 | 1. Generates Shear Force values due to various force generators along several x positions on beam.
335 | 2. Returns numpy 1d array of those shear values
336 |
337 | #### Arguments
338 | - `loads` = List or Tuple of various force generating objects:`PointLoad`, `Reaction`, `UDL`
339 | """
340 |
341 | self.shear_values = np.zeros_like(self.xbeam)
342 | macaulay = np.vectorize(SingularityFunction, otypes=[float])
343 |
344 | for force_gen in loads:
345 | if isinstance(force_gen, PointLoad):
346 | self.shear_values += force_gen.load_y * \
347 | macaulay(self.xbeam, force_gen.pos, 0)
348 | elif isinstance(force_gen, Reaction):
349 | self.shear_values += force_gen.ry_val * \
350 | macaulay(self.xbeam, force_gen.pos, 0)
351 | elif isinstance(force_gen, UDL):
352 | self.shear_values += force_gen.loadpm * \
353 | macaulay(self.xbeam, force_gen.start, 1)
354 | if force_gen.end < self.length: # add udl in opposite direction
355 | self.shear_values -= force_gen.loadpm * \
356 | macaulay(self.xbeam, force_gen.end, 1)
357 |
358 | elif isinstance(force_gen, UVL):
359 | self.shear_values += (force_gen.startload * macaulay(self.xbeam, force_gen.start,
360 | 1) + force_gen.gradient*macaulay(self.xbeam, force_gen.start, 2)/2)
361 | if force_gen.end < self.length: # add uvl in opposite direction
362 | self.shear_values -= (force_gen.endload * macaulay(self.xbeam, force_gen.end,
363 | 1) + force_gen.gradient*macaulay(self.xbeam, force_gen.end, 2)/2)
364 |
365 | return self.shear_values
366 |
367 | def generate_moment_values(self, loads: object):
368 | """
369 | ### Description
370 | 1. Generates Bending Moment Values due to various moment generators along several x positions on beam.
371 | 2. Returns numpy 1d array of bending moment values
372 |
373 | #### Arguments
374 | - `loads` = List or Tuple of various moment generating objects:`PointLoad`, `Reaction`, `UDL` or `PointMoment`
375 | """
376 | self.moment_values = np.zeros_like(self.xbeam)
377 | macaulay = np.vectorize(SingularityFunction, otypes=[float])
378 |
379 | for mom_gen in loads:
380 | if isinstance(mom_gen, PointLoad):
381 | self.moment_values += mom_gen.load_y * \
382 | macaulay(self.xbeam, mom_gen.pos, 1)
383 | elif isinstance(mom_gen, Reaction):
384 | self.moment_values += mom_gen.ry_val * \
385 | macaulay(self.xbeam, mom_gen.pos, 1)
386 | if hasattr(mom_gen, 'mom_val'):
387 | self.moment_values -= mom_gen.mom_val * \
388 | macaulay(self.xbeam, mom_gen.pos, 0)
389 | elif isinstance(mom_gen, PointMoment):
390 | self.moment_values -= mom_gen.mom * \
391 | macaulay(self.xbeam, mom_gen.pos, 0)
392 | # because we have defined anticlockwise moment positive in PointMoment
393 | elif isinstance(mom_gen, UDL):
394 | self.moment_values += mom_gen.loadpm * \
395 | macaulay(self.xbeam, mom_gen.start, 2)/2
396 | if mom_gen.end < self.length:
397 | self.moment_values -= mom_gen.loadpm * \
398 | macaulay(self.xbeam, mom_gen.end, 2)/2
399 |
400 | elif isinstance(mom_gen, UVL):
401 | self.moment_values += mom_gen.startload * \
402 | macaulay(self.xbeam, mom_gen.start, 2)/2 + \
403 | mom_gen.gradient * macaulay(self.xbeam, mom_gen.start, 3)/6
404 | if mom_gen.end < self.length: # add uvl in opposite direction
405 | self.moment_values -= (mom_gen.endload * macaulay(self.xbeam, mom_gen.end, 2) /
406 | 2 + mom_gen.gradient * macaulay(self.xbeam, mom_gen.end, 3)/6)
407 |
408 | return self.moment_values
409 |
410 | def generate_significant_values(self):
411 | """
412 | # Description
413 | Generates significant values of shear force diagram like minimum and maximum bending moment, shear force etc.
414 | """
415 | self.max_bm, self.posx_maxbm, self.min_bm, self.posx_minbm = np.max(self.moment_values), self.xbeam[np.argmax(
416 | self.moment_values)], np.min(self.moment_values), self.xbeam[np.argmin(self.moment_values)]
417 | self.max_sf, self.posx_maxsf, self.min_sf, self.posx_minsf = np.max(self.shear_values), self.xbeam[np.argmax(
418 | self.shear_values)], np.min(self.shear_values), self.xbeam[np.argmin(self.shear_values)]
419 |
420 | def fast_solve(self, loads_list: object, n: int = 1000):
421 | """
422 | ### Description
423 | This function will:
424 | 1. solve for the unknown reactions
425 | 2. generate shear function (can be accessed by `shear_fn`)
426 | 3. generate moment function (can be accessed by `mom_fn`)
427 | 4. generate shear force values (can be accessed by `shear_values`)
428 | 5. generate bending moment values (can be accessed by `moment_values`)
429 |
430 | #### Arguments
431 | - `loads_list` = List (or tuple) of every possible beam objects like Reactions, Loads, Moments, Internal Hinge
432 | - `n:int = 1000` = Number of shear and moment values to create
433 | """
434 | hin = None
435 | rxns = [rxn for rxn in loads_list if isinstance(rxn, Reaction)]
436 | for obj in loads_list:
437 | if isinstance(obj, Hinge):
438 | hin = obj
439 |
440 | self.add_loads(load_list=loads_list)
441 | self.add_moments(loads_list)
442 | if hin:
443 | self.add_hinge(hin, loads_list)
444 | self.calculate_reactions(rxns)
445 | self.generate_shear_equation(loads_list)
446 | self.generate_shear_values(loads_list)
447 | self.generate_moment_equation(loads_list)
448 | self.generate_moment_values(loads_list)
449 |
450 | def generate_graph(self, which: str = 'both', save_fig: bool = False, filename: str = None, extension: str = 'png', res: str = 'low', show_graph: bool = True, **kwargs):
451 | """
452 | To generate bending moment diagram for beam with all reactions solved
453 | # Arguments:
454 | - `which:str ='both'` = To specify which graph to show. Default value = `'both'`
455 | - Accepted values `('bmd', 'sfd', 'both')`
456 | - `save_fig:bool` = To specify whether or not to save the generated image locally
457 | - `filename:str` = Name of file or file path to specify the location to save the generated image
458 | - `extension: str = 'png' ` = File extension to save the generate image. Supported extensions are ` ('png', 'pdf', 'eps', 'svg')`. By default `png`.
459 | - `details: bool` = To specify whether or not to show salient features in graph like contraflexure, inflexion
460 | - `res: str = 'low'` = Resolution of graph to be shown or saved.
461 | - `show_graph: bool = True` Whether or not to show the generate graph.
462 | - Note: Don't use res(values other than low) and `show_graph=True` together. It will create render error.
463 | """
464 | # Rc parameters:
465 | plt.rc('font', family='serif', size=12)
466 | plt.rc('axes', autolimit_mode='round_numbers')
467 |
468 | diagrams = ('bmd', 'sfd', 'both')
469 | if which.lower() in diagrams:
470 | pass
471 | else:
472 | raise ValueError(f"Unexpected graph type {which}")
473 |
474 | resolution = {'high': 500, 'medium': 250, 'low': 100,
475 | 'h': 500, 'm': 250, 'l': 100} # list of possible resolutions
476 | if res.lower() in resolution.keys():
477 | DPI = resolution[res]
478 | else:
479 | raise ValueError(
480 | f"Unexpected resolution type {res}\n Use 'high' or 'medium' or 'low'")
481 |
482 | formats = ('png', 'pdf', 'eps', 'svg')
483 | if extension.lower() in formats:
484 | pass
485 | else:
486 | raise ValueError(
487 | f"Unknown image extension {extension}\n Supported extensions are: {formats}")
488 |
489 | # (y,x) in matplotib graph for maximum bending moment
490 |
491 | if which == 'bmd':
492 | fig, ax = plt.subplots(
493 | facecolor='w', edgecolor='w', num="Bending Moment Diagram", dpi=DPI)
494 | ax.plot(self.xbeam, self.moment_values,
495 | color='orange', label="BMD")
496 | ax.set_xticks(range(0, self.length+1, 1))
497 | ax.set_xlim(-0.5, self.length+0.5)
498 | ax.axhline(y=0, linewidth=3, color='k', label='Beam')
499 | ax.set_title("Bending Moment Diagram")
500 | ax.set_xlabel("x (m)")
501 | ax.set_ylabel("Bending Moment (kNm)")
502 | ax.legend(fontsize=8)
503 | ax.grid(linewidth=1, color='gainsboro')
504 |
505 | if kwargs.get('details') == True:
506 | self.generate_significant_values()
507 |
508 | if round(self.max_bm, 0) != 0:
509 | ax.plot(self.posx_maxbm, self.max_bm,
510 | c='0.5', marker='o', ms=5)
511 | ax.text(self.posx_maxbm, self.max_bm+50*self.max_bm/1000, s=r"$M_{max}$ = "+str(
512 | round(self.max_bm, 1)), fontsize='x-small', fontweight='light')
513 |
514 | # plotting 0 as min bending moment will interfere with beam line
515 | if round(self.min_bm, 0) != 0:
516 | ax.plot(self.posx_minbm, self.min_bm,
517 | c='0.5', marker='o', ms=5)
518 | ax.text(self.posx_minbm+10*self.dxbeam, self.min_bm-50*self.max_bm/1000,
519 | s=r"$M_{min}$ = "+str(round(self.min_bm, 1)), fontsize='x-small', fontweight='light')
520 |
521 | if which == 'sfd':
522 | fig, ax = plt.subplots(
523 | facecolor='w', edgecolor='w', num="Shear Force Diagram", dpi=DPI)
524 | ax.plot(self.xbeam, self.shear_values, color='orange', label="SFD")
525 | ax.set_xticks(range(0, self.length+1, 1))
526 | ax.set_xlim(-0.5, self.length+0.5)
527 | ax.axhline(y=0, linewidth=3, color='k', label='Beam')
528 | ax.set_title("Shear Force Diagram")
529 | ax.set_xlabel("x (m)")
530 | ax.set_ylabel("Shear Force (kN)")
531 | ax.legend(fontsize=8)
532 | ax.grid(linewidth=1, color='gainsboro')
533 |
534 | if kwargs.get('details') == True:
535 | self.generate_significant_values()
536 | if round(self.max_sf, 0) != 0:
537 | ax.plot(self.posx_maxsf, self.max_sf,
538 | c='0.5', marker='o', ms=5)
539 | ax.text(self.posx_maxsf+10*self.dxbeam, self.max_sf+50*self.max_sf/1000,
540 | s=r"$V_{max}$ = "+str(round(self.max_sf, 1)), fontsize='x-small', fontweight='light')
541 | if round(self.min_sf, 0) != 0:
542 | ax.plot(self.posx_minsf, self.min_sf,
543 | c='0.5', marker='o', ms=5)
544 | ax.text(self.posx_minsf+10*self.dxbeam, self.min_sf-50*self.max_sf/1000,
545 | s=r"$V_{min}$ = "+str(round(self.min_sf, 1)), fontsize='x-small', fontweight='light')
546 |
547 | if which == 'both':
548 | fig, axs = plt.subplots(nrows=2, ncols=1, figsize=(
549 | 10, 10), edgecolor='w', facecolor='w', sharex=True, num="SFD vs BMD", dpi=DPI)
550 | axs[0].plot(self.xbeam, self.shear_values, color='orange')
551 | axs[0].set_title("SFD")
552 | axs[0].set_ylabel("Shear Force (kN)")
553 | axs[1].plot(self.xbeam, self.moment_values, color='green')
554 | axs[1].set_xticks(range(0, self.length+1, 1))
555 | axs[1].set_title("BMD")
556 | axs[1].set_xlabel("x (m)")
557 | axs[1].set_ylabel("Bending Moment (kNm)")
558 | fig.suptitle("Comparison of BMD and SFD")
559 | for ax in axs:
560 | ax.set_xlim(-0.5, self.length+0.5)
561 | ax.axhline(y=0, linewidth=3, color='k')
562 | ax.grid(linewidth=1, color='gainsboro')
563 |
564 | if kwargs.get('details') == True:
565 | self.generate_significant_values()
566 | if round(self.max_bm, 0) != 0:
567 | axs[1].plot(self.posx_maxbm, self.max_bm,
568 | c='0.5', marker='o', ms=5)
569 | axs[1].text(self.posx_maxbm, self.max_bm+50*self.max_bm/1000, s=r"$M_{max}$ = "+str(
570 | round(self.max_bm, 1)), fontsize='x-small', fontweight='light')
571 | if round(self.min_bm, 0) != 0:
572 | axs[1].plot(self.posx_minbm, self.min_bm,
573 | c='0.5', marker='o', ms=5)
574 | axs[1].text(self.posx_minbm+10*self.dxbeam, self.min_bm-50*self.max_bm/1000,
575 | s=r"$M_{min}$ = "+str(round(self.min_bm, 1)), fontsize='x-small', fontweight='light')
576 |
577 | if round(self.max_sf, 0) != 0:
578 | axs[0].plot(self.posx_maxsf, self.max_sf,
579 | c='0.5', marker='o', ms=5)
580 | axs[0].text(self.posx_maxsf+10*self.dxbeam, self.max_sf+50*self.max_sf/1000,
581 | s=r"$V_{max}$ = "+str(round(self.max_sf, 1)), fontsize='x-small', fontweight='light')
582 | if round(self.min_sf, 0) != 0:
583 | axs[0].plot(self.posx_minsf, self.min_sf,
584 | c='0.5', marker='o', ms=5)
585 | axs[0].text(self.posx_minsf+10*self.dxbeam, self.min_sf-50*self.max_sf/1000,
586 | s=r"$V_{min}$ = "+str(round(self.min_sf, 1)), fontsize='x-small', fontweight='light')
587 |
588 | if save_fig:
589 | main_file_name = __main__.__file__.split('/')[-1]
590 | if filename == None:
591 | store_dir = __main__.__file__.replace(
592 | main_file_name, 'images/')
593 | print(store_dir)
594 | try:
595 | # try to create images/ directory in same directory level
596 | os.mkdir(store_dir)
597 | except FileExistsError:
598 | # now append full file name
599 | filename = f"{store_dir}{__main__.__file__.split('/')[-1][:-3]}.png"
600 | plt.savefig(filename)
601 | else:
602 | filename = f"{store_dir}/{__main__.__file__.split('/')[-1][:-3]}.png"
603 | plt.savefig(filename)
604 | else:
605 | if filename[-3:] in formats and '.' == filename[-4]:
606 | save_path = __main__.__file__.replace(
607 | main_file_name, filename)
608 | else:
609 | save_path = __main__.__file__.replace(
610 | main_file_name, f'{filename}.{extension}')
611 | plt.savefig(save_path, dpi=DPI)
612 |
613 | if show_graph:
614 | plt.show()
615 |
616 | def save_data(self, fname: str, fformat: str = 'txt'):
617 | """
618 | ### Description
619 | Saves numerical values of Shear Forces and Moment Values in text file
620 | The number of data are created as specified in ndivs in beam class construct
621 |
622 | ###
623 | - `fname:str` = Path / File name to save the data to
624 | - `fformat:str = 'txt'` = File extension. Default is '.txt'. Supported = `('npy', 'txt', 'gz')`
625 | """
626 | fformat = fformat.lower()
627 | formats = ('npy', 'txt', 'gz')
628 | if fformat in formats:
629 | pass
630 | else:
631 | raise ValueError(
632 | f"Unknown file format {fformat}\n Supported formats are: {formats}")
633 |
634 | main_file_name = __main__.__file__.split('/')[-1]
635 | save_path = __main__.__file__.replace(main_file_name, fname)
636 |
637 | x = self.xbeam[self.xbeam >= 0]
638 | shear_values = self.shear_values[self.beam_0::]
639 | moment_values = self.moment_values[self.beam_0::]
640 | data_array = np.array((x, shear_values, moment_values)).T
641 | self.generate_significant_values()
642 |
643 | support_details = '''Support Conditions:\n'''
644 | # adding support details for beam
645 | for rxn in self.reactions_list:
646 | if isinstance(rxn, Reaction):
647 | support_details += f"\t\t\t{rxn.pos_sym}-> {rxn.type}\t Position: {rxn.pos}m\n"
648 | else:
649 | raise ValueError(f"{rxn} cannot be treated as Reaction object")
650 |
651 | reaction_details = '''Reaction Values:\n'''
652 | # adding reaction values details
653 | for (reaction, val) in self.solved_rxns.items():
654 | reaction_details += f"\t\t\t{reaction} = {val}\n"
655 |
656 | details = f'''
657 | Beam Description:
658 | ===================\n
659 | Beam Length: {self.length}m
660 |
661 | {support_details}
662 | {reaction_details}
663 |
664 | Significant values:
665 | ===================\n
666 | Shear Force(kN):
667 | \t Maximum: {self.max_sf}\t\tPosition: {self.posx_maxsf}m
668 | \t Minimum: {self.min_sf}\t\tPosition: {self.posx_minsf}m
669 | Bending Moment(kNm):
670 | \t Maximum: {self.max_bm}\t\tPosition: {self.posx_maxbm}m
671 | \t Minimum: {self.min_bm}\t\tPosition: {self.posx_minbm}m
672 | \n
673 | =======================================================================================
674 |
675 | x\t\t\t Shear Force\t\t\t Bending Moment
676 | '''
677 | np.savetxt(save_path+'.'+fformat, data_array,
678 | delimiter="\t", header=details)
679 |
680 |
681 | class Load:
682 | '''
683 | Load class
684 |
685 | ### Attributes:
686 | `pos(float)`: `unit:meter` position of that netload with respect to beam coordinates's origin
687 | `load(float)`: `unit:kN` net load of that load type(for point load that is point load value,
688 | but it will be different
689 | for other loads like uvl and udl)
690 | `inverted(bool)=False`: Default direction of positive net load is in positive direction of y-axes
691 | - by default: `inverted = False` (load is facing upward)
692 | - use `inverted=True` to indicate load is in downward direction
693 |
694 | '''
695 |
696 | def __init__(self, pos: float, load: float, inverted=False, **kwargs):
697 | self.pos = pos
698 | self.inverted = inverted
699 | if self.inverted:
700 | self.load = -1*load
701 | else:
702 | self.load = load
703 |
704 |
705 | class PointLoad(Load):
706 | """
707 | ## Description
708 | Subclass of Class Load
709 |
710 | ### Attributes:
711 | `pos, load, inverted`: inherit from super class `Load`
712 | `inclination(float)=90`: `unit=degree` represents angle made by direction of net load with positive direction of beam's x axis
713 | inclination will be positive for counter clockwise direction
714 | put negative inclination if you want to take angle in clockwise direction
715 | `load_x`: component of net load value in positive direciton of beam's x-axis
716 | `load_y`: component of net load value in positive y-direciton(upward direction)
717 | """
718 |
719 | def __init__(self, pos: float, load: float, inverted: bool = False, inclination=90, **kwargs):
720 | super().__init__(pos, load, inverted, **kwargs)
721 | # self.var = sp.symbols(var) #might require variable for load too.
722 | # inclination of point load with positive direction of beam axis
723 | self.inclination = inclination
724 | self.load_x = round(
725 | self.load*np.cos(self.inclination*np.pi/180), ndigits=4)
726 | self.load_y = round(
727 | self.load*np.sin(self.inclination*np.pi/180), ndigits=4)
728 |
729 |
730 | class UDL:
731 | """
732 | ## Description
733 | UDL is type of load that is combinaiton of infinite points load over certain length acting transverse to beam
734 |
735 | ### Attributes:
736 | `start(float)`:Start position of UDL
737 | `loadpm(float)`: Load Per meter of udl
738 | `span(float)`: Total length of udl
739 | `inverted(bool) = True`: UDL facing downwards on beam,
740 | use `inverted=False` for upside udl
741 | `self.netload(float)`: total effective load of udl
742 | `self.pos(float)`: position of effective load from beam origin
743 | """
744 |
745 | def __init__(self, start: float, loadpm: float, span: float, inverted: bool = True, **kwargs):
746 | self.start = start # x coordinate of left edge of udl
747 | self.span = span # total length of udl
748 | self.end = start + span
749 | self.inverted = inverted
750 | if self.inverted:
751 | self.loadpm = -1*loadpm
752 | else:
753 | self.loadpm = loadpm
754 |
755 | self.netload = self.loadpm * self.span # netload of udl
756 | self.pos = self.start + self.span/2 # position of effective load of udl
757 |
758 |
759 | class UVL:
760 | """
761 | ## Description
762 | It is that load whose magnitude varies along the loading length with a constant rate.
763 | Uniformly varying load is further divided into two types;
764 | 1. Triangular Load
765 | 2. Trapezoidal Load
766 |
767 | ### Arguments
768 | 1. `start:float` = Start position of uvl from beam's origin along x-axis of beam coordinate system
769 | 2. `startload:float` = `unit: kN/m` = Starting load/m value of uvl
770 | 3. `span:float` = Total length of uvl object
771 | 4. `endload:float` = Ending load/m value of uvl object
772 | 5. `inverted:bool= True` : Default=`True` Inverts the uvl object
773 |
774 | ### Attributes
775 | - `self.end` = End coordinate of uvl object
776 | - `self.tload` = Net load value of upper triangular part of trapezoidal or triangular load
777 | - `self.rload` = Net load value of lower rectangular part of trapezoidal load itself
778 | - `self.netload` = Net load of whole uvl object itself. `netload = tload + rload`
779 | - `self.netpos` = Net position(coordinates) where net load of uvl acts
780 | """
781 |
782 | def __init__(self, start: float, startload: float, span: float, endload: float, inverted: bool = True, **kwargs):
783 | self.start = start
784 | self.span = span
785 | self.end = span+start
786 | self.inverted = inverted
787 |
788 | if self.inverted:
789 | self.startload = -1*startload
790 | self.endload = -1*endload
791 | else:
792 | self.startload = startload
793 | self.endload = endload
794 |
795 | # gradient of uvl:
796 | self.gradient = (self.endload-self.startload)/span
797 | if startload > endload:
798 | self.zero_load = startload / abs(self.gradient)
799 |
800 | # for upper triangular part: 1/2*b*h
801 | self.tload = self.span*abs(self.endload-self.startload)/2
802 | # for lowe rectangular part: b*h
803 | self.rload = self.span*min(abs(self.startload), abs(self.endload))
804 |
805 | self.netload = self.span*(self.startload + self.endload)/2 # net load
806 |
807 | if abs(self.endload) > abs(self.startload):
808 | self.pos = self.start + \
809 | (2*self.tload*self.span/3 + self.rload*self.span/2)/abs(self.netload)
810 | else:
811 | self.pos = self.start + \
812 | (self.tload*self.span/3 + self.rload*self.span/2)/abs(self.netload)
813 |
814 |
815 | class Reaction:
816 | """
817 | ## Description
818 | Reactions are given by supports. 3 types of supports are defined for now
819 | `hinge`, `roller` and `fixed` support.
820 |
821 | ### Arguments
822 | - `pos(float)`: position of reaction
823 | - `type(str)`: any one of `('roller'`,`'hinge'`,`'fixed')` or `('r'`,`'h'`,`'f')` Representing support condition at that point.
824 | - `pos_sym(str)`: Symbolic variable to represent support location name
825 |
826 | ### Attributes
827 | - `rx_val, ry_val, mom_val`: variables to store numerical values for reaction loads and moments
828 | - `rx_var, ry_var, mom_var`: symbolic variables to store symbolic values for reactions
829 | """
830 |
831 | def __init__(self, pos: float, type: str, pos_sym: str):
832 | self.pos = pos
833 | self.pos_sym = pos_sym
834 | # possible reaction values(initialize them as zeros):
835 | self.rx_val = 0
836 | self.ry_val = 0
837 | self.mom_val = 0
838 |
839 | self.type = type.lower()
840 | if self.type == 'roller' or self.type == 'r':
841 | self.type = 'roller'
842 | # symbolic variable for that roller support
843 | self.ry_var = sp.Symbol(f"R_{pos_sym}_y")
844 | elif self.type == 'hinge' or self.type == 'h':
845 | self.type = 'hinge'
846 | self.rx_var = sp.Symbol(f"R_{pos_sym}_x")
847 | self.ry_var = sp.Symbol(f"R_{pos_sym}_y")
848 | elif self.type == 'fixed' or self.type == 'f':
849 | self.type = 'fixed'
850 | self.rx_var = sp.Symbol(f"R_{pos_sym}_x")
851 | self.ry_var = sp.Symbol(f"R_{pos_sym}_y")
852 | self.mom_var = sp.Symbol(f"M_{pos_sym}")
853 | else:
854 | raise ValueError(f"Unidentified support type: {self.type}")
855 |
856 |
857 | class PointMoment:
858 | """
859 | ## Description
860 | Pure moment that act at point
861 |
862 | ### Attributes
863 | `pos`: location of that point moment from beam's origin
864 | `mom`: value of that point moment
865 | `ccw`(bool)=`False` : counterclockwise direciton is positive value of moment,
866 | by defalut: ccw=False and given moment is positive
867 |
868 | """
869 |
870 | def __init__(self, pos: float, mom: float, ccw: bool = True):
871 | self.pos = pos
872 | self.ccw = ccw
873 | if self.ccw:
874 | self.mom = mom
875 | else:
876 | self.mom = -1*mom
877 |
878 |
879 | class Hinge:
880 | """
881 | ## Description
882 | (Hinge) Internal hinges are provided in a structure to reduce statical indeterminacy of the structure.
883 | Bending moment at internal hinge is always zero.
884 | Internal hinge makes structure more flexible.
885 | It allows structure to move which reduces the reactive stresses.
886 |
887 | ### Attributes
888 | 1. `pos:float` = Position of that internal hinge from origin of beam coordinate system
889 | 2. `side:str = 'l'` : Accepted Values = `('r', 'right', 'l', 'left')`, Default Value = `'l'`
890 | - This side specifies which side of loads to take in order to take moment of that loads about hinge.
891 | """
892 |
893 | def __init__(self, pos: float, side: str = 'l'):
894 | self.pos = pos
895 | if side.lower() in ('r', 'right', 'l', 'left'):
896 | self.side = side.lower()
897 | else:
898 | raise ValueError(
899 | f"Unknown side attribute '{side}'\n Use 'l' for left and 'r' for right")
900 |
--------------------------------------------------------------------------------
/tests/__pycache__/beam.cpython-38.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/tests/__pycache__/beam.cpython-38.pyc
--------------------------------------------------------------------------------
/tests/generated_images/page_53_example_2-16.py.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/tests/generated_images/page_53_example_2-16.py.png
--------------------------------------------------------------------------------
/tests/generated_images/page_56_example_2-12.py.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/tests/generated_images/page_56_example_2-12.py.png
--------------------------------------------------------------------------------
/tests/generated_images/page_56_example_2-13.py.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/tests/generated_images/page_56_example_2-13.py.png
--------------------------------------------------------------------------------
/tests/generated_images/page_61_example_2-15.py.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/tests/generated_images/page_61_example_2-15.py.png
--------------------------------------------------------------------------------
/tests/generated_images/pg_28_1.py.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/tests/generated_images/pg_28_1.py.png
--------------------------------------------------------------------------------
/tests/generated_images/test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/tests/generated_images/test.png
--------------------------------------------------------------------------------
/tests/generated_images/test.py.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/tests/generated_images/test.py.png
--------------------------------------------------------------------------------
/tests/generated_images/test_cantilever.py.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/tests/generated_images/test_cantilever.py.png
--------------------------------------------------------------------------------
/tests/generated_images/test_hinge_inclined_load.py.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/tests/generated_images/test_hinge_inclined_load.py.png
--------------------------------------------------------------------------------
/tests/generated_images/testtt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ashim-Paudel/Python-Beam-Analysis/a8a00a640e15a6f4fa1ec45d7316b4d34a91d909/tests/generated_images/testtt.png
--------------------------------------------------------------------------------
/tests/page_53_example_2-16.py:
--------------------------------------------------------------------------------
1 | from beamframe import *
2 |
3 | b = Beam(14)
4 | ra = Reaction(0, 'f', 'A')
5 | p1 = PointLoad(2,100, inverted=True, inclination=90)
6 | m1 = PointMoment(4,60, ccw=False)
7 | h = Hinge(6, side='r')
8 | udl = UDL(6,20,8)
9 | re = Reaction(10, 'r', 'F')
10 |
11 | elements = (udl, p1, m1,h, ra, re)
12 | b.add_loads(elements)
13 | b.add_moments(elements, about=3.5)
14 | b.calculate_reactions((ra,re))
15 | b.generate_moment_equation(elements)
16 | b.generate_shear_equation(elements)
17 |
18 |
19 | x = np.linspace(-1, b.length, 1000)
20 | plt.rc('font', family='serif', size=14)
21 | fig, ax = plt.subplots(facecolor='w', edgecolor='w', num="BMD vs SFD")
22 | ax.plot(x, b.mom_fn(x), label="BMD (kNm)")
23 | ax.plot(x, b.shear_fn(x), label="SFD (kN)")
24 | ax.set_xticks(np.arange(0, b.length+1,1))
25 | ax.axhline(y=0, color='k', label='beam')
26 | ax.set_title("BMD vs SFD of Beam\n ")
27 | ax.set_xlabel("x (m)")
28 | ax.legend(fontsize=8)
29 | ax.grid()
30 | plt.savefig(f"Simply_Supported_Beam/generated_images/{__file__.split('/')[-1]}.png", dpi=500)
31 | plt.show()
--------------------------------------------------------------------------------
/tests/page_56_example_2-12.py:
--------------------------------------------------------------------------------
1 | from beamframe import *
2 |
3 | b = Beam(12)
4 | udl = UDL(4,6,4)
5 | p1 = PointLoad(2,80, inverted=True, inclination=30)
6 | p2 = PointLoad(b.length, 50, inverted=True)
7 | m1 = PointMoment(2,20, ccw=False)
8 | m2 = PointMoment(10, 20, ccw=False)
9 | ra = Reaction(0, 'h', 'A')
10 | rd = Reaction(8, 'r', 'D')
11 |
12 | elements = (udl, p1, m1,m2, p2, ra, rd)
13 | b.add_loads(elements)
14 | b.add_moments(elements)
15 | b.calculate_reactions((ra,rd))
16 | b.generate_moment_equation(elements)
17 | b.generate_shear_equation(elements)
18 |
19 | x = np.linspace(-1, b.length, 500)
20 | plt.rc('font', family='serif', size=14)
21 | fig, ax = plt.subplots(facecolor='w', edgecolor='w', num="BMD vs SFD")
22 | ax.plot(x, b.mom_fn(x), label="BMD (kNm)")
23 | ax.plot(x, b.shear_fn(x), label="SFD (kN)")
24 | ax.set_xticks(np.arange(0, b.length+1,1))
25 | ax.axhline(y=0, color='k', label='beam')
26 | ax.set_title("BMD vs SFD of Beam")
27 | ax.set_xlabel("x (m)")
28 | ax.legend(fontsize=8)
29 | ax.grid()
30 | #plt.savefig(f"Simply_Supported_Beam/generated_images/{__file__.split('/')[-1]}.png")
31 | plt.show()
--------------------------------------------------------------------------------
/tests/page_56_example_2-13.py:
--------------------------------------------------------------------------------
1 | from beamframe import *
2 |
3 | b = Beam(12)
4 | udl = UDL(4,6,4)
5 | p1 = PointLoad(2,40, inverted=True, inclination=30)
6 | p2 = PointLoad(b.length, 50, inverted=True)
7 | m1 = PointMoment(2,20)
8 | m2 = PointMoment(10, 20, ccw=False)
9 | ra = Reaction(0, 'h', 'A')
10 | rd = Reaction(8, 'r', 'D')
11 |
12 | elements = (udl, p1, m1,m2, p2, ra, rd)
13 | b.add_loads(elements)
14 | b.add_moments(elements)
15 | b.calculate_reactions((ra,rd))
16 | b.generate_moment_equation(elements)
17 | b.generate_shear_equation(elements)
18 |
19 | x = np.linspace(-1, b.length, 1000)
20 | plt.rc('font', family='serif', size=14)
21 | fig, ax = plt.subplots(facecolor='w', edgecolor='w', num="BMD vs SFD")
22 | ax.plot(x, b.mom_fn(x), label="BMD (kNm)")
23 | ax.plot(x, b.shear_fn(x), label="SFD (kN)")
24 | ax.set_xticks(np.arange(0, b.length+1,1))
25 | ax.axhline(y=0, color='k', label='beam')
26 | ax.set_title("BMD vs SFD of Beam")
27 | ax.set_xlabel("x (m)")
28 | ax.legend(fontsize=8)
29 | ax.grid()
30 | plt.savefig(f"Simply_Supported_Beam/generated_images/{__file__.split('/')[-1]}.png")
31 | plt.show()
--------------------------------------------------------------------------------
/tests/page_61_example_2-15.py:
--------------------------------------------------------------------------------
1 | from beamframe import *
2 |
3 | b = Beam(10)
4 | ra = Reaction(0, 'h', 'A')
5 | p1 = PointLoad(1,100, inverted=True, inclination=40)
6 | m1 = PointMoment(2.5,20, ccw=False)
7 | rd = Reaction(3.5, 'r', 'D')
8 | h = Hinge(5, side='r')
9 | udl = UDL(5,10,2)
10 | rf = Reaction(7, 'r', 'F')
11 | p2 = PointLoad(b.length, 50, inverted=True)
12 |
13 | elements = (udl, p1, p2, m1,h, ra, rd, rf)
14 | b.add_loads((udl, p1, p2, ra, rd, rf))
15 | b.add_moments((udl, p1, p2, m1, h, ra, rd, rf), about=3.5)
16 | b.calculate_reactions((ra,rd, rf))
17 | b.generate_moment_equation((udl, p1, p2, m1, ra, rd, rf))
18 | b.generate_shear_equation((udl, p1, p2, m1, ra, rd, rf))
19 |
20 |
21 | x = np.linspace(-1, b.length, 1000)
22 | plt.rc('font', family='serif', size=14)
23 | fig, ax = plt.subplots(facecolor='w', edgecolor='w', num="BMD vs SFD")
24 | ax.plot(x, b.mom_fn(x), label="BMD (kNm)")
25 | ax.plot(x, b.shear_fn(x), label="SFD (kN)")
26 | ax.set_xticks(np.arange(0, b.length+1,1))
27 | ax.axhline(y=0, color='k', label='beam')
28 | ax.set_title("BMD vs SFD of Beam")
29 | ax.set_xlabel("x (m)")
30 | ax.legend(fontsize=8)
31 | ax.grid()
32 | plt.savefig(f"C:/Users/paude/Beam-Analysis/tests/{__file__.split('/')[-1]}.png")
33 | plt.show()
--------------------------------------------------------------------------------
/tests/page_83_examle_2-23_uvl.py:
--------------------------------------------------------------------------------
1 | from beamframe import *
2 |
3 | b = Beam(6)
4 | uvl1 = UVL(0,3,3,0, inverted=True)
5 | uvl2=UVL(3,0,6,3, inverted=False)
6 | ra = Reaction(0,'h', 'A')
7 | rb = Reaction(b.length, 'r','B')
8 |
9 | b.add_loads((uvl1,uvl2, ra,rb))
10 | b.add_moments((uvl1, ra, uvl2, rb))
11 | b.calculate_reactions((ra,rb))
12 | b.generate_shear_equation((uvl1,uvl2, ra,rb))
13 |
14 | x = np.linspace(-1, b.length, 500)
15 | plt.rc('font', family='serif', size=14)
16 | fig, ax = plt.subplots(facecolor='w', edgecolor='w', num="BMD vs SFD")
17 | #ax.plot(x, b.mom_fn(x), label="BMD (kNm)")
18 | ax.plot(x, b.shear_fn(x), label="SFD (kN)")
19 | ax.set_xticks(np.arange(0, b.length+1,1))
20 | ax.axhline(y=0, color='k', label='beam')
21 | ax.set_title("BMD vs SFD of Beam")
22 | ax.set_xlabel("x (m)")
23 | ax.legend(fontsize=8)
24 | ax.grid()
25 | #plt.savefig(f"Simply_Supported_Beam/generated_images/{__file__.split('/')[-1]}.png")
26 | plt.show()
--------------------------------------------------------------------------------
/tests/page_85_example_2-24.py:
--------------------------------------------------------------------------------
1 | from beamframe import *
2 |
3 | b = Beam(8)
4 |
5 | ra = Reaction(0, 'h', 'A')
6 | rb = Reaction(b.length, 'r', 'B')
7 | uvl1 = UVL(0,0, 4, 4, inverted=False)
8 | uvl2 = UVL(4,4,4,0)
9 |
10 | loads = (ra, rb, uvl1, uvl2)
11 |
12 | b.fast_solve(loads)
13 | b.generate_graph()
--------------------------------------------------------------------------------
/tests/pg_28_1.py:
--------------------------------------------------------------------------------
1 | from beamframe import *
2 | # gbm book page: 28 qn 1
3 | # test question form SOM book by GBM
4 |
5 | b = Beam(11)
6 | udl = UDL(0,10,4)
7 | p1 = PointLoad(6,50, inverted=True)
8 | m = PointMoment(6,50, ccw=False)
9 | p2 = PointLoad(b.length, 80, inverted=True, inclination=30)
10 | ra = Reaction(0, 'h', 'A')
11 | rd = Reaction(8, 'r', 'D')
12 |
13 | print(p1.load_x, p1.load_y)
14 | print(p2.load_x, p2.load_y)
15 |
16 | b.add_loads((udl, p1, p2, ra, rd))
17 | b.add_moments((udl, p1, m, p2, ra, rd))
18 | b.calculate_reactions((ra,rd))
19 | b.generate_moment_equation((udl, p1, m, p2, ra, rd))
20 | b.generate_shear_equation((udl, p1, p2, ra, rd))
21 |
22 | x = np.linspace(-1, b.length, 1000)
23 | plt.rc('font', family='serif', size=14)
24 | fig, ax = plt.subplots(facecolor='w', edgecolor='w', num="BMD vs SFD")
25 | ax.plot(x, b.mom_fn(x), label="BMD (kNm)")
26 | ax.plot(x, b.shear_fn(x), label="SFD (kN)")
27 | ax.set_xticks(np.arange(0, b.length+1,1))
28 | ax.axhline(y=0, color='k', label='beam')
29 | ax.set_title("BMD vs SFD of Beam")
30 | ax.set_xlabel("x (m)")
31 | ax.legend(fontsize=8)
32 | ax.grid()
33 | plt.savefig(f"Simply_Supported_Beam/generated_images/{__file__.split('/')[-1]}.png")
34 | plt.show()
--------------------------------------------------------------------------------
/tests/sympy_test.py:
--------------------------------------------------------------------------------
1 | import sympy as sp
2 |
3 | x, m_x = sp.symbols('x m_x')
4 |
--------------------------------------------------------------------------------
/tests/test.py:
--------------------------------------------------------------------------------
1 | from beamframe import *
2 |
3 | b = Beam(14)
4 | ra = Reaction(0, 'f', 'A')
5 | p1 = PointLoad(2,100, inverted=True, inclination=90)
6 | m1 = PointMoment(4,60, ccw=False)
7 | h = Hinge(6, side='r')
8 | udl = UDL(6,20,8)
9 | re = Reaction(10, 'r', 'F')
10 |
11 | elements = (udl, p1, m1, ra, re)
12 | b.add_loads(elements)
13 | b.add_moments(elements, about=3.5)
14 | b.add_hinge(h, elements)
15 | b.calculate_reactions((ra,re))
16 | b.generate_moment_equation(elements)
17 | b.generate_shear_equation(elements)
18 |
19 |
20 | x = np.linspace(-1, b.length, 1000)
21 | plt.rc('font', family='serif', size=14)
22 | fig, ax = plt.subplots(facecolor='w', edgecolor='w', num="BMD vs SFD")
23 | ax.plot(x, b.mom_fn(x), label="BMD (kNm)")
24 | ax.plot(x, b.shear_fn(x), label="SFD (kN)")
25 | ax.set_xticks(np.arange(0, b.length+1,1))
26 | ax.axhline(y=0, color='k', label='beam')
27 | ax.set_title("BMD vs SFD of Beam\n ")
28 | ax.set_xlabel("x (m)")
29 | ax.legend(fontsize=8)
30 | ax.grid()
31 | plt.savefig(f"Simply_Supported_Beam/generated_images/{__file__.split('/')[-1]}.png", dpi=500)
32 | plt.show()
--------------------------------------------------------------------------------
/tests/test_cantilever.py:
--------------------------------------------------------------------------------
1 | # question: https://civilengineeronline.com/mech/fig51a.gif
2 | # solution : https://civilengineeronline.com/mech/fig51bsfbm.gif
3 | # last question from figure
4 | from beamframe import *
5 |
6 | b = Beam(4)
7 | rd = Reaction(b.length, 'f', 'D')
8 | #rb = Reaction(b.length, 'f', 'B')
9 | udl = UDL(1,4,2)
10 | p = PointLoad(0, 2, inverted=True)
11 | b.add_loads([rd, udl, p])
12 | b.add_moments([rd, udl, p], about=b.length)
13 | print(b.fx, b.fy, b.m)
14 | b.calculate_reactions((rd,))
15 | print(b.solved_rxns)
16 | b.generate_moment_equation([rd, udl, p])
17 | b.generate_shear_equation((rd, udl, p))
18 |
19 | x = np.linspace(-1, b.length, 1000)
20 | plt.rc('font', family='serif', size=14)
21 | fig, ax = plt.subplots(facecolor='w', edgecolor='w', num="BMD vs SFD")
22 | ax.plot(x, b.mom_fn(x), label="BMD (kNm)")
23 | ax.plot(x, b.shear_fn(x), label="SFD (kN)")
24 | ax.set_xticks(np.arange(0, b.length+1,1))
25 | ax.axhline(y=0, color='k', label='beam')
26 | ax.set_title("BMD vs SFD of Beam")
27 | ax.set_xlabel("x (m)")
28 | ax.legend(fontsize=8)
29 | ax.grid()
30 | plt.savefig(f"Simply_Supported_Beam/generated_images/{__file__.split('/')[-1]}.png")
31 | plt.show()
32 |
--------------------------------------------------------------------------------
/tests/test_data.txt:
--------------------------------------------------------------------------------
1 | #
2 | # Beam Description:
3 | # ===================
4 | #
5 | # Beam Length: 16m
6 | #
7 | # Support Conditions:
8 | # A-> fixed Position: 0m
9 | # D-> roller Position: 16m
10 | #
11 | # Reaction Values:
12 | # R_A_x = 70.2000000000000
13 | # R_A_y = 49.6600000000000
14 | # M_A = 297.960000000000
15 | # R_D_y = 43.9400000000000
16 | #
17 | #
18 | # Significant values:
19 | # ===================
20 | #
21 | # Shear Force(kN):
22 | # Maximum: 49.66 Position: 0.004004004004004136m
23 | # Minimum: -43.94 Position: 10.010010010010012m
24 | # Bending Moment(kNm):
25 | # Maximum: 198.29203203203207 Position: 9.992992992992994m
26 | # Minimum: -297.7611611611611 Position: 0.004004004004004136m
27 | #
28 | #
29 | # =======================================================================================
30 | #
31 | # x Shear Force Bending Moment
32 | #
33 | 4.004004004004135808e-03 4.965999999999999659e+01 -2.977611611611611124e+02
34 | 2.102102102102110237e-02 4.965999999999999659e+01 -2.969160960960960551e+02
35 | 3.803803803803806893e-02 4.965999999999999659e+01 -2.960710310310309978e+02
36 | 5.505505505505525754e-02 4.965999999999999659e+01 -2.952259659659659405e+02
37 | 7.207207207207222410e-02 4.965999999999999659e+01 -2.943809009009008832e+02
38 | 8.908908908908919067e-02 4.965999999999999659e+01 -2.935358358358358259e+02
39 | 1.061061061061061572e-01 4.965999999999999659e+01 -2.926907707707707686e+02
40 | 1.231231231231231238e-01 4.965999999999999659e+01 -2.918457057057057114e+02
41 | 1.401401401401403124e-01 4.965999999999999659e+01 -2.910006406406405972e+02
42 | 1.571571571571572790e-01 4.965999999999999659e+01 -2.901555755755755399e+02
43 | 1.741741741741742455e-01 4.965999999999999659e+01 -2.893105105105104826e+02
44 | 1.911911911911912121e-01 4.965999999999999659e+01 -2.884654454454454253e+02
45 | 2.082082082082084007e-01 4.965999999999999659e+01 -2.876203803803803680e+02
46 | 2.252252252252253673e-01 4.965999999999999659e+01 -2.867753153153153107e+02
47 | 2.422422422422423338e-01 4.965999999999999659e+01 -2.859302502502502534e+02
48 | 2.592592592592593004e-01 4.965999999999999659e+01 -2.850851851851851393e+02
49 | 2.762762762762764890e-01 4.965999999999999659e+01 -2.842401201201200820e+02
50 | 2.932932932932934555e-01 4.965999999999999659e+01 -2.833950550550550247e+02
51 | 3.103103103103104221e-01 4.965999999999999659e+01 -2.825499899899899674e+02
52 | 3.273273273273273887e-01 4.965999999999999659e+01 -2.817049249249249101e+02
53 | 3.443443443443445773e-01 4.965999999999999659e+01 -2.808598598598598528e+02
54 | 3.613613613613615438e-01 4.965999999999999659e+01 -2.800147947947947387e+02
55 | 3.783783783783785104e-01 4.965999999999999659e+01 -2.791697297297296814e+02
56 | 3.953953953953954770e-01 4.965999999999999659e+01 -2.783246646646646241e+02
57 | 4.124124124124124435e-01 4.965999999999999659e+01 -2.774795995995995668e+02
58 | 4.294294294294296321e-01 4.965999999999999659e+01 -2.766345345345345095e+02
59 | 4.464464464464465987e-01 4.965999999999999659e+01 -2.757894694694694522e+02
60 | 4.634634634634635653e-01 4.965999999999999659e+01 -2.749444044044043949e+02
61 | 4.804804804804805318e-01 4.965999999999999659e+01 -2.740993393393393376e+02
62 | 4.974974974974977204e-01 4.965999999999999659e+01 -2.732542742742742234e+02
63 | 5.145145145145146870e-01 4.965999999999999659e+01 -2.724092092092091661e+02
64 | 5.315315315315316536e-01 4.965999999999999659e+01 -2.715641441441441089e+02
65 | 5.485485485485486201e-01 4.965999999999999659e+01 -2.707190790790790516e+02
66 | 5.655655655655658087e-01 4.965999999999999659e+01 -2.698740140140139943e+02
67 | 5.825825825825827753e-01 4.965999999999999659e+01 -2.690289489489489370e+02
68 | 5.995995995995997419e-01 4.965999999999999659e+01 -2.681838838838838797e+02
69 | 6.166166166166167084e-01 4.965999999999999659e+01 -2.673388188188188224e+02
70 | 6.336336336336336750e-01 4.965999999999999659e+01 -2.664937537537537082e+02
71 | 6.506506506506508636e-01 4.965999999999999659e+01 -2.656486886886886509e+02
72 | 6.676676676676678301e-01 4.965999999999999659e+01 -2.648036236236235936e+02
73 | 6.846846846846847967e-01 4.965999999999999659e+01 -2.639585585585585363e+02
74 | 7.017017017017017633e-01 4.965999999999999659e+01 -2.631134934934934790e+02
75 | 7.187187187187189519e-01 4.965999999999999659e+01 -2.622684284284284217e+02
76 | 7.357357357357359184e-01 4.965999999999999659e+01 -2.614233633633633644e+02
77 | 7.527527527527528850e-01 4.965999999999999659e+01 -2.605782982982982503e+02
78 | 7.697697697697698516e-01 4.965999999999999659e+01 -2.597332332332331930e+02
79 | 7.867867867867870402e-01 4.965999999999999659e+01 -2.588881681681681357e+02
80 | 8.038038038038040067e-01 4.965999999999999659e+01 -2.580431031031030784e+02
81 | 8.208208208208209733e-01 4.965999999999999659e+01 -2.571980380380380211e+02
82 | 8.378378378378379399e-01 4.965999999999999659e+01 -2.563529729729729638e+02
83 | 8.548548548548551285e-01 4.965999999999999659e+01 -2.555079079079078781e+02
84 | 8.718718718718720950e-01 4.965999999999999659e+01 -2.546628428428428208e+02
85 | 8.888888888888890616e-01 4.965999999999999659e+01 -2.538177777777777351e+02
86 | 9.059059059059060282e-01 4.965999999999999659e+01 -2.529727127127126778e+02
87 | 9.229229229229229947e-01 4.965999999999999659e+01 -2.521276476476476205e+02
88 | 9.399399399399401833e-01 4.965999999999999659e+01 -2.512825825825825632e+02
89 | 9.569569569569571499e-01 4.965999999999999659e+01 -2.504375175175175059e+02
90 | 9.739739739739741164e-01 4.965999999999999659e+01 -2.495924524524524202e+02
91 | 9.909909909909910830e-01 4.965999999999999659e+01 -2.487473873873873629e+02
92 | 1.008008008008008272e+00 4.965999999999999659e+01 -2.479023223223222772e+02
93 | 1.025025025025025016e+00 4.965999999999999659e+01 -2.470572572572572483e+02
94 | 1.042042042042042205e+00 4.965999999999999659e+01 -2.462121921921921626e+02
95 | 1.059059059059059393e+00 4.965999999999999659e+01 -2.453671271271271053e+02
96 | 1.076076076076076138e+00 4.965999999999999659e+01 -2.445220620620620480e+02
97 | 1.093093093093093326e+00 4.965999999999999659e+01 -2.436769969969969623e+02
98 | 1.110110110110110515e+00 4.965999999999999659e+01 -2.428319319319319050e+02
99 | 1.127127127127127260e+00 4.965999999999999659e+01 -2.419868668668668477e+02
100 | 1.144144144144144448e+00 4.965999999999999659e+01 -2.411418018018017619e+02
101 | 1.161161161161161193e+00 4.965999999999999659e+01 -2.402967367367367046e+02
102 | 1.178178178178178381e+00 4.965999999999999659e+01 -2.394516716716716473e+02
103 | 1.195195195195195570e+00 4.965999999999999659e+01 -2.386066066066065616e+02
104 | 1.212212212212212314e+00 4.965999999999999659e+01 -2.377615415415415328e+02
105 | 1.229229229229229503e+00 4.965999999999999659e+01 -2.369164764764764470e+02
106 | 1.246246246246246248e+00 4.965999999999999659e+01 -2.360714114114113897e+02
107 | 1.263263263263263436e+00 4.965999999999999659e+01 -2.352263463463463040e+02
108 | 1.280280280280280625e+00 4.965999999999999659e+01 -2.343812812812812467e+02
109 | 1.297297297297297369e+00 4.965999999999999659e+01 -2.335362162162161894e+02
110 | 1.314314314314314558e+00 4.965999999999999659e+01 -2.326911511511511321e+02
111 | 1.331331331331331747e+00 4.965999999999999659e+01 -2.318460860860860464e+02
112 | 1.348348348348348491e+00 4.965999999999999659e+01 -2.310010210210210175e+02
113 | 1.365365365365365680e+00 4.965999999999999659e+01 -2.301559559559559034e+02
114 | 1.382382382382382424e+00 4.965999999999999659e+01 -2.293108908908908745e+02
115 | 1.399399399399399613e+00 4.965999999999999659e+01 -2.284658258258257888e+02
116 | 1.416416416416416801e+00 4.965999999999999659e+01 -2.276207607607607315e+02
117 | 1.433433433433433546e+00 4.965999999999999659e+01 -2.267756956956956742e+02
118 | 1.450450450450450735e+00 4.965999999999999659e+01 -2.259306306306306169e+02
119 | 1.467467467467467479e+00 4.965999999999999659e+01 -2.250855655655655596e+02
120 | 1.484484484484484668e+00 4.965999999999999659e+01 -2.242405005005004739e+02
121 | 1.501501501501501856e+00 4.965999999999999659e+01 -2.233954354354353882e+02
122 | 1.518518518518518601e+00 4.965999999999999659e+01 -2.225503703703703309e+02
123 | 1.535535535535535789e+00 4.965999999999999659e+01 -2.217053053053052736e+02
124 | 1.552552552552552978e+00 4.965999999999999659e+01 -2.208602402402402163e+02
125 | 1.569569569569569722e+00 4.965999999999999659e+01 -2.200151751751751590e+02
126 | 1.586586586586586911e+00 4.965999999999999659e+01 -2.191701101101100733e+02
127 | 1.603603603603603656e+00 4.965999999999999659e+01 -2.183250450450450444e+02
128 | 1.620620620620620844e+00 4.965999999999999659e+01 -2.174799799799799587e+02
129 | 1.637637637637638033e+00 4.965999999999999659e+01 -2.166349149149148730e+02
130 | 1.654654654654654777e+00 4.965999999999999659e+01 -2.157898498498498157e+02
131 | 1.671671671671671966e+00 4.965999999999999659e+01 -2.149447847847847584e+02
132 | 1.688688688688689155e+00 4.965999999999999659e+01 -2.140997197197197011e+02
133 | 1.705705705705705899e+00 4.965999999999999659e+01 -2.132546546546546438e+02
134 | 1.722722722722723088e+00 4.965999999999999659e+01 -2.124095895895895580e+02
135 | 1.739739739739739832e+00 4.965999999999999659e+01 -2.115645245245245007e+02
136 | 1.756756756756757021e+00 4.965999999999999659e+01 -2.107194594594594150e+02
137 | 1.773773773773774209e+00 4.965999999999999659e+01 -2.098743943943943577e+02
138 | 1.790790790790790954e+00 4.965999999999999659e+01 -2.090293293293293004e+02
139 | 1.807807807807808143e+00 4.965999999999999659e+01 -2.081842642642642431e+02
140 | 1.824824824824824887e+00 4.965999999999999659e+01 -2.073391991991991858e+02
141 | 1.841841841841842076e+00 4.965999999999999659e+01 -2.064941341341341285e+02
142 | 1.858858858858859264e+00 4.965999999999999659e+01 -2.056490690690690144e+02
143 | 1.875875875875876009e+00 4.965999999999999659e+01 -2.048040040040039855e+02
144 | 1.892892892892893197e+00 4.965999999999999659e+01 -2.039589389389388998e+02
145 | 1.909909909909910386e+00 4.965999999999999659e+01 -2.031138738738738425e+02
146 | 1.926926926926927131e+00 4.965999999999999659e+01 -2.022688088088087852e+02
147 | 1.943943943943944319e+00 4.965999999999999659e+01 -2.014237437437437279e+02
148 | 1.960960960960961064e+00 4.965999999999999659e+01 -2.005786786786786706e+02
149 | 1.977977977977978252e+00 4.965999999999999659e+01 -1.997336136136135849e+02
150 | 1.994994994994995441e+00 4.965999999999999659e+01 -1.988885485485484992e+02
151 | 2.012012012012012185e+00 4.965999999999999659e+01 -1.980434834834834419e+02
152 | 2.029029029029029374e+00 4.965999999999999659e+01 -1.971984184184183846e+02
153 | 2.046046046046046119e+00 4.965999999999999659e+01 -1.963533533533533273e+02
154 | 2.063063063063063307e+00 4.965999999999999659e+01 -1.955082882882882700e+02
155 | 2.080080080080080496e+00 4.965999999999999659e+01 -1.946632232232231843e+02
156 | 2.097097097097097240e+00 4.965999999999999659e+01 -1.938181581581581554e+02
157 | 2.114114114114114429e+00 4.965999999999999659e+01 -1.929730930930930697e+02
158 | 2.131131131131131617e+00 4.965999999999999659e+01 -1.921280280280279840e+02
159 | 2.148148148148148362e+00 4.965999999999999659e+01 -1.912829629629629267e+02
160 | 2.165165165165165551e+00 4.965999999999999659e+01 -1.904378978978978694e+02
161 | 2.182182182182182295e+00 4.965999999999999659e+01 -1.895928328328328121e+02
162 | 2.199199199199199484e+00 4.965999999999999659e+01 -1.887477677677677548e+02
163 | 2.216216216216216672e+00 4.965999999999999659e+01 -1.879027027027026691e+02
164 | 2.233233233233233417e+00 4.965999999999999659e+01 -1.870576376376376118e+02
165 | 2.250250250250250605e+00 4.965999999999999659e+01 -1.862125725725725260e+02
166 | 2.267267267267267350e+00 4.965999999999999659e+01 -1.853675075075074972e+02
167 | 2.284284284284284539e+00 4.965999999999999659e+01 -1.845224424424424114e+02
168 | 2.301301301301301727e+00 4.965999999999999659e+01 -1.836773773773773542e+02
169 | 2.318318318318318472e+00 4.965999999999999659e+01 -1.828323123123122969e+02
170 | 2.335335335335335660e+00 4.965999999999999659e+01 -1.819872472472472396e+02
171 | 2.352352352352352849e+00 4.965999999999999659e+01 -1.811421821821821254e+02
172 | 2.369369369369369593e+00 4.965999999999999659e+01 -1.802971171171170965e+02
173 | 2.386386386386386782e+00 4.965999999999999659e+01 -1.794520520520520108e+02
174 | 2.403403403403403527e+00 4.965999999999999659e+01 -1.786069869869869535e+02
175 | 2.420420420420420715e+00 4.965999999999999659e+01 -1.777619219219218962e+02
176 | 2.437437437437437904e+00 4.965999999999999659e+01 -1.769168568568568389e+02
177 | 2.454454454454454648e+00 4.965999999999999659e+01 -1.760717917917917816e+02
178 | 2.471471471471471837e+00 4.965999999999999659e+01 -1.752267267267266959e+02
179 | 2.488488488488489025e+00 4.965999999999999659e+01 -1.743816616616616102e+02
180 | 2.505505505505505770e+00 4.965999999999999659e+01 -1.735365965965965529e+02
181 | 2.522522522522522959e+00 4.965999999999999659e+01 -1.726915315315314956e+02
182 | 2.539539539539539703e+00 4.965999999999999659e+01 -1.718464664664664383e+02
183 | 2.556556556556556892e+00 4.965999999999999659e+01 -1.710014014014013810e+02
184 | 2.573573573573574080e+00 4.965999999999999659e+01 -1.701563363363362953e+02
185 | 2.590590590590590825e+00 4.965999999999999659e+01 -1.693112712712712380e+02
186 | 2.607607607607608013e+00 4.965999999999999659e+01 -1.684662062062061807e+02
187 | 2.624624624624624758e+00 4.965999999999999659e+01 -1.676211411411411234e+02
188 | 2.641641641641641947e+00 4.965999999999999659e+01 -1.667760760760760377e+02
189 | 2.658658658658659135e+00 4.965999999999999659e+01 -1.659310110110109804e+02
190 | 2.675675675675675880e+00 4.965999999999999659e+01 -1.650859459459459231e+02
191 | 2.692692692692693068e+00 4.965999999999999659e+01 -1.642408808808808374e+02
192 | 2.709709709709710257e+00 4.965999999999999659e+01 -1.633958158158157801e+02
193 | 2.726726726726727001e+00 4.965999999999999659e+01 -1.625507507507507228e+02
194 | 2.743743743743744190e+00 4.965999999999999659e+01 -1.617056856856856655e+02
195 | 2.760760760760760935e+00 4.965999999999999659e+01 -1.608606206206206082e+02
196 | 2.777777777777778123e+00 4.965999999999999659e+01 -1.600155555555555225e+02
197 | 2.794794794794795312e+00 4.965999999999999659e+01 -1.591704904904904652e+02
198 | 2.811811811811812056e+00 4.965999999999999659e+01 -1.583254254254254079e+02
199 | 2.828828828828829245e+00 4.965999999999999659e+01 -1.574803603603603221e+02
200 | 2.845845845845845989e+00 4.965999999999999659e+01 -1.566352952952952649e+02
201 | 2.862862862862863178e+00 4.965999999999999659e+01 -1.557902302302302076e+02
202 | 2.879879879879880367e+00 4.965999999999999659e+01 -1.549451651651651218e+02
203 | 2.896896896896897111e+00 4.965999999999999659e+01 -1.541001001001000930e+02
204 | 2.913913913913914300e+00 4.965999999999999659e+01 -1.532550350350350072e+02
205 | 2.930930930930931488e+00 4.965999999999999659e+01 -1.524099699699699215e+02
206 | 2.947947947947948233e+00 4.965999999999999659e+01 -1.515649049049048926e+02
207 | 2.964964964964965422e+00 4.965999999999999659e+01 -1.507198398398398069e+02
208 | 2.981981981981982166e+00 4.965999999999999659e+01 -1.498747747747747496e+02
209 | 2.998998998998999355e+00 4.965999999999999659e+01 -1.490297097097096923e+02
210 | 3.016016016016016543e+00 4.965999999999999659e+01 -1.481846446446446066e+02
211 | 3.033033033033033732e+00 4.965999999999999659e+01 -1.473395795795795209e+02
212 | 3.050050050050050032e+00 4.965999999999999659e+01 -1.464945145145144920e+02
213 | 3.067067067067067221e+00 4.965999999999999659e+01 -1.456494494494494347e+02
214 | 3.084084084084084409e+00 4.965999999999999659e+01 -1.448043843843843490e+02
215 | 3.101101101101101598e+00 4.965999999999999659e+01 -1.439593193193192917e+02
216 | 3.118118118118118787e+00 4.965999999999999659e+01 -1.431142542542542060e+02
217 | 3.135135135135135087e+00 4.965999999999999659e+01 -1.422691891891891771e+02
218 | 3.152152152152152276e+00 4.965999999999999659e+01 -1.414241241241241198e+02
219 | 3.169169169169169464e+00 4.965999999999999659e+01 -1.405790590590590341e+02
220 | 3.186186186186186653e+00 4.965999999999999659e+01 -1.397339939939939484e+02
221 | 3.203203203203203842e+00 4.965999999999999659e+01 -1.388889289289288911e+02
222 | 3.220220220220221030e+00 4.965999999999999659e+01 -1.380438638638638054e+02
223 | 3.237237237237237331e+00 4.965999999999999659e+01 -1.371987987987987765e+02
224 | 3.254254254254254519e+00 4.965999999999999659e+01 -1.363537337337337192e+02
225 | 3.271271271271271708e+00 4.965999999999999659e+01 -1.355086686686686335e+02
226 | 3.288288288288288896e+00 4.965999999999999659e+01 -1.346636036036035762e+02
227 | 3.305305305305306085e+00 4.965999999999999659e+01 -1.338185385385384905e+02
228 | 3.322322322322322385e+00 4.965999999999999659e+01 -1.329734734734734616e+02
229 | 3.339339339339339574e+00 4.965999999999999659e+01 -1.321284084084083759e+02
230 | 3.356356356356356763e+00 4.965999999999999659e+01 -1.312833433433433186e+02
231 | 3.373373373373373951e+00 4.965999999999999659e+01 -1.304382782782782328e+02
232 | 3.390390390390391140e+00 4.965999999999999659e+01 -1.295932132132131755e+02
233 | 3.407407407407407440e+00 4.965999999999999659e+01 -1.287481481481481467e+02
234 | 3.424424424424424629e+00 4.965999999999999659e+01 -1.279030830830830610e+02
235 | 3.441441441441441818e+00 4.965999999999999659e+01 -1.270580180180180037e+02
236 | 3.458458458458459006e+00 4.965999999999999659e+01 -1.262129529529529179e+02
237 | 3.475475475475476195e+00 4.965999999999999659e+01 -1.253678878878878322e+02
238 | 3.492492492492492495e+00 4.965999999999999659e+01 -1.245228228228228033e+02
239 | 3.509509509509509684e+00 4.965999999999999659e+01 -1.236777577577577460e+02
240 | 3.526526526526526872e+00 4.965999999999999659e+01 -1.228326926926926603e+02
241 | 3.543543543543544061e+00 4.965999999999999659e+01 -1.219876276276276030e+02
242 | 3.560560560560561250e+00 4.965999999999999659e+01 -1.211425625625625173e+02
243 | 3.577577577577578438e+00 4.965999999999999659e+01 -1.202974974974974600e+02
244 | 3.594594594594594739e+00 4.965999999999999659e+01 -1.194524324324324311e+02
245 | 3.611611611611611927e+00 4.965999999999999659e+01 -1.186073673673673454e+02
246 | 3.628628628628629116e+00 4.965999999999999659e+01 -1.177623023023022597e+02
247 | 3.645645645645646304e+00 4.965999999999999659e+01 -1.169172372372372024e+02
248 | 3.662662662662663493e+00 4.965999999999999659e+01 -1.160721721721721167e+02
249 | 3.679679679679679793e+00 4.965999999999999659e+01 -1.152271071071070878e+02
250 | 3.696696696696696982e+00 4.965999999999999659e+01 -1.143820420420420305e+02
251 | 3.713713713713714171e+00 4.965999999999999659e+01 -1.135369769769769448e+02
252 | 3.730730730730731359e+00 4.965999999999999659e+01 -1.126919119119118591e+02
253 | 3.747747747747748548e+00 4.965999999999999659e+01 -1.118468468468468018e+02
254 | 3.764764764764764848e+00 4.965999999999999659e+01 -1.110017817817817729e+02
255 | 3.781781781781782037e+00 4.965999999999999659e+01 -1.101567167167166872e+02
256 | 3.798798798798799226e+00 4.965999999999999659e+01 -1.093116516516516299e+02
257 | 3.815815815815816414e+00 4.965999999999999659e+01 -1.084665865865865442e+02
258 | 3.832832832832833603e+00 4.965999999999999659e+01 -1.076215215215214869e+02
259 | 3.849849849849849903e+00 4.965999999999999659e+01 -1.067764564564564580e+02
260 | 3.866866866866867092e+00 4.965999999999999659e+01 -1.059313913913913723e+02
261 | 3.883883883883884280e+00 4.965999999999999659e+01 -1.050863263263262866e+02
262 | 3.900900900900901469e+00 4.965999999999999659e+01 -1.042412612612612293e+02
263 | 3.917917917917918658e+00 4.965999999999999659e+01 -1.033961961961961435e+02
264 | 3.934934934934934958e+00 4.965999999999999659e+01 -1.025511311311311147e+02
265 | 3.951951951951952147e+00 4.965999999999999659e+01 -1.017060660660660574e+02
266 | 3.968968968968969335e+00 4.965999999999999659e+01 -1.008610010010009717e+02
267 | 3.985985985985986524e+00 4.965999999999999659e+01 -1.000159359359359144e+02
268 | 4.003003003003003712e+00 4.965999999999999659e+01 -9.917087087087082864e+01
269 | 4.020020020020020901e+00 4.965999999999999659e+01 -9.832580580580574292e+01
270 | 4.037037037037037202e+00 4.965999999999999659e+01 -9.748074074074071405e+01
271 | 4.054054054054054390e+00 4.965999999999999659e+01 -9.663567567567565675e+01
272 | 4.071071071071071579e+00 4.965999999999999659e+01 -9.579061061061057103e+01
273 | 4.088088088088088767e+00 4.965999999999999659e+01 -9.494554554554551373e+01
274 | 4.105105105105105956e+00 4.965999999999999659e+01 -9.410048048048042801e+01
275 | 4.122122122122122256e+00 4.965999999999999659e+01 -9.325541541541539914e+01
276 | 4.139139139139139445e+00 4.965999999999999659e+01 -9.241035035035034184e+01
277 | 4.156156156156156634e+00 4.965999999999999659e+01 -9.156528528528525612e+01
278 | 4.173173173173173822e+00 4.965999999999999659e+01 -9.072022022022017040e+01
279 | 4.190190190190191011e+00 4.965999999999999659e+01 -8.987515515515511311e+01
280 | 4.207207207207207311e+00 4.965999999999999659e+01 -8.903009009009008423e+01
281 | 4.224224224224224500e+00 4.965999999999999659e+01 -8.818502502502499851e+01
282 | 4.241241241241241688e+00 4.965999999999999659e+01 -8.733995995995994122e+01
283 | 4.258258258258258877e+00 4.965999999999999659e+01 -8.649489489489485550e+01
284 | 4.275275275275276066e+00 4.965999999999999659e+01 -8.564982982982979820e+01
285 | 4.292292292292292366e+00 4.965999999999999659e+01 -8.480476476476476932e+01
286 | 4.309309309309309555e+00 4.965999999999999659e+01 -8.395969969969968361e+01
287 | 4.326326326326326743e+00 4.965999999999999659e+01 -8.311463463463459789e+01
288 | 4.343343343343343932e+00 4.965999999999999659e+01 -8.226956956956954059e+01
289 | 4.360360360360361121e+00 4.965999999999999659e+01 -8.142450450450445487e+01
290 | 4.377377377377378309e+00 4.965999999999999659e+01 -8.057943943943939757e+01
291 | 4.394394394394394610e+00 4.965999999999999659e+01 -7.973437437437436870e+01
292 | 4.411411411411411798e+00 4.965999999999999659e+01 -7.888930930930928298e+01
293 | 4.428428428428428987e+00 4.965999999999999659e+01 -7.804424424424419726e+01
294 | 4.445445445445446175e+00 4.965999999999999659e+01 -7.719917917917913996e+01
295 | 4.462462462462463364e+00 4.965999999999999659e+01 -7.635411411411405425e+01
296 | 4.479479479479479664e+00 4.965999999999999659e+01 -7.550904904904902537e+01
297 | 4.496496496496496853e+00 4.965999999999999659e+01 -7.466398398398396807e+01
298 | 4.513513513513514042e+00 4.965999999999999659e+01 -7.381891891891888235e+01
299 | 4.530530530530531230e+00 4.965999999999999659e+01 -7.297385385385382506e+01
300 | 4.547547547547548419e+00 4.965999999999999659e+01 -7.212878878878873934e+01
301 | 4.564564564564564719e+00 4.965999999999999659e+01 -7.128372372372371046e+01
302 | 4.581581581581581908e+00 4.965999999999999659e+01 -7.043865865865862474e+01
303 | 4.598598598598599096e+00 4.965999999999999659e+01 -6.959359359359356745e+01
304 | 4.615615615615616285e+00 4.965999999999999659e+01 -6.874852852852848173e+01
305 | 4.632632632632633474e+00 4.965999999999999659e+01 -6.790346346346342443e+01
306 | 4.649649649649649774e+00 4.965999999999999659e+01 -6.705839839839839556e+01
307 | 4.666666666666666963e+00 4.965999999999999659e+01 -6.621333333333330984e+01
308 | 4.683683683683684151e+00 4.965999999999999659e+01 -6.536826826826825254e+01
309 | 4.700700700700701340e+00 4.965999999999999659e+01 -6.452320320320316682e+01
310 | 4.717717717717718529e+00 4.965999999999999659e+01 -6.367813813813808110e+01
311 | 4.734734734734734829e+00 4.965999999999999659e+01 -6.283307307307305223e+01
312 | 4.751751751751752018e+00 4.965999999999999659e+01 -6.198800800800799493e+01
313 | 4.768768768768769206e+00 4.965999999999999659e+01 -6.114294294294290921e+01
314 | 4.785785785785786395e+00 4.965999999999999659e+01 -6.029787787787785192e+01
315 | 4.802802802802803583e+00 4.965999999999999659e+01 -5.945281281281276620e+01
316 | 4.819819819819820772e+00 4.965999999999999659e+01 -5.860774774774770890e+01
317 | 4.836836836836837072e+00 4.965999999999999659e+01 -5.776268268268268002e+01
318 | 4.853853853853854261e+00 4.965999999999999659e+01 -5.691761761761759431e+01
319 | 4.870870870870871450e+00 4.965999999999999659e+01 -5.607255255255250859e+01
320 | 4.887887887887888638e+00 4.965999999999999659e+01 -5.522748748748745129e+01
321 | 4.904904904904905827e+00 4.965999999999999659e+01 -5.438242242242236557e+01
322 | 4.921921921921922127e+00 4.965999999999999659e+01 -5.353735735735733670e+01
323 | 4.938938938938939316e+00 4.965999999999999659e+01 -5.269229229229227940e+01
324 | 4.955955955955956505e+00 4.965999999999999659e+01 -5.184722722722719368e+01
325 | 4.972972972972973693e+00 4.965999999999999659e+01 -5.100216216216213638e+01
326 | 4.989989989989990882e+00 4.965999999999999659e+01 -5.015709709709705066e+01
327 | 5.007007007007007182e+00 4.965999999999999659e+01 -4.931203203203202179e+01
328 | 5.024024024024024371e+00 4.965999999999999659e+01 -4.846696696696693607e+01
329 | 5.041041041041041559e+00 4.965999999999999659e+01 -4.762190190190187877e+01
330 | 5.058058058058058748e+00 4.965999999999999659e+01 -4.677683683683679305e+01
331 | 5.075075075075075937e+00 4.965999999999999659e+01 -4.593177177177173576e+01
332 | 5.092092092092092237e+00 4.965999999999999659e+01 -4.508670670670670688e+01
333 | 5.109109109109109426e+00 4.965999999999999659e+01 -4.424164164164162116e+01
334 | 5.126126126126126614e+00 4.965999999999999659e+01 -4.339657657657653544e+01
335 | 5.143143143143143803e+00 4.965999999999999659e+01 -4.255151151151147815e+01
336 | 5.160160160160160991e+00 4.965999999999999659e+01 -4.170644644644642085e+01
337 | 5.177177177177178180e+00 4.965999999999999659e+01 -4.086138138138130671e+01
338 | 5.194194194194194480e+00 4.965999999999999659e+01 -4.001631631631630626e+01
339 | 5.211211211211211669e+00 4.965999999999999659e+01 -3.917125125125124896e+01
340 | 5.228228228228228858e+00 4.965999999999999659e+01 -3.832618618618613482e+01
341 | 5.245245245245246046e+00 4.965999999999999659e+01 -3.748112112112107752e+01
342 | 5.262262262262263235e+00 4.965999999999999659e+01 -3.663605605605602022e+01
343 | 5.279279279279279535e+00 4.965999999999999659e+01 -3.579099099099096293e+01
344 | 5.296296296296296724e+00 4.965999999999999659e+01 -3.494592592592590563e+01
345 | 5.313313313313313913e+00 4.965999999999999659e+01 -3.410086086086084833e+01
346 | 5.330330330330331101e+00 4.965999999999999659e+01 -3.325579579579573419e+01
347 | 5.347347347347348290e+00 4.965999999999999659e+01 -3.241073073073067690e+01
348 | 5.364364364364364590e+00 4.965999999999999659e+01 -3.156566566566567644e+01
349 | 5.381381381381381779e+00 4.965999999999999659e+01 -3.072060060060056230e+01
350 | 5.398398398398398967e+00 4.965999999999999659e+01 -2.987553553553550501e+01
351 | 5.415415415415416156e+00 4.965999999999999659e+01 -2.903047047047044771e+01
352 | 5.432432432432433345e+00 4.965999999999999659e+01 -2.818540540540533357e+01
353 | 5.449449449449449645e+00 4.965999999999999659e+01 -2.734034034034033311e+01
354 | 5.466466466466466834e+00 4.965999999999999659e+01 -2.649527527527527582e+01
355 | 5.483483483483484022e+00 4.965999999999999659e+01 -2.565021021021016168e+01
356 | 5.500500500500501211e+00 4.965999999999999659e+01 -2.480514514514510438e+01
357 | 5.517517517517518399e+00 4.965999999999999659e+01 -2.396008008008004708e+01
358 | 5.534534534534534700e+00 4.965999999999999659e+01 -2.311501501501498979e+01
359 | 5.551551551551551889e+00 4.965999999999999659e+01 -2.226994994994993249e+01
360 | 5.568568568568569077e+00 4.965999999999999659e+01 -2.142488488488487519e+01
361 | 5.585585585585586266e+00 4.965999999999999659e+01 -2.057981981981976105e+01
362 | 5.602602602602603454e+00 4.965999999999999659e+01 -1.973475475475470375e+01
363 | 5.619619619619620643e+00 4.965999999999999659e+01 -1.888968968968964646e+01
364 | 5.636636636636636943e+00 4.965999999999999659e+01 -1.804462462462458916e+01
365 | 5.653653653653654132e+00 4.965999999999999659e+01 -1.719955955955953186e+01
366 | 5.670670670670671321e+00 4.965999999999999659e+01 -1.635449449449447457e+01
367 | 5.687687687687688509e+00 4.965999999999999659e+01 -1.550942942942936043e+01
368 | 5.704704704704705698e+00 4.965999999999999659e+01 -1.466436436436430313e+01
369 | 5.721721721721721998e+00 4.965999999999999659e+01 -1.381929929929930267e+01
370 | 5.738738738738739187e+00 4.965999999999999659e+01 -1.297423423423418853e+01
371 | 5.755755755755756375e+00 4.965999999999999659e+01 -1.212916916916913124e+01
372 | 5.772772772772773564e+00 4.965999999999999659e+01 -1.128410410410407394e+01
373 | 5.789789789789790753e+00 4.965999999999999659e+01 -1.043903903903901664e+01
374 | 5.806806806806807053e+00 4.965999999999999659e+01 -9.593973973973959346e+00
375 | 5.823823823823824242e+00 4.965999999999999659e+01 -8.748908908908902049e+00
376 | 5.840840840840841430e+00 4.965999999999999659e+01 -7.903843843843787909e+00
377 | 5.857857857857858619e+00 4.965999999999999659e+01 -7.058778778778730612e+00
378 | 5.874874874874875808e+00 4.965999999999999659e+01 -6.213713713713673314e+00
379 | 5.891891891891892108e+00 4.965999999999999659e+01 -5.368648648648616017e+00
380 | 5.908908908908909297e+00 4.965999999999999659e+01 -4.523583583583558720e+00
381 | 5.925925925925926485e+00 4.965999999999999659e+01 -3.678518518518501423e+00
382 | 5.942942942942943674e+00 4.965999999999999659e+01 -2.833453453453444126e+00
383 | 5.959959959959960862e+00 4.965999999999999659e+01 -1.988388388388329986e+00
384 | 5.976976976976978051e+00 4.965999999999999659e+01 -1.143323323323272689e+00
385 | 5.993993993993994351e+00 4.965999999999999659e+01 -2.982582582582153918e-01
386 | 6.011011011011011540e+00 4.965999999999999659e+01 5.468068068068419052e-01
387 | 6.028028028028028729e+00 4.965999999999999659e+01 1.391871871871899202e+00
388 | 6.045045045045045917e+00 4.965999999999999659e+01 2.236936936936956499e+00
389 | 6.062062062062063106e+00 4.965999999999999659e+01 3.082002002002070640e+00
390 | 6.079079079079079406e+00 4.965999999999999659e+01 3.927067067067071093e+00
391 | 6.096096096096096595e+00 4.965999999999999659e+01 4.772132132132128390e+00
392 | 6.113113113113113783e+00 4.965999999999999659e+01 5.617197197197242531e+00
393 | 6.130130130130130972e+00 4.965999999999999659e+01 6.462262262262299828e+00
394 | 6.147147147147148161e+00 4.965999999999999659e+01 7.307327327327357125e+00
395 | 6.164164164164164461e+00 4.965999999999999659e+01 8.152392392392414422e+00
396 | 6.181181181181181650e+00 4.965999999999999659e+01 8.997457457457471719e+00
397 | 6.198198198198198838e+00 4.965999999999999659e+01 9.842522522522529016e+00
398 | 6.215215215215216027e+00 4.965999999999999659e+01 1.068758758758764316e+01
399 | 6.232232232232233216e+00 4.965999999999999659e+01 1.153265265265270045e+01
400 | 6.249249249249249516e+00 4.965999999999999659e+01 1.237771771771775775e+01
401 | 6.266266266266266705e+00 4.965999999999999659e+01 1.322278278278281505e+01
402 | 6.283283283283283893e+00 4.965999999999999659e+01 1.406784784784787234e+01
403 | 6.300300300300301082e+00 4.965999999999999659e+01 1.491291291291292964e+01
404 | 6.317317317317318270e+00 4.965999999999999659e+01 1.575797797797804378e+01
405 | 6.334334334334335459e+00 4.965999999999999659e+01 1.660304304304310108e+01
406 | 6.351351351351351759e+00 4.965999999999999659e+01 1.744810810810810153e+01
407 | 6.368368368368368948e+00 4.965999999999999659e+01 1.829317317317321567e+01
408 | 6.385385385385386137e+00 4.965999999999999659e+01 1.913823823823827297e+01
409 | 6.402402402402403325e+00 4.965999999999999659e+01 1.998330330330333027e+01
410 | 6.419419419419420514e+00 4.965999999999999659e+01 2.082836836836844441e+01
411 | 6.436436436436436814e+00 4.965999999999999659e+01 2.167343343343344486e+01
412 | 6.453453453453454003e+00 4.965999999999999659e+01 2.251849849849850216e+01
413 | 6.470470470470471192e+00 4.965999999999999659e+01 2.336356356356361630e+01
414 | 6.487487487487488380e+00 4.965999999999999659e+01 2.420862862862867360e+01
415 | 6.504504504504505569e+00 4.965999999999999659e+01 2.505369369369373089e+01
416 | 6.521521521521521869e+00 4.965999999999999659e+01 2.589875875875878819e+01
417 | 6.538538538538539058e+00 4.965999999999999659e+01 2.674382382382384549e+01
418 | 6.555555555555556246e+00 4.965999999999999659e+01 2.758888888888890278e+01
419 | 6.572572572572573435e+00 4.965999999999999659e+01 2.843395395395401692e+01
420 | 6.589589589589590624e+00 4.965999999999999659e+01 2.927901901901907422e+01
421 | 6.606606606606606924e+00 4.965999999999999659e+01 3.012408408408407468e+01
422 | 6.623623623623624113e+00 4.965999999999999659e+01 3.096914914914918882e+01
423 | 6.640640640640641301e+00 4.965999999999999659e+01 3.181421421421424611e+01
424 | 6.657657657657658490e+00 4.965999999999999659e+01 3.265927927927930341e+01
425 | 6.674674674674675678e+00 4.965999999999999659e+01 3.350434434434441755e+01
426 | 6.691691691691691979e+00 4.965999999999999659e+01 3.434940940940941800e+01
427 | 6.708708708708709167e+00 4.965999999999999659e+01 3.519447447447447530e+01
428 | 6.725725725725726356e+00 4.965999999999999659e+01 3.603953953953958944e+01
429 | 6.742742742742743545e+00 4.965999999999999659e+01 3.688460460460464674e+01
430 | 6.759759759759760733e+00 4.965999999999999659e+01 3.772966966966970404e+01
431 | 6.776776776776777922e+00 4.965999999999999659e+01 3.857473473473476133e+01
432 | 6.793793793793794222e+00 4.965999999999999659e+01 3.941979979979981863e+01
433 | 6.810810810810811411e+00 4.965999999999999659e+01 4.026486486486487593e+01
434 | 6.827827827827828600e+00 4.965999999999999659e+01 4.110992992992999007e+01
435 | 6.844844844844845788e+00 4.965999999999999659e+01 4.195499499499504736e+01
436 | 6.861861861861862977e+00 4.965999999999999659e+01 4.280006006006010466e+01
437 | 6.878878878878879277e+00 4.965999999999999659e+01 4.364512512512516196e+01
438 | 6.895895895895896466e+00 4.965999999999999659e+01 4.449019019019021925e+01
439 | 6.912912912912913654e+00 4.965999999999999659e+01 4.533525525525527655e+01
440 | 6.929929929929930843e+00 4.965999999999999659e+01 4.618032032032039069e+01
441 | 6.946946946946948032e+00 4.965999999999999659e+01 4.702538538538544799e+01
442 | 6.963963963963964332e+00 4.965999999999999659e+01 4.787045045045044844e+01
443 | 6.980980980980981521e+00 4.965999999999999659e+01 4.871551551551556258e+01
444 | 6.997997997997998709e+00 4.965999999999999659e+01 4.956058058058061988e+01
445 | 7.015015015015015010e+00 4.965999999999999659e+01 5.040564564564562033e+01
446 | 7.032032032032033086e+00 4.965999999999999659e+01 5.125071071071073447e+01
447 | 7.049049049049049387e+00 4.965999999999999659e+01 5.209577577577579177e+01
448 | 7.066066066066067464e+00 4.965999999999999659e+01 5.294084084084090591e+01
449 | 7.083083083083083764e+00 4.965999999999999659e+01 5.378590590590596321e+01
450 | 7.100100100100100065e+00 4.965999999999999659e+01 5.463097097097096366e+01
451 | 7.117117117117118141e+00 4.965999999999999659e+01 5.547603603603607780e+01
452 | 7.134134134134134442e+00 4.965999999999999659e+01 5.632110110110113510e+01
453 | 7.151151151151152519e+00 4.965999999999999659e+01 5.716616616616624924e+01
454 | 7.168168168168168819e+00 4.965999999999999659e+01 5.801123123123124969e+01
455 | 7.185185185185185119e+00 4.965999999999999659e+01 5.885629629629630699e+01
456 | 7.202202202202203196e+00 4.965999999999999659e+01 5.970136136136142113e+01
457 | 7.219219219219219497e+00 4.965999999999999659e+01 6.054642642642642159e+01
458 | 7.236236236236237573e+00 4.965999999999999659e+01 6.139149149149153573e+01
459 | 7.253253253253253874e+00 4.965999999999999659e+01 6.223655655655659302e+01
460 | 7.270270270270270174e+00 4.965999999999999659e+01 6.308162162162159348e+01
461 | 7.287287287287288251e+00 4.965999999999999659e+01 6.392668668668670762e+01
462 | 7.304304304304304551e+00 4.965999999999999659e+01 6.477175175175176491e+01
463 | 7.321321321321322628e+00 4.965999999999999659e+01 6.561681681681687905e+01
464 | 7.338338338338338929e+00 4.965999999999999659e+01 6.646188188188187951e+01
465 | 7.355355355355357005e+00 4.965999999999999659e+01 6.730694694694705049e+01
466 | 7.372372372372373306e+00 4.965999999999999659e+01 6.815201201201205095e+01
467 | 7.389389389389389606e+00 4.965999999999999659e+01 6.899707707707710824e+01
468 | 7.406406406406407683e+00 4.965999999999999659e+01 6.984214214214222238e+01
469 | 7.423423423423423984e+00 4.965999999999999659e+01 7.068720720720722284e+01
470 | 7.440440440440442060e+00 4.965999999999999659e+01 7.153227227227233698e+01
471 | 7.457457457457458361e+00 4.965999999999999659e+01 7.237733733733739427e+01
472 | 7.474474474474474661e+00 4.965999999999999659e+01 7.322240240240239473e+01
473 | 7.491491491491492738e+00 4.965999999999999659e+01 7.406746746746750887e+01
474 | 7.508508508508509038e+00 4.965999999999999659e+01 7.491253253253256617e+01
475 | 7.525525525525527115e+00 4.965999999999999659e+01 7.575759759759768031e+01
476 | 7.542542542542543416e+00 4.965999999999999659e+01 7.660266266266268076e+01
477 | 7.559559559559559716e+00 4.965999999999999659e+01 7.744772772772773806e+01
478 | 7.576576576576577793e+00 4.965999999999999659e+01 7.829279279279285220e+01
479 | 7.593593593593594093e+00 4.965999999999999659e+01 7.913785785785785265e+01
480 | 7.610610610610612170e+00 4.965999999999999659e+01 7.998292292292296679e+01
481 | 7.627627627627628470e+00 4.965999999999999659e+01 8.082798798798802409e+01
482 | 7.644644644644644771e+00 4.965999999999999659e+01 8.167305305305308138e+01
483 | 7.661661661661662848e+00 4.965999999999999659e+01 8.251811811811819553e+01
484 | 7.678678678678679148e+00 4.965999999999999659e+01 8.336318318318319598e+01
485 | 7.695695695695697225e+00 4.965999999999999659e+01 8.420824824824831012e+01
486 | 7.712712712712713525e+00 4.965999999999999659e+01 8.505331331331336742e+01
487 | 7.729729729729729826e+00 4.965999999999999659e+01 8.589837837837836787e+01
488 | 7.746746746746747903e+00 4.965999999999999659e+01 8.674344344344348201e+01
489 | 7.763763763763764203e+00 4.965999999999999659e+01 8.758850850850853931e+01
490 | 7.780780780780782280e+00 4.965999999999999659e+01 8.843357357357365345e+01
491 | 7.797797797797798580e+00 4.965999999999999659e+01 8.927863863863865390e+01
492 | 7.814814814814814881e+00 4.965999999999999659e+01 9.012370370370371120e+01
493 | 7.831831831831832957e+00 4.965999999999999659e+01 9.096876876876882534e+01
494 | 7.848848848848849258e+00 4.965999999999999659e+01 9.181383383383382579e+01
495 | 7.865865865865867335e+00 4.965999999999999659e+01 9.265889889889893993e+01
496 | 7.882882882882883635e+00 4.965999999999999659e+01 9.350396396396399723e+01
497 | 7.899899899899899935e+00 4.965999999999999659e+01 9.434902902902899768e+01
498 | 7.916916916916918012e+00 4.965999999999999659e+01 9.519409409409416867e+01
499 | 7.933933933933934313e+00 4.965999999999999659e+01 9.603915915915916912e+01
500 | 7.950950950950952389e+00 4.965999999999999659e+01 9.688422422422428326e+01
501 | 7.967967967967968690e+00 4.965999999999999659e+01 9.772928928928934056e+01
502 | 7.984984984984984990e+00 4.965999999999999659e+01 9.857435435435434101e+01
503 | 8.002002002002003067e+00 4.965999999999999659e+01 9.941941941941945515e+01
504 | 8.019019019019019368e+00 4.965999999999999659e+01 1.002644844844845124e+02
505 | 8.036036036036037444e+00 4.965999999999999659e+01 1.011095495495496266e+02
506 | 8.053053053053053745e+00 4.965999999999999659e+01 1.019546146146146270e+02
507 | 8.070070070070070045e+00 4.965999999999999659e+01 1.027996796796796843e+02
508 | 8.087087087087088122e+00 4.965999999999999659e+01 1.036447447447447985e+02
509 | 8.104104104104104422e+00 4.965999999999999659e+01 1.044898098098097989e+02
510 | 8.121121121121122499e+00 4.965999999999999659e+01 1.053348748748749131e+02
511 | 8.138138138138138800e+00 4.965999999999999659e+01 1.061799399399399704e+02
512 | 8.155155155155156876e+00 4.965999999999999659e+01 1.070250050050050845e+02
513 | 8.172172172172173177e+00 4.965999999999999659e+01 1.078700700700700850e+02
514 | 8.189189189189189477e+00 4.965999999999999659e+01 1.087151351351351423e+02
515 | 8.206206206206207554e+00 4.965999999999999659e+01 1.095602002002002564e+02
516 | 8.223223223223223854e+00 4.965999999999999659e+01 1.104052652652653137e+02
517 | 8.240240240240241931e+00 4.965999999999999659e+01 1.112503303303304278e+02
518 | 8.257257257257258232e+00 4.965999999999999659e+01 1.120953953953954283e+02
519 | 8.274274274274274532e+00 4.965999999999999659e+01 1.129404604604604856e+02
520 | 8.291291291291292609e+00 4.965999999999999659e+01 1.137855255255255997e+02
521 | 8.308308308308308909e+00 4.965999999999999659e+01 1.146305905905906002e+02
522 | 8.325325325325326986e+00 4.965999999999999659e+01 1.154756556556557143e+02
523 | 8.342342342342343287e+00 4.965999999999999659e+01 1.163207207207207716e+02
524 | 8.359359359359359587e+00 4.965999999999999659e+01 1.171657857857857721e+02
525 | 8.376376376376377664e+00 4.965999999999999659e+01 1.180108508508508862e+02
526 | 8.393393393393393964e+00 4.965999999999999659e+01 1.188559159159159435e+02
527 | 8.410410410410412041e+00 4.965999999999999659e+01 1.197009809809810577e+02
528 | 8.427427427427428341e+00 4.965999999999999659e+01 1.205460460460460581e+02
529 | 8.444444444444444642e+00 4.965999999999999659e+01 1.213911111111111154e+02
530 | 8.461461461461462719e+00 4.965999999999999659e+01 1.222361761761762295e+02
531 | 8.478478478478479019e+00 4.965999999999999659e+01 1.230812412412412868e+02
532 | 8.495495495495497096e+00 4.965999999999999659e+01 1.239263063063064010e+02
533 | 8.512512512512513396e+00 4.965999999999999659e+01 1.247713713713714014e+02
534 | 8.529529529529529697e+00 4.965999999999999659e+01 1.256164364364364587e+02
535 | 8.546546546546547773e+00 4.965999999999999659e+01 1.264615015015015729e+02
536 | 8.563563563563564074e+00 4.965999999999999659e+01 1.273065665665665733e+02
537 | 8.580580580580582151e+00 4.965999999999999659e+01 1.281516316316316875e+02
538 | 8.597597597597598451e+00 4.965999999999999659e+01 1.289966966966967448e+02
539 | 8.614614614614614752e+00 4.965999999999999659e+01 1.298417617617617452e+02
540 | 8.631631631631632828e+00 4.965999999999999659e+01 1.306868268268268594e+02
541 | 8.648648648648649129e+00 4.965999999999999659e+01 1.315318918918919167e+02
542 | 8.665665665665667206e+00 4.965999999999999659e+01 1.323769569569570308e+02
543 | 8.682682682682683506e+00 4.965999999999999659e+01 1.332220220220220313e+02
544 | 8.699699699699699806e+00 4.965999999999999659e+01 1.340670870870870885e+02
545 | 8.716716716716717883e+00 4.965999999999999659e+01 1.349121521521522027e+02
546 | 8.733733733733734184e+00 4.965999999999999659e+01 1.357572172172172031e+02
547 | 8.750750750750752260e+00 4.965999999999999659e+01 1.366022822822823741e+02
548 | 8.767767767767768561e+00 4.965999999999999659e+01 1.374473473473473746e+02
549 | 8.784784784784784861e+00 4.965999999999999659e+01 1.382924124124124319e+02
550 | 8.801801801801802938e+00 4.965999999999999659e+01 1.391374774774775460e+02
551 | 8.818818818818819238e+00 4.965999999999999659e+01 1.399825425425425465e+02
552 | 8.835835835835837315e+00 4.965999999999999659e+01 1.408276076076076606e+02
553 | 8.852852852852853616e+00 4.965999999999999659e+01 1.416726726726727179e+02
554 | 8.869869869869869916e+00 4.965999999999999659e+01 1.425177377377377184e+02
555 | 8.886886886886887993e+00 4.965999999999999659e+01 1.433628028028028325e+02
556 | 8.903903903903904293e+00 4.965999999999999659e+01 1.442078678678678898e+02
557 | 8.920920920920922370e+00 4.965999999999999659e+01 1.450529329329330039e+02
558 | 8.937937937937938671e+00 4.965999999999999659e+01 1.458979979979980044e+02
559 | 8.954954954954956747e+00 4.965999999999999659e+01 1.467430630630631185e+02
560 | 8.971971971971973048e+00 4.965999999999999659e+01 1.475881281281281758e+02
561 | 8.988988988988989348e+00 4.965999999999999659e+01 1.484331931931931763e+02
562 | 9.006006006006007425e+00 4.965999999999999659e+01 1.492782582582582904e+02
563 | 9.023023023023023725e+00 4.965999999999999659e+01 1.501233233233233477e+02
564 | 9.040040040040041802e+00 4.965999999999999659e+01 1.509683883883884619e+02
565 | 9.057057057057058103e+00 4.965999999999999659e+01 1.518134534534535192e+02
566 | 9.074074074074074403e+00 4.965999999999999659e+01 1.526585185185185196e+02
567 | 9.091091091091092480e+00 4.965999999999999659e+01 1.535035835835836338e+02
568 | 9.108108108108108780e+00 4.965999999999999659e+01 1.543486486486486911e+02
569 | 9.125125125125126857e+00 4.965999999999999659e+01 1.551937137137138052e+02
570 | 9.142142142142143157e+00 4.965999999999999659e+01 1.560387787787788056e+02
571 | 9.159159159159159458e+00 4.965999999999999659e+01 1.568838438438438629e+02
572 | 9.176176176176177535e+00 4.965999999999999659e+01 1.577289089089089771e+02
573 | 9.193193193193193835e+00 4.965999999999999659e+01 1.585739739739739775e+02
574 | 9.210210210210211912e+00 4.965999999999999659e+01 1.594190390390390917e+02
575 | 9.227227227227228212e+00 4.965999999999999659e+01 1.602641041041041490e+02
576 | 9.244244244244244513e+00 4.965999999999999659e+01 1.611091691691691494e+02
577 | 9.261261261261262590e+00 4.965999999999999659e+01 1.619542342342342636e+02
578 | 9.278278278278278890e+00 4.965999999999999659e+01 1.627992992992993209e+02
579 | 9.295295295295296967e+00 4.965999999999999659e+01 1.636443643643644350e+02
580 | 9.312312312312313267e+00 4.965999999999999659e+01 1.644894294294294923e+02
581 | 9.329329329329329568e+00 4.965999999999999659e+01 1.653344944944944928e+02
582 | 9.346346346346347644e+00 4.965999999999999659e+01 1.661795595595596069e+02
583 | 9.363363363363363945e+00 4.965999999999999659e+01 1.670246246246246642e+02
584 | 9.380380380380382022e+00 4.965999999999999659e+01 1.678696896896897783e+02
585 | 9.397397397397398322e+00 4.965999999999999659e+01 1.687147547547547788e+02
586 | 9.414414414414414622e+00 4.965999999999999659e+01 1.695598198198198361e+02
587 | 9.431431431431432699e+00 4.965999999999999659e+01 1.704048848848849502e+02
588 | 9.448448448448449000e+00 4.965999999999999659e+01 1.712499499499499507e+02
589 | 9.465465465465467076e+00 4.965999999999999659e+01 1.720950150150150648e+02
590 | 9.482482482482483377e+00 4.965999999999999659e+01 1.729400800800801221e+02
591 | 9.499499499499499677e+00 4.965999999999999659e+01 1.737851451451451226e+02
592 | 9.516516516516517754e+00 4.965999999999999659e+01 1.746302102102102367e+02
593 | 9.533533533533534055e+00 4.965999999999999659e+01 1.754752752752752940e+02
594 | 9.550550550550552131e+00 4.965999999999999659e+01 1.763203403403404081e+02
595 | 9.567567567567568432e+00 4.965999999999999659e+01 1.771654054054054086e+02
596 | 9.584584584584584732e+00 4.965999999999999659e+01 1.780104704704704659e+02
597 | 9.601601601601602809e+00 4.965999999999999659e+01 1.788555355355355800e+02
598 | 9.618618618618619109e+00 4.965999999999999659e+01 1.797006006006006373e+02
599 | 9.635635635635637186e+00 4.965999999999999659e+01 1.805456656656657515e+02
600 | 9.652652652652653487e+00 4.965999999999999659e+01 1.813907307307307519e+02
601 | 9.669669669669669787e+00 4.965999999999999659e+01 1.822357957957958092e+02
602 | 9.686686686686687864e+00 4.965999999999999659e+01 1.830808608608609234e+02
603 | 9.703703703703704164e+00 4.965999999999999659e+01 1.839259259259259238e+02
604 | 9.720720720720722241e+00 4.965999999999999659e+01 1.847709909909910380e+02
605 | 9.737737737737738541e+00 4.965999999999999659e+01 1.856160560560560953e+02
606 | 9.754754754754756618e+00 4.965999999999999659e+01 1.864611211211212094e+02
607 | 9.771771771771772919e+00 4.965999999999999659e+01 1.873061861861862099e+02
608 | 9.788788788788789219e+00 4.965999999999999659e+01 1.881512512512512671e+02
609 | 9.805805805805807296e+00 4.965999999999999659e+01 1.889963163163163813e+02
610 | 9.822822822822823596e+00 4.965999999999999659e+01 1.898413813813813817e+02
611 | 9.839839839839841673e+00 4.965999999999999659e+01 1.906864464464465527e+02
612 | 9.856856856856857974e+00 4.965999999999999659e+01 1.915315115115115532e+02
613 | 9.873873873873874274e+00 4.965999999999999659e+01 1.923765765765766105e+02
614 | 9.890890890890892351e+00 4.965999999999999659e+01 1.932216416416417246e+02
615 | 9.907907907907908651e+00 4.965999999999999659e+01 1.940667067067067251e+02
616 | 9.924924924924926728e+00 4.965999999999999659e+01 1.949117717717718392e+02
617 | 9.941941941941943028e+00 4.965999999999999659e+01 1.957568368368368965e+02
618 | 9.958958958958959329e+00 4.965999999999999659e+01 1.966019019019018970e+02
619 | 9.975975975975977406e+00 4.965999999999999659e+01 1.974469669669670111e+02
620 | 9.992992992992993706e+00 4.965999999999999659e+01 1.982920320320320684e+02
621 | 1.001001001001001178e+01 -4.393999999999999773e+01 1.982001601601600669e+02
622 | 1.002702702702702808e+01 -4.393999999999999773e+01 1.974524324324323459e+02
623 | 1.004404404404404438e+01 -4.393999999999999773e+01 1.967047047047046817e+02
624 | 1.006106106106106246e+01 -4.393999999999999773e+01 1.959569769769769039e+02
625 | 1.007807807807807876e+01 -4.393999999999999773e+01 1.952092492492491829e+02
626 | 1.009509509509509684e+01 -4.393999999999999773e+01 1.944615215215214050e+02
627 | 1.011211211211211314e+01 -4.393999999999999773e+01 1.937137937937937409e+02
628 | 1.012912912912912944e+01 -4.393999999999999773e+01 1.929660660660660199e+02
629 | 1.014614614614614752e+01 -4.393999999999999773e+01 1.922183383383382989e+02
630 | 1.016316316316316382e+01 -4.393999999999999773e+01 1.914706106106105779e+02
631 | 1.018018018018018189e+01 -4.393999999999999773e+01 1.907228828828828000e+02
632 | 1.019719719719719819e+01 -4.393999999999999773e+01 1.899751551551551074e+02
633 | 1.021421421421421449e+01 -4.393999999999999773e+01 1.892274274274273864e+02
634 | 1.023123123123123257e+01 -4.393999999999999773e+01 1.884796996996996086e+02
635 | 1.024824824824824887e+01 -4.393999999999999773e+01 1.877319719719719444e+02
636 | 1.026526526526526695e+01 -4.393999999999999773e+01 1.869842442442441666e+02
637 | 1.028228228228228325e+01 -4.393999999999999773e+01 1.862365165165164456e+02
638 | 1.029929929929929955e+01 -4.393999999999999773e+01 1.854887887887887814e+02
639 | 1.031631631631631763e+01 -4.393999999999999773e+01 1.847410610610610036e+02
640 | 1.033333333333333393e+01 -4.393999999999999773e+01 1.839933333333332826e+02
641 | 1.035035035035035200e+01 -4.393999999999999773e+01 1.832456056056055047e+02
642 | 1.036736736736736830e+01 -4.393999999999999773e+01 1.824978778778777837e+02
643 | 1.038438438438438460e+01 -4.393999999999999773e+01 1.817501501501501480e+02
644 | 1.040140140140140268e+01 -4.393999999999999773e+01 1.810024224224223985e+02
645 | 1.041841841841841898e+01 -4.393999999999999773e+01 1.802546946946946491e+02
646 | 1.043543543543543706e+01 -4.393999999999999773e+01 1.795069669669668713e+02
647 | 1.045245245245245336e+01 -4.393999999999999773e+01 1.787592392392391503e+02
648 | 1.046946946946946966e+01 -4.393999999999999773e+01 1.780115115115115429e+02
649 | 1.048648648648648773e+01 -4.393999999999999773e+01 1.772637837837837651e+02
650 | 1.050350350350350404e+01 -4.393999999999999773e+01 1.765160560560560441e+02
651 | 1.052052052052052211e+01 -4.393999999999999773e+01 1.757683283283282663e+02
652 | 1.053753753753753841e+01 -4.393999999999999773e+01 1.750206006006005452e+02
653 | 1.055455455455455649e+01 -4.393999999999999773e+01 1.742728728728727674e+02
654 | 1.057157157157157279e+01 -4.393999999999999773e+01 1.735251451451450180e+02
655 | 1.058858858858858909e+01 -4.393999999999999773e+01 1.727774174174174391e+02
656 | 1.060560560560560717e+01 -4.393999999999999773e+01 1.720296896896896328e+02
657 | 1.062262262262262347e+01 -4.393999999999999773e+01 1.712819619619619118e+02
658 | 1.063963963963964154e+01 -4.393999999999999773e+01 1.705342342342341340e+02
659 | 1.065665665665665784e+01 -4.393999999999999773e+01 1.697865065065064130e+02
660 | 1.067367367367367414e+01 -4.393999999999999773e+01 1.690387787787786920e+02
661 | 1.069069069069069222e+01 -4.393999999999999773e+01 1.682910510510510278e+02
662 | 1.070770770770770852e+01 -4.393999999999999773e+01 1.675433233233233068e+02
663 | 1.072472472472472660e+01 -4.393999999999999773e+01 1.667955955955955289e+02
664 | 1.074174174174174290e+01 -4.393999999999999773e+01 1.660478678678678079e+02
665 | 1.075875875875875920e+01 -4.393999999999999773e+01 1.653001401401400585e+02
666 | 1.077577577577577728e+01 -4.393999999999999773e+01 1.645524124124123091e+02
667 | 1.079279279279279358e+01 -4.393999999999999773e+01 1.638046846846846734e+02
668 | 1.080980980980981165e+01 -4.393999999999999773e+01 1.630569569569569239e+02
669 | 1.082682682682682795e+01 -4.393999999999999773e+01 1.623092292292291745e+02
670 | 1.084384384384384425e+01 -4.393999999999999773e+01 1.615615015015014535e+02
671 | 1.086086086086086233e+01 -4.393999999999999773e+01 1.608137737737736757e+02
672 | 1.087787787787787863e+01 -4.393999999999999773e+01 1.600660460460459547e+02
673 | 1.089489489489489671e+01 -4.393999999999999773e+01 1.593183183183181768e+02
674 | 1.091191191191191301e+01 -4.393999999999999773e+01 1.585705905905905695e+02
675 | 1.092892892892892931e+01 -4.393999999999999773e+01 1.578228628628628485e+02
676 | 1.094594594594594739e+01 -4.393999999999999773e+01 1.570751351351350422e+02
677 | 1.096296296296296369e+01 -4.393999999999999773e+01 1.563274074074073496e+02
678 | 1.097997997997998176e+01 -4.393999999999999773e+01 1.555796796796795434e+02
679 | 1.099699699699699806e+01 -4.393999999999999773e+01 1.548319519519519645e+02
680 | 1.101401401401401436e+01 -4.393999999999999773e+01 1.540842242242242150e+02
681 | 1.103103103103103244e+01 -4.393999999999999773e+01 1.533364964964964656e+02
682 | 1.104804804804804874e+01 -4.393999999999999773e+01 1.525887687687687162e+02
683 | 1.106506506506506682e+01 -4.393999999999999773e+01 1.518410410410409384e+02
684 | 1.108208208208208312e+01 -4.393999999999999773e+01 1.510933133133132173e+02
685 | 1.109909909909909942e+01 -4.393999999999999773e+01 1.503455855855856100e+02
686 | 1.111611611611611750e+01 -4.393999999999999773e+01 1.495978578578578322e+02
687 | 1.113313313313313380e+01 -4.393999999999999773e+01 1.488501301301300828e+02
688 | 1.115015015015015187e+01 -4.393999999999999773e+01 1.481024024024023333e+02
689 | 1.116716716716716817e+01 -4.393999999999999773e+01 1.473546746746745839e+02
690 | 1.118418418418418447e+01 -4.393999999999999773e+01 1.466069469469468913e+02
691 | 1.120120120120120255e+01 -4.393999999999999773e+01 1.458592192192190851e+02
692 | 1.121821821821821885e+01 -4.393999999999999773e+01 1.451114914914914777e+02
693 | 1.123523523523523693e+01 -4.393999999999999773e+01 1.443637637637636999e+02
694 | 1.125225225225225323e+01 -4.393999999999999773e+01 1.436160360360359789e+02
695 | 1.126926926926926953e+01 -4.393999999999999773e+01 1.428683083083082579e+02
696 | 1.128628628628628761e+01 -4.393999999999999773e+01 1.421205805805804800e+02
697 | 1.130330330330330391e+01 -4.393999999999999773e+01 1.413728528528528727e+02
698 | 1.132032032032032198e+01 -4.393999999999999773e+01 1.406251251251250949e+02
699 | 1.133733733733733828e+01 -4.393999999999999773e+01 1.398773973973973739e+02
700 | 1.135435435435435636e+01 -4.393999999999999773e+01 1.391296696696695676e+02
701 | 1.137137137137137266e+01 -4.393999999999999773e+01 1.383819419419418750e+02
702 | 1.138838838838838896e+01 -4.393999999999999773e+01 1.376342142142141256e+02
703 | 1.140540540540540704e+01 -4.393999999999999773e+01 1.368864864864863478e+02
704 | 1.142242242242242334e+01 -4.393999999999999773e+01 1.361387587587587404e+02
705 | 1.143943943943944141e+01 -4.393999999999999773e+01 1.353910310310309626e+02
706 | 1.145645645645645772e+01 -4.393999999999999773e+01 1.346433033033032416e+02
707 | 1.147347347347347402e+01 -4.393999999999999773e+01 1.338955755755755206e+02
708 | 1.149049049049049209e+01 -4.393999999999999773e+01 1.331478478478477427e+02
709 | 1.150750750750750839e+01 -4.393999999999999773e+01 1.324001201201200217e+02
710 | 1.152452452452452647e+01 -4.393999999999999773e+01 1.316523923923923576e+02
711 | 1.154154154154154277e+01 -4.393999999999999773e+01 1.309046646646646366e+02
712 | 1.155855855855855907e+01 -4.393999999999999773e+01 1.301569369369369156e+02
713 | 1.157557557557557715e+01 -4.393999999999999773e+01 1.294092092092091377e+02
714 | 1.159259259259259345e+01 -4.393999999999999773e+01 1.286614814814813883e+02
715 | 1.160960960960961152e+01 -4.393999999999999773e+01 1.279137537537536105e+02
716 | 1.162662662662662783e+01 -4.393999999999999773e+01 1.271660260260260031e+02
717 | 1.164364364364364413e+01 -4.393999999999999773e+01 1.264182982982982821e+02
718 | 1.166066066066066220e+01 -4.393999999999999773e+01 1.256705705705705043e+02
719 | 1.167767767767767850e+01 -4.393999999999999773e+01 1.249228428428427833e+02
720 | 1.169469469469469658e+01 -4.393999999999999773e+01 1.241751151151150054e+02
721 | 1.171171171171171288e+01 -4.393999999999999773e+01 1.234273873873872844e+02
722 | 1.172872872872872918e+01 -4.393999999999999773e+01 1.226796596596596771e+02
723 | 1.174574574574574726e+01 -4.393999999999999773e+01 1.219319319319318993e+02
724 | 1.176276276276276356e+01 -4.393999999999999773e+01 1.211842042042041783e+02
725 | 1.177977977977978163e+01 -4.393999999999999773e+01 1.204364764764764004e+02
726 | 1.179679679679679793e+01 -4.393999999999999773e+01 1.196887487487486510e+02
727 | 1.181381381381381424e+01 -4.393999999999999773e+01 1.189410210210210437e+02
728 | 1.183083083083083231e+01 -4.393999999999999773e+01 1.181932932932932658e+02
729 | 1.184784784784784861e+01 -4.393999999999999773e+01 1.174455655655655448e+02
730 | 1.186486486486486669e+01 -4.393999999999999773e+01 1.166978378378377670e+02
731 | 1.188188188188188299e+01 -4.393999999999999773e+01 1.159501101101100460e+02
732 | 1.189889889889889929e+01 -4.393999999999999773e+01 1.152023823823823250e+02
733 | 1.191591591591591737e+01 -4.393999999999999773e+01 1.144546546546545471e+02
734 | 1.193293293293293367e+01 -4.393999999999999773e+01 1.137069269269269398e+02
735 | 1.194994994994995174e+01 -4.393999999999999773e+01 1.129591991991991620e+02
736 | 1.196696696696696804e+01 -4.393999999999999773e+01 1.122114714714714125e+02
737 | 1.198398398398398434e+01 -4.393999999999999773e+01 1.114637437437436915e+02
738 | 1.200100100100100242e+01 -4.393999999999999773e+01 1.107160160160159137e+02
739 | 1.201801801801801872e+01 -4.393999999999999773e+01 1.099682882882881927e+02
740 | 1.203503503503503680e+01 -4.393999999999999773e+01 1.092205605605604148e+02
741 | 1.205205205205205310e+01 -4.393999999999999773e+01 1.084728328328328075e+02
742 | 1.206906906906906940e+01 -4.393999999999999773e+01 1.077251051051050865e+02
743 | 1.208608608608608748e+01 -4.393999999999999773e+01 1.069773773773773087e+02
744 | 1.210310310310310378e+01 -4.393999999999999773e+01 1.062296496496495877e+02
745 | 1.212012012012012185e+01 -4.393999999999999773e+01 1.054819219219218098e+02
746 | 1.213713713713713815e+01 -4.393999999999999773e+01 1.047341941941942025e+02
747 | 1.215415415415415623e+01 -4.393999999999999773e+01 1.039864664664664247e+02
748 | 1.217117117117117253e+01 -4.393999999999999773e+01 1.032387387387386752e+02
749 | 1.218818818818818883e+01 -4.393999999999999773e+01 1.024910110110109542e+02
750 | 1.220520520520520691e+01 -4.393999999999999773e+01 1.017432832832831764e+02
751 | 1.222222222222222321e+01 -4.393999999999999773e+01 1.009955555555554554e+02
752 | 1.223923923923924129e+01 -4.393999999999999773e+01 1.002478278278276775e+02
753 | 1.225625625625625759e+01 -4.393999999999999773e+01 9.950010010010007022e+01
754 | 1.227327327327327389e+01 -4.393999999999999773e+01 9.875237237237234922e+01
755 | 1.229029029029029196e+01 -4.393999999999999773e+01 9.800464464464457137e+01
756 | 1.230730730730730826e+01 -4.393999999999999773e+01 9.725691691691685037e+01
757 | 1.232432432432432634e+01 -4.393999999999999773e+01 9.650918918918907252e+01
758 | 1.234134134134134264e+01 -4.393999999999999773e+01 9.576146146146135152e+01
759 | 1.235835835835835894e+01 -4.393999999999999773e+01 9.501373373373371578e+01
760 | 1.237537537537537702e+01 -4.393999999999999773e+01 9.426600600600593793e+01
761 | 1.239239239239239332e+01 -4.393999999999999773e+01 9.351827827827821693e+01
762 | 1.240940940940941140e+01 -4.393999999999999773e+01 9.277055055055043908e+01
763 | 1.242642642642642770e+01 -4.393999999999999773e+01 9.202282282282271808e+01
764 | 1.244344344344344400e+01 -4.393999999999999773e+01 9.127509509509511076e+01
765 | 1.246046046046046207e+01 -4.393999999999999773e+01 9.052736736736733292e+01
766 | 1.247747747747747837e+01 -4.393999999999999773e+01 8.977963963963961191e+01
767 | 1.249449449449449645e+01 -4.393999999999999773e+01 8.903191191191183407e+01
768 | 1.251151151151151275e+01 -4.393999999999999773e+01 8.828418418418411306e+01
769 | 1.252852852852852905e+01 -4.393999999999999773e+01 8.753645645645639206e+01
770 | 1.254554554554554713e+01 -4.393999999999999773e+01 8.678872872872861421e+01
771 | 1.256256256256256343e+01 -4.393999999999999773e+01 8.604100100100097848e+01
772 | 1.257957957957958151e+01 -4.393999999999999773e+01 8.529327327327320063e+01
773 | 1.259659659659659781e+01 -4.393999999999999773e+01 8.454554554554547963e+01
774 | 1.261361361361361411e+01 -4.393999999999999773e+01 8.379781781781775862e+01
775 | 1.263063063063063218e+01 -4.393999999999999773e+01 8.305009009008998078e+01
776 | 1.264764764764764848e+01 -4.393999999999999773e+01 8.230236236236237346e+01
777 | 1.266466466466466656e+01 -4.393999999999999773e+01 8.155463463463459561e+01
778 | 1.268168168168168286e+01 -4.393999999999999773e+01 8.080690690690687461e+01
779 | 1.269869869869869916e+01 -4.393999999999999773e+01 8.005917917917915361e+01
780 | 1.271571571571571724e+01 -4.393999999999999773e+01 7.931145145145137576e+01
781 | 1.273273273273273354e+01 -4.393999999999999773e+01 7.856372372372365476e+01
782 | 1.274974974974975162e+01 -4.393999999999999773e+01 7.781599599599587691e+01
783 | 1.276676676676676792e+01 -4.393999999999999773e+01 7.706826826826824117e+01
784 | 1.278378378378378422e+01 -4.393999999999999773e+01 7.632054054054054859e+01
785 | 1.280080080080080229e+01 -4.393999999999999773e+01 7.557281281281274232e+01
786 | 1.281781781781781859e+01 -4.393999999999999773e+01 7.482508508508504974e+01
787 | 1.283483483483483667e+01 -4.393999999999999773e+01 7.407735735735724347e+01
788 | 1.285185185185185297e+01 -4.393999999999999773e+01 7.332962962962955089e+01
789 | 1.286886886886887105e+01 -4.393999999999999773e+01 7.258190190190174462e+01
790 | 1.288588588588588735e+01 -4.393999999999999773e+01 7.183417417417410888e+01
791 | 1.290290290290290365e+01 -4.393999999999999773e+01 7.108644644644641630e+01
792 | 1.291991991991992172e+01 -4.393999999999999773e+01 7.033871871871861003e+01
793 | 1.293693693693693803e+01 -4.393999999999999773e+01 6.959099099099091745e+01
794 | 1.295395395395395610e+01 -4.393999999999999773e+01 6.884326326326311118e+01
795 | 1.297097097097097240e+01 -4.393999999999999773e+01 6.809553553553553229e+01
796 | 1.298798798798798870e+01 -4.393999999999999773e+01 6.734780780780778286e+01
797 | 1.300500500500500678e+01 -4.393999999999999773e+01 6.660008008008003344e+01
798 | 1.302202202202202308e+01 -4.393999999999999773e+01 6.585235235235228402e+01
799 | 1.303903903903904116e+01 -4.393999999999999773e+01 6.510462462462453459e+01
800 | 1.305605605605605746e+01 -4.393999999999999773e+01 6.435689689689678517e+01
801 | 1.307307307307307376e+01 -4.393999999999999773e+01 6.360916916916914943e+01
802 | 1.309009009009009183e+01 -4.393999999999999773e+01 6.286144144144140000e+01
803 | 1.310710710710710813e+01 -4.393999999999999773e+01 6.211371371371365058e+01
804 | 1.312412412412412621e+01 -4.393999999999999773e+01 6.136598598598590115e+01
805 | 1.314114114114114251e+01 -4.393999999999999773e+01 6.061825825825815173e+01
806 | 1.315815815815815881e+01 -4.393999999999999773e+01 5.987053053053045915e+01
807 | 1.317517517517517689e+01 -4.393999999999999773e+01 5.912280280280265288e+01
808 | 1.319219219219219319e+01 -4.393999999999999773e+01 5.837507507507507398e+01
809 | 1.320920920920921127e+01 -4.393999999999999773e+01 5.762734734734726771e+01
810 | 1.322622622622622757e+01 -4.393999999999999773e+01 5.687961961961957513e+01
811 | 1.324324324324324387e+01 -4.393999999999999773e+01 5.613189189189182571e+01
812 | 1.326026026026026194e+01 -4.393999999999999773e+01 5.538416416416407628e+01
813 | 1.327727727727727824e+01 -4.393999999999999773e+01 5.463643643643644054e+01
814 | 1.329429429429429632e+01 -4.393999999999999773e+01 5.388870870870863428e+01
815 | 1.331131131131131262e+01 -4.393999999999999773e+01 5.314098098098094169e+01
816 | 1.332832832832832892e+01 -4.393999999999999773e+01 5.239325325325319227e+01
817 | 1.334534534534534700e+01 -4.393999999999999773e+01 5.164552552552544284e+01
818 | 1.336236236236236330e+01 -4.393999999999999773e+01 5.089779779779769342e+01
819 | 1.337937937937938138e+01 -4.393999999999999773e+01 5.015007007006994399e+01
820 | 1.339639639639639768e+01 -4.393999999999999773e+01 4.940234234234230826e+01
821 | 1.341341341341341398e+01 -4.393999999999999773e+01 4.865461461461461568e+01
822 | 1.343043043043043205e+01 -4.393999999999999773e+01 4.790688688688680941e+01
823 | 1.344744744744744835e+01 -4.393999999999999773e+01 4.715915915915905998e+01
824 | 1.346446446446446643e+01 -4.393999999999999773e+01 4.641143143143131056e+01
825 | 1.348148148148148273e+01 -4.393999999999999773e+01 4.566370370370367482e+01
826 | 1.349849849849849903e+01 -4.393999999999999773e+01 4.491597597597598224e+01
827 | 1.351551551551551711e+01 -4.393999999999999773e+01 4.416824824824817597e+01
828 | 1.353253253253253341e+01 -4.393999999999999773e+01 4.342052052052048339e+01
829 | 1.354954954954955149e+01 -4.393999999999999773e+01 4.267279279279267712e+01
830 | 1.356656656656656779e+01 -4.393999999999999773e+01 4.192506506506498454e+01
831 | 1.358358358358358409e+01 -4.393999999999999773e+01 4.117733733733734880e+01
832 | 1.360060060060060216e+01 -4.393999999999999773e+01 4.042960960960959937e+01
833 | 1.361761761761761846e+01 -4.393999999999999773e+01 3.968188188188184995e+01
834 | 1.363463463463463654e+01 -4.393999999999999773e+01 3.893415415415410052e+01
835 | 1.365165165165165284e+01 -4.393999999999999773e+01 3.818642642642635110e+01
836 | 1.366866866866867092e+01 -4.393999999999999773e+01 3.743869869869854483e+01
837 | 1.368568568568568722e+01 -4.393999999999999773e+01 3.669097097097085225e+01
838 | 1.370270270270270352e+01 -4.393999999999999773e+01 3.594324324324321651e+01
839 | 1.371971971971972160e+01 -4.393999999999999773e+01 3.519551551551546709e+01
840 | 1.373673673673673790e+01 -4.393999999999999773e+01 3.444778778778771766e+01
841 | 1.375375375375375597e+01 -4.393999999999999773e+01 3.370006006005996824e+01
842 | 1.377077077077077227e+01 -4.393999999999999773e+01 3.295233233233221881e+01
843 | 1.378778778778778857e+01 -4.393999999999999773e+01 3.220460460460463992e+01
844 | 1.380480480480480665e+01 -4.393999999999999773e+01 3.145687687687683365e+01
845 | 1.382182182182182295e+01 -4.393999999999999773e+01 3.070914914914914107e+01
846 | 1.383883883883884103e+01 -4.393999999999999773e+01 2.996142142142133480e+01
847 | 1.385585585585585733e+01 -4.393999999999999773e+01 2.921369369369358537e+01
848 | 1.387287287287287363e+01 -4.393999999999999773e+01 2.846596596596589279e+01
849 | 1.388988988988989171e+01 -4.393999999999999773e+01 2.771823823823808652e+01
850 | 1.390690690690690801e+01 -4.393999999999999773e+01 2.697051051051050763e+01
851 | 1.392392392392392608e+01 -4.393999999999999773e+01 2.622278278278270136e+01
852 | 1.394094094094094238e+01 -4.393999999999999773e+01 2.547505505505500878e+01
853 | 1.395795795795795868e+01 -4.393999999999999773e+01 2.472732732732725935e+01
854 | 1.397497497497497676e+01 -4.393999999999999773e+01 2.397959959959950993e+01
855 | 1.399199199199199306e+01 -4.393999999999999773e+01 2.323187187187176050e+01
856 | 1.400900900900901114e+01 -4.393999999999999773e+01 2.248414414414401108e+01
857 | 1.402602602602602744e+01 -4.393999999999999773e+01 2.173641641641637534e+01
858 | 1.404304304304304374e+01 -4.393999999999999773e+01 2.098868868868862592e+01
859 | 1.406006006006006182e+01 -4.393999999999999773e+01 2.024096096096087649e+01
860 | 1.407707707707707812e+01 -4.393999999999999773e+01 1.949323323323312707e+01
861 | 1.409409409409409619e+01 -4.393999999999999773e+01 1.874550550550537764e+01
862 | 1.411111111111111249e+01 -4.393999999999999773e+01 1.799777777777774190e+01
863 | 1.412812812812812879e+01 -4.393999999999999773e+01 1.725005005005004932e+01
864 | 1.414514514514514687e+01 -4.393999999999999773e+01 1.650232232232224305e+01
865 | 1.416216216216216317e+01 -4.393999999999999773e+01 1.575459459459455047e+01
866 | 1.417917917917918125e+01 -4.393999999999999773e+01 1.500686686686674420e+01
867 | 1.419619619619619755e+01 -4.393999999999999773e+01 1.425913913913905162e+01
868 | 1.421321321321321385e+01 -4.393999999999999773e+01 1.351141141141141588e+01
869 | 1.423023023023023192e+01 -4.393999999999999773e+01 1.276368368368366646e+01
870 | 1.424724724724724823e+01 -4.393999999999999773e+01 1.201595595595591703e+01
871 | 1.426426426426426630e+01 -4.393999999999999773e+01 1.126822822822811077e+01
872 | 1.428128128128128260e+01 -4.393999999999999773e+01 1.052050050050041818e+01
873 | 1.429829829829829890e+01 -4.393999999999999773e+01 9.772772772772668759e+00
874 | 1.431531531531531698e+01 -4.393999999999999773e+01 9.025045045045033021e+00
875 | 1.433233233233233328e+01 -4.393999999999999773e+01 8.277317317317283596e+00
876 | 1.434934934934935136e+01 -4.393999999999999773e+01 7.529589589589534171e+00
877 | 1.436636636636636766e+01 -4.393999999999999773e+01 6.781861861861784746e+00
878 | 1.438338338338338396e+01 -4.393999999999999773e+01 6.034134134134092164e+00
879 | 1.440040040040040203e+01 -4.393999999999999773e+01 5.286406406406285896e+00
880 | 1.441741741741741833e+01 -4.393999999999999773e+01 4.538678678678707001e+00
881 | 1.443443443443443641e+01 -4.393999999999999773e+01 3.790950950950900733e+00
882 | 1.445145145145145271e+01 -4.393999999999999773e+01 3.043223223223151308e+00
883 | 1.446846846846847079e+01 -4.393999999999999773e+01 2.295495495495401883e+00
884 | 1.448548548548548709e+01 -4.393999999999999773e+01 1.547767767767652458e+00
885 | 1.450250250250250339e+01 -4.393999999999999773e+01 8.000400400399598766e-01
886 | 1.451951951951952147e+01 -4.393999999999999773e+01 5.231231231215360822e-02
887 | 1.453653653653653777e+01 -4.393999999999999773e+01 -6.954154154154252865e-01
888 | 1.455355355355355584e+01 -4.393999999999999773e+01 -1.443143143143231555e+00
889 | 1.457057057057057214e+01 -4.393999999999999773e+01 -2.190870870870924136e+00
890 | 1.458758758758758844e+01 -4.393999999999999773e+01 -2.938598598598673561e+00
891 | 1.460460460460460652e+01 -4.393999999999999773e+01 -3.686326326326422986e+00
892 | 1.462162162162162282e+01 -4.393999999999999773e+01 -4.434054054054058724e+00
893 | 1.463863863863864090e+01 -4.393999999999999773e+01 -5.181781781781808149e+00
894 | 1.465565565565565720e+01 -4.393999999999999773e+01 -5.929509509509557574e+00
895 | 1.467267267267267350e+01 -4.393999999999999773e+01 -6.677237237237306999e+00
896 | 1.468968968968969158e+01 -4.393999999999999773e+01 -7.424964964965056424e+00
897 | 1.470670670670670788e+01 -4.393999999999999773e+01 -8.172692692692805849e+00
898 | 1.472372372372372595e+01 -4.393999999999999773e+01 -8.920420420420555274e+00
899 | 1.474074074074074225e+01 -4.393999999999999773e+01 -9.668148148148191012e+00
900 | 1.475775775775775855e+01 -4.393999999999999773e+01 -1.041587587587588359e+01
901 | 1.477477477477477663e+01 -4.393999999999999773e+01 -1.116360360360368986e+01
902 | 1.479179179179179293e+01 -4.393999999999999773e+01 -1.191133133133138244e+01
903 | 1.480880880880881101e+01 -4.393999999999999773e+01 -1.265905905905918871e+01
904 | 1.482582582582582731e+01 -4.393999999999999773e+01 -1.340678678678688129e+01
905 | 1.484284284284284361e+01 -4.393999999999999773e+01 -1.415451451451451703e+01
906 | 1.485985985985986169e+01 -4.393999999999999773e+01 -1.490224224224232330e+01
907 | 1.487687687687687799e+01 -4.393999999999999773e+01 -1.564996996997001588e+01
908 | 1.489389389389389606e+01 -4.393999999999999773e+01 -1.639769769769782215e+01
909 | 1.491091091091091236e+01 -4.393999999999999773e+01 -1.714542542542551473e+01
910 | 1.492792792792792866e+01 -4.393999999999999773e+01 -1.789315315315315047e+01
911 | 1.494494494494494674e+01 -4.393999999999999773e+01 -1.864088088088089989e+01
912 | 1.496196196196196304e+01 -4.393999999999999773e+01 -1.938860860860864932e+01
913 | 1.497897897897898112e+01 -4.393999999999999773e+01 -2.013633633633639874e+01
914 | 1.499599599599599742e+01 -4.393999999999999773e+01 -2.088406406406414817e+01
915 | 1.501301301301301550e+01 -4.393999999999999773e+01 -2.163179179179189759e+01
916 | 1.503003003003003002e+01 -4.393999999999999773e+01 -2.237951951951947649e+01
917 | 1.504704704704704810e+01 -4.393999999999999773e+01 -2.312724724724728276e+01
918 | 1.506406406406406617e+01 -4.393999999999999773e+01 -2.387497497497503218e+01
919 | 1.508108108108108425e+01 -4.393999999999999773e+01 -2.462270270270283845e+01
920 | 1.509809809809809877e+01 -4.393999999999999773e+01 -2.537043043043047419e+01
921 | 1.511511511511511685e+01 -4.393999999999999773e+01 -2.611815815815828046e+01
922 | 1.513213213213213493e+01 -4.393999999999999773e+01 -2.686588588588602988e+01
923 | 1.514914914914914945e+01 -4.393999999999999773e+01 -2.761361361361360878e+01
924 | 1.516616616616616753e+01 -4.393999999999999773e+01 -2.836134134134135820e+01
925 | 1.518318318318318561e+01 -4.393999999999999773e+01 -2.910906906906916447e+01
926 | 1.520020020020020013e+01 -4.393999999999999773e+01 -2.985679679679680021e+01
927 | 1.521721721721721821e+01 -4.393999999999999773e+01 -3.060452452452460648e+01
928 | 1.523423423423423628e+01 -4.393999999999999773e+01 -3.135225225225235590e+01
929 | 1.525125125125125436e+01 -4.393999999999999773e+01 -3.209997997998016217e+01
930 | 1.526826826826826888e+01 -4.393999999999999773e+01 -3.284770770770774106e+01
931 | 1.528528528528528696e+01 -4.393999999999999773e+01 -3.359543543543549049e+01
932 | 1.530230230230230504e+01 -4.393999999999999773e+01 -3.434316316316329676e+01
933 | 1.531931931931931956e+01 -4.393999999999999773e+01 -3.509089089089093250e+01
934 | 1.533633633633633764e+01 -4.393999999999999773e+01 -3.583861861861873876e+01
935 | 1.535335335335335571e+01 -4.393999999999999773e+01 -3.658634634634648819e+01
936 | 1.537037037037037024e+01 -4.393999999999999773e+01 -3.733407407407406708e+01
937 | 1.538738738738738832e+01 -4.393999999999999773e+01 -3.808180180180181651e+01
938 | 1.540440440440440639e+01 -4.393999999999999773e+01 -3.882952952952962278e+01
939 | 1.542142142142142447e+01 -4.393999999999999773e+01 -3.957725725725737220e+01
940 | 1.543843843843843899e+01 -4.393999999999999773e+01 -4.032498498498495110e+01
941 | 1.545545545545545707e+01 -4.393999999999999773e+01 -4.107271271271275737e+01
942 | 1.547247247247247515e+01 -4.393999999999999773e+01 -4.182044044044056363e+01
943 | 1.548948948948948967e+01 -4.393999999999999773e+01 -4.256816816816814253e+01
944 | 1.550650650650650775e+01 -4.393999999999999773e+01 -4.331589589589594880e+01
945 | 1.552352352352352582e+01 -4.393999999999999773e+01 -4.406362362362375507e+01
946 | 1.554054054054054035e+01 -4.393999999999999773e+01 -4.481135135135133396e+01
947 | 1.555755755755755843e+01 -4.393999999999999773e+01 -4.555907907907902654e+01
948 | 1.557457457457457650e+01 -4.393999999999999773e+01 -4.630680680680683281e+01
949 | 1.559159159159159458e+01 -4.393999999999999773e+01 -4.705453453453463908e+01
950 | 1.560860860860860910e+01 -4.393999999999999773e+01 -4.780226226226233166e+01
951 | 1.562562562562562718e+01 -4.393999999999999773e+01 -4.854998998999002424e+01
952 | 1.564264264264264526e+01 -4.393999999999999773e+01 -4.929771771771783051e+01
953 | 1.565965965965965978e+01 -4.393999999999999773e+01 -5.004544544544540940e+01
954 | 1.567667667667667786e+01 -4.393999999999999773e+01 -5.079317317317321567e+01
955 | 1.569369369369369593e+01 -4.393999999999999773e+01 -5.154090090090102194e+01
956 | 1.571071071071071401e+01 -4.393999999999999773e+01 -5.228862862862871452e+01
957 | 1.572772772772772854e+01 -4.393999999999999773e+01 -5.303635635635640710e+01
958 | 1.574474474474474661e+01 -4.393999999999999773e+01 -5.378408408408421337e+01
959 | 1.576176176176176469e+01 -4.393999999999999773e+01 -5.453181181181201964e+01
960 | 1.577877877877877921e+01 -4.393999999999999773e+01 -5.527953953953948485e+01
961 | 1.579579579579579729e+01 -4.393999999999999773e+01 -5.602726726726729112e+01
962 | 1.581281281281281537e+01 -4.393999999999999773e+01 -5.677499499499509739e+01
963 | 1.582982982982982989e+01 -4.393999999999999773e+01 -5.752272272272278997e+01
964 | 1.584684684684684797e+01 -4.393999999999999773e+01 -5.827045045045059624e+01
965 | 1.586386386386386604e+01 -4.393999999999999773e+01 -5.901817817817828882e+01
966 | 1.588088088088088412e+01 -4.393999999999999773e+01 -5.976590590590609509e+01
967 | 1.589789789789789864e+01 -4.393999999999999773e+01 -6.051363363363367398e+01
968 | 1.591491491491491672e+01 -4.393999999999999773e+01 -6.126136136136148025e+01
969 | 1.593193193193193480e+01 -4.393999999999999773e+01 -6.200908908908917283e+01
970 | 1.594894894894894932e+01 -4.393999999999999773e+01 -6.275681681681686541e+01
971 | 1.596596596596596740e+01 -4.393999999999999773e+01 -6.350454454454467168e+01
972 | 1.598298298298298548e+01 -4.393999999999999773e+01 -6.425227227227236426e+01
973 | 1.600000000000000000e+01 0.000000000000000000e+00 5.684341886080801487e-14
974 |
--------------------------------------------------------------------------------
/tests/test_hinge.py:
--------------------------------------------------------------------------------
1 | from beamframe import *
2 |
3 | b= Beam(18)
4 | ra = Reaction(0, 'f', 'A')
5 | rb = Reaction(b.length, 'r', 'B')
6 | h = Hinge(8, side='right')
7 | p = PointLoad(13,4,True)
8 |
9 | b.add_loads((ra, rb, p))
10 | b.add_moments((ra, rb, p, h))
11 | b.calculate_reactions((ra,rb))
12 | b.generate_moment_equation((ra,rb,p))
13 | b.generate_shear_equation((ra ,rb, p))
14 |
15 | x = np.linspace(-1, b.length, 1000)
16 | plt.rc('font', family='serif', size=14)
17 | fig, ax = plt.subplots(facecolor='w', edgecolor='w', num="BMD vs SFD")
18 | ax.plot(x, b.mom_fn(x), label="BMD (kNm)")
19 | ax.plot(x, b.shear_fn(x), label="SFD (kN)")
20 | ax.set_xticks(np.arange(0, b.length+1,1))
21 | ax.axhline(y=0, color='k', label='beam')
22 | ax.set_title("BMD vs SFD of Beam")
23 | ax.set_xlabel("x (m)")
24 | ax.legend(fontsize=8)
25 | ax.grid()
26 | #plt.savefig("Simply_Supported_Beam/generated_images/test_question.png")
27 | plt.show()
--------------------------------------------------------------------------------
/tests/test_hinge_inclined_load.py:
--------------------------------------------------------------------------------
1 | from beamframe.beam import *
2 |
3 | # q:b -> https://learnaboutstructures.com/sites/default/files/images/3-Frames/Problem-4-1.png
4 |
5 | b = Beam(16)
6 | ra = Reaction(0, 'f', 'A')
7 | h = Hinge(6)
8 | p = PointLoad(10,117,inverted=True, inclination=53.1301024)
9 | m = PointMoment(b.length, 65, ccw=False)
10 | rd = Reaction(b.length, 'r', 'D')
11 |
12 | b.fast_solve((ra, h, p, m, rd))
13 | b.save_data("test_data")
--------------------------------------------------------------------------------
/tests/test_pointload.py:
--------------------------------------------------------------------------------
1 | b = Beam(length=10)
2 | p = PointLoad(b.length/2, 10, True)
3 | ra = Reaction(0, 'r', 'A')
4 | rb = Reaction(b.length, 'h', 'B')
5 | print(ra.ry_val, rb.rx_val, rb.ry_val)
6 | b.add_loads((p,ra,rb))
7 | b.add_moments((p,ra,rb), about=b.length)
8 | print(b.fx, b.fy, b.m)
9 | b.calculate_reactions((ra,rb))
10 | print(b.solved_rxns)
11 | print(b.solved_rxns[rb.ry_var])
12 | print(ra.ry_val, rb.rx_val, rb.ry_val)
13 | b.generate_moment_equation(loads=[p,ra,rb])
14 | b.generate_shear_equation(loads=[p,ra,rb])
15 | x = np.linspace(-1, b.length, 1000)
16 | fig, ax = plt.subplots(figsize=(10,7))
17 | ax.plot(x, b.mom_fn(x), label='BMD')
18 | ax.plot(x,b.shear_fn(x), label="SFD")
19 | ax.axhline(y=0, color='k', label='beam')
20 | ax.legend()
21 | plt.show()
--------------------------------------------------------------------------------
/tests/test_question.py:
--------------------------------------------------------------------------------
1 | # question link: https://learnaboutstructures.com/sites/default/files/images/3-Frames/Det-Beam-Example-Moment.png
2 |
3 | from beamframe import *
4 | b = Beam(15)
5 | ra = Reaction(0, 'h', 'A')
6 | rc = Reaction(10, 'r','C')
7 | p = PointLoad(5, 20, True)
8 | m = PointMoment(5, 30, ccw=False)
9 | udl = UDL(10, 10, 5)
10 | b.add_loads((ra, rc, p, udl))
11 | b.add_moments((ra, rc, p, udl, m), about=10)
12 | b.calculate_reactions((ra, rc))
13 | b.generate_moment_equation((ra, rc, p, udl, m))
14 | b.generate_shear_equation((ra, rc, p, udl, m))
15 |
16 | print(b.fx, b.fy, b.m)
17 | print(b.solved_rxns)
18 | x = np.linspace(-0.009, b.length, 1000)
19 | plt.rc('font', family='serif', size=14)
20 | fig, ax = plt.subplots(figsize=(9,7),facecolor='w', edgecolor='w')
21 | ax.plot(x, b.mom_fn(x), label="BMD (kNm)")
22 | ax.plot(x, b.shear_fn(x), label="SFD (kN)")
23 | ax.set_xticks(np.arange(0,16,1))
24 | ax.axhline(y=0, color='k', label='beam')
25 | ax.set_title("BMD vs SFD of Beam")
26 | ax.set_xlabel("x (m)")
27 | ax.legend()
28 | ax.grid()
29 | #plt.savefig("Simply_Supported_Beam/generated_images/test_question.png")
30 | plt.show()
--------------------------------------------------------------------------------
/tests/test_udl.py:
--------------------------------------------------------------------------------
1 | from beamframe import *
2 |
3 | b = Beam(10)
4 | ra = Reaction(0, 'r', 'A')
5 | rb = Reaction(b.length, 'h', 'B')
6 | udl = UDL(0, 10, 5)
7 | b.add_loads([ra, rb, udl])
8 | b.add_moments([ra, rb, udl], about=b.length)
9 | b.calculate_reactions([ra, rb])
10 | b.generate_moment_equation([ra, rb, udl])
11 | b.generate_shear_equation((ra, rb, udl))
12 |
13 | print(b.fx, b.fy, b.m)
14 | print(b.solved_rxns)
15 |
16 | x = np.linspace(-1, b.length, 1000)
17 | plt.rc('font', family='serif', size=14)
18 | fig, ax = plt.subplots(facecolor='w', edgecolor='w', num="BMD vs SFD")
19 | ax.plot(x, b.mom_fn(x), label="BMD (kNm)")
20 | ax.plot(x, b.shear_fn(x), label="SFD (kN)")
21 | ax.set_xticks(np.arange(0, b.length+1,1))
22 | ax.axhline(y=0, color='k', label='beam')
23 | ax.set_title("BMD vs SFD of Beam")
24 | ax.set_xlabel("x (m)")
25 | ax.legend(fontsize=8)
26 | ax.grid()
27 | #plt.savefig("Simply_Supported_Beam/generated_images/test_question.png")
28 | plt.show()
--------------------------------------------------------------------------------
/tests/test_udl_point.py:
--------------------------------------------------------------------------------
1 | #question: https://ars.els-cdn.com/content/image/3-s2.0-B9780081025864000032-f03-22-9780081025864.jpg
2 |
3 | from beamframe import *
4 |
5 | b = Beam(4)
6 | p1 = PointLoad(1,2,True)
7 | p2 = PointLoad(2,5,True)
8 | udl = UDL(3,4,1)
9 | r_a = Reaction(0,'h','A')
10 | r_e = Reaction(b.length, 'r', 'E')
11 |
12 | b.add_loads((p1,p2, udl, r_a, r_e))
13 | b.add_moments((p1,p2, udl, r_a, r_e), about=b.length)
14 | b.calculate_reactions((r_a, r_e))
15 | b.generate_moment_equation((p1,p2, udl, r_a, r_e))
16 | b.generate_shear_equation((p1,p2, udl, r_a, r_e))
17 |
18 | x = np.linspace(-0.009, b.length, 1000)
19 | plt.rc('font', family='serif', size=14)
20 | fig, ax = plt.subplots(facecolor='w', edgecolor='w', num="BMD vs SFD")
21 | ax.plot(x, b.mom_fn(x), label="BMD (kNm)")
22 | ax.plot(x, b.shear_fn(x), label="SFD (kN)")
23 | ax.set_xticks(np.arange(0, b.length+1,1))
24 | ax.axhline(y=0, color='k', label='beam')
25 | ax.set_title("BMD vs SFD of Beam")
26 | ax.set_xlabel("x (m)")
27 | ax.legend()
28 | ax.grid()
29 | #plt.savefig("Simply_Supported_Beam/generated_images/test_question.png")
30 | plt.show()
--------------------------------------------------------------------------------
/tests/test_uvl.py:
--------------------------------------------------------------------------------
1 | from beamframe import *
2 |
3 | b = Beam(10)
4 | uvl = UVL(0,0, b.length,10)
5 | ra = Reaction(0,'f', 'A')
6 | print(uvl.netload)
7 | print(uvl.netload*uvl.pos)
8 | print(uvl.gradient)
9 | b.add_loads((uvl, ra))
10 | b.add_moments((uvl, ra))
11 | b.calculate_reactions((ra,))
12 | b.generate_shear_equation((uvl, ra))
13 |
14 | x = np.linspace(-1, b.length, 500)
15 | plt.rc('font', family='serif', size=14)
16 | fig, ax = plt.subplots(facecolor='w', edgecolor='w', num="BMD vs SFD")
17 | #ax.plot(x, b.mom_fn(x), label="BMD (kNm)")
18 | ax.plot(x, b.shear_fn(x), label="SFD (kN)")
19 | ax.set_xticks(np.arange(0, b.length+1,1))
20 | ax.axhline(y=0, color='k', label='beam')
21 | ax.set_title("BMD vs SFD of Beam")
22 | ax.set_xlabel("x (m)")
23 | ax.legend(fontsize=8)
24 | ax.grid()
25 | #plt.savefig(f"Simply_Supported_Beam/generated_images/{__file__.split('/')[-1]}.png")
26 | plt.show()
--------------------------------------------------------------------------------
/tests/test_uvl_class_attribute.py:
--------------------------------------------------------------------------------
1 | from beamframe import *
2 |
3 | uvl = UVL(start=0, startload=0, span=3, endload=4) #triangular load (inverted)
4 | uvl2 = UVL(start=0, startload=4, span=3, endload=0)
5 | uvl3 = UVL(start=2, startload=2, span=5, endload=4) #trapezoidal load(inverted)
6 | uvl4 = UVL(start=2, startload=2, span=5, endload=4, inverted=False) #trapezoidal load (upright)
7 |
8 |
9 | print(uvl.tload, uvl.rload)
10 | print(uvl.netload, uvl.pos)
11 |
12 | print(uvl2.tload, uvl2.rload)
13 | print(uvl2.netload, uvl2.pos)
14 |
15 | print(uvl3.tload, uvl3.rload)
16 | print(uvl3.netload, uvl3.pos)
17 |
18 |
19 | print(uvl4.tload, uvl4.rload)
20 | print(uvl4.netload, uvl4.pos)
--------------------------------------------------------------------------------
/tests/uvl_both.py:
--------------------------------------------------------------------------------
1 | from beamframe import *
2 |
3 | b = Beam(6)
4 | #uvl1 = UVL(0,0,3,3)
5 | uvl1 = UVL(0,3,3,0)
6 | uvl2 = UVL(3,0,3,3, inverted=False)
7 | ra = Reaction(0, 'h', 'A')
8 | rb = Reaction(6, 'r', 'B')
9 |
10 | elem = (uvl1, uvl2, ra, rb)
11 | b.fast_solve(elem)
12 | b.generate_graph('both')
--------------------------------------------------------------------------------