├── .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 | ![SFD and BMD of simply supported beam with pointload at mid of span](https://ashimp.com.np/beamframe/images/readme_example_1.png) 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 | ![SFD and BMD of cantilever beam with udl](https://ashimp.com.np/beamframe/images/readme_example_2.png) 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 | ![Example 3](https://ashimp.com.np/beamframe/images/readme_example_3.png) 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') --------------------------------------------------------------------------------