{ "cells": [ { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "using LinearAlgebra\n", "using Plots\n", "import JSON\n", "# using Quaternions\n", "using StaticArrays, Rotations\n", "using Distributed\n", "using StaticArrays, BenchmarkTools\n", "using Base.Threads\n", "using CUDAnative\n", "using CuArrays,CUDAdrv \n", "using Test\n", "import Base: +, * , -, ^" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Todo\n", "- create struct for material and get for each edge its properties\n", "- implement getTimestep\n", "- implement on single voxel\n", "- get reat E and L\n", "- compare to Frame3dd" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "struct Vector3\n", " x::Float64\n", " y::Float64\n", " z::Float64\n", " function Vector3()\n", " x=0.0\n", " y=0.0\n", " z=0.0\n", " new(x,y,z)\n", " end\n", " function Vector3(x,y,z)\n", " new(x,y,z)\n", " end\n", "end\n", "struct Quaternion\n", " x::Float64\n", " y::Float64\n", " z::Float64\n", " w::Float64\n", " function Quaternion()\n", " x=0.0\n", " y=0.0\n", " z=0.0\n", " w=1.0\n", " new(x,y,z,w)\n", " end\n", " function Quaternion(x,y,z,w)\n", " new(x,y,z,w)\n", " end\n", "end\n", "struct RotationMatrix\n", " te1::Float64\n", " te2::Float64\n", " te3::Float64\n", " te4::Float64\n", " te5::Float64\n", " te6::Float64\n", " te7::Float64\n", " te8::Float64\n", " te9::Float64\n", " te10::Float64\n", " te11::Float64\n", " te12::Float64\n", " te13::Float64\n", " te14::Float64\n", " te15::Float64\n", " te16::Float64\n", " function RotationMatrix()\n", " te1 =0.0\n", " te2 =0.0\n", " te3 =0.0\n", " te4 =0.0\n", " te5 =0.0\n", " te6 =0.0\n", " te7 =0.0\n", " te8 =0.0\n", " te9 =0.0\n", " te10=0.0\n", " te11=0.0\n", " te12=0.0\n", " te13=0.0\n", " te14=0.0\n", " te15=0.0\n", " te16=0.0\n", " new(te1,te2,te3,te4,te5,te6,te7,te8,te9,te10,te11,te12,te13,te14,te15,te16)\n", " end\n", " function RotationMatrix(te1,te2,te3,te4,te5,te6,te7,te8,te9,te10,te11,te12,te13,te14,te15,te16)\n", " new(te1,te2,te3,te4,te5,te6,te7,te8,te9,te10,te11,te12,te13,te14,te15,te16)\n", " end\n", "end\n", "\n", "+(f::Vector3, g::Vector3)=Vector3(f.x+g.x , f.y+g.y,f.z+g.z )\n", "-(f::Vector3, g::Vector3)=Vector3(f.x-g.x , f.y-g.y,f.z-g.z )\n", "*(f::Vector3, g::Vector3)=Vector3(f.x*g.x , f.y*g.y,f.z*g.z )\n", "\n", "+(f::Vector3, g::Number)=Vector3(f.x+g , f.y+g,f.z+g )\n", "-(f::Vector3, g::Number)=Vector3(f.x-g , f.y-g,f.z-g )\n", "*(f::Vector3, g::Number)=Vector3(f.x*g , f.y*g,f.z*g )\n", "\n", "+(g::Vector3, f::Number)=Vector3(f.x+g , f.y+g,f.z+g )\n", "-(g::Vector3, f::Number)=Vector3(g-f.x , g-f.y,g-f.z )\n", "*(g::Vector3, f::Number)=Vector3(f.x*g , f.y*g,f.z*g )\n", "\n", "addX(f::Vector3, g::Number)=Vector3(f.x+g , f.y,f.z)\n", "addY(f::Vector3, g::Number)=Vector3(f.x , f.y+g,f.z )\n", "addZ(f::Vector3, g::Number)=Vector3(f.x , f.y,f.z+g )\n", "\n", "function normalizeVector3(f::Vector3)\n", " leng=sqrt((f.x * f.x) + (f.y * f.y) + (f.z * f.z))\n", " return Vector3(f.x/leng,f.y/leng,f.z/leng)\n", " \n", "end\n", "function normalizeQuaternion(f::Quaternion)\n", " l = sqrt((f.x * f.x) + (f.y * f.y) + (f.z * f.z)+ (f.w * f.w))\n", " if l === 0 \n", " qx = 0\n", " qy = 0\n", " qz = 0\n", " qw = 1\n", " else \n", " l = 1 / l\n", " qx = f.x * l\n", " qy = f.y * l\n", " qz = f.z * l\n", " qw = f.w * l\n", " end\n", " return Quaternion(qx,qy,qz,qw)\n", "end\n", "\n", "function normalizeQuaternion1!(fx::Float64,fy::Float64,fz::Float64,fw::Float64)\n", " l = sqrt((fx * fx) + (fy * fy) + (fz * fz)+ (fw * fw))\n", " if l === 0 \n", " qx = 0.0\n", " qy = 0.0\n", " qz = 0.0\n", " qw = 1.0\n", " else \n", " l = 1.0 / l\n", " qx = fx * l\n", " qy = fy * l\n", " qz = fz * l\n", " qw = fw * l\n", " end\n", " return qx,qy,qz,qw\n", "end\n", "\n", "\n", "function dotVector3(f::Vector3, g::Vector3)\n", " return (f.x * g.x) + (f.y * g.y) + (f.z * g.z)\n", "end\n", "\n", "function Base.show(io::IO, v::Vector3)\n", " print(io, \"x:$(v.x), y:$(v.y), z:$(v.z)\")\n", "end\n", "\n", "function Base.show(io::IO, v::Quaternion)\n", " print(io, \"x:$(v.x), y:$(v.y), z:$(v.z), w:$(v.z)\")\n", "end\n", "\n", "Base.Broadcast.broadcastable(q::Vector3) = Ref(q)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "simulateParallel (generic function with 2 methods)" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function simulateParallel(numTimeSteps,dt)\n", " # initialize(setup)\n", " \n", " for i in 1:numTimeSteps\n", " #println(\"Timestep:\",i)\n", " doTimeStep(dt,i)\n", " end\n", "end\n", "\n", "function simulateParallel(metavoxel,numTimeSteps,dt)\n", " # initialize(setup)\n", " \n", " for i in 1:numTimeSteps\n", " #println(\"Timestep:\",i)\n", " doTimeStep(metavoxel,dt,i)\n", " end\n", "end" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "initialize (generic function with 1 method)" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function initialize(setup)\n", " nodes = setup[\"nodes\"]\n", " edges = setup[\"edges\"]\n", "\n", " i=1\n", " # pre-calculate current position\n", " for node in nodes\n", " # element=parse(Int,node[\"id\"][2:end])\n", " N_position[i]=Vector3(node[\"position\"][\"x\"],node[\"position\"][\"y\"],node[\"position\"][\"z\"])\n", " N_restrained[i]=node[\"restrained_degrees_of_freedom\"][1] ## todo later consider other degrees of freedom\n", " N_displacement[i]=Vector3(node[\"displacement\"][\"x\"],node[\"displacement\"][\"y\"],node[\"displacement\"][\"z\"])\n", " N_angle[i]=Vector3(node[\"angle\"][\"x\"],node[\"angle\"][\"y\"],node[\"angle\"][\"z\"])\n", " N_force[i]=Vector3(node[\"force\"][\"x\"]/100,node[\"force\"][\"y\"]/100,node[\"force\"][\"z\"]/100)\n", " N_currPosition[i]=Vector3(node[\"position\"][\"x\"],node[\"position\"][\"y\"],node[\"position\"][\"z\"])\n", "\n", " # for dynamic simulations\n", " # append!(N_posTimeSteps,[[]])\n", " # append!(N_angTimeSteps,[[]])\n", "\n", " i=i+1\n", " end \n", "\n", " i=1\n", " # pre-calculate the axis\n", " for edge in edges\n", " # element=parse(Int,edge[\"id\"][2:end])\n", "\n", " # find the nodes that the lements connects\n", " fromNode = nodes[edge[\"source\"]+1]\n", " toNode = nodes[edge[\"target\"]+1]\n", "\n", "\n", " node1 = [fromNode[\"position\"][\"x\"] fromNode[\"position\"][\"y\"] fromNode[\"position\"][\"z\"]]\n", " node2 = [toNode[\"position\"][\"x\"] toNode[\"position\"][\"y\"] toNode[\"position\"][\"z\"]]\n", "\n", " length=norm(node2-node1)\n", " axis=normalize(collect(Iterators.flatten(node2-node1)))\n", "\n", " E_source[i]=edge[\"source\"]+1\n", " E_target[i]=edge[\"target\"]+1\n", " E_area[i]=edge[\"area\"]\n", " E_density[i]=edge[\"density\"]\n", " E_stiffness[i]=edge[\"stiffness\"]\n", " E_axis[i]=Vector3(axis[1],axis[2],axis[3])\n", " E_currentRestLength[i]=length\n", "\n", " N_edgeID[E_source[i],N_currEdge[E_source[i]]]=i\n", " N_edgeFirst[E_source[i],N_currEdge[E_source[i]]]=true\n", " N_currEdge[E_source[i]]+=1\n", "\n", " N_edgeID[E_target[i],N_currEdge[E_target[i]]]=i\n", " N_edgeFirst[E_target[i],N_currEdge[E_target[i]]]=false\n", " N_currEdge[E_target[i]]+=1\n", "\n", "\n", " # for dynamic simulations\n", " # append!(E_stressTimeSteps,[[]])\n", "\n", " i=i+1\n", " end \n", "end" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "doTimeStep! (generic function with 1 method)" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function doTimeStep(dt,currentTimeStep)\n", " # update forces: go through edges, get currentposition from nodes, calc pos2 and update stresses and interior forces of nodes\n", " run_updateEdges!(\n", " E_sourceGPU, \n", " E_targetGPU,\n", " E_areaGPU,\n", " E_densityGPU,\n", " E_stiffnessGPU,\n", " E_stressGPU,\n", " E_axisGPU,\n", " E_currentRestLengthGPU,\n", " E_pos2GPU,\n", " E_angle1vGPU,\n", " E_angle2vGPU,\n", " E_angle1GPU,\n", " E_angle2GPU,\n", " E_intForce1GPU,\n", " E_intMoment1GPU,\n", " E_intForce2GPU,\n", " E_intMoment2GPU,\n", " E_dampGPU,\n", " N_currPositionGPU,\n", " N_orientGPU)\n", " \n", " # update forces: go through nodes and update interior force (according to int forces from edges), integrate and update currpos\n", " run_updateNodes!(dt,currentTimeStep,\n", " N_positionGPU, \n", " N_restrainedGPU,\n", " N_displacementGPU,\n", " N_angleGPU,\n", " N_currPositionGPU,\n", " N_linMomGPU,\n", " N_angMomGPU,\n", " N_intForceGPU,\n", " N_intMomentGPU,\n", " N_forceGPU,\n", " N_momentGPU,\n", " N_orientGPU,\n", " N_edgeIDGPU, \n", " N_edgeFirstGPU, \n", " E_intForce1GPU,\n", " E_intMoment1GPU,\n", " E_intForce2GPU,\n", " E_intMoment2GPU)\n", " \n", "end\n", "\n", "function doTimeStep!(metavoxel,dt,currentTimeStep)\n", " # update forces: go through edges, get currentposition from nodes, calc pos2 and update stresses and interior forces of nodes\n", " run_updateEdges!(\n", " metavoxel[\"E_sourceGPU\"], \n", " metavoxel[\"E_targetGPU\"],\n", " metavoxel[\"E_areaGPU\"],\n", " metavoxel[\"E_densityGPU\"],\n", " metavoxel[\"E_stiffnessGPU\"],\n", " metavoxel[\"E_stressGPU\"],\n", " metavoxel[\"E_axisGPU\"],\n", " metavoxel[\"E_currentRestLengthGPU\"],\n", " metavoxel[\"E_pos2GPU\"],\n", " metavoxel[\"E_angle1vGPU\"],\n", " metavoxel[\"E_angle2vGPU\"],\n", " metavoxel[\"E_angle1GPU\"],\n", " metavoxel[\"E_angle2GPU\"],\n", " metavoxel[\"E_intForce1GPU\"],\n", " metavoxel[\"E_intMoment1GPU\"],\n", " metavoxel[\"E_intForce2GPU\"],\n", " metavoxel[\"E_intMoment2GPU\"],\n", " metavoxel[\"E_dampGPU\"],\n", " metavoxel[\"N_currPositionGPU\"],\n", " metavoxel[\"N_orientGPU\"])\n", " \n", " # update forces: go through nodes and update interior force (according to int forces from edges), integrate and update currpos\n", " run_updateNodes!(dt,currentTimeStep,\n", " metavoxel[\"N_positionGPU\"], \n", " metavoxel[\"N_restrainedGPU\"],\n", " metavoxel[\"N_displacementGPU\"],\n", " metavoxel[\"N_angleGPU\"],\n", " metavoxel[\"N_currPositionGPU\"],\n", " metavoxel[\"N_linMomGPU\"],\n", " metavoxel[\"N_angMomGPU\"],\n", " metavoxel[\"N_intForceGPU\"],\n", " metavoxel[\"N_intMomentGPU\"],\n", " metavoxel[\"N_forceGPU\"],\n", " metavoxel[\"N_momentGPU\"],\n", " metavoxel[\"N_orientGPU\"],\n", " metavoxel[\"N_edgeIDGPU\"], \n", " metavoxel[\"N_edgeFirstGPU\"], \n", " metavoxel[\"E_intForce1GPU\"],\n", " metavoxel[\"E_intMoment1GPU\"],\n", " metavoxel[\"E_intForce2GPU\"],\n", " metavoxel[\"E_intMoment2GPU\"])\n", " \n", "end" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "run_updateEdges! (generic function with 1 method)" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function updateEdges!(E_source,E_target,E_area,E_density,E_stiffness,E_stress,E_axis,\n", " E_currentRestLength,E_pos2,E_angle1v,E_angle2v,\n", " E_angle1,E_angle2,E_intForce1,E_intMoment1,E_intForce2,E_intMoment2,E_damp,\n", " N_currPosition,N_orient)\n", "\n", " index = (blockIdx().x - 1) * blockDim().x + threadIdx().x\n", " stride = blockDim().x * gridDim().x\n", " ## @cuprintln(\"thread $index, block $stride\")\n", " N=length(E_source)\n", " for i = index:stride:N\n", " \n", " @inbounds pVNeg=N_currPosition[E_source[i]]\n", " @inbounds pVPos=N_currPosition[E_target[i]]\n", " \n", " @inbounds oVNeg=N_orient[E_source[i]]\n", " @inbounds oVPos=N_orient[E_target[i]]\n", " \n", " @inbounds oldPos2=Vector3(E_pos2[i].x,E_pos2[i].y,E_pos2[i].z) #?copy?\n", " @inbounds oldAngle1v = Vector3(E_angle1v[i].x,E_angle1v[i].y,E_angle1v[i].z)\n", " @inbounds oldAngle2v = Vector3(E_angle2v[i].x,E_angle2v[i].y,E_angle2v[i].z)# remember the positions/angles from last timestep to calculate velocity\n", " \n", " \n", " @inbounds E_pos2[i],E_angle1v[i],E_angle2v[i],E_angle1[i],E_angle2[i],totalRot= orientLink!(E_currentRestLength[i],pVNeg,pVPos,oVNeg,oVPos,E_axis[i])\n", " \n", " @inbounds dPos2 = Vector3(0.5,0.5,0.5) * (E_pos2[i]-oldPos2) #deltas for local damping. velocity at center is half the total velocity\n", " @inbounds dAngle1 = Vector3(0.5,0.5,0.5) *(E_angle1v[i]-oldAngle1v)\n", " @inbounds dAngle2 = Vector3(0.5,0.5,0.5) *(E_angle2v[i]-oldAngle2v)\n", " \n", " \n", " @inbounds strain=(E_pos2[i].x/E_currentRestLength[i])\n", " \n", " positiveEnd=true\n", " if axialStrain( positiveEnd,strain)>100.0\n", " diverged=true\n", " @cuprintln(\"DIVERGED!!!!!!!!!!\")\n", " return \n", " end\n", " \n", " @inbounds E = E_stiffness[i]\n", " \n", " \n", " \n", " @inbounds l = E_currentRestLength[i]\n", " \n", " \n", " nu=0\n", "# L = 5.0 #?? change!!!!!!\n", " L=l\n", " a1 = E*L # EA/L : Units of N/m\n", " a2 = E * L*L*L / (12.0*(1+nu)) # GJ/L : Units of N-m\n", " b1 = E*L # 12EI/L^3 : Units of N/m\n", " b2 = E*L*L/2.0 # 6EI/L^2 : Units of N (or N-m/m: torque related to linear distance)\n", " b3 = E*L*L*L/6.0 # 2EI/L : Units of N-m\n", " \n", " nu=0.3\n", " W = 75\n", " L = W/sqrt(2)\n", " l=L\n", " n_min = 1\n", " n_max = 7\n", " # Cross Section inputs, must be floats\n", " E = 3000.0 # MPa\n", " G = E * 1 / 3 # MPa\n", " h = 2.38 # mm\n", " b = 2.38 # mm\n", " rho = 7.85e-9 / 3 # kg/mm^3\n", " S = h * b\n", " Sy = (S * (6 + 12 * nu + 6 * nu^2)/ (7 + 12 * nu + 4 * nu^2))\n", " # For solid rectangular cross section (width=b, depth=d & ( b < d )):\n", " Q = 1 / 3 - 0.2244 / (min(h / b, b / h) + 0.1607)\n", " Jxx = Q * min(h * b^3, b * h^3)\n", "\n", "\n", " ##if voxels\n", " #nu=0\n", " #L=l\n", " #a1 = E*L # EA/L : Units of N/m\n", " #a2 = E * L*L*L / (12.0*(1+nu)) # GJ/L : Units of N-m\n", " #b1 = E*L # 12EI/L^3 : Units of N/m\n", " #b2 = E*L*L/2.0 # 6EI/L^2 : Units of N (or N-m/m: torque related to linear distance)\n", " #b3 = E*L*L*L/6.0 # 2EI/L : Units of N-m\n", "\n", " I= b*h^3/12\n", " J=b*h*(b*b+h*h)/12\n", " a1=E*b*h/L\n", " a2=G*J/L\n", " b1=12*E*I/(L^3)\n", " b2=6*E*I/(L^2)\n", " b3=2*E*I/(L)\n", " \n", " \n", "\n", " \n", " #inbounds currentTransverseArea=25.0 #?? change!!!!!! E_area[i]\n", " @inbounds currentTransverseArea= b*h\n", " @inbounds _stress=updateStrain(strain,E)\n", " \n", " #@inbounds currentTransverseArea= E_area[i]\n", " #@inbounds _stress=updateStrain(strain,E_stiffness[i])\n", " \n", " @inbounds E_stress[i]=_stress\n", " \n", " #@cuprintln(\"_stress $_stress\")\n", " x=(_stress*currentTransverseArea)\n", " @inbounds y=(b1*E_pos2[i].y-b2*(E_angle1v[i].z + E_angle2v[i].z))\n", " @inbounds z=(b1*E_pos2[i].z + b2*(E_angle1v[i].y + E_angle2v[i].y))\n", " \n", " x=convert(Float64,x)\n", " y=convert(Float64,y)\n", " z=convert(Float64,z)\n", " \n", " # Use Curstress instead of -a1*Pos2.x to account for non-linear deformation \n", " forceNeg = Vector3(x,y,z)\n", " \n", " forcePos = Vector3(-x,-y,-z)\n", " \n", " @inbounds x= (a2*(E_angle2v[i].x-E_angle1v[i].x))\n", " @inbounds y= (-b2*E_pos2[i].z-b3*(2.0*E_angle1v[i].y+E_angle2v[i].y))\n", " @inbounds z=(b2*E_pos2[i].y - b3*(2.0*E_angle1v[i].z + E_angle2v[i].z)) \n", " x=convert(Float64,x)\n", " y=convert(Float64,y)\n", " z=convert(Float64,z)\n", " momentNeg = Vector3(x,y,z)\n", " \n", "\n", " @inbounds x= (a2*(E_angle1v[i].x-E_angle2v[i].x))\n", " @inbounds y= (-b2*E_pos2[i].z- b3*(E_angle1v[i].y+2.0*E_angle2v[i].y))\n", " @inbounds z=(b2*E_pos2[i].y - b3*(E_angle1v[i].z + 2.0*E_angle2v[i].z))\n", " x=convert(Float64,x)\n", " y=convert(Float64,y)\n", " z=convert(Float64,z)\n", " momentPos = Vector3(x,y,z)\n", " \n", " \n", " ### damping\n", " @inbounds if E_damp[i] #first pass no damping\n", " sqA1=CUDAnative.sqrt(a1) \n", " sqA2xIp=CUDAnative.sqrt(a2*L*L/6.0) \n", " sqB1=CUDAnative.sqrt(b1) \n", " sqB2xFMp=CUDAnative.sqrt(b2*L/2) \n", " sqB3xIp=CUDAnative.sqrt(b3*L*L/6.0)\n", " \n", " dampingMultiplier=Vector3(28099.3,28099.3,28099.3) # 2*mat->_sqrtMass*mat->zetaInternal/previousDt;?? todo link to material\n", " \n", " posCalc=Vector3(sqA1*dPos2.x, sqB1*dPos2.y - sqB2xFMp*(dAngle1.z+dAngle2.z),sqB1*dPos2.z + sqB2xFMp*(dAngle1.y+dAngle2.y))\n", " \n", " \n", " forceNeg =forceNeg + (dampingMultiplier*posCalc);\n", " forcePos =forcePos - (dampingMultiplier*posCalc);\n", "\n", " momentNeg -= Vector3(0.5,0.5,0.5)*dampingMultiplier*Vector3(-sqA2xIp*(dAngle2.x - dAngle1.x),\n", " sqB2xFMp*dPos2.z + sqB3xIp*(2*dAngle1.y + dAngle2.y),\n", " -sqB2xFMp*dPos2.y + sqB3xIp*(2*dAngle1.z + dAngle2.z));\n", " momentPos -= Vector3(0.5,0.5,0.5)*dampingMultiplier*Vector3(sqA2xIp*(dAngle2.x - dAngle1.x),\n", " sqB2xFMp*dPos2.z + sqB3xIp*(dAngle1.y + 2*dAngle2.y),\n", " -sqB2xFMp*dPos2.y + sqB3xIp*(dAngle1.z + 2*dAngle2.z));\n", "\n", " else\n", " @inbounds E_damp[i]=true \n", " end\n", "\n", " smallAngle=true\n", " if !smallAngle # ?? check\n", " @inbounds forceNeg = RotateVec3DInv(E_angle1[i],forceNeg)\n", " @inbounds momentNeg = RotateVec3DInv(E_angle1[i],momentNeg)\n", " end\n", " \n", " @inbounds forcePos = RotateVec3DInv(E_angle2[i],forcePos)\n", " @inbounds momentPos = RotateVec3DInv(E_angle2[i],momentPos)\n", "\n", " @inbounds forceNeg =toAxisOriginalVector3(forceNeg,E_axis[i])\n", " @inbounds forcePos =toAxisOriginalVector3(forcePos,E_axis[i])\n", "\n", " @inbounds momentNeg=toAxisOriginalQuat(momentNeg,E_axis[i])# TODOO CHECKKKKKK\n", " @inbounds momentPos=toAxisOriginalQuat(momentPos,E_axis[i])\n", "\n", "\n", " @inbounds E_intForce1[i] =forceNeg\n", " @inbounds E_intForce2[i] =forcePos\n", " \n", "\n", "\n", " @inbounds x= momentNeg.x\n", " @inbounds y= momentNeg.y\n", " @inbounds z= momentNeg.z \n", " x=convert(Float64,x)\n", " y=convert(Float64,y)\n", " z=convert(Float64,z)\n", " \n", " @inbounds E_intMoment1[i]=Vector3(x,y,z)\n", "\n", " @inbounds x= momentNeg.x\n", " @inbounds y= momentNeg.y\n", " @inbounds z= momentNeg.z\n", " x=convert(Float64,x)\n", " y=convert(Float64,y)\n", " z=convert(Float64,z)\n", " \n", " @inbounds E_intMoment2[i]=Vector3(x,y,z)\n", " \n", " #x=E_pos2[i].x*10000000000\n", " #y=E_pos2[i].y*10000000000\n", " #z=E_pos2[i].z*10000000000\n", " #@cuprintln(\"pos2 x $x, y $y, z $z \")\n", " ##x=E_intMoment2[i].x*10000000000\n", " #y=E_intMoment2[i].y*10000000000\n", " #z=E_intMoment2[i].z*10000000000\n", " #@cuprintln(\"E_intMoment2 x $x, y $y, z $z \")\n", "\n", " \n", " \n", " end\n", " return\n", "end\n", "\n", "function run_updateEdges!(E_source,E_target,E_area,E_density,E_stiffness,\n", " E_stress,E_axis,E_currentRestLength,E_pos2,E_angle1v,E_angle2v,\n", " E_angle1,E_angle2,E_intForce1,E_intMoment1,E_intForce2,E_intMoment2,\n", " E_damp,N_currPosition,N_orient)\n", " N=length(E_source)\n", " numblocks = ceil(Int, N/256)\n", " CuArrays.@sync begin\n", " @cuda threads=256 blocks=numblocks updateEdges!(E_source,E_target,E_area,E_density,\n", " E_stiffness,E_stress,E_axis,E_currentRestLength,E_pos2,E_angle1v,\n", " E_angle2v,E_angle1,E_angle2,E_intForce1,E_intMoment1,E_intForce2,\n", " E_intMoment2,E_damp,N_currPosition,N_orient)\n", " end\n", "end" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "run_updateNodes! (generic function with 1 method)" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function updateNodes!(dt,currentTimeStep,N_position, N_restrained,N_displacement,N_angle,N_currPosition,N_linMom,N_angMom,N_intForce,N_intMoment,N_force,N_moment,N_orient,N_edgeID,N_edgeFirst,E_intForce1,E_intMoment1,E_intForce2,E_intMoment2)\n", "\n", " index = (blockIdx().x - 1) * blockDim().x + threadIdx().x\n", " stride = blockDim().x * gridDim().x\n", " ## @cuprintln(\"thread $index, block $stride\")\n", " N,M=size(N_edgeID)\n", " for i = index:stride:N\n", " @inbounds if N_restrained[i]\n", " return\n", " else\n", " for j in 1:M\n", " temp=N_edgeID[i,j]\n", " @inbounds if (N_edgeID[i,j]!=-1)\n", " #@cuprintln(\"i $i, j $j, N_edgeID[i,j] $temp\")\n", " @inbounds N_intForce[i]=ifelse(N_edgeFirst[i,j], N_intForce[i]+E_intForce1[N_edgeID[i,j]], N_intForce[i]+E_intForce2[N_edgeID[i,j]] )\n", " @inbounds N_intMoment[i]=ifelse(N_edgeFirst[i,j], N_intMoment[i]+E_intMoment1[N_edgeID[i,j]], N_intMoment[i]+E_intMoment2[N_edgeID[i,j]] )\n", " end\n", " end\n", " @inbounds curForce = force(N_intForce[i],N_orient[i],N_force[i],true,currentTimeStep)\n", " \n", " #@inbounds N_force[i]=Vector3(0,0,0) ##????\n", " \n", " @inbounds N_intForce[i]=Vector3(0,0,0)\n", " \n", " #x=curForce.x\n", " #y=curForce.y\n", " #z=curForce.z\n", " #@cuprintln(\"curForce x $x, y $y, z $z \")\n", " \n", " #x=N_linMom[i].x*10000000000\n", " #y=N_linMom[i].y*10000000000\n", " #z=N_linMom[i].z*10000000000\n", " #@cuprintln(\"N_linMom[i] x $x, y $y, z $z \")\n", " \n", " \n", " @inbounds N_linMom[i]=N_linMom[i]+curForce*Vector3(dt,dt,dt) #todo make sure right\n", " massInverse=8e-6 # todo ?? later change\n", " @inbounds translate=N_linMom[i]*Vector3((dt*massInverse),(dt*massInverse),(dt*massInverse)) # ??massInverse\n", " \n", " #x=translate.x*10000000000\n", " #y=translate.y*10000000000\n", " #z=translate.z*10000000000\n", " #@cuprintln(\"translate x $x, y $y, z $z \")\n", " \n", " @inbounds N_currPosition[i]=N_currPosition[i]+translate\n", " @inbounds N_displacement[i]=N_displacement[i]+translate\n", " \n", " \n", " \n", " # Rotation\n", " @inbounds curMoment = moment(N_intMoment[i],N_orient[i],N_moment[i]) \n", " \n", " \n", " \n", " @inbounds N_intMoment[i]=Vector3(0,0,0) # do i really need it?\n", " \n", " @inbounds N_angMom[i]=N_angMom[i]+curMoment*Vector3(dt,dt,dt)\n", " \n", " \n", " \n", " \n", " momentInertiaInverse=1.92e-6 # todo ?? later change 1/Inertia (1/(kg*m^2))\n", " \n", " \n", " @inbounds temp=FromRotationVector(N_angMom[i]*Vector3((dt*momentInertiaInverse),(dt*momentInertiaInverse),(dt*momentInertiaInverse)))\n", " \n", " \n", " #x=temp.x*10000000000\n", " #y=temp.y*10000000000\n", " #z=temp.z*10000000000\n", " #@cuprintln(\"temp x $x, y $y, z $z \")\n", " \n", " @inbounds N_orient[i]=multiplyQuaternions(temp,N_orient[i])\n", " \n", " #@inbounds x= N_orient[i].x*temp.x\n", " #@inbounds y= N_orient[i].y*temp.y\n", " #@inbounds z= N_orient[i].z*temp.z\n", " #@inbounds w= N_orient[i].w*temp.w\n", " #x=convert(Float64,x)\n", " #y=convert(Float64,y)\n", " #z=convert(Float64,z)\n", " #w=convert(Float64,w)\n", " \n", " #@inbounds N_orient[i]=Quaternion(x,y,z,w)\n", " \n", " #x=N_orient[i].x*10000000000\n", " #y=N_orient[i].y*10000000000\n", " #z=N_orient[i].z*10000000000\n", " #w=N_orient[i].w\n", " #@cuprintln(\"N_orient x $x, y $y, z $z, w $w \")\n", " \n", " \n", " end\n", " end\n", " return\n", "end\n", "\n", "\n", "function run_updateNodes!(dt,currentTimeStep,N_position, N_restrained,N_displacement, N_angle,N_currPosition,N_linMom,N_angMom,N_intForce,N_intMoment,N_force,N_moment,N_orient,N_edgeID,N_edgeFirst,E_intForce1,E_intMoment1,E_intForce2,E_intMoment2)\n", " N=length(N_intForce)\n", " numblocks = ceil(Int, N/256)\n", " CuArrays.@sync begin\n", " @cuda threads=256 blocks=numblocks updateNodes!(dt,currentTimeStep,N_position, N_restrained,N_displacement, N_angle,N_currPosition,N_linMom,N_angMom,N_intForce,N_intMoment,N_force,N_moment,N_orient,N_edgeID,N_edgeFirst,E_intForce1,E_intMoment1,E_intForce2,E_intMoment2)\n", " end\n", "end" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "orientLink! (generic function with 1 method)" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function orientLink!(currentRestLength,pVNeg,pVPos,oVNeg,oVPos,axis) # updates pos2, angle1, angle2, and smallAngle //Quat3D<double> /*double restLength*/\n", " \n", " pos2 = toAxisXVector3(pVPos-pVNeg,axis) # digit truncation happens here...\n", " angle1 = toAxisXQuat(oVNeg,axis)\n", " angle2 = toAxisXQuat(oVPos,axis)\n", " \n", " #x=pos2.x*10000000000\n", " #y=pos2.y*10000000000\n", " #z=pos2.z*10000000000\n", " #@cuprintln(\"pos2 x $x, y $y, z $z \")\n", " \n", " #x=angle1.x*10000000000\n", " #y=angle1.y*10000000000\n", " #z=angle1.z*10000000000\n", " #@cuprintln(\"angle1 x $x, y $y, z $z \")\n", " #x=oVNeg.x*10000000000\n", " #y=oVNeg.y*10000000000\n", " #z=oVNeg.z*10000000000\n", " #@cuprintln(\"oVNeg x $x, y $y, z $z \")\n", " \n", " \n", " \n", " totalRot = conjugate(angle1) #keep track of the total rotation of this bond (after toAxisX()) # Quat3D<double>\n", " pos2 = RotateVec3D(totalRot,pos2)\n", " \n", " #x=pos2.x*10000000000\n", " #y=pos2.y*10000000000\n", " #z=pos2.z*10000000000\n", " #@cuprintln(\"pos2 2 x $x, y $y, z $z \")\n", " \n", " \n", " #x=totalRot.x*10000000000\n", " #y=totalRot.y*10000000000\n", " #z=totalRot.z*10000000000\n", " #@cuprintln(\"totalRot x $x, y $y, z $z \")\n", " \n", " \n", "# x=pos2.x*10000000000\n", "# y=pos2.y*10000000000\n", "# z=pos2.z*10000000000\n", "# @cuprintln(\"pos2 x $x, y $y, z $z \")\n", " \n", " angle2 = Quaternion(angle2.x*totalRot.x,angle2.y*totalRot.y,angle2.z*totalRot.z,angle2.w*totalRot.w)\n", " angle1 = Quaternion(0.0,0.0,0.0,1.0)#new THREE.Quaternion() #zero for now...\n", "\n", " smallAngle=true #todo later remove\n", " \n", " \n", " if (smallAngle)\t #Align so Angle1 is all zeros\n", " #pos2[1] =pos2[1]- currentRestLength #only valid for small angles\n", " pos2=Vector3(pos2.x-currentRestLength,pos2.y,pos2.z)\n", " else #Large angle. Align so that Pos2.y, Pos2.z are zero.\n", " # FromAngleToPosX(angle1,pos2) #get the angle to align Pos2 with the X axis\n", " # totalRot = angle1.clone().multiply(totalRot) #update our total rotation to reflect this\n", " # angle2 = angle1.clone().multiply( angle2) #rotate angle2\n", " # pos2 = new THREE.Vector3(pos2.length() - currentRestLength, 0, 0);\n", " end\n", " \n", " angle1v = ToRotationVector(angle1)\n", " angle2v = ToRotationVector(angle2)\n", " \n", " \n", " \n", " \n", "# pos2,angle1v,angle2v,angle1,angle2,\n", " return pos2,angle1v,angle2v,angle1,angle2,totalRot\n", "end" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "toAxisOriginalQuat (generic function with 1 method)" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function toAxisXVector3(pV::Vector3,axis::Vector3) #TODO CHANGE\n", "\n", " xaxis=Vector3(1.0,0.0,0.0)\n", "\n", " vector=normalizeVector3(axis)\n", " q=setFromUnitVectors(vector,xaxis)\n", " \n", " \n", " \n", "# rot=setFromRotationMatrix(quatToMatrix( q ))\n", " \n", " \n", "# v= applyQuaternion1( pV ,setQuaternionFromEuler(rot) )\n", " v=applyQuaternion1( pV ,q )\n", " \n", " #d=15\n", " #vx=round(v.x, digits=d)\n", " #vy=round(v.y, digits=d)\n", " #vz=round(v.z, digits=d)\n", " \n", " \n", " return Vector3(v.x,v.y,v.z)\n", "end\n", "\n", "function toAxisOriginalVector3(pV::Vector3,axis::Vector3)\n", " \n", " xaxis=Vector3(1.0,0.0,0.0)\n", "\n", " vector=normalizeVector3(axis)\n", "\n", " q=setFromUnitVectors(xaxis,vector)\n", " \n", "\n", "# rot=setFromRotationMatrix(quatToMatrix( q ))\n", "\n", "# v= applyQuaternion1( pV ,setQuaternionFromEuler(rot) )\n", " v=applyQuaternion1( pV ,q )\n", " \n", " #d=15\n", " #vx=round(v.x, digits=d)\n", " #vy=round(v.y, digits=d)\n", " #vz=round(v.z, digits=d)\n", " \n", " \n", " return Vector3(v.x,v.y,v.z)\n", "end\n", "\n", "function toAxisXQuat(pQ::Quaternion,axis::Vector3)\n", " \n", " xaxis=Vector3(1.0,0.0,0.0)\n", "\n", " vector=normalizeVector3(axis)\n", "\n", "\n", " q=setFromUnitVectors(vector,xaxis)\n", " \n", " #d=17\n", " #qw=round(q[1], digits=d)\n", " #qx=round(q[2], digits=d)\n", " #qy=round(q[3], digits=d)\n", " #qz=round(q[4], digits=d)\n", " #\n", "\n", "# rot=setFromRotationMatrix(quatToMatrix( q ))\n", " \n", " pV=Vector3(pQ.x,pQ.y,pQ.z)\n", " \n", "# v=applyQuaternion1( pV ,setQuaternionFromEuler(rot) )\n", " v=applyQuaternion1( pV ,q )\n", " \n", " #d=15\n", " #vx=round(v.x, digits=d)\n", " #vy=round(v.y, digits=d)\n", " #vz=round(v.z, digits=d)\n", " \n", " return Quaternion(v.x,v.y,v.z,1.0)\n", " \n", " # return [1.0 v[1] v[2] v[3]]\n", "end\n", "\n", "function toAxisOriginalQuat(pQ::Vector3,axis::Vector3)\n", " xaxis=Vector3(1.0,0.0,0.0)\n", "\n", " vector=normalizeVector3(axis)\n", " \n", " q=setFromUnitVectors(xaxis,vector)\n", " \n", "\n", "# rot=setFromRotationMatrix(quatToMatrix( q ))\n", " \n", " pV=Vector3(pQ.x,pQ.y,pQ.z)\n", "# v=applyQuaternion1( pV ,setQuaternionFromEuler(rot) )\n", " v=applyQuaternion1( pV ,q )\n", " \n", " #d=15\n", " #vx=round(v.x, digits=d)\n", " #vy=round(v.y, digits=d)\n", " #vz=round(v.z, digits=d)\n", " \n", " return Quaternion(v.x,v.y,v.z,1.0)\n", " \n", "end" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "applyQuaternion1 (generic function with 1 method)" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function setFromUnitVectors(vFrom::Vector3, vTo::Vector3)\n", " # assumes direction vectors vFrom and vTo are normalized\n", " EPS = 0.000000001;\n", " r= dotVector3(vFrom,vTo)+1.0\n", " # r = dot(vFrom,vTo)+1\n", "\n", " if r < EPS\n", " r = 0;\n", " if abs( vFrom.x ) > abs( vFrom.z ) \n", " qx = - vFrom.y\n", " qy = vFrom.x\n", " qz = 0.0\n", " qw = r\n", " else \n", " qx = 0.0\n", " qy = -(vFrom.z)\n", " qz = vFrom.y\n", " qw = r\n", " end\n", " else \n", " # crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n", " qx = vFrom.y * vTo.z - vFrom.z * vTo.y\n", " qy = vFrom.z * vTo.x - vFrom.x * vTo.z\n", " qz = vFrom.x * vTo.y - vFrom.y * vTo.x\n", " qw = r\n", "\n", " end\n", " qx= (qx==-0.0) ? 0.0 : qx\n", " qy= (qy==-0.0) ? 0.0 : qy\n", " qz= (qz==-0.0) ? 0.0 : qz\n", " qw= (qw==-0.0) ? 0.0 : qw\n", " \n", " \n", " mx=qx*qx\n", " my=qy*qy\n", " mz=qz*qz\n", " mw=qw*qw\n", " mm=mx+my\n", " mm=mm+mz\n", " mm=mm+mw\n", " mm=convert(Float64,mm)#??????????????????? todo check later\n", " \n", " l=CUDAnative.sqrt(mm)\n", " \n", " #l = sqrt((qx * qx) + (qy * qy) + (qz * qz)+ (qw * qw))\n", " if l === 0 \n", " qx = 0.0\n", " qy = 0.0\n", " qz = 0.0\n", " qw = 1.0\n", " else \n", " l = 1.0 / l\n", " qx = qx * l\n", " qy = qy * l\n", " qz = qz * l\n", " qw = qw * l\n", " end\n", " \n", " \n", "\n", " # return qx,qy,qz,qw\n", " return Quaternion(qx,qy,qz,qw)\n", " \n", " # return normalizeQ(Quat(qw,qx,qy,qz))\n", " # return Quat(nn[1], nn[2], nn[3], nn[4])\n", "\n", "end\n", "\n", "function quatToMatrix( quaternion::Quaternion)\n", "\n", " #te = RotationMatrix()\n", " \n", " x = quaternion.x\n", " y = quaternion.y\n", " z = quaternion.z\n", " w = quaternion.w\n", " \n", " x2 = x + x\n", " y2 = y + y\n", " z2 = z + z\n", " xx = x * x2\n", " xy = x * y2\n", " xz = x * z2\n", " yy = y * y2\n", " yz = y * z2\n", " zz = z * z2\n", " wx = w * x2\n", " wy = w * y2\n", " wz = w * z2\n", "\n", " sx = 1.0\n", " sy = 1.0\n", " sz = 1.0\n", "\n", " te1 = ( 1.0 - ( yy + zz ) ) * sx\n", " te2 = ( xy + wz ) * sx\n", " te3 = ( xz - wy ) * sx\n", " te4 = 0.0\n", "\n", " te5 = ( xy - wz ) * sy\n", " te6 = ( 1.0 - ( xx + zz ) ) * sy\n", " te7 = ( yz + wx ) * sy\n", " te8 = 0.0\n", "\n", " te9 = ( xz + wy ) * sz\n", " te10 = ( yz - wx ) * sz\n", " te11 = ( 1.0 - ( xx + yy ) ) * sz\n", " te12 = 0.0\n", "\n", " te13 = 0.0 #position.x;\n", " te14 = 0.0 #position.y;\n", " te15 = 0.0 #position.z;\n", " te16 = 1.0\n", " \n", " \n", " te= RotationMatrix(te1,te2,te3,te4,te5,te6,te7,te8,te9,te10,te11,te12,te13,te14,te15,te16)\n", "\n", " return te\n", "\n", "end\n", "\n", "function setFromRotationMatrix(m::RotationMatrix)\n", " #te = m\n", " #m11 = (te[ 1 ]== -0.0) ? 0.0 : te[ 1 ]\n", " #m12 = (te[ 5 ]== -0.0) ? 0.0 : te[ 5 ]\n", " #m13 = (te[ 9 ]== -0.0) ? 0.0 : te[ 9 ]\n", " #m21 = (te[ 2 ]== -0.0) ? 0.0 : te[ 2 ]\n", " #m22 = (te[ 6 ]== -0.0) ? 0.0 : te[ 6 ]\n", " #m23 = (te[ 10]== -0.0) ? 0.0 : te[ 10]\n", " #m31 = (te[ 3 ]== -0.0) ? 0.0 : te[ 3 ]\n", " #m32 = (te[ 7 ]== -0.0) ? 0.0 : te[ 7 ]\n", " #m33 = (te[ 11]== -0.0) ? 0.0 : te[ 11]\n", "\n", " m11 = convert(Float64,m.te1 )\n", " m12 = convert(Float64,m.te5 )\n", " m13 = convert(Float64,m.te9 )\n", " m21 = convert(Float64,m.te2 )\n", " m22 = convert(Float64,m.te6 )\n", " m23 = convert(Float64,m.te10)\n", " m31 = convert(Float64,m.te3 )\n", " m32 = convert(Float64,m.te7 )\n", " m33 = convert(Float64,m.te11)\n", " \n", "\n", " y = CUDAnative.asin( clamp( m13, -1.0, 1.0 ) ) ##check if has to be changed to cuda\n", "\n", " if ( abs( m13 ) < 0.9999999999 ) \n", " \n", " x = CUDAnative.atan2( - m23, m33 )\n", " z = CUDAnative.atan2( - m12, m11 )#-m12, m11\n", " # if(m23==0.0)\n", " # x = atan( m23, m33 )\n", " # end\n", " # if(m12==0.0)\n", " # z = atan( m12, m11 )\n", " # end\n", "\n", " else\n", "\n", " x = CUDAnative.atan2( m32, m22 )\n", " z = 0.0;\n", "\n", " end\n", " \n", " \n", " return Vector3(x,y,z)\n", " \n", "end\n", "\n", "function setQuaternionFromEuler(euler::Vector3)\n", " x=euler.x\n", " y=euler.y\n", " z=euler.z\n", " \n", " \n", " c1 = CUDAnative.cos( x / 2.0 )\n", " c2 = CUDAnative.cos( y / 2.0 )\n", " c3 = CUDAnative.cos( z / 2.0 )\n", "\n", " s1 = CUDAnative.sin( x / 2.0 )\n", " s2 = CUDAnative.sin( y / 2.0 )\n", " s3 = CUDAnative.sin( z / 2.0 )\n", " \n", " \n", " x = s1 * c2 * c3 + c1 * s2 * s3\n", " y = c1 * s2 * c3 - s1 * c2 * s3\n", " z = c1 * c2 * s3 + s1 * s2 * c3\n", " w = c1 * c2 * c3 - s1 * s2 * s3\n", " \n", " return Quaternion(x,y,z,w)\n", "end\n", "\n", "function applyQuaternion1(e::Vector3,q2::Quaternion)\n", " x = e.x\n", " y = e.y\n", " z = e.z\n", "\n", " qx = q2.x\n", " qy = q2.y\n", " qz = q2.z\n", " qw = q2.w\n", "\n", " # calculate quat * vector\n", "\n", " ix = qw * x + qy * z - qz * y\n", " iy = qw * y + qz * x - qx * z\n", " iz = qw * z + qx * y - qy * x\n", " iw = - qx * x - qy * y - qz * z\n", "\n", " # calculate result * inverse quat\n", "\n", " xx = ix * qw + iw * - qx + iy * - qz - iz * - qy\n", " yy = iy * qw + iw * - qy + iz * - qx - ix * - qz\n", " zz = iz * qw + iw * - qz + ix * - qy - iy * - qx\n", " \n", " d=15\n", "\n", " return Vector3(xx,yy,zz)\n", "end\n" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "multiplyQuaternions (generic function with 1 method)" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function conjugate(q::Quaternion)\n", " x= (-q.x==-0) ? 0.0 : -q.x\n", " y= (-q.y==-0) ? 0.0 : -q.y\n", " z= (-q.z==-0) ? 0.0 : -q.z\n", " w=q.w\n", " x=convert(Float64,x)\n", " y=convert(Float64,y)\n", " z=convert(Float64,z)\n", " w=convert(Float64,w)\n", " return Quaternion(x,y,z,w)\n", "end\n", "\n", "function RotateVec3D(a::Quaternion, f::Vector3) \n", " fx= (f.x==-0) ? 0 : f.x\n", " fy= (f.y==-0) ? 0 : f.y\n", " fz= (f.z==-0) ? 0 : f.z\n", " # fx= f.x\n", " # fy= f.y\n", " # fz= f.z\n", " tw = fx*a.x + fy*a.y + fz*a.z\n", " tx = fx*a.w - fy*a.z + fz*a.y\n", " ty = fx*a.z + fy*a.w - fz*a.x\n", " tz = -fx*a.y + fy*a.x + fz*a.w\n", "\n", " return Vector3((a.w*tx+a.x*tw+a.y*tz-a.z*ty),(a.w*ty-a.x*tz+a.y*tw+a.z*tx),(a.w*tz+a.x*ty-a.y*tx+a.z*tw))\n", "end\n", "#!< Returns a vector representing the specified vector \"f\" rotated by this quaternion. @param[in] f The vector to transform.\n", "\n", "function RotateVec3DInv(a::Quaternion, f::Vector3) \n", " fx=f.x\n", " fy=f.y\n", " fz=f.z\n", " tw = a.x*fx + a.y*fy + a.z*fz\n", " tx = a.w*fx - a.y*fz + a.z*fy\n", " ty = a.w*fy + a.x*fz - a.z*fx\n", " tz = a.w*fz - a.x*fy + a.y*fx\n", " return Vector3((tw*a.x + tx*a.w + ty*a.z - tz*a.y),(tw*a.y - tx*a.z + ty*a.w + tz*a.x),(tw*a.z + tx*a.y - ty*a.x + tz*a.w))\n", "end\n", "#!< Returns a vector representing the specified vector \"f\" rotated by the inverse of this quaternion. This is the opposite of RotateVec3D. @param[in] f The vector to transform.\n", "\n", "function ToRotationVector(a::Quaternion) \n", " if (a.w >= 1.0 || a.w <= -1.0) \n", " return Vector3(0.0,0.0,0.0)\n", " end\n", " squareLength = 1.0-a.w*a.w; # because x*x + y*y + z*z + w*w = 1.0, but more susceptible to w noise (when \n", " SLTHRESH_ACOS2SQRT= 2.4e-3; # SquareLength threshhold for when we can use square root optimization for acos. From SquareLength = 1-w*w. (calculate according to 1.0-W_THRESH_ACOS2SQRT*W_THRESH_ACOS2SQRT\n", "\n", " if (squareLength < SLTHRESH_ACOS2SQRT) # ???????\n", " x=a.x*(2.0*CUDAnative.sqrt((2-2*a.w)/squareLength))\n", " y=a.y*(2.0*CUDAnative.sqrt((2-2*a.w)/squareLength))\n", " z=a.z*(2.0*CUDAnative.sqrt((2-2*a.w)/squareLength))\n", " x=convert(Float64,x)\n", " y=convert(Float64,y)\n", " z=convert(Float64,z)\n", " \n", " return Vector3(x,y,z) ; # acos(w) = sqrt(2*(1-x)) for w close to 1. for w=0.001, error is 1.317e-6\n", " else \n", " x=a.x*(2.0*CUDAnative.acos(a.w)/CUDAnative.sqrt(squareLength))\n", " y=a.y*(2.0*CUDAnative.acos(a.w)/CUDAnative.sqrt(squareLength))\n", " z=a.z*(2.0*CUDAnative.acos(a.w)/CUDAnative.sqrt(squareLength))\n", " x=convert(Float64,x)\n", " y=convert(Float64,y)\n", " z=convert(Float64,z)\n", "\n", " return Vector3(x,y,z)\n", " end \n", "end \n", "# !< Returns a rotation vector representing this quaternion rotation. Adapted from http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/\n", "\n", "function FromRotationVector(VecIn::Vector3)\n", " theta=VecIn*Vector3(0.5,0.5,0.5)\n", " ntheta=CUDAnative.sqrt((theta.x * theta.x) + (theta.y * theta.y) + (theta.z * theta.z))\n", " thetaMag2=ntheta*ntheta\n", " \n", " DBL_EPSILONx24 =5.328e-15\n", " if thetaMag2*thetaMag2 < DBL_EPSILONx24\n", " qw=1.0 - 0.5*thetaMag2\n", "\t\ts=1.0 - thetaMag2 / 6.0\n", " else\n", " thetaMag = CUDAnative.sqrt(thetaMag2)\n", "\t\tqw=CUDAnative.cos(thetaMag)\n", "\t\ts=CUDAnative.sin(thetaMag) / thetaMag\n", " end\n", " qx=theta.x*s\n", " qy=theta.y*s\n", " qz=theta.z*s\n", " \n", " qx=convert(Float64,qx)\n", " qy=convert(Float64,qy)\n", " qz=convert(Float64,qz)\n", " qw=convert(Float64,qw)\n", " \n", " return Quaternion(qx,qy,qz,qw)\n", "end\n", "\n", "function multiplyQuaternions(q::Quaternion,f::Quaternion)\n", " x=q.x\n", " y=q.y\n", " z=q.z\n", " w=q.w\n", " x1=w*f.x + x*f.w + y*f.z - z*f.y \n", " y1=w*f.y - x*f.z + y*f.w + z*f.x\n", " z1=w*f.z + x*f.y - y*f.x + z*f.w\n", " w1=w*f.w - x*f.x - y*f.y - z*f.z\n", "# x1=convert(Float64,x1)\n", "# y1=convert(Float64,y1)\n", "# z1=convert(Float64,z1)\n", "# w1=convert(Float64,w1)\n", "\treturn Quaternion(x1,y1,z1,w1 ); #!< overload quaternion multiplication.\n", "end\n" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "axialStrain (generic function with 1 method)" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function updateStrain( axialStrain,E) # ?from where strain\n", " strain = axialStrain # redundant?\n", " currentTransverseStrainSum=0.0 # ??? todo\n", " linear=true\n", " maxStrain=1000000000000000;# ?? todo later change\n", " if linear\n", " if axialStrain > maxStrain\n", " maxStrain = axialStrain # remember this maximum for easy reference\n", " end\n", " return stress(axialStrain,E)\n", " else \n", " if (axialStrain > maxStrain) # if new territory on the stress/strain curve\n", " maxStrain = axialStrain # remember this maximum for easy reference\n", " returnStress = stress(axialStrain,E) # ??currentTransverseStrainSum\n", " if (nu != 0.0) \n", " strainOffset = maxStrain-stress(axialStrain,E)/(_eHat*(1.0-nu)) # precalculate strain offset for when we back off\n", " else \n", " strainOffset = maxStrain-returnStress/E # precalculate strain offset for when we back off\n", " end\n", " else # backed off a non-linear material, therefore in linear region.\n", " relativeStrain = axialStrain-strainOffset # treat the material as linear with a strain offset according to the maximum plastic deformation\n", " if (nu != 0.0) \n", " returnStress = stress(relativeStrain,E)\n", " else \n", " returnStress = E*relativeStrain\n", " end\n", " end\n", " return returnStress\n", " end\n", "end\n", "\n", "function stress( strain , E ) #end,transverseStrainSum, forceLinear){\n", " # reference: http://www.colorado.edu/engineering/CAS/courses.d/Structures.d/IAST.Lect05.d/IAST.Lect05.pdf page 10\n", " # if (isFailed(strain)) return 0.0f; //if a failure point is set and exceeded, we've broken!\n", " # var E =setup.edges[0].stiffness; //todo change later to material ??\n", " # var E=1000000;//todo change later to material ??\n", " # var scaleFactor=1;\n", " return E*strain;\n", "\n", " # # if (strain <= strainData[1] || linear || forceLinear){ //for compression/first segment and linear materials (forced or otherwise), simple calculation\n", "\n", " # if (nu==0.0) return E*strain;\n", " # else return _eHat*((1-nu)*strain + nu*transverseStrainSum); \n", " # else return eHat()*((1-nu)*strain + nu*transverseStrainSum); \n", " # # }\n", "\n", " #//the non-linear feature with non-zero poissons ratio is currently experimental\n", " #int DataCount = modelDataPoints();\n", " #for (int i=2; i<DataCount; i++){ //go through each segment in the material model (skipping the first segment because it has already been handled.\n", " # if (strain <= strainData[i] || i==DataCount-1){ //if in the segment ending with this point (or if this is the last point extrapolate out) \n", " # float Perc = (strain-strainData[i-1])/(strainData[i]-strainData[i-1]);\n", " # float basicStress = stressData[i-1] + Perc*(stressData[i]-stressData[i-1]);\n", " # if (nu==0.0f) return basicStress;\n", " # else { //accounting for volumetric effects\n", " # float modulus = (stressData[i]-stressData[i-1])/(strainData[i]-strainData[i-1]);\n", " # float modulusHat = modulus/((1-2*nu)*(1+nu));\n", " # float effectiveStrain = basicStress/modulus; //this is the strain at which a simple linear stress strain line would hit this point at the definied modulus\n", " # float effectiveTransverseStrainSum = transverseStrainSum*(effectiveStrain/strain);\n", " # return modulusHat*((1-nu)*effectiveStrain + nu*effectiveTransverseStrainSum);\n", " # }\n", " # }\n", " #}\n", "\n", " # assert(false); //should never reach this point\n", " # return 0.0f;\n", "end \n", "\n", "function axialStrain( positiveEnd,strain)\n", "\t#strainRatio = pVPos->material()->E/pVNeg->material()->E;\n", "\tstrainRatio=1.0;\n", "\treturn positiveEnd ? 2.0 *strain*strainRatio/(1.0+strainRatio) : 2.0*strain/(1.0+strainRatio)\n", "end" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "moment (generic function with 1 method)" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function force(N_intForce,N_orient,N_force,static,currentTimeStep) \n", " # forces from internal bonds\n", " totalForce=Vector3(0,0,0)\n", " # new THREE.Vector3(node.force.x,node.force.y,node.force.z);\n", " # todo \n", "\n", "\n", " totalForce=totalForce+N_intForce\n", "\n", " # for (int i=0; i<6; i++){ \n", " # \tif (links[i]) totalForce += links[i]->force(isNegative((linkDirection)i)); # total force in LCS\n", " # }\n", " totalForce = RotateVec3D(N_orient,totalForce); # from local to global coordinates\n", "\n", "\n", " # assert(!(totalForce.x != totalForce.x) || !(totalForce.y != totalForce.y) || !(totalForce.z != totalForce.z)); //assert non QNAN\n", "\n", " # other forces\n", " if(static)\n", " totalForce=totalForce+N_force\n", " # }else if(currentTimeStep<50){\n", " # \ttotalForce.add(new THREE.Vector3(node.force.x,node.force.y,node.force.z));\n", " else\n", " # var ex=0.1;\n", " # if(node.force.y!=0){\n", " # \tvar f=400*Math.sin(currentTimeStep*ex);\n", " # \ttotalForce.add(new THREE.Vector3(0,f,0));\n", "\n", " # }\n", " #x=N_position[node][3]\n", " #t=currentTimeStep\n", " #wave=getForce(x,t)\n", " #totalForce=totalForce+[0 wave 0]\n", " end\n", "\n", "\n", " # if (externalExists()) totalForce += external()->force(); //external forces\n", " # totalForce -= velocity()*mat->globalDampingTranslateC(); //global damping f-cv\n", " # totalForce.z += mat->gravityForce(); //gravity, according to f=mg\n", "\n", " # if (isCollisionsEnabled()){\n", " # \tfor (std::vector<CVX_Collision*>::iterator it=colWatch->begin(); it!=colWatch->end(); it++){\n", " # \t\ttotalForce -= (*it)->contactForce(this);\n", " # \t}\n", " # }\n", " # todo make internal forces 0 again\n", " # N_intForce[node]=[0 0 0] # do i really need it?\n", "\n", " # node.force.x=0;\n", " # node.force.y=0;\n", " # node.force.z=0;\n", "\n", "\n", " return totalForce\n", "end\n", "\n", "\n", "function moment(intMoment,orient,moment) \n", " #moments from internal bonds\n", " totalMoment=Vector3(0,0,0)\n", " # for (int i=0; i<6; i++){ \n", " # \tif (links[i]) totalMoment += links[i]->moment(isNegative((linkDirection)i)); //total force in LCS\n", " # }\n", "\n", " totalMoment=totalMoment+intMoment\n", " \n", " \n", "\n", " totalMoment = RotateVec3D(orient,totalMoment);\n", " \n", " \n", "\n", " totalMoment=totalMoment+moment\n", "\n", "\n", " #other moments\n", " # if (externalExists()) totalMoment += external()->moment(); //external moments\n", " # totalMoment -= angularVelocity()*mat->globalDampingRotateC(); //global damping\n", "\n", " return totalMoment\n", "end" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "updateDataAndSave! (generic function with 1 method)" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function updateDataAndSave!(metavoxel,setup,fileName)\n", " nodes = setup[\"nodes\"]\n", " edges = setup[\"edges\"]\n", " \n", " setup[\"animation\"][\"showDisplacement\"]=false\n", " voxCount=size(nodes)[1]\n", " linkCount=size(edges)[1]\n", " \n", " N_displacement=Array(metavoxel[\"N_displacementGPU\"])\n", " N_angle=Array(metavoxel[\"N_angleGPU\"])\n", " E_stress=Array(metavoxel[\"E_stressGPU\"])\n", " \n", " setup[\"viz\"][\"maxStress\"]=maximum(E_stress)\n", " setup[\"viz\"][\"minStress\"]=minimum(E_stress) \n", "\n", " i=1\n", "\tfor edge in edges\n", " edge[\"stress\"]=E_stress[i]\n", " i=i+1\n", "\n", " end\n", " \n", " \n", " i=1 \n", "\tfor node in nodes\n", " node[\"displacement\"][\"x\"]=N_displacement[i].x\n", " node[\"displacement\"][\"y\"]=N_displacement[i].y\n", " node[\"displacement\"][\"z\"]=N_displacement[i].z\n", " \n", " node[\"angle\"][\"x\"]=N_angle[i].x\n", " node[\"angle\"][\"y\"]=N_angle[i].y\n", " node[\"angle\"][\"z\"]=N_angle[i].z\n", " i=i+1\n", "\n", " end\n", " \n", " # pass data as a json string (how it shall be displayed in a file)\n", " stringdata = JSON.json(setup)\n", "\n", " # write the file with the stringdata variable information\n", " open(fileName, \"w\") do f\n", " write(f, stringdata)\n", " end\n", " \n", "end" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "runMetavoxelGPU! (generic function with 1 method)" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function runMetavoxelGPU!(setup,numTimeSteps,latticeSize,displacements,returnEvery,save)\n", " function initialize!(setup)\n", " nodes = setup[\"nodes\"]\n", " edges = setup[\"edges\"]\n", "\n", " i=1\n", " # pre-calculate current position\n", " for node in nodes\n", " # element=parse(Int,node[\"id\"][2:end])\n", " N_position[i]=Vector3(node[\"position\"][\"x\"],node[\"position\"][\"y\"],node[\"position\"][\"z\"])\n", " N_restrained[i]=node[\"restrained_degrees_of_freedom\"][1] ## todo later consider other degrees of freedom\n", " N_displacement[i]=Vector3(node[\"displacement\"][\"x\"],node[\"displacement\"][\"y\"],node[\"displacement\"][\"z\"])\n", " N_angle[i]=Vector3(node[\"angle\"][\"x\"],node[\"angle\"][\"y\"],node[\"angle\"][\"z\"])\n", " N_force[i]=Vector3(node[\"force\"][\"x\"],node[\"force\"][\"y\"]/100,node[\"force\"][\"z\"])\n", " N_currPosition[i]=Vector3(node[\"position\"][\"x\"],node[\"position\"][\"y\"],node[\"position\"][\"z\"])\n", "\n", " # for dynamic simulations\n", " # append!(N_posTimeSteps,[[]])\n", " # append!(N_angTimeSteps,[[]])\n", "\n", " i=i+1\n", " end \n", "\n", " i=1\n", " # pre-calculate the axis\n", " for edge in edges\n", " # element=parse(Int,edge[\"id\"][2:end])\n", "\n", " # find the nodes that the lements connects\n", " fromNode = nodes[edge[\"source\"]+1]\n", " toNode = nodes[edge[\"target\"]+1]\n", "\n", "\n", " node1 = [fromNode[\"position\"][\"x\"] fromNode[\"position\"][\"y\"] fromNode[\"position\"][\"z\"]]\n", " node2 = [toNode[\"position\"][\"x\"] toNode[\"position\"][\"y\"] toNode[\"position\"][\"z\"]]\n", "\n", " length=norm(node2-node1)\n", " axis=normalize(collect(Iterators.flatten(node2-node1)))\n", "\n", " E_source[i]=edge[\"source\"]+1\n", " E_target[i]=edge[\"target\"]+1\n", " E_area[i]=edge[\"area\"]\n", " E_density[i]=edge[\"density\"]\n", " E_stiffness[i]=edge[\"stiffness\"]\n", " E_axis[i]=Vector3(axis[1],axis[2],axis[3])\n", " E_currentRestLength[i]=length\n", "\n", " N_edgeID[E_source[i],N_currEdge[E_source[i]]]=i\n", " N_edgeFirst[E_source[i],N_currEdge[E_source[i]]]=true\n", " N_currEdge[E_source[i]]+=1\n", "\n", " N_edgeID[E_target[i],N_currEdge[E_target[i]]]=i\n", " N_edgeFirst[E_target[i],N_currEdge[E_target[i]]]=false\n", " N_currEdge[E_target[i]]+=1\n", "\n", "\n", " # for dynamic simulations\n", " # append!(E_stressTimeSteps,[[]])\n", "\n", " i=i+1\n", " end \n", " end\n", " function simulateParallel!(metavoxel,numTimeSteps,dt,returnEvery)\n", " # initialize(setup)\n", "\n", " for i in 1:numTimeSteps\n", " #println(\"Timestep:\",i)\n", " doTimeStep!(metavoxel,dt,i)\n", " if(mod(i,returnEvery)==0)\n", " append!(displacements,[Array(metavoxel[\"N_displacementGPU\"])])\n", " end\n", " end\n", " end\n", " \n", " ########\n", " voxCount=0\n", " linkCount=0\n", " nodes = setup[\"nodes\"]\n", " edges = setup[\"edges\"]\n", " voxCount=size(nodes)[1]\n", " linkCount=size(edges)[1]\n", " strain =0 #todooo moveeee\n", " maxNumEdges=10\n", "\n", " ########\n", " voxCount=0\n", " linkCount=0\n", " nodes = setup[\"nodes\"]\n", " edges = setup[\"edges\"]\n", " voxCount=size(nodes)[1]\n", " linkCount=size(edges)[1]\n", " strain =0 #todooo moveeee\n", "\n", " ############# nodes\n", " N_position=fill(Vector3(),voxCount)\n", " N_restrained=zeros(Bool, voxCount)\n", " N_displacement=fill(Vector3(),voxCount)\n", " N_angle=fill(Vector3(),voxCount)\n", " N_currPosition=fill(Vector3(),voxCount)\n", " N_linMom=fill(Vector3(),voxCount)\n", " N_angMom=fill(Vector3(),voxCount)\n", " N_intForce=fill(Vector3(),voxCount)\n", " N_intMoment=fill(Vector3(),voxCount)\n", " N_moment=fill(Vector3(),voxCount)\n", " # N_posTimeSteps=[]\n", " # N_angTimeSteps=[]\n", " N_force=fill(Vector3(),voxCount)\n", " N_orient=fill(Quaternion(),voxCount)\n", " N_edgeID=fill(-1,(voxCount,maxNumEdges))\n", " N_edgeFirst=fill(true,(voxCount,maxNumEdges))\n", " N_currEdge=fill(1,voxCount)\n", "\n", " ############# edges\n", " E_source=fill(0,linkCount)\n", " E_target=fill(0,linkCount)\n", " E_area=fill(0.0f0,linkCount)\n", " E_density=fill(0.0f0,linkCount)\n", " E_stiffness=fill(0.0f0,linkCount)\n", " E_stress=fill(0.0f0,linkCount)\n", " E_axis=fill(Vector3(1.0,0.0,0.0),linkCount)\n", " E_currentRestLength=fill(0.0f0,linkCount)\n", " E_pos2=fill(Vector3(),linkCount)\n", " E_angle1v=fill(Vector3(),linkCount)\n", " E_angle2v=fill(Vector3(),linkCount)\n", " E_angle1=fill(Quaternion(),linkCount)\n", " E_angle2=fill(Quaternion(),linkCount)\n", "\n", " E_intForce1=fill(Vector3(),linkCount)\n", " E_intMoment1=fill(Vector3(),linkCount) \n", "\n", " E_intForce2=fill(Vector3(),linkCount)\n", " E_intMoment2=fill(Vector3(),linkCount)\n", " E_damp=fill(false,linkCount)\n", "\n", " E_currentTransverseStrainSum=fill(0.0f0,linkCount)# TODO remove ot incorporate\n", " # E_stressTimeSteps=[]\n", "\n", "\n", " #################################################################\n", " initialize!(setup)\n", " #################################################################\n", "\n", " ########################## turn to cuda arrays\n", " ############# nodes\n", " N_positionGPU= CuArray(N_position) \n", " N_restrainedGPU= CuArray(N_restrained) \n", " N_displacementGPU=CuArray(N_displacement) \n", " N_angleGPU= CuArray(N_angle) \n", " N_currPositionGPU=CuArray(N_currPosition) \n", " N_linMomGPU= CuArray(N_linMom) \n", " N_angMomGPU= CuArray(N_angMom) \n", " N_intForceGPU= CuArray(N_intForce) \n", " N_intMomentGPU= CuArray(N_intMoment) \n", " N_momentGPU= CuArray(N_moment) \n", " N_forceGPU= CuArray(N_force) \n", " N_orientGPU= CuArray(N_orient) \n", " N_edgeIDGPU= CuArray(N_edgeID) \n", " N_edgeFirstGPU= CuArray(N_edgeFirst) \n", "\n", "\n", " ############# edges\n", " E_sourceGPU= CuArray(E_source) \n", " E_targetGPU= CuArray(E_target)\n", " E_areaGPU= CuArray(E_area) \n", " E_densityGPU= CuArray(E_density)\n", " E_stiffnessGPU= CuArray(E_stiffness)\n", " E_stressGPU= CuArray(E_stress)\n", " E_axisGPU= CuArray(E_axis) \n", " E_currentRestLengthGPU= CuArray(E_currentRestLength)\n", " E_pos2GPU= CuArray(E_pos2)\n", " E_angle1vGPU= CuArray(E_angle1v)\n", " E_angle2vGPU= CuArray(E_angle2v)\n", " E_angle1GPU= CuArray(E_angle1)\n", " E_angle2GPU= CuArray(E_angle2)\n", " E_currentTransverseStrainSumGPU=CuArray(E_currentTransverseStrainSum)\n", " E_intForce1GPU= CuArray(E_intForce1) \n", " E_intMoment1GPU= CuArray(E_intMoment1) \n", " E_intForce2GPU= CuArray(E_intForce2) \n", " E_intMoment2GPU= CuArray(E_intMoment2)\n", " E_dampGPU= CuArray(E_damp) \n", " # E_stressTimeSteps=[]\n", "\n", "\n", " #########################################\n", " metavoxel = Dict(\n", " \"N_positionGPU\" => N_positionGPU, \n", " \"N_restrainedGPU\" => N_restrainedGPU, \n", " \"N_displacementGPU\" => N_displacementGPU,\n", " \"N_angleGPU\" => N_angleGPU, \n", " \"N_currPositionGPU\" => N_currPositionGPU,\n", " \"N_linMomGPU\" => N_linMomGPU, \n", " \"N_angMomGPU\" => N_angMomGPU, \n", " \"N_intForceGPU\" => N_intForceGPU, \n", " \"N_intMomentGPU\" => N_intMomentGPU, \n", " \"N_momentGPU\" => N_momentGPU, \n", " \"N_forceGPU\" => N_forceGPU, \n", " \"N_orientGPU\" => N_orientGPU, \n", " \"N_edgeIDGPU\" => N_edgeIDGPU, \n", " \"N_edgeFirstGPU\" => N_edgeFirstGPU,\n", " \"E_sourceGPU\" =>E_sourceGPU, \n", " \"E_targetGPU\" =>E_targetGPU, \n", " \"E_areaGPU\" =>E_areaGPU, \n", " \"E_densityGPU\" =>E_densityGPU, \n", " \"E_stiffnessGPU\" =>E_stiffnessGPU, \n", " \"E_stressGPU\" =>E_stressGPU, \n", " \"E_axisGPU\" =>E_axisGPU, \n", " \"E_currentRestLengthGPU\" =>E_currentRestLengthGPU, \n", " \"E_pos2GPU\" =>E_pos2GPU, \n", " \"E_angle1vGPU\" =>E_angle1vGPU, \n", " \"E_angle2vGPU\" =>E_angle2vGPU, \n", " \"E_angle1GPU\" =>E_angle1GPU, \n", " \"E_angle2GPU\" =>E_angle2GPU, \n", " \"E_currentTransverseStrainSumGPU\" =>E_currentTransverseStrainSumGPU,\n", " \"E_intForce1GPU\" =>E_intForce1GPU, \n", " \"E_intMoment1GPU\" =>E_intMoment1GPU, \n", " \"E_intForce2GPU\" =>E_intForce2GPU, \n", " \"E_intMoment2GPU\" =>E_intMoment2GPU, \n", " \"E_dampGPU\" =>E_dampGPU \n", " )\n", "\n", " #########################################\n", " if save\n", " updateDataAndSave!(metavoxel,setup,\"../json/trialJuliaParallelGPU.json\")\n", " end\n", "\n", " dt=0.0251646\n", "# dt=0.0001646\n", " \n", " append!(displacements,[Array(metavoxel[\"N_displacementGPU\"])])\n", " \n", " t=@timed doTimeStep!(metavoxel,dt,0)\n", " append!(displacements,[Array(metavoxel[\"N_displacementGPU\"])])\n", " time=t[2]\n", " println(\"first timestep took $time seconds\")\n", " t=@timed simulateParallel!(metavoxel,numTimeSteps-1,dt,returnEvery)\n", " time=t[2]\n", " \n", " \n", " println(\"ran latticeSize $latticeSize with $voxCount voxels and $linkCount edges for $numTimeSteps time steps took $time seconds\")\n", " return\n", "end" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "fea (generic function with 1 method)" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function fea(setup)\n", " #######################################################\n", " function points(element, properties)\n", " elements = properties[\"elements\"]\n", " nodes = properties[\"nodes\"]\n", " degrees_of_freedom = properties[\"degrees_of_freedom\"]\n", "\n", " # find the nodes that the lements connects\n", " fromNode = elements[element][1]\n", " toNode = elements[element][2]\n", "\n", " # the coordinates for each node\n", " fromPoint = nodes[fromNode]\n", " toPoint = nodes[toNode]\n", "\n", " # find the degrees of freedom for each node\n", " dofs = degrees_of_freedom[fromNode]\n", " dofs=vcat(dofs,degrees_of_freedom[toNode])\n", "\n", " return fromPoint, toPoint, dofs\n", " end\n", "\n", " function direction_cosine(vec1, vec2)\n", " return dot(vec1,vec2) / (norm(vec1) * norm(vec2))\n", " end\n", "\n", " function rotation_matrix(element_vector, x_axis, y_axis,z_axis)\n", " # find the direction cosines\n", " x_proj = direction_cosine(element_vector, x_axis)\n", " y_proj = direction_cosine(element_vector, y_axis)\n", " z_proj = direction_cosine(element_vector, z_axis);\n", " return [[x_proj y_proj z_proj 0 0 0];[0 0 0 x_proj y_proj z_proj]]\n", " end\n", "\n", " function rotation_matrix(element_vector, x_axis, y_axis,z_axis)\n", " # find the direction cosines\n", " L=norm(element_vector)\n", " l = (element_vector[1])/L\n", " m = (element_vector[2])/L\n", " n = (element_vector[3])/L\n", " D = ( l^2+ m^2+n^2)^0.5\n", "\n", " transMatrix=[[l m n 0 0 0 0 0 0 0 0 0];[-m/D l/D 0 0 0 0 0 0 0 0 0 0];[ -l*n/D -m*n/D D 0 0 0 0 0 0 0 0 0];[ 0 0 0 l m n 0 0 0 0 0 0];[ 0 0 0 -m/D l/D 0 0 0 0 0 0 0];[ 0 0 0 -l*n/D -m*n/D D 0 0 0 0 0 0];[ 0 0 0 0 0 0 l m n 0 0 0];[ 0 0 0 0 0 0 -m/D l/D 0 0 0 0];[ 0 0 0 0 0 0 -l*n/D -m*n/D D 0 0 0];[ 0 0 0 0 0 0 0 0 0 l m n];[ 0 0 0 0 0 0 0 0 0 -m/D l/D 0];[ 0 0 0 0 0 0 0 0 0 -l*n/D -m*n/D D]]\n", "\n", " return transMatrix\n", " end\n", " \n", " #######################################################\n", " function get_matrices(setup)\n", "\n", " nodes = setup[\"nodes\"]\n", " edges = setup[\"edges\"]\n", " ndofs = length(nodes)*6\n", "\n", " x_axis = [1 0 0]\n", " y_axis = [0 1 0]\n", " z_axis = [0 0 1]\n", "\n", " M = zeros((ndofs,ndofs))\n", " K = zeros((ndofs,ndofs))\n", " \n", " \n", " for edge in edges\n", " #degrees_of_freedom = properties[\"degrees_of_freedom\"]\n", "\n", " element=parse(Int,edge[\"id\"][2:end])\n", "\n", " # find the nodes that the lements connects\n", " fromNode = nodes[edge[\"source\"]+1]\n", " toNode = nodes[edge[\"target\"]+1]\n", " \n", "\n", " # the coordinates for each node\n", " fromPoint = [fromNode[\"position\"][\"x\"] fromNode[\"position\"][\"y\"] fromNode[\"position\"][\"z\"]]\n", " toPoint = [toNode[\"position\"][\"x\"] toNode[\"position\"][\"y\"] toNode[\"position\"][\"z\"]]\n", "\n", " # find the degrees of freedom for each node\n", " dofs = convert(Array{Int}, fromNode[\"degrees_of_freedom\"])\n", " dofs=vcat(dofs,convert(Array{Int}, toNode[\"degrees_of_freedom\"]))\n", "\n", " element_vector=toPoint-fromPoint\n", "\n", " # find element mass and stifness matrices\n", " length = norm(element_vector)\n", " rho = edge[\"density\"]\n", " area = edge[\"area\"]\n", " E = edge[\"stiffness\"]# youngs modulus\n", "\n", " A = edge[\"area\"]\n", " G=1.0#todo shear_modulus\n", " ixx = 1.0#todo section ixx\n", " iyy = 1.0#todo section.iyy#\n", " l0=length\n", " j=1.0;#todo check\n", " l02 = l0 * l0\n", " l03 = l0 * l0 * l0\n", " \n", " ################################\n", " \n", " nu=0.3\n", " W = 75\n", " L = W/sqrt(2)\n", " n_min = 1\n", " n_max = 7\n", " # Cross Section inputs, must be floats\n", " E = 3000.0 # MPa\n", " G = E * 1 / 3 # MPa\n", " h = 2.38 # mm\n", " b = 2.38 # mm\n", " rho = 7.85e-9 / 3 # kg/mm^3\n", " S = h * b\n", " Sy = (S * (6 + 12 * nu + 6 * nu^2)/ (7 + 12 * nu + 4 * nu^2))\n", " # For solid rectangular cross section (width=b, depth=d & ( b < d )):\n", " Q = 1 / 3 - 0.2244 / (min(h / b, b / h) + 0.1607)\n", " Jxx = Q * min(h * b^3, b * h^3)\n", " \n", " \n", " ##if voxels\n", " #nu=0\n", " #L=l\n", " #a1 = E*L # EA/L : Units of N/m\n", " #a2 = E * L*L*L / (12.0*(1+nu)) # GJ/L : Units of N-m\n", " #b1 = E*L # 12EI/L^3 : Units of N/m\n", " #b2 = E*L*L/2.0 # 6EI/L^2 : Units of N (or N-m/m: torque related to linear distance)\n", " #b3 = E*L*L*L/6.0 # 2EI/L : Units of N-m\n", " \n", " I= b*h^3/12\n", " J=b*h*(b*b+h*h)/12\n", " a1=E*b*h/L\n", " a2=G*J/L\n", " b1=12*E*I/(L^3)\n", " b2=6*E*I/(L^2)\n", " b3=2*E*I/(L)\n", " \n", " # Cm = rho * area * length /6.0\n", " # Ck= E * area / length \n", "\n", " # m = [[2 1];[1 2]]\n", " # k = [[1 -1];[-1 1]]\n", " \n", "\n", " k = [[E*A/l0 0 0 0 0 0 -E*A/l0 0 0 0 0 0];[0 12*E*ixx/l03 0 0 0 6*E*ixx/l02 0 -12*E*ixx/l03 0 0 0 6*E*ixx/l02];[0 0 12*E*iyy/l03 0 -6*E*iyy/l02 0 0 0 -12*E*iyy/l03 0 -6*E*iyy/l02 0];[0 0 0 G*j/l0 0 0 0 0 0 -G*j/l0 0 0];[0 0 -6*E*iyy/l02 0 4*E*iyy/l0 0 0 0 6*E*iyy/l02 0 2*E*iyy/l0 0];[0 6*E*ixx/l02 0 0 0 4*E*ixx/l0 0 -6*E*ixx/l02 0 0 0 2*E*ixx/l0];[-E*A/l0 0 0 0 0 0 E*A/l0 0 0 0 0 0];[0 -12*E*ixx/l03 0 0 0 -6*E*ixx/l02 0 12*E*ixx/l03 0 0 0 -6*E*ixx/l02];[0 0 -12*E*iyy/l03 0 6*E*iyy/l02 0 0 0 12*E*iyy/l03 0 6*E*iyy/l02 0];[0 0 0 -G*j/l0 0 0 0 0 0 G*j/l0 0 0];[0 0 -6*E*iyy/l02 0 2*E*iyy/l0 0 0 0 6*E*iyy/l02 0 4*E*iyy/l0 0];[0 6*E*ixx/l02 0 0 0 2*E*ixx/l0 0 -6*E*ixx/l02 0 0 0 4*E*ixx/l0]]\n", " k= [[ a1 0 0 0 0 0 -a1 0 0 0 0 0 ];\n", " [ 0 b1 0 0 0 b2 0 -b1 0 0 0 b2 ];\n", " [ 0 0 b1 0 -b2 0 0 0 -b1 0 -b2 0 ];\n", " [ 0 0 0 a2 0 0 0 0 0 -a2 0 0 ];\n", " [ 0 0 0 0 2b3 0 0 0 b2 0 b3 0 ];\n", " [ 0 0 0 0 0 2b3 0 -b2 0 0 0 b3 ];\n", " [ 0 0 0 0 0 0 a1 0 0 0 0 0 ];\n", " [ 0 0 0 0 0 0 0 b1 0 0 0 -b2 ];\n", " [ 0 0 0 0 0 0 0 0 b1 0 b2 0 ];\n", " [ 0 0 0 0 0 0 0 0 0 a2 0 0 ];\n", " [ 0 0 0 0 0 0 0 0 0 0 2b3 0 ];\n", " [ 0 0 0 0 0 0 0 0 0 0 0 2b3 ]]\n", " # find rotated mass and stifness matrices\n", " tau = rotation_matrix(element_vector, x_axis,y_axis,z_axis)\n", "\n", " # m_r=transpose(tau)*m*tau\n", " k_r=transpose(tau)*k*tau\n", "\n", " # change from element to global coordinate\n", " index= dofs.+1\n", "\n", " B=zeros((12,ndofs))\n", " for i in 1:12\n", " B[i,index[i]]=1.0\n", " end\n", "\n", "\n", " # M_rG= transpose(B)*m_r*B\n", " K_rG= transpose(B)*k_r*B\n", "\n", " # M += Cm .* M_rG\n", " # K += Ck .* K_rG\n", " K += K_rG\n", "\n", " end\n", " \n", " \n", " # construct the force vector\n", " F=zeros(ndofs)\n", " remove_indices=[];\n", " for node in nodes\n", " #insert!(F,i, value);\n", " #F=vcat(F,value)\n", " \n", " \n", " i=parse(Int,node[\"id\"][2:end])\n", " f=node[\"force\"]\n", " \n", " # println(f)\n", " F[(i)*6+1]=f[\"x\"]/100.0\n", " F[(i)*6+2]=f[\"y\"]/100.0\n", " F[(i)*6+3]=f[\"z\"]/100.0\n", " F[(i)*6+4]=0\n", " F[(i)*6+5]=0\n", " F[(i)*6+6]=0\n", " \n", " dofs = convert(Array{Int}, node[\"degrees_of_freedom\"]).+1\n", " restrained_dofs=node[\"restrained_degrees_of_freedom\"]\n", " for (index, value) in enumerate(dofs)\n", " if restrained_dofs[index]\n", " append!( remove_indices, value)\n", " end\n", " end\n", " \n", " end\n", "\n", " #println(remove_indices)\n", " #print(K)\n", " #print(F)\n", " \n", "\n", " #M = M[setdiff(1:end, remove_indices), :]\n", " K = K[setdiff(1:end, remove_indices), :]\n", "\n", " #M = M[:,setdiff(1:end, remove_indices)]\n", " K = K[:,setdiff(1:end, remove_indices)]\n", "\n", " F = F[setdiff(1:end, remove_indices)]\n", " return M,K,F\n", " end\n", " \n", " \n", " function updateDisplacement(setup, X)\n", " nodes= setup[\"nodes\"]\n", " i=0\n", " for node in nodes\n", " \n", " if !node[\"restrained_degrees_of_freedom\"][1]\n", " #i=parse(Int,node[\"id\"][2:end])\n", " node[\"displacement\"][\"x\"]=X[(i)*6+1]\n", " node[\"displacement\"][\"y\"]=X[(i)*6+2]\n", " node[\"displacement\"][\"z\"]=X[(i)*6+3]\n", " node[\"angle\"][\"x\"]=X[(i)*6+4]\n", " node[\"angle\"][\"y\"]=X[(i)*6+5]\n", " node[\"angle\"][\"z\"]=X[(i)*6+6]\n", " append!(displacementFEA,[Vector3(X[(i)*6+1],X[(i)*6+2],X[(i)*6+3])])\n", " i=i+1\n", " else\n", " append!(displacementFEA,[Vector3(0,0,0)])\n", " end\n", " end\n", " end\n", " \n", " #######################################################\n", "\n", " function get_stresses(setup)\n", " nodes = setup[\"nodes\"]\n", " edges = setup[\"edges\"]\n", " ndofs = length(nodes)*6\n", "\n", " x_axis = [1 0 0]\n", " y_axis = [0 1 0]\n", " z_axis = [0 0 1]\n", "\n", " # find the stresses in each member\n", " stresses=zeros(length(edges))\n", " max11=-10e6\n", " min11=10e6\n", " for edge in edges\n", " #degrees_of_freedom = properties[\"degrees_of_freedom\"]\n", "\n", " element=parse(Int,edge[\"id\"][2:end])\n", "\n", " # find the nodes that the lements connects\n", " fromNode = nodes[edge[\"source\"]+1]\n", " toNode = nodes[edge[\"target\"]+1]\n", "\n", " # the coordinates for each node\n", " fromPoint = [fromNode[\"position\"][\"x\"] fromNode[\"position\"][\"y\"] fromNode[\"position\"][\"z\"]]\n", " toPoint = [toNode[\"position\"][\"x\"] toNode[\"position\"][\"y\"] toNode[\"position\"][\"z\"]]\n", "\n", " # find the degrees of freedom for each node\n", " dofs = convert(Array{Int}, fromNode[\"degrees_of_freedom\"])\n", " dofs=vcat(dofs,convert(Array{Int}, toNode[\"degrees_of_freedom\"]))\n", "\n", " element_vector=toPoint-fromPoint\n", "\n", "\n", " # find rotated mass and stifness matrices\n", " tau = rotation_matrix(element_vector, x_axis,y_axis,z_axis)\n", "\n", " # i1=parse(Int,fromNode[\"id\"][2:end])\n", " # i2=parse(Int,toNode[\"id\"][2:end])\n", "\n", " # global_displacements=[X[(i1)*6+1] X[(i1)*6+2] X[(i1)*6+3] X[(i1)*6+4] X[(i1)*6+5] X[(i1)*6+6] X[(i2)*6+1] X[(i2)*6+2] X[(i2)*6+3] X[(i2)*6+4] X[(i2)*6+5] X[(i2)*6+6]] # todo change\n", " global_displacements=[fromNode[\"displacement\"][\"x\"] fromNode[\"displacement\"][\"y\"] fromNode[\"displacement\"][\"z\"] fromNode[\"angle\"][\"x\"] fromNode[\"angle\"][\"y\"] fromNode[\"angle\"][\"z\"] toNode[\"displacement\"][\"x\"] toNode[\"displacement\"][\"y\"] toNode[\"displacement\"][\"z\"] toNode[\"angle\"][\"x\"] toNode[\"angle\"][\"y\"] toNode[\"angle\"][\"z\"]] # todo change\n", "\n", " # nodal displacement\n", "\n", " q=tau*transpose(global_displacements)\n", " # println(q)\n", " # calculate the strain and stresses\n", " strain =(q[7]-q[1])/norm(element_vector)\n", " E = edge[\"stiffness\"]# youngs modulus\n", " stress=E.*strain\n", " edge[\"stress\"]=stress\n", " if stress>max11\n", " max11=stress\n", " end\n", " if stress<min11\n", " min11=stress\n", " end\n", " # println(element)\n", " # println(stress)\n", " end\n", "\n", "\n", "\n", " setup[\"viz\"][\"minStress\"]=min11\n", " setup[\"viz\"][\"maxStress\"]=max11\n", " return stresses\n", " end\n", " \n", " function initialize(setup)\n", " nodes = setup[\"nodes\"]\n", " ndofs = length(nodes)*6\n", " \n", " i=0\n", " for node in nodes\n", " dg=[]\n", " for ii in 0:5\n", " append!(dg,i+ii) \n", " end\n", " i+=6\n", " node[\"degrees_of_freedom\"]=dg\n", " end\n", " end\n", "\n", " #######################################################\n", " function solveFea(setup)\n", " // # determine the global matrices\n", " initialize(setup)\n", " \n", " M,K,F=get_matrices(setup)\n", " \n", " #println(M)\n", " #println(K)\n", " #println(F)\n", "\n", " #evals=eigvals(K,M)\n", " #evecs=eigvecs(K,M)\n", " #frequencies=sqrt.(evals)\n", " X=inv(K)*F\n", " # println(X)\n", "\n", "\n", " #updateDisplacement(displacements);\n", " updateDisplacement(setup, X)\n", "\n", " # determine the stresses in each element\n", " stresses=get_stresses(setup)\n", " end\n", " #######################################################\n", " displacementFEA=[]\n", " solveFea(setup)\n", " return displacementFEA\n", "end" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "getSetup (generic function with 1 method)" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function getSetup()\n", " setup = Dict()\n", "\n", " open(\"../json/setupValid2.json\", \"r\") do f\n", "# open(\"../json/setupTest.json\", \"r\") do f\n", " # open(\"../json/trialJulia.json\", \"r\") do f\n", "# open(\"../json/setupTestUni4.json\", \"r\") do f\n", " # open(\"../json/setupChiral.json\", \"r\") do f\n", "# open(\"../json/setupTestCubeUni10.json\", \"r\") do f\n", "# global setup\n", " dicttxt = String(read(f)) # file information to string\n", " setup=JSON.parse(dicttxt) # parse and transform data\n", " end\n", "\n", " setup=setup[\"setup\"]\n", " return setup\n", "end" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "first timestep took 0.9752327 seconds\n", "ran latticeSize 4 with 8 voxels and 12 edges for 3000 time steps took 1.0615292 seconds\n", "FEA displacement= -0.003114564315143315,converged displacement= -0.00026102125581191663\n" ] }, { "data": { "image/svg+xml": [ "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n", "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"600\" height=\"400\" viewBox=\"0 0 2400 1600\">\n", "<defs>\n", " <clipPath id=\"clip5500\">\n", " <rect x=\"0\" y=\"0\" width=\"2400\" height=\"1600\"/>\n", " </clipPath>\n", "</defs>\n", "<path clip-path=\"url(#clip5500)\" d=\"\n", "M0 1600 L2400 1600 L2400 0 L0 0 Z\n", " \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n", "<defs>\n", " <clipPath id=\"clip5501\">\n", " <rect x=\"480\" y=\"0\" width=\"1681\" height=\"1600\"/>\n", " </clipPath>\n", "</defs>\n", "<path clip-path=\"url(#clip5500)\" d=\"\n", "M235.533 1487.47 L2352.76 1487.47 L2352.76 47.2441 L235.533 47.2441 Z\n", " \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n", "<defs>\n", " <clipPath id=\"clip5502\">\n", " <rect x=\"235\" y=\"47\" width=\"2118\" height=\"1441\"/>\n", " </clipPath>\n", "</defs>\n", "<polyline clip-path=\"url(#clip5502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 294.788,1487.47 294.788,47.2441 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 960.582,1487.47 960.582,47.2441 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 1626.38,1487.47 1626.38,47.2441 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 2292.17,1487.47 2292.17,47.2441 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 235.533,1396.74 2352.76,1396.74 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 235.533,960.492 2352.76,960.492 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 235.533,524.249 2352.76,524.249 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5502)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 235.533,88.0053 2352.76,88.0053 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 235.533,1487.47 2352.76,1487.47 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 235.533,1487.47 235.533,47.2441 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 294.788,1487.47 294.788,1470.19 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 960.582,1487.47 960.582,1470.19 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 1626.38,1487.47 1626.38,1470.19 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 2292.17,1487.47 2292.17,1470.19 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 235.533,1396.74 260.939,1396.74 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 235.533,960.492 260.939,960.492 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 235.533,524.249 260.939,524.249 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 235.533,88.0053 260.939,88.0053 \n", " \"/>\n", "<g clip-path=\"url(#clip5500)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 294.788, 1541.47)\" x=\"294.788\" y=\"1541.47\">0</text>\n", "</g>\n", "<g clip-path=\"url(#clip5500)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 960.582, 1541.47)\" x=\"960.582\" y=\"1541.47\">1000</text>\n", "</g>\n", "<g clip-path=\"url(#clip5500)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 1626.38, 1541.47)\" x=\"1626.38\" y=\"1541.47\">2000</text>\n", "</g>\n", "<g clip-path=\"url(#clip5500)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 2292.17, 1541.47)\" x=\"2292.17\" y=\"1541.47\">3000</text>\n", "</g>\n", "<g clip-path=\"url(#clip5500)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 211.533, 1414.24)\" x=\"211.533\" y=\"1414.24\">-0.003</text>\n", "</g>\n", "<g clip-path=\"url(#clip5500)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 211.533, 977.992)\" x=\"211.533\" y=\"977.992\">-0.002</text>\n", "</g>\n", "<g clip-path=\"url(#clip5500)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 211.533, 541.749)\" x=\"211.533\" y=\"541.749\">-0.001</text>\n", "</g>\n", "<g clip-path=\"url(#clip5500)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 211.533, 105.505)\" x=\"211.533\" y=\"105.505\">0.000</text>\n", "</g>\n", "<polyline clip-path=\"url(#clip5502)\" style=\"stroke:#009af9; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 295.454,88.0053 296.12,88.0075 296.786,88.012 297.452,88.0186 298.117,88.0274 298.783,88.0384 299.449,88.0516 300.115,88.067 300.78,88.0846 301.446,88.1044 \n", " 302.112,88.1264 302.778,88.1505 303.444,88.1768 304.109,88.2053 304.775,88.2359 305.441,88.2687 306.107,88.3037 306.773,88.3408 307.438,88.3801 308.104,88.4215 \n", " 308.77,88.4651 309.436,88.5108 310.102,88.5587 310.767,88.6087 311.433,88.6608 312.099,88.715 312.765,88.7714 313.431,88.8299 314.096,88.8905 314.762,88.9532 \n", " 315.428,89.018 316.094,89.0849 316.76,89.1539 317.425,89.2251 318.091,89.2983 318.757,89.3735 319.423,89.4509 320.089,89.5304 320.754,89.6119 321.42,89.6955 \n", " 322.086,89.7811 322.752,89.8689 323.417,89.9586 324.083,90.0505 324.749,90.1443 325.415,90.2402 326.081,90.3382 326.746,90.4382 327.412,90.5402 328.078,90.6443 \n", " 328.744,90.7503 329.41,90.8584 330.075,90.9685 330.741,91.0806 331.407,91.1947 332.073,91.3108 332.739,91.4289 333.404,91.5489 334.07,91.671 334.736,91.795 \n", " 335.402,91.9211 336.068,92.049 336.733,92.179 337.399,92.3109 338.065,92.4447 338.731,92.5805 339.397,92.7183 340.062,92.8579 340.728,92.9996 341.394,93.1431 \n", " 342.06,93.2886 342.725,93.436 343.391,93.5852 344.057,93.7365 344.723,93.8896 345.389,94.0446 346.054,94.2015 346.72,94.3602 347.386,94.5209 348.052,94.6834 \n", " 348.718,94.8478 349.383,95.0141 350.049,95.1822 350.715,95.3522 351.381,95.524 352.047,95.6977 352.712,95.8732 353.378,96.0506 354.044,96.2297 354.71,96.4107 \n", " 355.376,96.5935 356.041,96.7781 356.707,96.9646 357.373,97.1528 358.039,97.3428 358.705,97.5346 359.37,97.7281 360.036,97.9235 360.702,98.1206 361.368,98.3195 \n", " 362.033,98.5201 362.699,98.7225 363.365,98.9267 364.031,99.1325 364.697,99.3401 365.362,99.5495 366.028,99.7605 366.694,99.9733 367.36,100.188 368.026,100.404 \n", " 368.691,100.622 369.357,100.841 370.023,101.063 370.689,101.286 371.355,101.51 372.02,101.737 372.686,101.964 373.352,102.194 374.018,102.425 374.684,102.658 \n", " 375.349,102.893 376.015,103.129 376.681,103.367 377.347,103.606 378.013,103.847 378.678,104.09 379.344,104.334 380.01,104.58 380.676,104.827 381.342,105.076 \n", " 382.007,105.327 382.673,105.579 383.339,105.832 384.005,106.087 384.67,106.344 385.336,106.603 386.002,106.862 386.668,107.124 387.334,107.387 387.999,107.651 \n", " 388.665,107.917 389.331,108.184 389.997,108.453 390.663,108.724 391.328,108.995 391.994,109.269 392.66,109.544 393.326,109.82 393.992,110.097 394.657,110.377 \n", " 395.323,110.657 395.989,110.939 396.655,111.223 397.321,111.508 397.986,111.794 398.652,112.082 399.318,112.371 399.984,112.661 400.65,112.953 401.315,113.246 \n", " 401.981,113.541 402.647,113.837 403.313,114.134 403.978,114.433 404.644,114.733 405.31,115.034 405.976,115.337 406.642,115.641 407.307,115.946 407.973,116.253 \n", " 408.639,116.561 409.305,116.87 409.971,117.181 410.636,117.492 411.302,117.805 411.968,118.12 412.634,118.435 413.3,118.752 413.965,119.07 414.631,119.39 \n", " 415.297,119.71 415.963,120.032 416.629,120.355 417.294,120.679 417.96,121.004 418.626,121.331 419.292,121.659 419.958,121.988 420.623,122.318 421.289,122.649 \n", " 421.955,122.982 422.621,123.315 423.286,123.65 423.952,123.986 424.618,124.323 425.284,124.661 425.95,125 426.615,125.341 427.281,125.682 427.947,126.024 \n", " 428.613,126.368 429.279,126.713 429.944,127.059 430.61,127.405 431.276,127.753 431.942,128.102 432.608,128.452 433.273,128.803 433.939,129.155 434.605,129.508 \n", " 435.271,129.862 435.937,130.217 436.602,130.573 437.268,130.93 437.934,131.288 438.6,131.647 439.266,132.007 439.931,132.368 440.597,132.73 441.263,133.093 \n", " 441.929,133.456 442.595,133.821 443.26,134.187 443.926,134.553 444.592,134.92 445.258,135.289 445.923,135.658 446.589,136.028 447.255,136.399 447.921,136.771 \n", " 448.587,137.143 449.252,137.517 449.918,137.891 450.584,138.266 451.25,138.642 451.916,139.019 452.581,139.397 453.247,139.775 453.913,140.155 454.579,140.535 \n", " 455.245,140.915 455.91,141.297 456.576,141.679 457.242,142.062 457.908,142.446 458.574,142.831 459.239,143.216 459.905,143.602 460.571,143.989 461.237,144.377 \n", " 461.903,144.765 462.568,145.154 463.234,145.544 463.9,145.934 464.566,146.325 465.231,146.716 465.897,147.109 466.563,147.502 467.229,147.895 467.895,148.29 \n", " 468.56,148.684 469.226,149.08 469.892,149.476 470.558,149.873 471.224,150.27 471.889,150.668 472.555,151.067 473.221,151.466 473.887,151.865 474.553,152.266 \n", " 475.218,152.666 475.884,153.068 476.55,153.469 477.216,153.872 477.882,154.275 478.547,154.678 479.213,155.082 479.879,155.486 480.545,155.891 481.211,156.297 \n", " 481.876,156.703 482.542,157.109 483.208,157.516 483.874,157.923 484.539,158.331 485.205,158.739 485.871,159.148 486.537,159.557 487.203,159.966 487.868,160.376 \n", " 488.534,160.786 489.2,161.197 489.866,161.608 490.532,162.019 491.197,162.431 491.863,162.843 492.529,163.256 493.195,163.668 493.861,164.082 494.526,164.495 \n", " 495.192,164.909 495.858,165.323 496.524,165.738 497.19,166.152 497.855,166.567 498.521,166.983 499.187,167.398 499.853,167.814 500.519,168.231 501.184,168.647 \n", " 501.85,169.064 502.516,169.481 503.182,169.898 503.847,170.315 504.513,170.733 505.179,171.151 505.845,171.569 506.511,171.987 507.176,172.405 507.842,172.824 \n", " 508.508,173.243 509.174,173.662 509.84,174.081 510.505,174.5 511.171,174.919 511.837,175.339 512.503,175.759 513.169,176.178 513.834,176.598 514.5,177.018 \n", " 515.166,177.439 515.832,177.859 516.498,178.279 517.163,178.7 517.829,179.12 518.495,179.541 519.161,179.961 519.827,180.382 520.492,180.803 521.158,181.223 \n", " 521.824,181.644 522.49,182.065 523.156,182.486 523.821,182.906 524.487,183.327 525.153,183.748 525.819,184.169 526.484,184.59 527.15,185.01 527.816,185.431 \n", " 528.482,185.852 529.148,186.272 529.813,186.693 530.479,187.113 531.145,187.534 531.811,187.954 532.477,188.374 533.142,188.795 533.808,189.215 534.474,189.635 \n", " 535.14,190.054 535.806,190.474 536.471,190.894 537.137,191.313 537.803,191.732 538.469,192.152 539.135,192.571 539.8,192.99 540.466,193.408 541.132,193.827 \n", " 541.798,194.245 542.464,194.663 543.129,195.081 543.795,195.499 544.461,195.916 545.127,196.334 545.792,196.751 546.458,197.168 547.124,197.584 547.79,198.001 \n", " 548.456,198.417 549.121,198.833 549.787,199.248 550.453,199.663 551.119,200.078 551.785,200.493 552.45,200.908 553.116,201.322 553.782,201.736 554.448,202.149 \n", " 555.114,202.562 555.779,202.975 556.445,203.388 557.111,203.8 557.777,204.212 558.443,204.623 559.108,205.035 559.774,205.445 560.44,205.856 561.106,206.266 \n", " 561.772,206.676 562.437,207.085 563.103,207.494 563.769,207.902 564.435,208.31 565.1,208.718 565.766,209.125 566.432,209.532 567.098,209.938 567.764,210.344 \n", " 568.429,210.75 569.095,211.155 569.761,211.559 570.427,211.963 571.093,212.367 571.758,212.77 572.424,213.173 573.09,213.575 573.756,213.976 574.422,214.378 \n", " 575.087,214.778 575.753,215.178 576.419,215.578 577.085,215.977 577.751,216.375 578.416,216.773 579.082,217.171 579.748,217.568 580.414,217.964 581.08,218.36 \n", " 581.745,218.755 582.411,219.15 583.077,219.544 583.743,219.937 584.409,220.33 585.074,220.722 585.74,221.114 586.406,221.505 587.072,221.895 587.737,222.285 \n", " 588.403,222.674 589.069,223.062 589.735,223.45 590.401,223.837 591.066,224.224 591.732,224.61 592.398,224.995 593.064,225.38 593.73,225.763 594.395,226.147 \n", " 595.061,226.529 595.727,226.911 596.393,227.292 597.059,227.672 597.724,228.052 598.39,228.431 599.056,228.809 599.722,229.187 600.388,229.564 601.053,229.94 \n", " 601.719,230.315 602.385,230.69 603.051,231.063 603.717,231.436 604.382,231.809 605.048,232.18 605.714,232.551 606.38,232.921 607.045,233.29 607.711,233.658 \n", " 608.377,234.026 609.043,234.393 609.709,234.759 610.374,235.124 611.04,235.488 611.706,235.852 612.372,236.214 613.038,236.576 613.703,236.937 614.369,237.297 \n", " 615.035,237.657 615.701,238.015 616.367,238.373 617.032,238.73 617.698,239.085 618.364,239.441 619.03,239.795 619.696,240.148 620.361,240.5 621.027,240.852 \n", " 621.693,241.202 622.359,241.552 623.025,241.901 623.69,242.249 624.356,242.596 625.022,242.942 625.688,243.287 626.353,243.631 627.019,243.974 627.685,244.316 \n", " 628.351,244.658 629.017,244.998 629.682,245.338 630.348,245.676 631.014,246.014 631.68,246.35 632.346,246.686 633.011,247.02 633.677,247.354 634.343,247.687 \n", " 635.009,248.018 635.675,248.349 636.34,248.679 637.006,249.008 637.672,249.335 638.338,249.662 639.004,249.988 639.669,250.312 640.335,250.636 641.001,250.958 \n", " 641.667,251.28 642.333,251.601 642.998,251.92 643.664,252.238 644.33,252.556 644.996,252.872 645.662,253.188 646.327,253.502 646.993,253.815 647.659,254.127 \n", " 648.325,254.438 648.99,254.748 649.656,255.057 650.322,255.365 650.988,255.672 651.654,255.977 652.319,256.282 652.985,256.585 653.651,256.888 654.317,257.189 \n", " 654.983,257.489 655.648,257.788 656.314,258.086 656.98,258.383 657.646,258.678 658.312,258.973 658.977,259.266 659.643,259.559 660.309,259.85 660.975,260.14 \n", " 661.641,260.429 662.306,260.716 662.972,261.003 663.638,261.288 664.304,261.573 664.97,261.856 665.635,262.138 666.301,262.419 666.967,262.698 667.633,262.977 \n", " 668.298,263.254 668.964,263.53 669.63,263.805 670.296,264.079 670.962,264.351 671.627,264.622 672.293,264.893 672.959,265.162 673.625,265.429 674.291,265.696 \n", " 674.956,265.961 675.622,266.225 676.288,266.488 676.954,266.75 677.62,267.011 678.285,267.27 678.951,267.528 679.617,267.785 680.283,268.04 680.949,268.295 \n", " 681.614,268.548 682.28,268.8 682.946,269.051 683.612,269.3 684.278,269.548 684.943,269.795 685.609,270.041 686.275,270.285 686.941,270.528 687.606,270.77 \n", " 688.272,271.011 688.938,271.251 689.604,271.489 690.27,271.726 690.935,271.961 691.601,272.196 692.267,272.429 692.933,272.66 693.599,272.891 694.264,273.12 \n", " 694.93,273.348 695.596,273.575 696.262,273.8 696.928,274.024 697.593,274.247 698.259,274.469 698.925,274.689 699.591,274.908 700.257,275.126 700.922,275.342 \n", " 701.588,275.557 702.254,275.771 702.92,275.983 703.586,276.194 704.251,276.404 704.917,276.613 705.583,276.82 706.249,277.026 706.915,277.231 707.58,277.434 \n", " 708.246,277.636 708.912,277.836 709.578,278.036 710.243,278.234 710.909,278.43 711.575,278.626 712.241,278.82 712.907,279.012 713.572,279.204 714.238,279.394 \n", " 714.904,279.582 715.57,279.77 716.236,279.956 716.901,280.14 717.567,280.324 718.233,280.506 718.899,280.686 719.565,280.866 720.23,281.044 720.896,281.22 \n", " 721.562,281.395 722.228,281.569 722.894,281.742 723.559,281.913 724.225,282.083 724.891,282.251 725.557,282.419 726.223,282.584 726.888,282.749 727.554,282.912 \n", " 728.22,283.074 728.886,283.234 729.551,283.393 730.217,283.551 730.883,283.707 731.549,283.862 732.215,284.016 732.88,284.168 733.546,284.319 734.212,284.468 \n", " 734.878,284.616 735.544,284.763 736.209,284.908 736.875,285.052 737.541,285.195 738.207,285.336 738.873,285.476 739.538,285.615 740.204,285.752 740.87,285.888 \n", " 741.536,286.022 742.202,286.155 742.867,286.287 743.533,286.417 744.199,286.546 744.865,286.674 745.531,286.8 746.196,286.925 746.862,287.048 747.528,287.17 \n", " 748.194,287.291 748.859,287.41 749.525,287.528 750.191,287.645 750.857,287.76 751.523,287.874 752.188,287.986 752.854,288.098 753.52,288.207 754.186,288.316 \n", " 754.852,288.423 755.517,288.528 756.183,288.632 756.849,288.735 757.515,288.837 758.181,288.937 758.846,289.036 759.512,289.133 760.178,289.229 760.844,289.324 \n", " 761.51,289.417 762.175,289.509 762.841,289.599 763.507,289.688 764.173,289.776 764.839,289.862 765.504,289.947 766.17,290.031 766.836,290.113 767.502,290.194 \n", " 768.167,290.274 768.833,290.352 769.499,290.429 770.165,290.504 770.831,290.578 771.496,290.651 772.162,290.722 772.828,290.792 773.494,290.861 774.16,290.928 \n", " 774.825,290.994 775.491,291.058 776.157,291.121 776.823,291.183 777.489,291.244 778.154,291.303 778.82,291.36 779.486,291.417 780.152,291.472 780.818,291.525 \n", " 781.483,291.578 782.149,291.629 782.815,291.678 783.481,291.727 784.147,291.773 784.812,291.819 785.478,291.863 786.144,291.906 786.81,291.948 787.476,291.988 \n", " 788.141,292.027 788.807,292.064 789.473,292.1 790.139,292.135 790.804,292.168 791.47,292.2 792.136,292.231 792.802,292.261 793.468,292.289 794.133,292.316 \n", " 794.799,292.341 795.465,292.365 796.131,292.388 796.797,292.409 797.462,292.43 798.128,292.448 798.794,292.466 799.46,292.482 800.126,292.497 800.791,292.51 \n", " 801.457,292.523 802.123,292.534 802.789,292.543 803.455,292.552 804.12,292.558 804.786,292.564 805.452,292.569 806.118,292.572 806.784,292.573 807.449,292.574 \n", " 808.115,292.573 808.781,292.571 809.447,292.567 810.112,292.563 810.778,292.557 811.444,292.549 812.11,292.541 812.776,292.531 813.441,292.52 814.107,292.507 \n", " 814.773,292.494 815.439,292.479 816.105,292.462 816.77,292.445 817.436,292.426 818.102,292.406 818.768,292.385 819.434,292.362 820.099,292.338 820.765,292.313 \n", " 821.431,292.287 822.097,292.259 822.763,292.23 823.428,292.2 824.094,292.168 824.76,292.136 825.426,292.102 826.092,292.067 826.757,292.03 827.423,291.993 \n", " 828.089,291.954 828.755,291.914 829.42,291.872 830.086,291.83 830.752,291.786 831.418,291.741 832.084,291.695 832.749,291.647 833.415,291.599 834.081,291.549 \n", " 834.747,291.498 835.413,291.445 836.078,291.392 836.744,291.337 837.41,291.281 838.076,291.224 838.742,291.166 839.407,291.106 840.073,291.046 840.739,290.984 \n", " 841.405,290.921 842.071,290.856 842.736,290.791 843.402,290.724 844.068,290.657 844.734,290.588 845.4,290.518 846.065,290.446 846.731,290.374 847.397,290.3 \n", " 848.063,290.225 848.729,290.149 849.394,290.072 850.06,289.994 850.726,289.915 851.392,289.834 852.057,289.753 852.723,289.67 853.389,289.586 854.055,289.501 \n", " 854.721,289.415 855.386,289.327 856.052,289.239 856.718,289.149 857.384,289.059 858.05,288.967 858.715,288.874 859.381,288.78 860.047,288.685 860.713,288.589 \n", " 861.379,288.491 862.044,288.393 862.71,288.294 863.376,288.193 864.042,288.091 864.708,287.989 865.373,287.885 866.039,287.78 866.705,287.674 867.371,287.567 \n", " 868.037,287.459 868.702,287.35 869.368,287.24 870.034,287.128 870.7,287.016 871.365,286.903 872.031,286.788 872.697,286.673 873.363,286.556 874.029,286.439 \n", " 874.694,286.32 875.36,286.201 876.026,286.08 876.692,285.958 877.358,285.836 878.023,285.712 878.689,285.587 879.355,285.462 880.021,285.335 880.687,285.207 \n", " 881.352,285.079 882.018,284.949 882.684,284.818 883.35,284.687 884.016,284.554 884.681,284.42 885.347,284.286 886.013,284.15 886.679,284.014 887.345,283.876 \n", " 888.01,283.738 888.676,283.599 889.342,283.458 890.008,283.317 890.673,283.175 891.339,283.032 892.005,282.887 892.671,282.742 893.337,282.596 894.002,282.449 \n", " 894.668,282.302 895.334,282.153 896,282.003 896.666,281.853 897.331,281.701 897.997,281.549 898.663,281.396 899.329,281.241 899.995,281.086 900.66,280.93 \n", " 901.326,280.774 901.992,280.616 902.658,280.457 903.324,280.298 903.989,280.137 904.655,279.976 905.321,279.814 905.987,279.651 906.653,279.487 907.318,279.323 \n", " 907.984,279.157 908.65,278.991 909.316,278.824 909.982,278.656 910.647,278.487 911.313,278.318 911.979,278.147 912.645,277.976 913.31,277.804 913.976,277.631 \n", " 914.642,277.457 915.308,277.283 915.974,277.108 916.639,276.931 917.305,276.755 917.971,276.577 918.637,276.399 919.303,276.219 919.968,276.039 920.634,275.859 \n", " 921.3,275.677 921.966,275.495 922.632,275.312 923.297,275.128 923.963,274.944 924.629,274.758 925.295,274.572 925.961,274.386 926.626,274.198 927.292,274.01 \n", " 927.958,273.821 928.624,273.632 929.29,273.441 929.955,273.25 930.621,273.058 931.287,272.866 931.953,272.673 932.618,272.479 933.284,272.285 933.95,272.089 \n", " 934.616,271.893 935.282,271.697 935.947,271.5 936.613,271.302 937.279,271.103 937.945,270.904 938.611,270.704 939.276,270.504 939.942,270.303 940.608,270.101 \n", " 941.274,269.898 941.94,269.695 942.605,269.492 943.271,269.287 943.937,269.082 944.603,268.877 945.269,268.671 945.934,268.464 946.6,268.257 947.266,268.049 \n", " 947.932,267.84 948.598,267.631 949.263,267.421 949.929,267.211 950.595,267 951.261,266.789 951.926,266.577 952.592,266.364 953.258,266.151 953.924,265.937 \n", " 954.59,265.723 955.255,265.509 955.921,265.293 956.587,265.077 957.253,264.861 957.919,264.644 958.584,264.427 959.25,264.209 959.916,263.99 960.582,263.771 \n", " 961.248,263.552 961.913,263.332 962.579,263.112 963.245,262.891 963.911,262.669 964.577,262.447 965.242,262.225 965.908,262.002 966.574,261.779 967.24,261.555 \n", " 967.906,261.331 968.571,261.106 969.237,260.881 969.903,260.655 970.569,260.429 971.234,260.203 971.9,259.976 972.566,259.749 973.232,259.521 973.898,259.293 \n", " 974.563,259.064 975.229,258.835 975.895,258.606 976.561,258.376 977.227,258.146 977.892,257.915 978.558,257.684 979.224,257.453 979.89,257.221 980.556,256.989 \n", " 981.221,256.757 981.887,256.524 982.553,256.291 983.219,256.057 983.885,255.823 984.55,255.589 985.216,255.354 985.882,255.119 986.548,254.884 987.214,254.649 \n", " 987.879,254.413 988.545,254.176 989.211,253.94 989.877,253.703 990.543,253.466 991.208,253.228 991.874,252.991 992.54,252.753 993.206,252.514 993.871,252.276 \n", " 994.537,252.037 995.203,251.797 995.869,251.558 996.535,251.318 997.2,251.078 997.866,250.838 998.532,250.598 999.198,250.357 999.864,250.116 1000.53,249.875 \n", " 1001.2,249.633 1001.86,249.391 1002.53,249.149 1003.19,248.907 1003.86,248.665 1004.52,248.422 1005.19,248.18 1005.86,247.937 1006.52,247.693 1007.19,247.45 \n", " 1007.85,247.206 1008.52,246.963 1009.18,246.719 1009.85,246.475 1010.52,246.23 1011.18,245.986 1011.85,245.741 1012.51,245.497 1013.18,245.252 1013.85,245.006 \n", " 1014.51,244.761 1015.18,244.516 1015.84,244.27 1016.51,244.025 1017.17,243.779 1017.84,243.533 1018.51,243.287 1019.17,243.041 1019.84,242.795 1020.5,242.548 \n", " 1021.17,242.302 1021.83,242.055 1022.5,241.809 1023.17,241.562 1023.83,241.315 1024.5,241.068 1025.16,240.821 1025.83,240.574 1026.5,240.327 1027.16,240.08 \n", " 1027.83,239.833 1028.49,239.585 1029.16,239.338 1029.82,239.091 1030.49,238.843 1031.16,238.596 1031.82,238.348 1032.49,238.101 1033.15,237.853 1033.82,237.605 \n", " 1034.48,237.358 1035.15,237.11 1035.82,236.863 1036.48,236.615 1037.15,236.367 1037.81,236.12 1038.48,235.872 1039.15,235.625 1039.81,235.377 1040.48,235.129 \n", " 1041.14,234.882 1041.81,234.634 1042.47,234.387 1043.14,234.139 1043.81,233.892 1044.47,233.645 1045.14,233.397 1045.8,233.15 1046.47,232.903 1047.13,232.656 \n", " 1047.8,232.409 1048.47,232.162 1049.13,231.915 1049.8,231.668 1050.46,231.421 1051.13,231.175 1051.8,230.928 1052.46,230.682 1053.13,230.435 1053.79,230.189 \n", " 1054.46,229.943 1055.12,229.697 1055.79,229.451 1056.46,229.205 1057.12,228.96 1057.79,228.714 1058.45,228.469 1059.12,228.223 1059.79,227.978 1060.45,227.733 \n", " 1061.12,227.489 1061.78,227.244 1062.45,226.999 1063.11,226.755 1063.78,226.511 1064.45,226.267 1065.11,226.023 1065.78,225.779 1066.44,225.536 1067.11,225.292 \n", " 1067.77,225.049 1068.44,224.806 1069.11,224.564 1069.77,224.321 1070.44,224.079 1071.1,223.837 1071.77,223.595 1072.44,223.353 1073.1,223.112 1073.77,222.87 \n", " 1074.43,222.629 1075.1,222.388 1075.76,222.148 1076.43,221.908 1077.1,221.667 1077.76,221.428 1078.43,221.188 1079.09,220.949 1079.76,220.71 1080.42,220.471 \n", " 1081.09,220.232 1081.76,219.994 1082.42,219.756 1083.09,219.518 1083.75,219.281 1084.42,219.044 1085.09,218.807 1085.75,218.57 1086.42,218.334 1087.08,218.098 \n", " 1087.75,217.862 1088.41,217.627 1089.08,217.392 1089.75,217.157 1090.41,216.922 1091.08,216.688 1091.74,216.454 1092.41,216.221 1093.07,215.988 1093.74,215.755 \n", " 1094.41,215.522 1095.07,215.29 1095.74,215.059 1096.4,214.827 1097.07,214.596 1097.74,214.365 1098.4,214.135 1099.07,213.905 1099.73,213.675 1100.4,213.446 \n", " 1101.06,213.217 1101.73,212.988 1102.4,212.76 1103.06,212.532 1103.73,212.305 1104.39,212.078 1105.06,211.851 1105.72,211.625 1106.39,211.399 1107.06,211.174 \n", " 1107.72,210.949 1108.39,210.724 1109.05,210.5 1109.72,210.276 1110.39,210.053 1111.05,209.83 1111.72,209.607 1112.38,209.385 1113.05,209.163 1113.71,208.942 \n", " 1114.38,208.721 1115.05,208.501 1115.71,208.281 1116.38,208.062 1117.04,207.843 1117.71,207.624 1118.37,207.406 1119.04,207.188 1119.71,206.971 1120.37,206.754 \n", " 1121.04,206.538 1121.7,206.322 1122.37,206.107 1123.04,205.892 1123.7,205.678 1124.37,205.464 1125.03,205.251 1125.7,205.038 1126.36,204.825 1127.03,204.614 \n", " 1127.7,204.402 1128.36,204.191 1129.03,203.981 1129.69,203.771 1130.36,203.562 1131.02,203.353 1131.69,203.144 1132.36,202.937 1133.02,202.729 1133.69,202.522 \n", " 1134.35,202.316 1135.02,202.111 1135.69,201.905 1136.35,201.701 1137.02,201.497 1137.68,201.293 1138.35,201.09 1139.01,200.887 1139.68,200.686 1140.35,200.484 \n", " 1141.01,200.283 1141.68,200.083 1142.34,199.883 1143.01,199.684 1143.68,199.486 1144.34,199.288 1145.01,199.09 1145.67,198.893 1146.34,198.697 1147,198.501 \n", " 1147.67,198.306 1148.34,198.112 1149,197.918 1149.67,197.724 1150.33,197.531 1151,197.339 1151.66,197.148 1152.33,196.957 1153,196.766 1153.66,196.577 \n", " 1154.33,196.387 1154.99,196.199 1155.66,196.011 1156.33,195.823 1156.99,195.637 1157.66,195.451 1158.32,195.265 1158.99,195.08 1159.65,194.896 1160.32,194.712 \n", " 1160.99,194.529 1161.65,194.347 1162.32,194.165 1162.98,193.984 1163.65,193.804 1164.31,193.624 1164.98,193.445 1165.65,193.266 1166.31,193.088 1166.98,192.911 \n", " 1167.64,192.734 1168.31,192.558 1168.98,192.383 1169.64,192.209 1170.31,192.035 1170.97,191.861 1171.64,191.689 1172.3,191.517 1172.97,191.345 1173.64,191.175 \n", " 1174.3,191.005 1174.97,190.835 1175.63,190.667 1176.3,190.499 1176.96,190.332 1177.63,190.165 1178.3,189.999 1178.96,189.834 1179.63,189.669 1180.29,189.506 \n", " 1180.96,189.342 1181.63,189.18 1182.29,189.018 1182.96,188.857 1183.62,188.697 1184.29,188.537 1184.95,188.378 1185.62,188.22 1186.29,188.062 1186.95,187.906 \n", " 1187.62,187.749 1188.28,187.594 1188.95,187.439 1189.61,187.285 1190.28,187.132 1190.95,186.979 1191.61,186.828 1192.28,186.676 1192.94,186.526 1193.61,186.376 \n", " 1194.28,186.227 1194.94,186.079 1195.61,185.932 1196.27,185.785 1196.94,185.639 1197.6,185.493 1198.27,185.349 1198.94,185.205 1199.6,185.062 1200.27,184.92 \n", " 1200.93,184.778 1201.6,184.637 1202.26,184.497 1202.93,184.357 1203.6,184.219 1204.26,184.081 1204.93,183.944 1205.59,183.807 1206.26,183.672 1206.93,183.537 \n", " 1207.59,183.403 1208.26,183.269 1208.92,183.137 1209.59,183.005 1210.25,182.873 1210.92,182.743 1211.59,182.613 1212.25,182.485 1212.92,182.357 1213.58,182.229 \n", " 1214.25,182.103 1214.91,181.977 1215.58,181.852 1216.25,181.728 1216.91,181.604 1217.58,181.481 1218.24,181.359 1218.91,181.238 1219.58,181.118 1220.24,180.998 \n", " 1220.91,180.879 1221.57,180.761 1222.24,180.644 1222.9,180.527 1223.57,180.412 1224.24,180.297 1224.9,180.182 1225.57,180.069 1226.23,179.956 1226.9,179.845 \n", " 1227.56,179.733 1228.23,179.623 1228.9,179.514 1229.56,179.405 1230.23,179.297 1230.89,179.19 1231.56,179.084 1232.23,178.978 1232.89,178.873 1233.56,178.769 \n", " 1234.22,178.666 1234.89,178.564 1235.55,178.462 1236.22,178.361 1236.89,178.261 1237.55,178.162 1238.22,178.064 1238.88,177.966 1239.55,177.869 1240.22,177.773 \n", " 1240.88,177.678 1241.55,177.584 1242.21,177.49 1242.88,177.397 1243.54,177.305 1244.21,177.214 1244.88,177.124 1245.54,177.034 1246.21,176.945 1246.87,176.857 \n", " 1247.54,176.77 1248.2,176.683 1248.87,176.598 1249.54,176.513 1250.2,176.429 1250.87,176.346 1251.53,176.263 1252.2,176.182 1252.87,176.101 1253.53,176.021 \n", " 1254.2,175.942 1254.86,175.864 1255.53,175.786 1256.19,175.709 1256.86,175.633 1257.53,175.558 1258.19,175.484 1258.86,175.41 1259.52,175.337 1260.19,175.266 \n", " 1260.85,175.194 1261.52,175.124 1262.19,175.055 1262.85,174.986 1263.52,174.918 1264.18,174.851 1264.85,174.785 1265.52,174.719 1266.18,174.655 1266.85,174.591 \n", " 1267.51,174.528 1268.18,174.466 1268.84,174.404 1269.51,174.343 1270.18,174.284 1270.84,174.225 1271.51,174.166 1272.17,174.109 1272.84,174.053 1273.5,173.997 \n", " 1274.17,173.942 1274.84,173.888 1275.5,173.834 1276.17,173.782 1276.83,173.73 1277.5,173.679 1278.17,173.629 1278.83,173.58 1279.5,173.531 1280.16,173.483 \n", " 1280.83,173.436 1281.49,173.39 1282.16,173.345 1282.83,173.301 1283.49,173.257 1284.16,173.214 1284.82,173.172 1285.49,173.131 1286.15,173.09 1286.82,173.05 \n", " 1287.49,173.012 1288.15,172.973 1288.82,172.936 1289.48,172.9 1290.15,172.864 1290.82,172.829 1291.48,172.795 1292.15,172.762 1292.81,172.729 1293.48,172.698 \n", " 1294.14,172.667 1294.81,172.636 1295.48,172.607 1296.14,172.579 1296.81,172.551 1297.47,172.524 1298.14,172.498 1298.8,172.472 1299.47,172.448 1300.14,172.424 \n", " 1300.8,172.401 1301.47,172.379 1302.13,172.358 1302.8,172.337 1303.47,172.317 1304.13,172.298 1304.8,172.28 1305.46,172.262 1306.13,172.246 1306.79,172.23 \n", " 1307.46,172.215 1308.13,172.2 1308.79,172.187 1309.46,172.174 1310.12,172.162 1310.79,172.151 1311.45,172.14 1312.12,172.13 1312.79,172.122 1313.45,172.113 \n", " 1314.12,172.106 1314.78,172.1 1315.45,172.094 1316.12,172.089 1316.78,172.084 1317.45,172.081 1318.11,172.078 1318.78,172.076 1319.44,172.075 1320.11,172.074 \n", " 1320.78,172.075 1321.44,172.076 1322.11,172.078 1322.77,172.08 1323.44,172.084 1324.11,172.088 1324.77,172.093 1325.44,172.098 1326.1,172.105 1326.77,172.112 \n", " 1327.43,172.12 1328.1,172.128 1328.77,172.138 1329.43,172.148 1330.1,172.159 1330.76,172.17 1331.43,172.183 1332.09,172.196 1332.76,172.21 1333.43,172.224 \n", " 1334.09,172.24 1334.76,172.256 1335.42,172.272 1336.09,172.29 1336.76,172.308 1337.42,172.327 1338.09,172.347 1338.75,172.368 1339.42,172.389 1340.08,172.411 \n", " 1340.75,172.433 1341.42,172.457 1342.08,172.481 1342.75,172.506 1343.41,172.531 1344.08,172.558 1344.74,172.585 1345.41,172.612 1346.08,172.641 1346.74,172.67 \n", " 1347.41,172.7 1348.07,172.73 1348.74,172.761 1349.41,172.793 1350.07,172.826 1350.74,172.859 1351.4,172.894 1352.07,172.928 1352.73,172.964 1353.4,173 \n", " 1354.07,173.037 1354.73,173.074 1355.4,173.113 1356.06,173.152 1356.73,173.191 1357.39,173.232 1358.06,173.273 1358.73,173.314 1359.39,173.357 1360.06,173.4 \n", " 1360.72,173.444 1361.39,173.488 1362.06,173.533 1362.72,173.579 1363.39,173.625 1364.05,173.673 1364.72,173.72 1365.38,173.769 1366.05,173.818 1366.72,173.868 \n", " 1367.38,173.918 1368.05,173.969 1368.71,174.021 1369.38,174.074 1370.04,174.127 1370.71,174.18 1371.38,174.235 1372.04,174.29 1372.71,174.346 1373.37,174.402 \n", " 1374.04,174.459 1374.71,174.517 1375.37,174.575 1376.04,174.634 1376.7,174.693 1377.37,174.753 1378.03,174.814 1378.7,174.876 1379.37,174.938 1380.03,175 \n", " 1380.7,175.064 1381.36,175.128 1382.03,175.192 1382.69,175.258 1383.36,175.323 1384.03,175.39 1384.69,175.457 1385.36,175.524 1386.02,175.593 1386.69,175.662 \n", " 1387.36,175.731 1388.02,175.801 1388.69,175.872 1389.35,175.943 1390.02,176.015 1390.68,176.088 1391.35,176.161 1392.02,176.234 1392.68,176.308 1393.35,176.383 \n", " 1394.01,176.459 1394.68,176.535 1395.34,176.611 1396.01,176.688 1396.68,176.766 1397.34,176.845 1398.01,176.923 1398.67,177.003 1399.34,177.083 1400.01,177.164 \n", " 1400.67,177.245 1401.34,177.326 1402,177.409 1402.67,177.491 1403.33,177.575 1404,177.659 1404.67,177.743 1405.33,177.828 1406,177.914 1406.66,178 \n", " 1407.33,178.087 1408,178.174 1408.66,178.262 1409.33,178.35 1409.99,178.439 1410.66,178.528 1411.32,178.618 1411.99,178.708 1412.66,178.799 1413.32,178.891 \n", " 1413.99,178.983 1414.65,179.075 1415.32,179.168 1415.98,179.262 1416.65,179.356 1417.32,179.45 1417.98,179.545 1418.65,179.641 1419.31,179.737 1419.98,179.833 \n", " 1420.65,179.93 1421.31,180.028 1421.98,180.126 1422.64,180.224 1423.31,180.323 1423.97,180.423 1424.64,180.523 1425.31,180.623 1425.97,180.724 1426.64,180.826 \n", " 1427.3,180.927 1427.97,181.03 1428.63,181.133 1429.3,181.236 1429.97,181.34 1430.63,181.444 1431.3,181.548 1431.96,181.653 1432.63,181.759 1433.3,181.865 \n", " 1433.96,181.971 1434.63,182.078 1435.29,182.186 1435.96,182.293 1436.62,182.402 1437.29,182.51 1437.96,182.619 1438.62,182.729 1439.29,182.839 1439.95,182.949 \n", " 1440.62,183.06 1441.28,183.171 1441.95,183.283 1442.62,183.395 1443.28,183.507 1443.95,183.62 1444.61,183.733 1445.28,183.847 1445.95,183.961 1446.61,184.076 \n", " 1447.28,184.191 1447.94,184.306 1448.61,184.422 1449.27,184.538 1449.94,184.654 1450.61,184.771 1451.27,184.888 1451.94,185.006 1452.6,185.124 1453.27,185.242 \n", " 1453.93,185.361 1454.6,185.48 1455.27,185.599 1455.93,185.719 1456.6,185.839 1457.26,185.96 1457.93,186.081 1458.6,186.202 1459.26,186.324 1459.93,186.446 \n", " 1460.59,186.568 1461.26,186.691 1461.92,186.814 1462.59,186.937 1463.26,187.061 1463.92,187.185 1464.59,187.309 1465.25,187.434 1465.92,187.559 1466.58,187.684 \n", " 1467.25,187.81 1467.92,187.936 1468.58,188.062 1469.25,188.189 1469.91,188.316 1470.58,188.443 1471.25,188.57 1471.91,188.698 1472.58,188.826 1473.24,188.955 \n", " 1473.91,189.083 1474.57,189.212 1475.24,189.342 1475.91,189.471 1476.57,189.601 1477.24,189.731 1477.9,189.862 1478.57,189.993 1479.23,190.124 1479.9,190.255 \n", " 1480.57,190.386 1481.23,190.518 1481.9,190.65 1482.56,190.783 1483.23,190.915 1483.9,191.048 1484.56,191.181 1485.23,191.314 1485.89,191.448 1486.56,191.582 \n", " 1487.22,191.716 1487.89,191.85 1488.56,191.985 1489.22,192.12 1489.89,192.255 1490.55,192.39 1491.22,192.525 1491.88,192.661 1492.55,192.797 1493.22,192.933 \n", " 1493.88,193.07 1494.55,193.206 1495.21,193.343 1495.88,193.48 1496.55,193.617 1497.21,193.755 1497.88,193.892 1498.54,194.03 1499.21,194.168 1499.87,194.306 \n", " 1500.54,194.445 1501.21,194.583 1501.87,194.722 1502.54,194.861 1503.2,195 1503.87,195.139 1504.54,195.279 1505.2,195.418 1505.87,195.558 1506.53,195.698 \n", " 1507.2,195.838 1507.86,195.979 1508.53,196.119 1509.2,196.26 1509.86,196.4 1510.53,196.541 1511.19,196.682 1511.86,196.824 1512.52,196.965 1513.19,197.106 \n", " 1513.86,197.248 1514.52,197.39 1515.19,197.532 1515.85,197.674 1516.52,197.816 1517.19,197.958 1517.85,198.101 1518.52,198.243 1519.18,198.386 1519.85,198.529 \n", " 1520.51,198.672 1521.18,198.815 1521.85,198.958 1522.51,199.101 1523.18,199.244 1523.84,199.387 1524.51,199.531 1525.17,199.675 1525.84,199.818 1526.51,199.962 \n", " 1527.17,200.106 1527.84,200.25 1528.5,200.394 1529.17,200.538 1529.84,200.682 1530.5,200.826 1531.17,200.971 1531.83,201.115 1532.5,201.259 1533.16,201.404 \n", " 1533.83,201.548 1534.5,201.693 1535.16,201.838 1535.83,201.982 1536.49,202.127 1537.16,202.272 1537.82,202.417 1538.49,202.562 1539.16,202.707 1539.82,202.852 \n", " 1540.49,202.997 1541.15,203.142 1541.82,203.287 1542.49,203.432 1543.15,203.577 1543.82,203.722 1544.48,203.867 1545.15,204.013 1545.81,204.158 1546.48,204.303 \n", " 1547.15,204.448 1547.81,204.593 1548.48,204.739 1549.14,204.884 1549.81,205.029 1550.47,205.174 1551.14,205.32 1551.81,205.465 1552.47,205.61 1553.14,205.755 \n", " 1553.8,205.9 1554.47,206.045 1555.14,206.191 1555.8,206.336 1556.47,206.481 1557.13,206.626 1557.8,206.771 1558.46,206.916 1559.13,207.061 1559.8,207.206 \n", " 1560.46,207.351 1561.13,207.496 1561.79,207.64 1562.46,207.785 1563.12,207.93 1563.79,208.074 1564.46,208.219 1565.12,208.364 1565.79,208.508 1566.45,208.652 \n", " 1567.12,208.797 1567.79,208.941 1568.45,209.085 1569.12,209.229 1569.78,209.373 1570.45,209.517 1571.11,209.661 1571.78,209.805 1572.45,209.949 1573.11,210.093 \n", " 1573.78,210.236 1574.44,210.38 1575.11,210.523 1575.77,210.666 1576.44,210.81 1577.11,210.953 1577.77,211.096 1578.44,211.239 1579.1,211.381 1579.77,211.524 \n", " 1580.44,211.667 1581.1,211.809 1581.77,211.951 1582.43,212.094 1583.1,212.236 1583.76,212.378 1584.43,212.519 1585.1,212.661 1585.76,212.803 1586.43,212.944 \n", " 1587.09,213.086 1587.76,213.227 1588.43,213.368 1589.09,213.509 1589.76,213.65 1590.42,213.79 1591.09,213.931 1591.75,214.071 1592.42,214.211 1593.09,214.351 \n", " 1593.75,214.491 1594.42,214.631 1595.08,214.77 1595.75,214.91 1596.41,215.049 1597.08,215.188 1597.75,215.327 1598.41,215.466 1599.08,215.604 1599.74,215.742 \n", " 1600.41,215.881 1601.08,216.019 1601.74,216.157 1602.41,216.294 1603.07,216.432 1603.74,216.569 1604.4,216.706 1605.07,216.843 1605.74,216.98 1606.4,217.116 \n", " 1607.07,217.252 1607.73,217.388 1608.4,217.524 1609.06,217.66 1609.73,217.796 1610.4,217.931 1611.06,218.066 1611.73,218.201 1612.39,218.335 1613.06,218.47 \n", " 1613.73,218.604 1614.39,218.738 1615.06,218.872 1615.72,219.005 1616.39,219.139 1617.05,219.272 1617.72,219.404 1618.39,219.537 1619.05,219.669 1619.72,219.802 \n", " 1620.38,219.934 1621.05,220.065 1621.71,220.197 1622.38,220.328 1623.05,220.459 1623.71,220.589 1624.38,220.72 1625.04,220.85 1625.71,220.98 1626.38,221.11 \n", " 1627.04,221.239 1627.71,221.368 1628.37,221.497 1629.04,221.626 1629.7,221.754 1630.37,221.882 1631.04,222.01 1631.7,222.138 1632.37,222.265 1633.03,222.392 \n", " 1633.7,222.519 1634.36,222.645 1635.03,222.771 1635.7,222.897 1636.36,223.023 1637.03,223.148 1637.69,223.273 1638.36,223.398 1639.03,223.522 1639.69,223.646 \n", " 1640.36,223.77 1641.02,223.894 1641.69,224.017 1642.35,224.14 1643.02,224.263 1643.69,224.385 1644.35,224.507 1645.02,224.629 1645.68,224.751 1646.35,224.872 \n", " 1647.01,224.993 1647.68,225.113 1648.35,225.233 1649.01,225.353 1649.68,225.473 1650.34,225.592 1651.01,225.711 1651.68,225.83 1652.34,225.948 1653.01,226.066 \n", " 1653.67,226.184 1654.34,226.301 1655,226.418 1655.67,226.535 1656.34,226.651 1657,226.767 1657.67,226.883 1658.33,226.998 1659,227.113 1659.66,227.228 \n", " 1660.33,227.342 1661,227.456 1661.66,227.57 1662.33,227.683 1662.99,227.796 1663.66,227.908 1664.33,228.021 1664.99,228.133 1665.66,228.244 1666.32,228.355 \n", " 1666.99,228.466 1667.65,228.576 1668.32,228.687 1668.99,228.796 1669.65,228.906 1670.32,229.015 1670.98,229.123 1671.65,229.232 1672.32,229.34 1672.98,229.447 \n", " 1673.65,229.554 1674.31,229.661 1674.98,229.767 1675.64,229.874 1676.31,229.979 1676.98,230.084 1677.64,230.189 1678.31,230.294 1678.97,230.398 1679.64,230.502 \n", " 1680.3,230.605 1680.97,230.708 1681.64,230.811 1682.3,230.913 1682.97,231.015 1683.63,231.117 1684.3,231.218 1684.97,231.318 1685.63,231.419 1686.3,231.518 \n", " 1686.96,231.618 1687.63,231.717 1688.29,231.816 1688.96,231.914 1689.63,232.012 1690.29,232.11 1690.96,232.207 1691.62,232.303 1692.29,232.4 1692.95,232.496 \n", " 1693.62,232.591 1694.29,232.686 1694.95,232.781 1695.62,232.875 1696.28,232.969 1696.95,233.062 1697.62,233.155 1698.28,233.248 1698.95,233.34 1699.61,233.432 \n", " 1700.28,233.523 1700.94,233.614 1701.61,233.705 1702.28,233.795 1702.94,233.885 1703.61,233.974 1704.27,234.063 1704.94,234.151 1705.6,234.239 1706.27,234.327 \n", " 1706.94,234.414 1707.6,234.501 1708.27,234.587 1708.93,234.673 1709.6,234.758 1710.27,234.843 1710.93,234.928 1711.6,235.012 1712.26,235.096 1712.93,235.179 \n", " 1713.59,235.262 1714.26,235.344 1714.93,235.426 1715.59,235.508 1716.26,235.589 1716.92,235.67 1717.59,235.75 1718.25,235.83 1718.92,235.909 1719.59,235.988 \n", " 1720.25,236.066 1720.92,236.144 1721.58,236.222 1722.25,236.299 1722.92,236.376 1723.58,236.452 1724.25,236.528 1724.91,236.603 1725.58,236.678 1726.24,236.752 \n", " 1726.91,236.826 1727.58,236.9 1728.24,236.973 1728.91,237.045 1729.57,237.118 1730.24,237.189 1730.9,237.261 1731.57,237.331 1732.24,237.402 1732.9,237.472 \n", " 1733.57,237.541 1734.23,237.61 1734.9,237.679 1735.57,237.747 1736.23,237.814 1736.9,237.882 1737.56,237.948 1738.23,238.014 1738.89,238.08 1739.56,238.146 \n", " 1740.23,238.21 1740.89,238.275 1741.56,238.339 1742.22,238.402 1742.89,238.465 1743.55,238.528 1744.22,238.59 1744.89,238.652 1745.55,238.713 1746.22,238.773 \n", " 1746.88,238.834 1747.55,238.893 1748.22,238.953 1748.88,239.012 1749.55,239.07 1750.21,239.128 1750.88,239.185 1751.54,239.242 1752.21,239.299 1752.88,239.355 \n", " 1753.54,239.41 1754.21,239.465 1754.87,239.52 1755.54,239.574 1756.2,239.628 1756.87,239.681 1757.54,239.734 1758.2,239.786 1758.87,239.838 1759.53,239.889 \n", " 1760.2,239.94 1760.87,239.99 1761.53,240.04 1762.2,240.09 1762.86,240.139 1763.53,240.187 1764.19,240.235 1764.86,240.283 1765.53,240.33 1766.19,240.376 \n", " 1766.86,240.422 1767.52,240.468 1768.19,240.513 1768.86,240.558 1769.52,240.602 1770.19,240.646 1770.85,240.689 1771.52,240.732 1772.18,240.774 1772.85,240.816 \n", " 1773.52,240.858 1774.18,240.899 1774.85,240.939 1775.51,240.979 1776.18,241.018 1776.84,241.057 1777.51,241.096 1778.18,241.134 1778.84,241.172 1779.51,241.209 \n", " 1780.17,241.245 1780.84,241.281 1781.51,241.317 1782.17,241.352 1782.84,241.387 1783.5,241.421 1784.17,241.455 1784.83,241.488 1785.5,241.521 1786.17,241.554 \n", " 1786.83,241.586 1787.5,241.617 1788.16,241.648 1788.83,241.678 1789.49,241.708 1790.16,241.738 1790.83,241.767 1791.49,241.796 1792.16,241.824 1792.82,241.851 \n", " 1793.49,241.878 1794.16,241.905 1794.82,241.931 1795.49,241.957 1796.15,241.982 1796.82,242.007 1797.48,242.031 1798.15,242.055 1798.82,242.079 1799.48,242.102 \n", " 1800.15,242.124 1800.81,242.146 1801.48,242.168 1802.14,242.189 1802.81,242.209 1803.48,242.229 1804.14,242.249 1804.81,242.268 1805.47,242.287 1806.14,242.305 \n", " 1806.81,242.323 1807.47,242.34 1808.14,242.357 1808.8,242.373 1809.47,242.389 1810.13,242.404 1810.8,242.419 1811.47,242.434 1812.13,242.448 1812.8,242.461 \n", " 1813.46,242.475 1814.13,242.487 1814.79,242.499 1815.46,242.511 1816.13,242.522 1816.79,242.533 1817.46,242.543 1818.12,242.553 1818.79,242.563 1819.46,242.572 \n", " 1820.12,242.58 1820.79,242.588 1821.45,242.596 1822.12,242.603 1822.78,242.609 1823.45,242.616 1824.12,242.621 1824.78,242.627 1825.45,242.631 1826.11,242.636 \n", " 1826.78,242.64 1827.44,242.643 1828.11,242.646 1828.78,242.649 1829.44,242.651 1830.11,242.652 1830.77,242.654 1831.44,242.654 1832.11,242.655 1832.77,242.655 \n", " 1833.44,242.654 1834.1,242.653 1834.77,242.651 1835.43,242.65 1836.1,242.647 1836.77,242.644 1837.43,242.641 1838.1,242.637 1838.76,242.633 1839.43,242.629 \n", " 1840.09,242.624 1840.76,242.618 1841.43,242.612 1842.09,242.606 1842.76,242.599 1843.42,242.592 1844.09,242.584 1844.76,242.576 1845.42,242.567 1846.09,242.558 \n", " 1846.75,242.549 1847.42,242.539 1848.08,242.529 1848.75,242.518 1849.42,242.507 1850.08,242.495 1850.75,242.483 1851.41,242.471 1852.08,242.458 1852.75,242.445 \n", " 1853.41,242.431 1854.08,242.417 1854.74,242.402 1855.41,242.387 1856.07,242.372 1856.74,242.356 1857.41,242.34 1858.07,242.323 1858.74,242.306 1859.4,242.289 \n", " 1860.07,242.271 1860.73,242.252 1861.4,242.233 1862.07,242.214 1862.73,242.195 1863.4,242.175 1864.06,242.154 1864.73,242.133 1865.4,242.112 1866.06,242.09 \n", " 1866.73,242.068 1867.39,242.046 1868.06,242.023 1868.72,242 1869.39,241.976 1870.06,241.952 1870.72,241.927 1871.39,241.902 1872.05,241.877 1872.72,241.851 \n", " 1873.38,241.825 1874.05,241.799 1874.72,241.772 1875.38,241.745 1876.05,241.717 1876.71,241.689 1877.38,241.66 1878.05,241.631 1878.71,241.602 1879.38,241.573 \n", " 1880.04,241.543 1880.71,241.512 1881.37,241.481 1882.04,241.45 1882.71,241.418 1883.37,241.386 1884.04,241.354 1884.7,241.321 1885.37,241.288 1886.03,241.255 \n", " 1886.7,241.221 1887.37,241.187 1888.03,241.152 1888.7,241.117 1889.36,241.082 1890.03,241.046 1890.7,241.01 1891.36,240.973 1892.03,240.936 1892.69,240.899 \n", " 1893.36,240.861 1894.02,240.823 1894.69,240.785 1895.36,240.746 1896.02,240.707 1896.69,240.668 1897.35,240.628 1898.02,240.588 1898.68,240.548 1899.35,240.507 \n", " 1900.02,240.465 1900.68,240.424 1901.35,240.382 1902.01,240.34 1902.68,240.297 1903.35,240.254 1904.01,240.211 1904.68,240.167 1905.34,240.123 1906.01,240.079 \n", " 1906.67,240.034 1907.34,239.989 1908.01,239.944 1908.67,239.898 1909.34,239.852 1910,239.805 1910.67,239.759 1911.33,239.712 1912,239.664 1912.67,239.616 \n", " 1913.33,239.568 1914,239.52 1914.66,239.471 1915.33,239.422 1916,239.373 1916.66,239.323 1917.33,239.273 1917.99,239.223 1918.66,239.172 1919.32,239.121 \n", " 1919.99,239.07 1920.66,239.018 1921.32,238.966 1921.99,238.914 1922.65,238.861 1923.32,238.808 1923.98,238.755 1924.65,238.702 1925.32,238.648 1925.98,238.594 \n", " 1926.65,238.539 1927.31,238.485 1927.98,238.43 1928.65,238.374 1929.31,238.319 1929.98,238.263 1930.64,238.207 1931.31,238.15 1931.97,238.093 1932.64,238.036 \n", " 1933.31,237.979 1933.97,237.921 1934.64,237.863 1935.3,237.805 1935.97,237.746 1936.64,237.688 1937.3,237.629 1937.97,237.569 1938.63,237.51 1939.3,237.45 \n", " 1939.96,237.389 1940.63,237.329 1941.3,237.268 1941.96,237.207 1942.63,237.146 1943.29,237.084 1943.96,237.022 1944.62,236.96 1945.29,236.898 1945.96,236.835 \n", " 1946.62,236.772 1947.29,236.709 1947.95,236.646 1948.62,236.582 1949.29,236.518 1949.95,236.454 1950.62,236.389 1951.28,236.325 1951.95,236.26 1952.61,236.195 \n", " 1953.28,236.129 1953.95,236.063 1954.61,235.997 1955.28,235.931 1955.94,235.865 1956.61,235.798 1957.27,235.731 1957.94,235.664 1958.61,235.597 1959.27,235.529 \n", " 1959.94,235.461 1960.6,235.393 1961.27,235.325 1961.94,235.256 1962.6,235.187 1963.27,235.118 1963.93,235.049 1964.6,234.98 1965.26,234.91 1965.93,234.84 \n", " 1966.6,234.77 1967.26,234.7 1967.93,234.629 1968.59,234.558 1969.26,234.487 1969.92,234.416 1970.59,234.345 1971.26,234.273 1971.92,234.202 1972.59,234.129 \n", " 1973.25,234.057 1973.92,233.985 1974.59,233.912 1975.25,233.839 1975.92,233.766 1976.58,233.693 1977.25,233.62 1977.91,233.546 1978.58,233.472 1979.25,233.398 \n", " 1979.91,233.324 1980.58,233.25 1981.24,233.175 1981.91,233.101 1982.57,233.026 1983.24,232.951 1983.91,232.875 1984.57,232.8 1985.24,232.724 1985.9,232.649 \n", " 1986.57,232.573 1987.24,232.496 1987.9,232.42 1988.57,232.344 1989.23,232.267 1989.9,232.19 1990.56,232.113 1991.23,232.036 1991.9,231.959 1992.56,231.881 \n", " 1993.23,231.804 1993.89,231.726 1994.56,231.648 1995.22,231.57 1995.89,231.492 1996.56,231.413 1997.22,231.335 1997.89,231.256 1998.55,231.177 1999.22,231.098 \n", " 1999.89,231.019 2000.55,230.94 2001.22,230.861 2001.88,230.781 2002.55,230.702 2003.21,230.622 2003.88,230.542 2004.55,230.462 2005.21,230.382 2005.88,230.301 \n", " 2006.54,230.221 2007.21,230.14 2007.87,230.06 2008.54,229.979 2009.21,229.898 2009.87,229.817 2010.54,229.736 2011.2,229.654 2011.87,229.573 2012.54,229.491 \n", " 2013.2,229.41 2013.87,229.328 2014.53,229.246 2015.2,229.164 2015.86,229.082 2016.53,229 2017.2,228.918 2017.86,228.836 2018.53,228.753 2019.19,228.671 \n", " 2019.86,228.588 2020.52,228.505 2021.19,228.422 2021.86,228.339 2022.52,228.256 2023.19,228.173 2023.85,228.09 2024.52,228.007 2025.19,227.924 2025.85,227.84 \n", " 2026.52,227.757 2027.18,227.673 2027.85,227.589 2028.51,227.506 2029.18,227.422 2029.85,227.338 2030.51,227.254 2031.18,227.17 2031.84,227.086 2032.51,227.002 \n", " 2033.18,226.917 2033.84,226.833 2034.51,226.749 2035.17,226.664 2035.84,226.58 2036.5,226.495 2037.17,226.411 2037.84,226.326 2038.5,226.241 2039.17,226.157 \n", " 2039.83,226.072 2040.5,225.987 2041.16,225.902 2041.83,225.817 2042.5,225.732 2043.16,225.647 2043.83,225.562 2044.49,225.477 2045.16,225.392 2045.83,225.307 \n", " 2046.49,225.221 2047.16,225.136 2047.82,225.051 2048.49,224.966 2049.15,224.88 2049.82,224.795 2050.49,224.71 2051.15,224.624 2051.82,224.539 2052.48,224.453 \n", " 2053.15,224.368 2053.81,224.282 2054.48,224.197 2055.15,224.111 2055.81,224.026 2056.48,223.94 2057.14,223.855 2057.81,223.769 2058.48,223.684 2059.14,223.598 \n", " 2059.81,223.512 2060.47,223.427 2061.14,223.341 2061.8,223.256 2062.47,223.17 2063.14,223.085 2063.8,222.999 2064.47,222.913 2065.13,222.828 2065.8,222.742 \n", " 2066.46,222.657 2067.13,222.571 2067.8,222.486 2068.46,222.4 2069.13,222.315 2069.79,222.229 2070.46,222.144 2071.13,222.058 2071.79,221.973 2072.46,221.887 \n", " 2073.12,221.802 2073.79,221.717 2074.45,221.631 2075.12,221.546 2075.79,221.461 2076.45,221.376 2077.12,221.291 2077.78,221.205 2078.45,221.12 2079.11,221.035 \n", " 2079.78,220.95 2080.45,220.865 2081.11,220.78 2081.78,220.695 2082.44,220.61 2083.11,220.526 2083.78,220.441 2084.44,220.356 2085.11,220.271 2085.77,220.187 \n", " 2086.44,220.102 2087.1,220.018 2087.77,219.933 2088.44,219.849 2089.1,219.764 2089.77,219.68 2090.43,219.596 2091.1,219.512 2091.76,219.428 2092.43,219.343 \n", " 2093.1,219.26 2093.76,219.176 2094.43,219.092 2095.09,219.008 2095.76,218.924 2096.43,218.841 2097.09,218.757 2097.76,218.674 2098.42,218.59 2099.09,218.507 \n", " 2099.75,218.424 2100.42,218.34 2101.09,218.257 2101.75,218.174 2102.42,218.091 2103.08,218.009 2103.75,217.926 2104.41,217.843 2105.08,217.761 2105.75,217.678 \n", " 2106.41,217.596 2107.08,217.514 2107.74,217.431 2108.41,217.349 2109.08,217.267 2109.74,217.185 2110.41,217.104 2111.07,217.022 2111.74,216.94 2112.4,216.859 \n", " 2113.07,216.777 2113.74,216.696 2114.4,216.615 2115.07,216.534 2115.73,216.453 2116.4,216.372 2117.07,216.291 2117.73,216.211 2118.4,216.13 2119.06,216.05 \n", " 2119.73,215.97 2120.39,215.889 2121.06,215.809 2121.73,215.73 2122.39,215.65 2123.06,215.57 2123.72,215.491 2124.39,215.411 2125.05,215.332 2125.72,215.253 \n", " 2126.39,215.174 2127.05,215.095 2127.72,215.016 2128.38,214.937 2129.05,214.859 2129.72,214.781 2130.38,214.702 2131.05,214.624 2131.71,214.546 2132.38,214.469 \n", " 2133.04,214.391 2133.71,214.313 2134.38,214.236 2135.04,214.159 2135.71,214.082 2136.37,214.005 2137.04,213.928 2137.7,213.851 2138.37,213.775 2139.04,213.698 \n", " 2139.7,213.622 2140.37,213.546 2141.03,213.47 2141.7,213.395 2142.37,213.319 2143.03,213.244 2143.7,213.168 2144.36,213.093 2145.03,213.018 2145.69,212.944 \n", " 2146.36,212.869 2147.03,212.794 2147.69,212.72 2148.36,212.646 2149.02,212.572 2149.69,212.498 2150.35,212.425 2151.02,212.351 2151.69,212.278 2152.35,212.205 \n", " 2153.02,212.132 2153.68,212.059 2154.35,211.987 2155.02,211.914 2155.68,211.842 2156.35,211.77 2157.01,211.698 2157.68,211.626 2158.34,211.555 2159.01,211.484 \n", " 2159.68,211.412 2160.34,211.342 2161.01,211.271 2161.67,211.2 2162.34,211.13 2163,211.06 2163.67,210.99 2164.34,210.92 2165,210.85 2165.67,210.781 \n", " 2166.33,210.711 2167,210.642 2167.67,210.573 2168.33,210.505 2169,210.436 2169.66,210.368 2170.33,210.3 2170.99,210.232 2171.66,210.164 2172.33,210.097 \n", " 2172.99,210.03 2173.66,209.963 2174.32,209.896 2174.99,209.829 2175.65,209.763 2176.32,209.696 2176.99,209.63 2177.65,209.564 2178.32,209.499 2178.98,209.433 \n", " 2179.65,209.368 2180.32,209.303 2180.98,209.238 2181.65,209.174 2182.31,209.109 2182.98,209.045 2183.64,208.981 2184.31,208.918 2184.98,208.854 2185.64,208.791 \n", " 2186.31,208.728 2186.97,208.665 2187.64,208.602 2188.3,208.54 2188.97,208.478 2189.64,208.416 2190.3,208.354 2190.97,208.292 2191.63,208.231 2192.3,208.17 \n", " 2192.97,208.109 2193.63,208.049 2194.3,207.988 2194.96,207.928 2195.63,207.868 2196.29,207.808 2196.96,207.749 2197.63,207.69 2198.29,207.631 2198.96,207.572 \n", " 2199.62,207.513 2200.29,207.455 2200.95,207.397 2201.62,207.339 2202.29,207.282 2202.95,207.224 2203.62,207.167 2204.28,207.11 2204.95,207.054 2205.62,206.997 \n", " 2206.28,206.941 2206.95,206.885 2207.61,206.829 2208.28,206.774 2208.94,206.719 2209.61,206.664 2210.28,206.609 2210.94,206.554 2211.61,206.5 2212.27,206.446 \n", " 2212.94,206.392 2213.61,206.339 2214.27,206.286 2214.94,206.233 2215.6,206.18 2216.27,206.127 2216.93,206.075 2217.6,206.023 2218.27,205.971 2218.93,205.92 \n", " 2219.6,205.869 2220.26,205.818 2220.93,205.767 2221.59,205.716 2222.26,205.666 2222.93,205.616 2223.59,205.566 2224.26,205.517 2224.92,205.468 2225.59,205.419 \n", " 2226.26,205.37 2226.92,205.321 2227.59,205.273 2228.25,205.225 2228.92,205.178 2229.58,205.13 2230.25,205.083 2230.92,205.036 2231.58,204.989 2232.25,204.943 \n", " 2232.91,204.897 2233.58,204.851 2234.24,204.805 2234.91,204.76 2235.58,204.715 2236.24,204.67 2236.91,204.625 2237.57,204.581 2238.24,204.537 2238.91,204.493 \n", " 2239.57,204.45 2240.24,204.407 2240.9,204.364 2241.57,204.321 2242.23,204.279 2242.9,204.236 2243.57,204.194 2244.23,204.153 2244.9,204.111 2245.56,204.07 \n", " 2246.23,204.029 2246.89,203.989 2247.56,203.949 2248.23,203.909 2248.89,203.869 2249.56,203.829 2250.22,203.79 2250.89,203.751 2251.56,203.713 2252.22,203.674 \n", " 2252.89,203.636 2253.55,203.598 2254.22,203.561 2254.88,203.523 2255.55,203.486 2256.22,203.449 2256.88,203.413 2257.55,203.377 2258.21,203.341 2258.88,203.305 \n", " 2259.54,203.27 2260.21,203.234 2260.88,203.2 2261.54,203.165 2262.21,203.131 2262.87,203.097 2263.54,203.063 2264.21,203.029 2264.87,202.996 2265.54,202.963 \n", " 2266.2,202.931 2266.87,202.898 2267.53,202.866 2268.2,202.834 2268.87,202.803 2269.53,202.772 2270.2,202.741 2270.86,202.71 2271.53,202.679 2272.19,202.649 \n", " 2272.86,202.619 2273.53,202.59 2274.19,202.561 2274.86,202.531 2275.52,202.503 2276.19,202.474 2276.86,202.446 2277.52,202.418 2278.19,202.39 2278.85,202.363 \n", " 2279.52,202.336 2280.18,202.309 2280.85,202.283 2281.52,202.256 2282.18,202.23 2282.85,202.205 2283.51,202.179 2284.18,202.154 2284.84,202.129 2285.51,202.105 \n", " 2286.18,202.08 2286.84,202.056 2287.51,202.033 2288.17,202.009 2288.84,201.986 2289.51,201.963 2290.17,201.94 2290.84,201.918 2291.5,201.896 2292.17,201.874 \n", " 2292.83,201.853 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5502)\" style=\"stroke:#e26f46; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 295.454,1446.71 296.12,1446.71 296.786,1446.71 297.452,1446.71 298.117,1446.71 298.783,1446.71 299.449,1446.71 300.115,1446.71 300.78,1446.71 301.446,1446.71 \n", " 302.112,1446.71 302.778,1446.71 303.444,1446.71 304.109,1446.71 304.775,1446.71 305.441,1446.71 306.107,1446.71 306.773,1446.71 307.438,1446.71 308.104,1446.71 \n", " 308.77,1446.71 309.436,1446.71 310.102,1446.71 310.767,1446.71 311.433,1446.71 312.099,1446.71 312.765,1446.71 313.431,1446.71 314.096,1446.71 314.762,1446.71 \n", " 315.428,1446.71 316.094,1446.71 316.76,1446.71 317.425,1446.71 318.091,1446.71 318.757,1446.71 319.423,1446.71 320.089,1446.71 320.754,1446.71 321.42,1446.71 \n", " 322.086,1446.71 322.752,1446.71 323.417,1446.71 324.083,1446.71 324.749,1446.71 325.415,1446.71 326.081,1446.71 326.746,1446.71 327.412,1446.71 328.078,1446.71 \n", " 328.744,1446.71 329.41,1446.71 330.075,1446.71 330.741,1446.71 331.407,1446.71 332.073,1446.71 332.739,1446.71 333.404,1446.71 334.07,1446.71 334.736,1446.71 \n", " 335.402,1446.71 336.068,1446.71 336.733,1446.71 337.399,1446.71 338.065,1446.71 338.731,1446.71 339.397,1446.71 340.062,1446.71 340.728,1446.71 341.394,1446.71 \n", " 342.06,1446.71 342.725,1446.71 343.391,1446.71 344.057,1446.71 344.723,1446.71 345.389,1446.71 346.054,1446.71 346.72,1446.71 347.386,1446.71 348.052,1446.71 \n", " 348.718,1446.71 349.383,1446.71 350.049,1446.71 350.715,1446.71 351.381,1446.71 352.047,1446.71 352.712,1446.71 353.378,1446.71 354.044,1446.71 354.71,1446.71 \n", " 355.376,1446.71 356.041,1446.71 356.707,1446.71 357.373,1446.71 358.039,1446.71 358.705,1446.71 359.37,1446.71 360.036,1446.71 360.702,1446.71 361.368,1446.71 \n", " 362.033,1446.71 362.699,1446.71 363.365,1446.71 364.031,1446.71 364.697,1446.71 365.362,1446.71 366.028,1446.71 366.694,1446.71 367.36,1446.71 368.026,1446.71 \n", " 368.691,1446.71 369.357,1446.71 370.023,1446.71 370.689,1446.71 371.355,1446.71 372.02,1446.71 372.686,1446.71 373.352,1446.71 374.018,1446.71 374.684,1446.71 \n", " 375.349,1446.71 376.015,1446.71 376.681,1446.71 377.347,1446.71 378.013,1446.71 378.678,1446.71 379.344,1446.71 380.01,1446.71 380.676,1446.71 381.342,1446.71 \n", " 382.007,1446.71 382.673,1446.71 383.339,1446.71 384.005,1446.71 384.67,1446.71 385.336,1446.71 386.002,1446.71 386.668,1446.71 387.334,1446.71 387.999,1446.71 \n", " 388.665,1446.71 389.331,1446.71 389.997,1446.71 390.663,1446.71 391.328,1446.71 391.994,1446.71 392.66,1446.71 393.326,1446.71 393.992,1446.71 394.657,1446.71 \n", " 395.323,1446.71 395.989,1446.71 396.655,1446.71 397.321,1446.71 397.986,1446.71 398.652,1446.71 399.318,1446.71 399.984,1446.71 400.65,1446.71 401.315,1446.71 \n", " 401.981,1446.71 402.647,1446.71 403.313,1446.71 403.978,1446.71 404.644,1446.71 405.31,1446.71 405.976,1446.71 406.642,1446.71 407.307,1446.71 407.973,1446.71 \n", " 408.639,1446.71 409.305,1446.71 409.971,1446.71 410.636,1446.71 411.302,1446.71 411.968,1446.71 412.634,1446.71 413.3,1446.71 413.965,1446.71 414.631,1446.71 \n", " 415.297,1446.71 415.963,1446.71 416.629,1446.71 417.294,1446.71 417.96,1446.71 418.626,1446.71 419.292,1446.71 419.958,1446.71 420.623,1446.71 421.289,1446.71 \n", " 421.955,1446.71 422.621,1446.71 423.286,1446.71 423.952,1446.71 424.618,1446.71 425.284,1446.71 425.95,1446.71 426.615,1446.71 427.281,1446.71 427.947,1446.71 \n", " 428.613,1446.71 429.279,1446.71 429.944,1446.71 430.61,1446.71 431.276,1446.71 431.942,1446.71 432.608,1446.71 433.273,1446.71 433.939,1446.71 434.605,1446.71 \n", " 435.271,1446.71 435.937,1446.71 436.602,1446.71 437.268,1446.71 437.934,1446.71 438.6,1446.71 439.266,1446.71 439.931,1446.71 440.597,1446.71 441.263,1446.71 \n", " 441.929,1446.71 442.595,1446.71 443.26,1446.71 443.926,1446.71 444.592,1446.71 445.258,1446.71 445.923,1446.71 446.589,1446.71 447.255,1446.71 447.921,1446.71 \n", " 448.587,1446.71 449.252,1446.71 449.918,1446.71 450.584,1446.71 451.25,1446.71 451.916,1446.71 452.581,1446.71 453.247,1446.71 453.913,1446.71 454.579,1446.71 \n", " 455.245,1446.71 455.91,1446.71 456.576,1446.71 457.242,1446.71 457.908,1446.71 458.574,1446.71 459.239,1446.71 459.905,1446.71 460.571,1446.71 461.237,1446.71 \n", " 461.903,1446.71 462.568,1446.71 463.234,1446.71 463.9,1446.71 464.566,1446.71 465.231,1446.71 465.897,1446.71 466.563,1446.71 467.229,1446.71 467.895,1446.71 \n", " 468.56,1446.71 469.226,1446.71 469.892,1446.71 470.558,1446.71 471.224,1446.71 471.889,1446.71 472.555,1446.71 473.221,1446.71 473.887,1446.71 474.553,1446.71 \n", " 475.218,1446.71 475.884,1446.71 476.55,1446.71 477.216,1446.71 477.882,1446.71 478.547,1446.71 479.213,1446.71 479.879,1446.71 480.545,1446.71 481.211,1446.71 \n", " 481.876,1446.71 482.542,1446.71 483.208,1446.71 483.874,1446.71 484.539,1446.71 485.205,1446.71 485.871,1446.71 486.537,1446.71 487.203,1446.71 487.868,1446.71 \n", " 488.534,1446.71 489.2,1446.71 489.866,1446.71 490.532,1446.71 491.197,1446.71 491.863,1446.71 492.529,1446.71 493.195,1446.71 493.861,1446.71 494.526,1446.71 \n", " 495.192,1446.71 495.858,1446.71 496.524,1446.71 497.19,1446.71 497.855,1446.71 498.521,1446.71 499.187,1446.71 499.853,1446.71 500.519,1446.71 501.184,1446.71 \n", " 501.85,1446.71 502.516,1446.71 503.182,1446.71 503.847,1446.71 504.513,1446.71 505.179,1446.71 505.845,1446.71 506.511,1446.71 507.176,1446.71 507.842,1446.71 \n", " 508.508,1446.71 509.174,1446.71 509.84,1446.71 510.505,1446.71 511.171,1446.71 511.837,1446.71 512.503,1446.71 513.169,1446.71 513.834,1446.71 514.5,1446.71 \n", " 515.166,1446.71 515.832,1446.71 516.498,1446.71 517.163,1446.71 517.829,1446.71 518.495,1446.71 519.161,1446.71 519.827,1446.71 520.492,1446.71 521.158,1446.71 \n", " 521.824,1446.71 522.49,1446.71 523.156,1446.71 523.821,1446.71 524.487,1446.71 525.153,1446.71 525.819,1446.71 526.484,1446.71 527.15,1446.71 527.816,1446.71 \n", " 528.482,1446.71 529.148,1446.71 529.813,1446.71 530.479,1446.71 531.145,1446.71 531.811,1446.71 532.477,1446.71 533.142,1446.71 533.808,1446.71 534.474,1446.71 \n", " 535.14,1446.71 535.806,1446.71 536.471,1446.71 537.137,1446.71 537.803,1446.71 538.469,1446.71 539.135,1446.71 539.8,1446.71 540.466,1446.71 541.132,1446.71 \n", " 541.798,1446.71 542.464,1446.71 543.129,1446.71 543.795,1446.71 544.461,1446.71 545.127,1446.71 545.792,1446.71 546.458,1446.71 547.124,1446.71 547.79,1446.71 \n", " 548.456,1446.71 549.121,1446.71 549.787,1446.71 550.453,1446.71 551.119,1446.71 551.785,1446.71 552.45,1446.71 553.116,1446.71 553.782,1446.71 554.448,1446.71 \n", " 555.114,1446.71 555.779,1446.71 556.445,1446.71 557.111,1446.71 557.777,1446.71 558.443,1446.71 559.108,1446.71 559.774,1446.71 560.44,1446.71 561.106,1446.71 \n", " 561.772,1446.71 562.437,1446.71 563.103,1446.71 563.769,1446.71 564.435,1446.71 565.1,1446.71 565.766,1446.71 566.432,1446.71 567.098,1446.71 567.764,1446.71 \n", " 568.429,1446.71 569.095,1446.71 569.761,1446.71 570.427,1446.71 571.093,1446.71 571.758,1446.71 572.424,1446.71 573.09,1446.71 573.756,1446.71 574.422,1446.71 \n", " 575.087,1446.71 575.753,1446.71 576.419,1446.71 577.085,1446.71 577.751,1446.71 578.416,1446.71 579.082,1446.71 579.748,1446.71 580.414,1446.71 581.08,1446.71 \n", " 581.745,1446.71 582.411,1446.71 583.077,1446.71 583.743,1446.71 584.409,1446.71 585.074,1446.71 585.74,1446.71 586.406,1446.71 587.072,1446.71 587.737,1446.71 \n", " 588.403,1446.71 589.069,1446.71 589.735,1446.71 590.401,1446.71 591.066,1446.71 591.732,1446.71 592.398,1446.71 593.064,1446.71 593.73,1446.71 594.395,1446.71 \n", " 595.061,1446.71 595.727,1446.71 596.393,1446.71 597.059,1446.71 597.724,1446.71 598.39,1446.71 599.056,1446.71 599.722,1446.71 600.388,1446.71 601.053,1446.71 \n", " 601.719,1446.71 602.385,1446.71 603.051,1446.71 603.717,1446.71 604.382,1446.71 605.048,1446.71 605.714,1446.71 606.38,1446.71 607.045,1446.71 607.711,1446.71 \n", " 608.377,1446.71 609.043,1446.71 609.709,1446.71 610.374,1446.71 611.04,1446.71 611.706,1446.71 612.372,1446.71 613.038,1446.71 613.703,1446.71 614.369,1446.71 \n", " 615.035,1446.71 615.701,1446.71 616.367,1446.71 617.032,1446.71 617.698,1446.71 618.364,1446.71 619.03,1446.71 619.696,1446.71 620.361,1446.71 621.027,1446.71 \n", " 621.693,1446.71 622.359,1446.71 623.025,1446.71 623.69,1446.71 624.356,1446.71 625.022,1446.71 625.688,1446.71 626.353,1446.71 627.019,1446.71 627.685,1446.71 \n", " 628.351,1446.71 629.017,1446.71 629.682,1446.71 630.348,1446.71 631.014,1446.71 631.68,1446.71 632.346,1446.71 633.011,1446.71 633.677,1446.71 634.343,1446.71 \n", " 635.009,1446.71 635.675,1446.71 636.34,1446.71 637.006,1446.71 637.672,1446.71 638.338,1446.71 639.004,1446.71 639.669,1446.71 640.335,1446.71 641.001,1446.71 \n", " 641.667,1446.71 642.333,1446.71 642.998,1446.71 643.664,1446.71 644.33,1446.71 644.996,1446.71 645.662,1446.71 646.327,1446.71 646.993,1446.71 647.659,1446.71 \n", " 648.325,1446.71 648.99,1446.71 649.656,1446.71 650.322,1446.71 650.988,1446.71 651.654,1446.71 652.319,1446.71 652.985,1446.71 653.651,1446.71 654.317,1446.71 \n", " 654.983,1446.71 655.648,1446.71 656.314,1446.71 656.98,1446.71 657.646,1446.71 658.312,1446.71 658.977,1446.71 659.643,1446.71 660.309,1446.71 660.975,1446.71 \n", " 661.641,1446.71 662.306,1446.71 662.972,1446.71 663.638,1446.71 664.304,1446.71 664.97,1446.71 665.635,1446.71 666.301,1446.71 666.967,1446.71 667.633,1446.71 \n", " 668.298,1446.71 668.964,1446.71 669.63,1446.71 670.296,1446.71 670.962,1446.71 671.627,1446.71 672.293,1446.71 672.959,1446.71 673.625,1446.71 674.291,1446.71 \n", " 674.956,1446.71 675.622,1446.71 676.288,1446.71 676.954,1446.71 677.62,1446.71 678.285,1446.71 678.951,1446.71 679.617,1446.71 680.283,1446.71 680.949,1446.71 \n", " 681.614,1446.71 682.28,1446.71 682.946,1446.71 683.612,1446.71 684.278,1446.71 684.943,1446.71 685.609,1446.71 686.275,1446.71 686.941,1446.71 687.606,1446.71 \n", " 688.272,1446.71 688.938,1446.71 689.604,1446.71 690.27,1446.71 690.935,1446.71 691.601,1446.71 692.267,1446.71 692.933,1446.71 693.599,1446.71 694.264,1446.71 \n", " 694.93,1446.71 695.596,1446.71 696.262,1446.71 696.928,1446.71 697.593,1446.71 698.259,1446.71 698.925,1446.71 699.591,1446.71 700.257,1446.71 700.922,1446.71 \n", " 701.588,1446.71 702.254,1446.71 702.92,1446.71 703.586,1446.71 704.251,1446.71 704.917,1446.71 705.583,1446.71 706.249,1446.71 706.915,1446.71 707.58,1446.71 \n", " 708.246,1446.71 708.912,1446.71 709.578,1446.71 710.243,1446.71 710.909,1446.71 711.575,1446.71 712.241,1446.71 712.907,1446.71 713.572,1446.71 714.238,1446.71 \n", " 714.904,1446.71 715.57,1446.71 716.236,1446.71 716.901,1446.71 717.567,1446.71 718.233,1446.71 718.899,1446.71 719.565,1446.71 720.23,1446.71 720.896,1446.71 \n", " 721.562,1446.71 722.228,1446.71 722.894,1446.71 723.559,1446.71 724.225,1446.71 724.891,1446.71 725.557,1446.71 726.223,1446.71 726.888,1446.71 727.554,1446.71 \n", " 728.22,1446.71 728.886,1446.71 729.551,1446.71 730.217,1446.71 730.883,1446.71 731.549,1446.71 732.215,1446.71 732.88,1446.71 733.546,1446.71 734.212,1446.71 \n", " 734.878,1446.71 735.544,1446.71 736.209,1446.71 736.875,1446.71 737.541,1446.71 738.207,1446.71 738.873,1446.71 739.538,1446.71 740.204,1446.71 740.87,1446.71 \n", " 741.536,1446.71 742.202,1446.71 742.867,1446.71 743.533,1446.71 744.199,1446.71 744.865,1446.71 745.531,1446.71 746.196,1446.71 746.862,1446.71 747.528,1446.71 \n", " 748.194,1446.71 748.859,1446.71 749.525,1446.71 750.191,1446.71 750.857,1446.71 751.523,1446.71 752.188,1446.71 752.854,1446.71 753.52,1446.71 754.186,1446.71 \n", " 754.852,1446.71 755.517,1446.71 756.183,1446.71 756.849,1446.71 757.515,1446.71 758.181,1446.71 758.846,1446.71 759.512,1446.71 760.178,1446.71 760.844,1446.71 \n", " 761.51,1446.71 762.175,1446.71 762.841,1446.71 763.507,1446.71 764.173,1446.71 764.839,1446.71 765.504,1446.71 766.17,1446.71 766.836,1446.71 767.502,1446.71 \n", " 768.167,1446.71 768.833,1446.71 769.499,1446.71 770.165,1446.71 770.831,1446.71 771.496,1446.71 772.162,1446.71 772.828,1446.71 773.494,1446.71 774.16,1446.71 \n", " 774.825,1446.71 775.491,1446.71 776.157,1446.71 776.823,1446.71 777.489,1446.71 778.154,1446.71 778.82,1446.71 779.486,1446.71 780.152,1446.71 780.818,1446.71 \n", " 781.483,1446.71 782.149,1446.71 782.815,1446.71 783.481,1446.71 784.147,1446.71 784.812,1446.71 785.478,1446.71 786.144,1446.71 786.81,1446.71 787.476,1446.71 \n", " 788.141,1446.71 788.807,1446.71 789.473,1446.71 790.139,1446.71 790.804,1446.71 791.47,1446.71 792.136,1446.71 792.802,1446.71 793.468,1446.71 794.133,1446.71 \n", " 794.799,1446.71 795.465,1446.71 796.131,1446.71 796.797,1446.71 797.462,1446.71 798.128,1446.71 798.794,1446.71 799.46,1446.71 800.126,1446.71 800.791,1446.71 \n", " 801.457,1446.71 802.123,1446.71 802.789,1446.71 803.455,1446.71 804.12,1446.71 804.786,1446.71 805.452,1446.71 806.118,1446.71 806.784,1446.71 807.449,1446.71 \n", " 808.115,1446.71 808.781,1446.71 809.447,1446.71 810.112,1446.71 810.778,1446.71 811.444,1446.71 812.11,1446.71 812.776,1446.71 813.441,1446.71 814.107,1446.71 \n", " 814.773,1446.71 815.439,1446.71 816.105,1446.71 816.77,1446.71 817.436,1446.71 818.102,1446.71 818.768,1446.71 819.434,1446.71 820.099,1446.71 820.765,1446.71 \n", " 821.431,1446.71 822.097,1446.71 822.763,1446.71 823.428,1446.71 824.094,1446.71 824.76,1446.71 825.426,1446.71 826.092,1446.71 826.757,1446.71 827.423,1446.71 \n", " 828.089,1446.71 828.755,1446.71 829.42,1446.71 830.086,1446.71 830.752,1446.71 831.418,1446.71 832.084,1446.71 832.749,1446.71 833.415,1446.71 834.081,1446.71 \n", " 834.747,1446.71 835.413,1446.71 836.078,1446.71 836.744,1446.71 837.41,1446.71 838.076,1446.71 838.742,1446.71 839.407,1446.71 840.073,1446.71 840.739,1446.71 \n", " 841.405,1446.71 842.071,1446.71 842.736,1446.71 843.402,1446.71 844.068,1446.71 844.734,1446.71 845.4,1446.71 846.065,1446.71 846.731,1446.71 847.397,1446.71 \n", " 848.063,1446.71 848.729,1446.71 849.394,1446.71 850.06,1446.71 850.726,1446.71 851.392,1446.71 852.057,1446.71 852.723,1446.71 853.389,1446.71 854.055,1446.71 \n", " 854.721,1446.71 855.386,1446.71 856.052,1446.71 856.718,1446.71 857.384,1446.71 858.05,1446.71 858.715,1446.71 859.381,1446.71 860.047,1446.71 860.713,1446.71 \n", " 861.379,1446.71 862.044,1446.71 862.71,1446.71 863.376,1446.71 864.042,1446.71 864.708,1446.71 865.373,1446.71 866.039,1446.71 866.705,1446.71 867.371,1446.71 \n", " 868.037,1446.71 868.702,1446.71 869.368,1446.71 870.034,1446.71 870.7,1446.71 871.365,1446.71 872.031,1446.71 872.697,1446.71 873.363,1446.71 874.029,1446.71 \n", " 874.694,1446.71 875.36,1446.71 876.026,1446.71 876.692,1446.71 877.358,1446.71 878.023,1446.71 878.689,1446.71 879.355,1446.71 880.021,1446.71 880.687,1446.71 \n", " 881.352,1446.71 882.018,1446.71 882.684,1446.71 883.35,1446.71 884.016,1446.71 884.681,1446.71 885.347,1446.71 886.013,1446.71 886.679,1446.71 887.345,1446.71 \n", " 888.01,1446.71 888.676,1446.71 889.342,1446.71 890.008,1446.71 890.673,1446.71 891.339,1446.71 892.005,1446.71 892.671,1446.71 893.337,1446.71 894.002,1446.71 \n", " 894.668,1446.71 895.334,1446.71 896,1446.71 896.666,1446.71 897.331,1446.71 897.997,1446.71 898.663,1446.71 899.329,1446.71 899.995,1446.71 900.66,1446.71 \n", " 901.326,1446.71 901.992,1446.71 902.658,1446.71 903.324,1446.71 903.989,1446.71 904.655,1446.71 905.321,1446.71 905.987,1446.71 906.653,1446.71 907.318,1446.71 \n", " 907.984,1446.71 908.65,1446.71 909.316,1446.71 909.982,1446.71 910.647,1446.71 911.313,1446.71 911.979,1446.71 912.645,1446.71 913.31,1446.71 913.976,1446.71 \n", " 914.642,1446.71 915.308,1446.71 915.974,1446.71 916.639,1446.71 917.305,1446.71 917.971,1446.71 918.637,1446.71 919.303,1446.71 919.968,1446.71 920.634,1446.71 \n", " 921.3,1446.71 921.966,1446.71 922.632,1446.71 923.297,1446.71 923.963,1446.71 924.629,1446.71 925.295,1446.71 925.961,1446.71 926.626,1446.71 927.292,1446.71 \n", " 927.958,1446.71 928.624,1446.71 929.29,1446.71 929.955,1446.71 930.621,1446.71 931.287,1446.71 931.953,1446.71 932.618,1446.71 933.284,1446.71 933.95,1446.71 \n", " 934.616,1446.71 935.282,1446.71 935.947,1446.71 936.613,1446.71 937.279,1446.71 937.945,1446.71 938.611,1446.71 939.276,1446.71 939.942,1446.71 940.608,1446.71 \n", " 941.274,1446.71 941.94,1446.71 942.605,1446.71 943.271,1446.71 943.937,1446.71 944.603,1446.71 945.269,1446.71 945.934,1446.71 946.6,1446.71 947.266,1446.71 \n", " 947.932,1446.71 948.598,1446.71 949.263,1446.71 949.929,1446.71 950.595,1446.71 951.261,1446.71 951.926,1446.71 952.592,1446.71 953.258,1446.71 953.924,1446.71 \n", " 954.59,1446.71 955.255,1446.71 955.921,1446.71 956.587,1446.71 957.253,1446.71 957.919,1446.71 958.584,1446.71 959.25,1446.71 959.916,1446.71 960.582,1446.71 \n", " 961.248,1446.71 961.913,1446.71 962.579,1446.71 963.245,1446.71 963.911,1446.71 964.577,1446.71 965.242,1446.71 965.908,1446.71 966.574,1446.71 967.24,1446.71 \n", " 967.906,1446.71 968.571,1446.71 969.237,1446.71 969.903,1446.71 970.569,1446.71 971.234,1446.71 971.9,1446.71 972.566,1446.71 973.232,1446.71 973.898,1446.71 \n", " 974.563,1446.71 975.229,1446.71 975.895,1446.71 976.561,1446.71 977.227,1446.71 977.892,1446.71 978.558,1446.71 979.224,1446.71 979.89,1446.71 980.556,1446.71 \n", " 981.221,1446.71 981.887,1446.71 982.553,1446.71 983.219,1446.71 983.885,1446.71 984.55,1446.71 985.216,1446.71 985.882,1446.71 986.548,1446.71 987.214,1446.71 \n", " 987.879,1446.71 988.545,1446.71 989.211,1446.71 989.877,1446.71 990.543,1446.71 991.208,1446.71 991.874,1446.71 992.54,1446.71 993.206,1446.71 993.871,1446.71 \n", " 994.537,1446.71 995.203,1446.71 995.869,1446.71 996.535,1446.71 997.2,1446.71 997.866,1446.71 998.532,1446.71 999.198,1446.71 999.864,1446.71 1000.53,1446.71 \n", " 1001.2,1446.71 1001.86,1446.71 1002.53,1446.71 1003.19,1446.71 1003.86,1446.71 1004.52,1446.71 1005.19,1446.71 1005.86,1446.71 1006.52,1446.71 1007.19,1446.71 \n", " 1007.85,1446.71 1008.52,1446.71 1009.18,1446.71 1009.85,1446.71 1010.52,1446.71 1011.18,1446.71 1011.85,1446.71 1012.51,1446.71 1013.18,1446.71 1013.85,1446.71 \n", " 1014.51,1446.71 1015.18,1446.71 1015.84,1446.71 1016.51,1446.71 1017.17,1446.71 1017.84,1446.71 1018.51,1446.71 1019.17,1446.71 1019.84,1446.71 1020.5,1446.71 \n", " 1021.17,1446.71 1021.83,1446.71 1022.5,1446.71 1023.17,1446.71 1023.83,1446.71 1024.5,1446.71 1025.16,1446.71 1025.83,1446.71 1026.5,1446.71 1027.16,1446.71 \n", " 1027.83,1446.71 1028.49,1446.71 1029.16,1446.71 1029.82,1446.71 1030.49,1446.71 1031.16,1446.71 1031.82,1446.71 1032.49,1446.71 1033.15,1446.71 1033.82,1446.71 \n", " 1034.48,1446.71 1035.15,1446.71 1035.82,1446.71 1036.48,1446.71 1037.15,1446.71 1037.81,1446.71 1038.48,1446.71 1039.15,1446.71 1039.81,1446.71 1040.48,1446.71 \n", " 1041.14,1446.71 1041.81,1446.71 1042.47,1446.71 1043.14,1446.71 1043.81,1446.71 1044.47,1446.71 1045.14,1446.71 1045.8,1446.71 1046.47,1446.71 1047.13,1446.71 \n", " 1047.8,1446.71 1048.47,1446.71 1049.13,1446.71 1049.8,1446.71 1050.46,1446.71 1051.13,1446.71 1051.8,1446.71 1052.46,1446.71 1053.13,1446.71 1053.79,1446.71 \n", " 1054.46,1446.71 1055.12,1446.71 1055.79,1446.71 1056.46,1446.71 1057.12,1446.71 1057.79,1446.71 1058.45,1446.71 1059.12,1446.71 1059.79,1446.71 1060.45,1446.71 \n", " 1061.12,1446.71 1061.78,1446.71 1062.45,1446.71 1063.11,1446.71 1063.78,1446.71 1064.45,1446.71 1065.11,1446.71 1065.78,1446.71 1066.44,1446.71 1067.11,1446.71 \n", " 1067.77,1446.71 1068.44,1446.71 1069.11,1446.71 1069.77,1446.71 1070.44,1446.71 1071.1,1446.71 1071.77,1446.71 1072.44,1446.71 1073.1,1446.71 1073.77,1446.71 \n", " 1074.43,1446.71 1075.1,1446.71 1075.76,1446.71 1076.43,1446.71 1077.1,1446.71 1077.76,1446.71 1078.43,1446.71 1079.09,1446.71 1079.76,1446.71 1080.42,1446.71 \n", " 1081.09,1446.71 1081.76,1446.71 1082.42,1446.71 1083.09,1446.71 1083.75,1446.71 1084.42,1446.71 1085.09,1446.71 1085.75,1446.71 1086.42,1446.71 1087.08,1446.71 \n", " 1087.75,1446.71 1088.41,1446.71 1089.08,1446.71 1089.75,1446.71 1090.41,1446.71 1091.08,1446.71 1091.74,1446.71 1092.41,1446.71 1093.07,1446.71 1093.74,1446.71 \n", " 1094.41,1446.71 1095.07,1446.71 1095.74,1446.71 1096.4,1446.71 1097.07,1446.71 1097.74,1446.71 1098.4,1446.71 1099.07,1446.71 1099.73,1446.71 1100.4,1446.71 \n", " 1101.06,1446.71 1101.73,1446.71 1102.4,1446.71 1103.06,1446.71 1103.73,1446.71 1104.39,1446.71 1105.06,1446.71 1105.72,1446.71 1106.39,1446.71 1107.06,1446.71 \n", " 1107.72,1446.71 1108.39,1446.71 1109.05,1446.71 1109.72,1446.71 1110.39,1446.71 1111.05,1446.71 1111.72,1446.71 1112.38,1446.71 1113.05,1446.71 1113.71,1446.71 \n", " 1114.38,1446.71 1115.05,1446.71 1115.71,1446.71 1116.38,1446.71 1117.04,1446.71 1117.71,1446.71 1118.37,1446.71 1119.04,1446.71 1119.71,1446.71 1120.37,1446.71 \n", " 1121.04,1446.71 1121.7,1446.71 1122.37,1446.71 1123.04,1446.71 1123.7,1446.71 1124.37,1446.71 1125.03,1446.71 1125.7,1446.71 1126.36,1446.71 1127.03,1446.71 \n", " 1127.7,1446.71 1128.36,1446.71 1129.03,1446.71 1129.69,1446.71 1130.36,1446.71 1131.02,1446.71 1131.69,1446.71 1132.36,1446.71 1133.02,1446.71 1133.69,1446.71 \n", " 1134.35,1446.71 1135.02,1446.71 1135.69,1446.71 1136.35,1446.71 1137.02,1446.71 1137.68,1446.71 1138.35,1446.71 1139.01,1446.71 1139.68,1446.71 1140.35,1446.71 \n", " 1141.01,1446.71 1141.68,1446.71 1142.34,1446.71 1143.01,1446.71 1143.68,1446.71 1144.34,1446.71 1145.01,1446.71 1145.67,1446.71 1146.34,1446.71 1147,1446.71 \n", " 1147.67,1446.71 1148.34,1446.71 1149,1446.71 1149.67,1446.71 1150.33,1446.71 1151,1446.71 1151.66,1446.71 1152.33,1446.71 1153,1446.71 1153.66,1446.71 \n", " 1154.33,1446.71 1154.99,1446.71 1155.66,1446.71 1156.33,1446.71 1156.99,1446.71 1157.66,1446.71 1158.32,1446.71 1158.99,1446.71 1159.65,1446.71 1160.32,1446.71 \n", " 1160.99,1446.71 1161.65,1446.71 1162.32,1446.71 1162.98,1446.71 1163.65,1446.71 1164.31,1446.71 1164.98,1446.71 1165.65,1446.71 1166.31,1446.71 1166.98,1446.71 \n", " 1167.64,1446.71 1168.31,1446.71 1168.98,1446.71 1169.64,1446.71 1170.31,1446.71 1170.97,1446.71 1171.64,1446.71 1172.3,1446.71 1172.97,1446.71 1173.64,1446.71 \n", " 1174.3,1446.71 1174.97,1446.71 1175.63,1446.71 1176.3,1446.71 1176.96,1446.71 1177.63,1446.71 1178.3,1446.71 1178.96,1446.71 1179.63,1446.71 1180.29,1446.71 \n", " 1180.96,1446.71 1181.63,1446.71 1182.29,1446.71 1182.96,1446.71 1183.62,1446.71 1184.29,1446.71 1184.95,1446.71 1185.62,1446.71 1186.29,1446.71 1186.95,1446.71 \n", " 1187.62,1446.71 1188.28,1446.71 1188.95,1446.71 1189.61,1446.71 1190.28,1446.71 1190.95,1446.71 1191.61,1446.71 1192.28,1446.71 1192.94,1446.71 1193.61,1446.71 \n", " 1194.28,1446.71 1194.94,1446.71 1195.61,1446.71 1196.27,1446.71 1196.94,1446.71 1197.6,1446.71 1198.27,1446.71 1198.94,1446.71 1199.6,1446.71 1200.27,1446.71 \n", " 1200.93,1446.71 1201.6,1446.71 1202.26,1446.71 1202.93,1446.71 1203.6,1446.71 1204.26,1446.71 1204.93,1446.71 1205.59,1446.71 1206.26,1446.71 1206.93,1446.71 \n", " 1207.59,1446.71 1208.26,1446.71 1208.92,1446.71 1209.59,1446.71 1210.25,1446.71 1210.92,1446.71 1211.59,1446.71 1212.25,1446.71 1212.92,1446.71 1213.58,1446.71 \n", " 1214.25,1446.71 1214.91,1446.71 1215.58,1446.71 1216.25,1446.71 1216.91,1446.71 1217.58,1446.71 1218.24,1446.71 1218.91,1446.71 1219.58,1446.71 1220.24,1446.71 \n", " 1220.91,1446.71 1221.57,1446.71 1222.24,1446.71 1222.9,1446.71 1223.57,1446.71 1224.24,1446.71 1224.9,1446.71 1225.57,1446.71 1226.23,1446.71 1226.9,1446.71 \n", " 1227.56,1446.71 1228.23,1446.71 1228.9,1446.71 1229.56,1446.71 1230.23,1446.71 1230.89,1446.71 1231.56,1446.71 1232.23,1446.71 1232.89,1446.71 1233.56,1446.71 \n", " 1234.22,1446.71 1234.89,1446.71 1235.55,1446.71 1236.22,1446.71 1236.89,1446.71 1237.55,1446.71 1238.22,1446.71 1238.88,1446.71 1239.55,1446.71 1240.22,1446.71 \n", " 1240.88,1446.71 1241.55,1446.71 1242.21,1446.71 1242.88,1446.71 1243.54,1446.71 1244.21,1446.71 1244.88,1446.71 1245.54,1446.71 1246.21,1446.71 1246.87,1446.71 \n", " 1247.54,1446.71 1248.2,1446.71 1248.87,1446.71 1249.54,1446.71 1250.2,1446.71 1250.87,1446.71 1251.53,1446.71 1252.2,1446.71 1252.87,1446.71 1253.53,1446.71 \n", " 1254.2,1446.71 1254.86,1446.71 1255.53,1446.71 1256.19,1446.71 1256.86,1446.71 1257.53,1446.71 1258.19,1446.71 1258.86,1446.71 1259.52,1446.71 1260.19,1446.71 \n", " 1260.85,1446.71 1261.52,1446.71 1262.19,1446.71 1262.85,1446.71 1263.52,1446.71 1264.18,1446.71 1264.85,1446.71 1265.52,1446.71 1266.18,1446.71 1266.85,1446.71 \n", " 1267.51,1446.71 1268.18,1446.71 1268.84,1446.71 1269.51,1446.71 1270.18,1446.71 1270.84,1446.71 1271.51,1446.71 1272.17,1446.71 1272.84,1446.71 1273.5,1446.71 \n", " 1274.17,1446.71 1274.84,1446.71 1275.5,1446.71 1276.17,1446.71 1276.83,1446.71 1277.5,1446.71 1278.17,1446.71 1278.83,1446.71 1279.5,1446.71 1280.16,1446.71 \n", " 1280.83,1446.71 1281.49,1446.71 1282.16,1446.71 1282.83,1446.71 1283.49,1446.71 1284.16,1446.71 1284.82,1446.71 1285.49,1446.71 1286.15,1446.71 1286.82,1446.71 \n", " 1287.49,1446.71 1288.15,1446.71 1288.82,1446.71 1289.48,1446.71 1290.15,1446.71 1290.82,1446.71 1291.48,1446.71 1292.15,1446.71 1292.81,1446.71 1293.48,1446.71 \n", " 1294.14,1446.71 1294.81,1446.71 1295.48,1446.71 1296.14,1446.71 1296.81,1446.71 1297.47,1446.71 1298.14,1446.71 1298.8,1446.71 1299.47,1446.71 1300.14,1446.71 \n", " 1300.8,1446.71 1301.47,1446.71 1302.13,1446.71 1302.8,1446.71 1303.47,1446.71 1304.13,1446.71 1304.8,1446.71 1305.46,1446.71 1306.13,1446.71 1306.79,1446.71 \n", " 1307.46,1446.71 1308.13,1446.71 1308.79,1446.71 1309.46,1446.71 1310.12,1446.71 1310.79,1446.71 1311.45,1446.71 1312.12,1446.71 1312.79,1446.71 1313.45,1446.71 \n", " 1314.12,1446.71 1314.78,1446.71 1315.45,1446.71 1316.12,1446.71 1316.78,1446.71 1317.45,1446.71 1318.11,1446.71 1318.78,1446.71 1319.44,1446.71 1320.11,1446.71 \n", " 1320.78,1446.71 1321.44,1446.71 1322.11,1446.71 1322.77,1446.71 1323.44,1446.71 1324.11,1446.71 1324.77,1446.71 1325.44,1446.71 1326.1,1446.71 1326.77,1446.71 \n", " 1327.43,1446.71 1328.1,1446.71 1328.77,1446.71 1329.43,1446.71 1330.1,1446.71 1330.76,1446.71 1331.43,1446.71 1332.09,1446.71 1332.76,1446.71 1333.43,1446.71 \n", " 1334.09,1446.71 1334.76,1446.71 1335.42,1446.71 1336.09,1446.71 1336.76,1446.71 1337.42,1446.71 1338.09,1446.71 1338.75,1446.71 1339.42,1446.71 1340.08,1446.71 \n", " 1340.75,1446.71 1341.42,1446.71 1342.08,1446.71 1342.75,1446.71 1343.41,1446.71 1344.08,1446.71 1344.74,1446.71 1345.41,1446.71 1346.08,1446.71 1346.74,1446.71 \n", " 1347.41,1446.71 1348.07,1446.71 1348.74,1446.71 1349.41,1446.71 1350.07,1446.71 1350.74,1446.71 1351.4,1446.71 1352.07,1446.71 1352.73,1446.71 1353.4,1446.71 \n", " 1354.07,1446.71 1354.73,1446.71 1355.4,1446.71 1356.06,1446.71 1356.73,1446.71 1357.39,1446.71 1358.06,1446.71 1358.73,1446.71 1359.39,1446.71 1360.06,1446.71 \n", " 1360.72,1446.71 1361.39,1446.71 1362.06,1446.71 1362.72,1446.71 1363.39,1446.71 1364.05,1446.71 1364.72,1446.71 1365.38,1446.71 1366.05,1446.71 1366.72,1446.71 \n", " 1367.38,1446.71 1368.05,1446.71 1368.71,1446.71 1369.38,1446.71 1370.04,1446.71 1370.71,1446.71 1371.38,1446.71 1372.04,1446.71 1372.71,1446.71 1373.37,1446.71 \n", " 1374.04,1446.71 1374.71,1446.71 1375.37,1446.71 1376.04,1446.71 1376.7,1446.71 1377.37,1446.71 1378.03,1446.71 1378.7,1446.71 1379.37,1446.71 1380.03,1446.71 \n", " 1380.7,1446.71 1381.36,1446.71 1382.03,1446.71 1382.69,1446.71 1383.36,1446.71 1384.03,1446.71 1384.69,1446.71 1385.36,1446.71 1386.02,1446.71 1386.69,1446.71 \n", " 1387.36,1446.71 1388.02,1446.71 1388.69,1446.71 1389.35,1446.71 1390.02,1446.71 1390.68,1446.71 1391.35,1446.71 1392.02,1446.71 1392.68,1446.71 1393.35,1446.71 \n", " 1394.01,1446.71 1394.68,1446.71 1395.34,1446.71 1396.01,1446.71 1396.68,1446.71 1397.34,1446.71 1398.01,1446.71 1398.67,1446.71 1399.34,1446.71 1400.01,1446.71 \n", " 1400.67,1446.71 1401.34,1446.71 1402,1446.71 1402.67,1446.71 1403.33,1446.71 1404,1446.71 1404.67,1446.71 1405.33,1446.71 1406,1446.71 1406.66,1446.71 \n", " 1407.33,1446.71 1408,1446.71 1408.66,1446.71 1409.33,1446.71 1409.99,1446.71 1410.66,1446.71 1411.32,1446.71 1411.99,1446.71 1412.66,1446.71 1413.32,1446.71 \n", " 1413.99,1446.71 1414.65,1446.71 1415.32,1446.71 1415.98,1446.71 1416.65,1446.71 1417.32,1446.71 1417.98,1446.71 1418.65,1446.71 1419.31,1446.71 1419.98,1446.71 \n", " 1420.65,1446.71 1421.31,1446.71 1421.98,1446.71 1422.64,1446.71 1423.31,1446.71 1423.97,1446.71 1424.64,1446.71 1425.31,1446.71 1425.97,1446.71 1426.64,1446.71 \n", " 1427.3,1446.71 1427.97,1446.71 1428.63,1446.71 1429.3,1446.71 1429.97,1446.71 1430.63,1446.71 1431.3,1446.71 1431.96,1446.71 1432.63,1446.71 1433.3,1446.71 \n", " 1433.96,1446.71 1434.63,1446.71 1435.29,1446.71 1435.96,1446.71 1436.62,1446.71 1437.29,1446.71 1437.96,1446.71 1438.62,1446.71 1439.29,1446.71 1439.95,1446.71 \n", " 1440.62,1446.71 1441.28,1446.71 1441.95,1446.71 1442.62,1446.71 1443.28,1446.71 1443.95,1446.71 1444.61,1446.71 1445.28,1446.71 1445.95,1446.71 1446.61,1446.71 \n", " 1447.28,1446.71 1447.94,1446.71 1448.61,1446.71 1449.27,1446.71 1449.94,1446.71 1450.61,1446.71 1451.27,1446.71 1451.94,1446.71 1452.6,1446.71 1453.27,1446.71 \n", " 1453.93,1446.71 1454.6,1446.71 1455.27,1446.71 1455.93,1446.71 1456.6,1446.71 1457.26,1446.71 1457.93,1446.71 1458.6,1446.71 1459.26,1446.71 1459.93,1446.71 \n", " 1460.59,1446.71 1461.26,1446.71 1461.92,1446.71 1462.59,1446.71 1463.26,1446.71 1463.92,1446.71 1464.59,1446.71 1465.25,1446.71 1465.92,1446.71 1466.58,1446.71 \n", " 1467.25,1446.71 1467.92,1446.71 1468.58,1446.71 1469.25,1446.71 1469.91,1446.71 1470.58,1446.71 1471.25,1446.71 1471.91,1446.71 1472.58,1446.71 1473.24,1446.71 \n", " 1473.91,1446.71 1474.57,1446.71 1475.24,1446.71 1475.91,1446.71 1476.57,1446.71 1477.24,1446.71 1477.9,1446.71 1478.57,1446.71 1479.23,1446.71 1479.9,1446.71 \n", " 1480.57,1446.71 1481.23,1446.71 1481.9,1446.71 1482.56,1446.71 1483.23,1446.71 1483.9,1446.71 1484.56,1446.71 1485.23,1446.71 1485.89,1446.71 1486.56,1446.71 \n", " 1487.22,1446.71 1487.89,1446.71 1488.56,1446.71 1489.22,1446.71 1489.89,1446.71 1490.55,1446.71 1491.22,1446.71 1491.88,1446.71 1492.55,1446.71 1493.22,1446.71 \n", " 1493.88,1446.71 1494.55,1446.71 1495.21,1446.71 1495.88,1446.71 1496.55,1446.71 1497.21,1446.71 1497.88,1446.71 1498.54,1446.71 1499.21,1446.71 1499.87,1446.71 \n", " 1500.54,1446.71 1501.21,1446.71 1501.87,1446.71 1502.54,1446.71 1503.2,1446.71 1503.87,1446.71 1504.54,1446.71 1505.2,1446.71 1505.87,1446.71 1506.53,1446.71 \n", " 1507.2,1446.71 1507.86,1446.71 1508.53,1446.71 1509.2,1446.71 1509.86,1446.71 1510.53,1446.71 1511.19,1446.71 1511.86,1446.71 1512.52,1446.71 1513.19,1446.71 \n", " 1513.86,1446.71 1514.52,1446.71 1515.19,1446.71 1515.85,1446.71 1516.52,1446.71 1517.19,1446.71 1517.85,1446.71 1518.52,1446.71 1519.18,1446.71 1519.85,1446.71 \n", " 1520.51,1446.71 1521.18,1446.71 1521.85,1446.71 1522.51,1446.71 1523.18,1446.71 1523.84,1446.71 1524.51,1446.71 1525.17,1446.71 1525.84,1446.71 1526.51,1446.71 \n", " 1527.17,1446.71 1527.84,1446.71 1528.5,1446.71 1529.17,1446.71 1529.84,1446.71 1530.5,1446.71 1531.17,1446.71 1531.83,1446.71 1532.5,1446.71 1533.16,1446.71 \n", " 1533.83,1446.71 1534.5,1446.71 1535.16,1446.71 1535.83,1446.71 1536.49,1446.71 1537.16,1446.71 1537.82,1446.71 1538.49,1446.71 1539.16,1446.71 1539.82,1446.71 \n", " 1540.49,1446.71 1541.15,1446.71 1541.82,1446.71 1542.49,1446.71 1543.15,1446.71 1543.82,1446.71 1544.48,1446.71 1545.15,1446.71 1545.81,1446.71 1546.48,1446.71 \n", " 1547.15,1446.71 1547.81,1446.71 1548.48,1446.71 1549.14,1446.71 1549.81,1446.71 1550.47,1446.71 1551.14,1446.71 1551.81,1446.71 1552.47,1446.71 1553.14,1446.71 \n", " 1553.8,1446.71 1554.47,1446.71 1555.14,1446.71 1555.8,1446.71 1556.47,1446.71 1557.13,1446.71 1557.8,1446.71 1558.46,1446.71 1559.13,1446.71 1559.8,1446.71 \n", " 1560.46,1446.71 1561.13,1446.71 1561.79,1446.71 1562.46,1446.71 1563.12,1446.71 1563.79,1446.71 1564.46,1446.71 1565.12,1446.71 1565.79,1446.71 1566.45,1446.71 \n", " 1567.12,1446.71 1567.79,1446.71 1568.45,1446.71 1569.12,1446.71 1569.78,1446.71 1570.45,1446.71 1571.11,1446.71 1571.78,1446.71 1572.45,1446.71 1573.11,1446.71 \n", " 1573.78,1446.71 1574.44,1446.71 1575.11,1446.71 1575.77,1446.71 1576.44,1446.71 1577.11,1446.71 1577.77,1446.71 1578.44,1446.71 1579.1,1446.71 1579.77,1446.71 \n", " 1580.44,1446.71 1581.1,1446.71 1581.77,1446.71 1582.43,1446.71 1583.1,1446.71 1583.76,1446.71 1584.43,1446.71 1585.1,1446.71 1585.76,1446.71 1586.43,1446.71 \n", " 1587.09,1446.71 1587.76,1446.71 1588.43,1446.71 1589.09,1446.71 1589.76,1446.71 1590.42,1446.71 1591.09,1446.71 1591.75,1446.71 1592.42,1446.71 1593.09,1446.71 \n", " 1593.75,1446.71 1594.42,1446.71 1595.08,1446.71 1595.75,1446.71 1596.41,1446.71 1597.08,1446.71 1597.75,1446.71 1598.41,1446.71 1599.08,1446.71 1599.74,1446.71 \n", " 1600.41,1446.71 1601.08,1446.71 1601.74,1446.71 1602.41,1446.71 1603.07,1446.71 1603.74,1446.71 1604.4,1446.71 1605.07,1446.71 1605.74,1446.71 1606.4,1446.71 \n", " 1607.07,1446.71 1607.73,1446.71 1608.4,1446.71 1609.06,1446.71 1609.73,1446.71 1610.4,1446.71 1611.06,1446.71 1611.73,1446.71 1612.39,1446.71 1613.06,1446.71 \n", " 1613.73,1446.71 1614.39,1446.71 1615.06,1446.71 1615.72,1446.71 1616.39,1446.71 1617.05,1446.71 1617.72,1446.71 1618.39,1446.71 1619.05,1446.71 1619.72,1446.71 \n", " 1620.38,1446.71 1621.05,1446.71 1621.71,1446.71 1622.38,1446.71 1623.05,1446.71 1623.71,1446.71 1624.38,1446.71 1625.04,1446.71 1625.71,1446.71 1626.38,1446.71 \n", " 1627.04,1446.71 1627.71,1446.71 1628.37,1446.71 1629.04,1446.71 1629.7,1446.71 1630.37,1446.71 1631.04,1446.71 1631.7,1446.71 1632.37,1446.71 1633.03,1446.71 \n", " 1633.7,1446.71 1634.36,1446.71 1635.03,1446.71 1635.7,1446.71 1636.36,1446.71 1637.03,1446.71 1637.69,1446.71 1638.36,1446.71 1639.03,1446.71 1639.69,1446.71 \n", " 1640.36,1446.71 1641.02,1446.71 1641.69,1446.71 1642.35,1446.71 1643.02,1446.71 1643.69,1446.71 1644.35,1446.71 1645.02,1446.71 1645.68,1446.71 1646.35,1446.71 \n", " 1647.01,1446.71 1647.68,1446.71 1648.35,1446.71 1649.01,1446.71 1649.68,1446.71 1650.34,1446.71 1651.01,1446.71 1651.68,1446.71 1652.34,1446.71 1653.01,1446.71 \n", " 1653.67,1446.71 1654.34,1446.71 1655,1446.71 1655.67,1446.71 1656.34,1446.71 1657,1446.71 1657.67,1446.71 1658.33,1446.71 1659,1446.71 1659.66,1446.71 \n", " 1660.33,1446.71 1661,1446.71 1661.66,1446.71 1662.33,1446.71 1662.99,1446.71 1663.66,1446.71 1664.33,1446.71 1664.99,1446.71 1665.66,1446.71 1666.32,1446.71 \n", " 1666.99,1446.71 1667.65,1446.71 1668.32,1446.71 1668.99,1446.71 1669.65,1446.71 1670.32,1446.71 1670.98,1446.71 1671.65,1446.71 1672.32,1446.71 1672.98,1446.71 \n", " 1673.65,1446.71 1674.31,1446.71 1674.98,1446.71 1675.64,1446.71 1676.31,1446.71 1676.98,1446.71 1677.64,1446.71 1678.31,1446.71 1678.97,1446.71 1679.64,1446.71 \n", " 1680.3,1446.71 1680.97,1446.71 1681.64,1446.71 1682.3,1446.71 1682.97,1446.71 1683.63,1446.71 1684.3,1446.71 1684.97,1446.71 1685.63,1446.71 1686.3,1446.71 \n", " 1686.96,1446.71 1687.63,1446.71 1688.29,1446.71 1688.96,1446.71 1689.63,1446.71 1690.29,1446.71 1690.96,1446.71 1691.62,1446.71 1692.29,1446.71 1692.95,1446.71 \n", " 1693.62,1446.71 1694.29,1446.71 1694.95,1446.71 1695.62,1446.71 1696.28,1446.71 1696.95,1446.71 1697.62,1446.71 1698.28,1446.71 1698.95,1446.71 1699.61,1446.71 \n", " 1700.28,1446.71 1700.94,1446.71 1701.61,1446.71 1702.28,1446.71 1702.94,1446.71 1703.61,1446.71 1704.27,1446.71 1704.94,1446.71 1705.6,1446.71 1706.27,1446.71 \n", " 1706.94,1446.71 1707.6,1446.71 1708.27,1446.71 1708.93,1446.71 1709.6,1446.71 1710.27,1446.71 1710.93,1446.71 1711.6,1446.71 1712.26,1446.71 1712.93,1446.71 \n", " 1713.59,1446.71 1714.26,1446.71 1714.93,1446.71 1715.59,1446.71 1716.26,1446.71 1716.92,1446.71 1717.59,1446.71 1718.25,1446.71 1718.92,1446.71 1719.59,1446.71 \n", " 1720.25,1446.71 1720.92,1446.71 1721.58,1446.71 1722.25,1446.71 1722.92,1446.71 1723.58,1446.71 1724.25,1446.71 1724.91,1446.71 1725.58,1446.71 1726.24,1446.71 \n", " 1726.91,1446.71 1727.58,1446.71 1728.24,1446.71 1728.91,1446.71 1729.57,1446.71 1730.24,1446.71 1730.9,1446.71 1731.57,1446.71 1732.24,1446.71 1732.9,1446.71 \n", " 1733.57,1446.71 1734.23,1446.71 1734.9,1446.71 1735.57,1446.71 1736.23,1446.71 1736.9,1446.71 1737.56,1446.71 1738.23,1446.71 1738.89,1446.71 1739.56,1446.71 \n", " 1740.23,1446.71 1740.89,1446.71 1741.56,1446.71 1742.22,1446.71 1742.89,1446.71 1743.55,1446.71 1744.22,1446.71 1744.89,1446.71 1745.55,1446.71 1746.22,1446.71 \n", " 1746.88,1446.71 1747.55,1446.71 1748.22,1446.71 1748.88,1446.71 1749.55,1446.71 1750.21,1446.71 1750.88,1446.71 1751.54,1446.71 1752.21,1446.71 1752.88,1446.71 \n", " 1753.54,1446.71 1754.21,1446.71 1754.87,1446.71 1755.54,1446.71 1756.2,1446.71 1756.87,1446.71 1757.54,1446.71 1758.2,1446.71 1758.87,1446.71 1759.53,1446.71 \n", " 1760.2,1446.71 1760.87,1446.71 1761.53,1446.71 1762.2,1446.71 1762.86,1446.71 1763.53,1446.71 1764.19,1446.71 1764.86,1446.71 1765.53,1446.71 1766.19,1446.71 \n", " 1766.86,1446.71 1767.52,1446.71 1768.19,1446.71 1768.86,1446.71 1769.52,1446.71 1770.19,1446.71 1770.85,1446.71 1771.52,1446.71 1772.18,1446.71 1772.85,1446.71 \n", " 1773.52,1446.71 1774.18,1446.71 1774.85,1446.71 1775.51,1446.71 1776.18,1446.71 1776.84,1446.71 1777.51,1446.71 1778.18,1446.71 1778.84,1446.71 1779.51,1446.71 \n", " 1780.17,1446.71 1780.84,1446.71 1781.51,1446.71 1782.17,1446.71 1782.84,1446.71 1783.5,1446.71 1784.17,1446.71 1784.83,1446.71 1785.5,1446.71 1786.17,1446.71 \n", " 1786.83,1446.71 1787.5,1446.71 1788.16,1446.71 1788.83,1446.71 1789.49,1446.71 1790.16,1446.71 1790.83,1446.71 1791.49,1446.71 1792.16,1446.71 1792.82,1446.71 \n", " 1793.49,1446.71 1794.16,1446.71 1794.82,1446.71 1795.49,1446.71 1796.15,1446.71 1796.82,1446.71 1797.48,1446.71 1798.15,1446.71 1798.82,1446.71 1799.48,1446.71 \n", " 1800.15,1446.71 1800.81,1446.71 1801.48,1446.71 1802.14,1446.71 1802.81,1446.71 1803.48,1446.71 1804.14,1446.71 1804.81,1446.71 1805.47,1446.71 1806.14,1446.71 \n", " 1806.81,1446.71 1807.47,1446.71 1808.14,1446.71 1808.8,1446.71 1809.47,1446.71 1810.13,1446.71 1810.8,1446.71 1811.47,1446.71 1812.13,1446.71 1812.8,1446.71 \n", " 1813.46,1446.71 1814.13,1446.71 1814.79,1446.71 1815.46,1446.71 1816.13,1446.71 1816.79,1446.71 1817.46,1446.71 1818.12,1446.71 1818.79,1446.71 1819.46,1446.71 \n", " 1820.12,1446.71 1820.79,1446.71 1821.45,1446.71 1822.12,1446.71 1822.78,1446.71 1823.45,1446.71 1824.12,1446.71 1824.78,1446.71 1825.45,1446.71 1826.11,1446.71 \n", " 1826.78,1446.71 1827.44,1446.71 1828.11,1446.71 1828.78,1446.71 1829.44,1446.71 1830.11,1446.71 1830.77,1446.71 1831.44,1446.71 1832.11,1446.71 1832.77,1446.71 \n", " 1833.44,1446.71 1834.1,1446.71 1834.77,1446.71 1835.43,1446.71 1836.1,1446.71 1836.77,1446.71 1837.43,1446.71 1838.1,1446.71 1838.76,1446.71 1839.43,1446.71 \n", " 1840.09,1446.71 1840.76,1446.71 1841.43,1446.71 1842.09,1446.71 1842.76,1446.71 1843.42,1446.71 1844.09,1446.71 1844.76,1446.71 1845.42,1446.71 1846.09,1446.71 \n", " 1846.75,1446.71 1847.42,1446.71 1848.08,1446.71 1848.75,1446.71 1849.42,1446.71 1850.08,1446.71 1850.75,1446.71 1851.41,1446.71 1852.08,1446.71 1852.75,1446.71 \n", " 1853.41,1446.71 1854.08,1446.71 1854.74,1446.71 1855.41,1446.71 1856.07,1446.71 1856.74,1446.71 1857.41,1446.71 1858.07,1446.71 1858.74,1446.71 1859.4,1446.71 \n", " 1860.07,1446.71 1860.73,1446.71 1861.4,1446.71 1862.07,1446.71 1862.73,1446.71 1863.4,1446.71 1864.06,1446.71 1864.73,1446.71 1865.4,1446.71 1866.06,1446.71 \n", " 1866.73,1446.71 1867.39,1446.71 1868.06,1446.71 1868.72,1446.71 1869.39,1446.71 1870.06,1446.71 1870.72,1446.71 1871.39,1446.71 1872.05,1446.71 1872.72,1446.71 \n", " 1873.38,1446.71 1874.05,1446.71 1874.72,1446.71 1875.38,1446.71 1876.05,1446.71 1876.71,1446.71 1877.38,1446.71 1878.05,1446.71 1878.71,1446.71 1879.38,1446.71 \n", " 1880.04,1446.71 1880.71,1446.71 1881.37,1446.71 1882.04,1446.71 1882.71,1446.71 1883.37,1446.71 1884.04,1446.71 1884.7,1446.71 1885.37,1446.71 1886.03,1446.71 \n", " 1886.7,1446.71 1887.37,1446.71 1888.03,1446.71 1888.7,1446.71 1889.36,1446.71 1890.03,1446.71 1890.7,1446.71 1891.36,1446.71 1892.03,1446.71 1892.69,1446.71 \n", " 1893.36,1446.71 1894.02,1446.71 1894.69,1446.71 1895.36,1446.71 1896.02,1446.71 1896.69,1446.71 1897.35,1446.71 1898.02,1446.71 1898.68,1446.71 1899.35,1446.71 \n", " 1900.02,1446.71 1900.68,1446.71 1901.35,1446.71 1902.01,1446.71 1902.68,1446.71 1903.35,1446.71 1904.01,1446.71 1904.68,1446.71 1905.34,1446.71 1906.01,1446.71 \n", " 1906.67,1446.71 1907.34,1446.71 1908.01,1446.71 1908.67,1446.71 1909.34,1446.71 1910,1446.71 1910.67,1446.71 1911.33,1446.71 1912,1446.71 1912.67,1446.71 \n", " 1913.33,1446.71 1914,1446.71 1914.66,1446.71 1915.33,1446.71 1916,1446.71 1916.66,1446.71 1917.33,1446.71 1917.99,1446.71 1918.66,1446.71 1919.32,1446.71 \n", " 1919.99,1446.71 1920.66,1446.71 1921.32,1446.71 1921.99,1446.71 1922.65,1446.71 1923.32,1446.71 1923.98,1446.71 1924.65,1446.71 1925.32,1446.71 1925.98,1446.71 \n", " 1926.65,1446.71 1927.31,1446.71 1927.98,1446.71 1928.65,1446.71 1929.31,1446.71 1929.98,1446.71 1930.64,1446.71 1931.31,1446.71 1931.97,1446.71 1932.64,1446.71 \n", " 1933.31,1446.71 1933.97,1446.71 1934.64,1446.71 1935.3,1446.71 1935.97,1446.71 1936.64,1446.71 1937.3,1446.71 1937.97,1446.71 1938.63,1446.71 1939.3,1446.71 \n", " 1939.96,1446.71 1940.63,1446.71 1941.3,1446.71 1941.96,1446.71 1942.63,1446.71 1943.29,1446.71 1943.96,1446.71 1944.62,1446.71 1945.29,1446.71 1945.96,1446.71 \n", " 1946.62,1446.71 1947.29,1446.71 1947.95,1446.71 1948.62,1446.71 1949.29,1446.71 1949.95,1446.71 1950.62,1446.71 1951.28,1446.71 1951.95,1446.71 1952.61,1446.71 \n", " 1953.28,1446.71 1953.95,1446.71 1954.61,1446.71 1955.28,1446.71 1955.94,1446.71 1956.61,1446.71 1957.27,1446.71 1957.94,1446.71 1958.61,1446.71 1959.27,1446.71 \n", " 1959.94,1446.71 1960.6,1446.71 1961.27,1446.71 1961.94,1446.71 1962.6,1446.71 1963.27,1446.71 1963.93,1446.71 1964.6,1446.71 1965.26,1446.71 1965.93,1446.71 \n", " 1966.6,1446.71 1967.26,1446.71 1967.93,1446.71 1968.59,1446.71 1969.26,1446.71 1969.92,1446.71 1970.59,1446.71 1971.26,1446.71 1971.92,1446.71 1972.59,1446.71 \n", " 1973.25,1446.71 1973.92,1446.71 1974.59,1446.71 1975.25,1446.71 1975.92,1446.71 1976.58,1446.71 1977.25,1446.71 1977.91,1446.71 1978.58,1446.71 1979.25,1446.71 \n", " 1979.91,1446.71 1980.58,1446.71 1981.24,1446.71 1981.91,1446.71 1982.57,1446.71 1983.24,1446.71 1983.91,1446.71 1984.57,1446.71 1985.24,1446.71 1985.9,1446.71 \n", " 1986.57,1446.71 1987.24,1446.71 1987.9,1446.71 1988.57,1446.71 1989.23,1446.71 1989.9,1446.71 1990.56,1446.71 1991.23,1446.71 1991.9,1446.71 1992.56,1446.71 \n", " 1993.23,1446.71 1993.89,1446.71 1994.56,1446.71 1995.22,1446.71 1995.89,1446.71 1996.56,1446.71 1997.22,1446.71 1997.89,1446.71 1998.55,1446.71 1999.22,1446.71 \n", " 1999.89,1446.71 2000.55,1446.71 2001.22,1446.71 2001.88,1446.71 2002.55,1446.71 2003.21,1446.71 2003.88,1446.71 2004.55,1446.71 2005.21,1446.71 2005.88,1446.71 \n", " 2006.54,1446.71 2007.21,1446.71 2007.87,1446.71 2008.54,1446.71 2009.21,1446.71 2009.87,1446.71 2010.54,1446.71 2011.2,1446.71 2011.87,1446.71 2012.54,1446.71 \n", " 2013.2,1446.71 2013.87,1446.71 2014.53,1446.71 2015.2,1446.71 2015.86,1446.71 2016.53,1446.71 2017.2,1446.71 2017.86,1446.71 2018.53,1446.71 2019.19,1446.71 \n", " 2019.86,1446.71 2020.52,1446.71 2021.19,1446.71 2021.86,1446.71 2022.52,1446.71 2023.19,1446.71 2023.85,1446.71 2024.52,1446.71 2025.19,1446.71 2025.85,1446.71 \n", " 2026.52,1446.71 2027.18,1446.71 2027.85,1446.71 2028.51,1446.71 2029.18,1446.71 2029.85,1446.71 2030.51,1446.71 2031.18,1446.71 2031.84,1446.71 2032.51,1446.71 \n", " 2033.18,1446.71 2033.84,1446.71 2034.51,1446.71 2035.17,1446.71 2035.84,1446.71 2036.5,1446.71 2037.17,1446.71 2037.84,1446.71 2038.5,1446.71 2039.17,1446.71 \n", " 2039.83,1446.71 2040.5,1446.71 2041.16,1446.71 2041.83,1446.71 2042.5,1446.71 2043.16,1446.71 2043.83,1446.71 2044.49,1446.71 2045.16,1446.71 2045.83,1446.71 \n", " 2046.49,1446.71 2047.16,1446.71 2047.82,1446.71 2048.49,1446.71 2049.15,1446.71 2049.82,1446.71 2050.49,1446.71 2051.15,1446.71 2051.82,1446.71 2052.48,1446.71 \n", " 2053.15,1446.71 2053.81,1446.71 2054.48,1446.71 2055.15,1446.71 2055.81,1446.71 2056.48,1446.71 2057.14,1446.71 2057.81,1446.71 2058.48,1446.71 2059.14,1446.71 \n", " 2059.81,1446.71 2060.47,1446.71 2061.14,1446.71 2061.8,1446.71 2062.47,1446.71 2063.14,1446.71 2063.8,1446.71 2064.47,1446.71 2065.13,1446.71 2065.8,1446.71 \n", " 2066.46,1446.71 2067.13,1446.71 2067.8,1446.71 2068.46,1446.71 2069.13,1446.71 2069.79,1446.71 2070.46,1446.71 2071.13,1446.71 2071.79,1446.71 2072.46,1446.71 \n", " 2073.12,1446.71 2073.79,1446.71 2074.45,1446.71 2075.12,1446.71 2075.79,1446.71 2076.45,1446.71 2077.12,1446.71 2077.78,1446.71 2078.45,1446.71 2079.11,1446.71 \n", " 2079.78,1446.71 2080.45,1446.71 2081.11,1446.71 2081.78,1446.71 2082.44,1446.71 2083.11,1446.71 2083.78,1446.71 2084.44,1446.71 2085.11,1446.71 2085.77,1446.71 \n", " 2086.44,1446.71 2087.1,1446.71 2087.77,1446.71 2088.44,1446.71 2089.1,1446.71 2089.77,1446.71 2090.43,1446.71 2091.1,1446.71 2091.76,1446.71 2092.43,1446.71 \n", " 2093.1,1446.71 2093.76,1446.71 2094.43,1446.71 2095.09,1446.71 2095.76,1446.71 2096.43,1446.71 2097.09,1446.71 2097.76,1446.71 2098.42,1446.71 2099.09,1446.71 \n", " 2099.75,1446.71 2100.42,1446.71 2101.09,1446.71 2101.75,1446.71 2102.42,1446.71 2103.08,1446.71 2103.75,1446.71 2104.41,1446.71 2105.08,1446.71 2105.75,1446.71 \n", " 2106.41,1446.71 2107.08,1446.71 2107.74,1446.71 2108.41,1446.71 2109.08,1446.71 2109.74,1446.71 2110.41,1446.71 2111.07,1446.71 2111.74,1446.71 2112.4,1446.71 \n", " 2113.07,1446.71 2113.74,1446.71 2114.4,1446.71 2115.07,1446.71 2115.73,1446.71 2116.4,1446.71 2117.07,1446.71 2117.73,1446.71 2118.4,1446.71 2119.06,1446.71 \n", " 2119.73,1446.71 2120.39,1446.71 2121.06,1446.71 2121.73,1446.71 2122.39,1446.71 2123.06,1446.71 2123.72,1446.71 2124.39,1446.71 2125.05,1446.71 2125.72,1446.71 \n", " 2126.39,1446.71 2127.05,1446.71 2127.72,1446.71 2128.38,1446.71 2129.05,1446.71 2129.72,1446.71 2130.38,1446.71 2131.05,1446.71 2131.71,1446.71 2132.38,1446.71 \n", " 2133.04,1446.71 2133.71,1446.71 2134.38,1446.71 2135.04,1446.71 2135.71,1446.71 2136.37,1446.71 2137.04,1446.71 2137.7,1446.71 2138.37,1446.71 2139.04,1446.71 \n", " 2139.7,1446.71 2140.37,1446.71 2141.03,1446.71 2141.7,1446.71 2142.37,1446.71 2143.03,1446.71 2143.7,1446.71 2144.36,1446.71 2145.03,1446.71 2145.69,1446.71 \n", " 2146.36,1446.71 2147.03,1446.71 2147.69,1446.71 2148.36,1446.71 2149.02,1446.71 2149.69,1446.71 2150.35,1446.71 2151.02,1446.71 2151.69,1446.71 2152.35,1446.71 \n", " 2153.02,1446.71 2153.68,1446.71 2154.35,1446.71 2155.02,1446.71 2155.68,1446.71 2156.35,1446.71 2157.01,1446.71 2157.68,1446.71 2158.34,1446.71 2159.01,1446.71 \n", " 2159.68,1446.71 2160.34,1446.71 2161.01,1446.71 2161.67,1446.71 2162.34,1446.71 2163,1446.71 2163.67,1446.71 2164.34,1446.71 2165,1446.71 2165.67,1446.71 \n", " 2166.33,1446.71 2167,1446.71 2167.67,1446.71 2168.33,1446.71 2169,1446.71 2169.66,1446.71 2170.33,1446.71 2170.99,1446.71 2171.66,1446.71 2172.33,1446.71 \n", " 2172.99,1446.71 2173.66,1446.71 2174.32,1446.71 2174.99,1446.71 2175.65,1446.71 2176.32,1446.71 2176.99,1446.71 2177.65,1446.71 2178.32,1446.71 2178.98,1446.71 \n", " 2179.65,1446.71 2180.32,1446.71 2180.98,1446.71 2181.65,1446.71 2182.31,1446.71 2182.98,1446.71 2183.64,1446.71 2184.31,1446.71 2184.98,1446.71 2185.64,1446.71 \n", " 2186.31,1446.71 2186.97,1446.71 2187.64,1446.71 2188.3,1446.71 2188.97,1446.71 2189.64,1446.71 2190.3,1446.71 2190.97,1446.71 2191.63,1446.71 2192.3,1446.71 \n", " 2192.97,1446.71 2193.63,1446.71 2194.3,1446.71 2194.96,1446.71 2195.63,1446.71 2196.29,1446.71 2196.96,1446.71 2197.63,1446.71 2198.29,1446.71 2198.96,1446.71 \n", " 2199.62,1446.71 2200.29,1446.71 2200.95,1446.71 2201.62,1446.71 2202.29,1446.71 2202.95,1446.71 2203.62,1446.71 2204.28,1446.71 2204.95,1446.71 2205.62,1446.71 \n", " 2206.28,1446.71 2206.95,1446.71 2207.61,1446.71 2208.28,1446.71 2208.94,1446.71 2209.61,1446.71 2210.28,1446.71 2210.94,1446.71 2211.61,1446.71 2212.27,1446.71 \n", " 2212.94,1446.71 2213.61,1446.71 2214.27,1446.71 2214.94,1446.71 2215.6,1446.71 2216.27,1446.71 2216.93,1446.71 2217.6,1446.71 2218.27,1446.71 2218.93,1446.71 \n", " 2219.6,1446.71 2220.26,1446.71 2220.93,1446.71 2221.59,1446.71 2222.26,1446.71 2222.93,1446.71 2223.59,1446.71 2224.26,1446.71 2224.92,1446.71 2225.59,1446.71 \n", " 2226.26,1446.71 2226.92,1446.71 2227.59,1446.71 2228.25,1446.71 2228.92,1446.71 2229.58,1446.71 2230.25,1446.71 2230.92,1446.71 2231.58,1446.71 2232.25,1446.71 \n", " 2232.91,1446.71 2233.58,1446.71 2234.24,1446.71 2234.91,1446.71 2235.58,1446.71 2236.24,1446.71 2236.91,1446.71 2237.57,1446.71 2238.24,1446.71 2238.91,1446.71 \n", " 2239.57,1446.71 2240.24,1446.71 2240.9,1446.71 2241.57,1446.71 2242.23,1446.71 2242.9,1446.71 2243.57,1446.71 2244.23,1446.71 2244.9,1446.71 2245.56,1446.71 \n", " 2246.23,1446.71 2246.89,1446.71 2247.56,1446.71 2248.23,1446.71 2248.89,1446.71 2249.56,1446.71 2250.22,1446.71 2250.89,1446.71 2251.56,1446.71 2252.22,1446.71 \n", " 2252.89,1446.71 2253.55,1446.71 2254.22,1446.71 2254.88,1446.71 2255.55,1446.71 2256.22,1446.71 2256.88,1446.71 2257.55,1446.71 2258.21,1446.71 2258.88,1446.71 \n", " 2259.54,1446.71 2260.21,1446.71 2260.88,1446.71 2261.54,1446.71 2262.21,1446.71 2262.87,1446.71 2263.54,1446.71 2264.21,1446.71 2264.87,1446.71 2265.54,1446.71 \n", " 2266.2,1446.71 2266.87,1446.71 2267.53,1446.71 2268.2,1446.71 2268.87,1446.71 2269.53,1446.71 2270.2,1446.71 2270.86,1446.71 2271.53,1446.71 2272.19,1446.71 \n", " 2272.86,1446.71 2273.53,1446.71 2274.19,1446.71 2274.86,1446.71 2275.52,1446.71 2276.19,1446.71 2276.86,1446.71 2277.52,1446.71 2278.19,1446.71 2278.85,1446.71 \n", " 2279.52,1446.71 2280.18,1446.71 2280.85,1446.71 2281.52,1446.71 2282.18,1446.71 2282.85,1446.71 2283.51,1446.71 2284.18,1446.71 2284.84,1446.71 2285.51,1446.71 \n", " 2286.18,1446.71 2286.84,1446.71 2287.51,1446.71 2288.17,1446.71 2288.84,1446.71 2289.51,1446.71 2290.17,1446.71 2290.84,1446.71 2291.5,1446.71 2292.17,1446.71 \n", " 2292.83,1446.71 \n", " \"/>\n", "<path clip-path=\"url(#clip5500)\" d=\"\n", "M1853.56 312.204 L2280.76 312.204 L2280.76 130.764 L1853.56 130.764 Z\n", " \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n", "<polyline clip-path=\"url(#clip5500)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 1853.56,312.204 2280.76,312.204 2280.76,130.764 1853.56,130.764 1853.56,312.204 \n", " \"/>\n", "<polyline clip-path=\"url(#clip5500)\" style=\"stroke:#009af9; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 1877.56,191.244 2021.56,191.244 \n", " \"/>\n", "<g clip-path=\"url(#clip5500)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:start;\" transform=\"rotate(0, 2045.56, 208.744)\" x=\"2045.56\" y=\"208.744\">Dynamic</text>\n", "</g>\n", "<polyline clip-path=\"url(#clip5500)\" style=\"stroke:#e26f46; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 1877.56,251.724 2021.56,251.724 \n", " \"/>\n", "<g clip-path=\"url(#clip5500)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:start;\" transform=\"rotate(0, 2045.56, 269.224)\" x=\"2045.56\" y=\"269.224\">FEA</text>\n", "</g>\n", "</svg>\n" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "setup=getSetup()\n", "displacementFEA=fea(setup)\n", "\n", "latticeSize=4\n", "numTimeSteps=3000\n", "setup=getSetup()\n", "displacements=[]\n", "save=true\n", "returnEvery=1\n", "runMetavoxelGPU!(setup,numTimeSteps,latticeSize,displacements,returnEvery,false)\n", "\n", "numTimeStepsRecorded=length(displacements)\n", "d=[]\n", "dFEA=[]\n", "j=length(displacements[end])\n", "step=1\n", "for i in 1:step:numTimeStepsRecorded\n", " append!(d,displacements[i][j].y)\n", " append!(dFEA,displacementFEA[j].y)\n", "end\n", "println(\"FEA displacement= $(displacementFEA[j].y),converged displacement= $(displacements[numTimeSteps][j].y)\")\n", "plot(1:step:numTimeStepsRecorded,d,label=\"Dynamic\")\n", "plot!(1:step:numTimeStepsRecorded,dFEA,label=\"FEA\")\n" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n", "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"600\" height=\"400\" viewBox=\"0 0 2400 1600\">\n", "<defs>\n", " <clipPath id=\"clip6900\">\n", " <rect x=\"0\" y=\"0\" width=\"2400\" height=\"1600\"/>\n", " </clipPath>\n", "</defs>\n", "<path clip-path=\"url(#clip6900)\" d=\"\n", "M0 1600 L2400 1600 L2400 0 L0 0 Z\n", " \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n", "<defs>\n", " <clipPath id=\"clip6901\">\n", " <rect x=\"480\" y=\"0\" width=\"1681\" height=\"1600\"/>\n", " </clipPath>\n", "</defs>\n", "<path clip-path=\"url(#clip6900)\" d=\"\n", "M235.533 1487.47 L2352.76 1487.47 L2352.76 47.2441 L235.533 47.2441 Z\n", " \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n", "<defs>\n", " <clipPath id=\"clip6902\">\n", " <rect x=\"235\" y=\"47\" width=\"2118\" height=\"1441\"/>\n", " </clipPath>\n", "</defs>\n", "<polyline clip-path=\"url(#clip6902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 295.454,1487.47 295.454,47.2441 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 794.799,1487.47 794.799,47.2441 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 1294.14,1487.47 1294.14,47.2441 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 1793.49,1487.47 1793.49,47.2441 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 2292.83,1487.47 2292.83,47.2441 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 235.533,1396.74 2352.76,1396.74 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 235.533,960.492 2352.76,960.492 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 235.533,524.249 2352.76,524.249 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6902)\" style=\"stroke:#000000; stroke-width:2; stroke-opacity:0.1; fill:none\" points=\"\n", " 235.533,88.0053 2352.76,88.0053 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 235.533,1487.47 2352.76,1487.47 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 235.533,1487.47 235.533,47.2441 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 295.454,1487.47 295.454,1470.19 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 794.799,1487.47 794.799,1470.19 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 1294.14,1487.47 1294.14,1470.19 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 1793.49,1487.47 1793.49,1470.19 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 2292.83,1487.47 2292.83,1470.19 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 235.533,1396.74 260.939,1396.74 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 235.533,960.492 260.939,960.492 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 235.533,524.249 260.939,524.249 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 235.533,88.0053 260.939,88.0053 \n", " \"/>\n", "<g clip-path=\"url(#clip6900)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 295.454, 1541.47)\" x=\"295.454\" y=\"1541.47\">4</text>\n", "</g>\n", "<g clip-path=\"url(#clip6900)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 794.799, 1541.47)\" x=\"794.799\" y=\"1541.47\">5</text>\n", "</g>\n", "<g clip-path=\"url(#clip6900)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 1294.14, 1541.47)\" x=\"1294.14\" y=\"1541.47\">6</text>\n", "</g>\n", "<g clip-path=\"url(#clip6900)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 1793.49, 1541.47)\" x=\"1793.49\" y=\"1541.47\">7</text>\n", "</g>\n", "<g clip-path=\"url(#clip6900)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:middle;\" transform=\"rotate(0, 2292.83, 1541.47)\" x=\"2292.83\" y=\"1541.47\">8</text>\n", "</g>\n", "<g clip-path=\"url(#clip6900)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 211.533, 1414.24)\" x=\"211.533\" y=\"1414.24\">-0.003</text>\n", "</g>\n", "<g clip-path=\"url(#clip6900)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 211.533, 977.992)\" x=\"211.533\" y=\"977.992\">-0.002</text>\n", "</g>\n", "<g clip-path=\"url(#clip6900)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 211.533, 541.749)\" x=\"211.533\" y=\"541.749\">-0.001</text>\n", "</g>\n", "<g clip-path=\"url(#clip6900)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:end;\" transform=\"rotate(0, 211.533, 105.505)\" x=\"211.533\" y=\"105.505\">0.000</text>\n", "</g>\n", "<polyline clip-path=\"url(#clip6902)\" style=\"stroke:#009af9; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 295.454,88.0053 794.799,88.0053 1294.14,90.0895 1793.49,88.0053 2292.83,1446.71 \n", " \"/>\n", "<path clip-path=\"url(#clip6900)\" d=\"\n", "M1947.14 251.724 L2280.76 251.724 L2280.76 130.764 L1947.14 130.764 Z\n", " \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n", "<polyline clip-path=\"url(#clip6900)\" style=\"stroke:#000000; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 1947.14,251.724 2280.76,251.724 2280.76,130.764 1947.14,130.764 1947.14,251.724 \n", " \"/>\n", "<polyline clip-path=\"url(#clip6900)\" style=\"stroke:#009af9; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n", " 1971.14,191.244 2115.14,191.244 \n", " \"/>\n", "<g clip-path=\"url(#clip6900)\">\n", "<text style=\"fill:#000000; fill-opacity:1; font-family:Arial,Helvetica Neue,Helvetica,sans-serif; font-size:48px; text-anchor:start;\" transform=\"rotate(0, 2139.14, 208.744)\" x=\"2139.14\" y=\"208.744\">FEA</text>\n", "</g>\n", "</svg>\n" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n=[]\n", "nFEA=[]\n", "j=length(displacements[end])\n", "for i in 4:j\n", " append!(n,displacements[end][i].y)\n", " append!(nFEA,displacementFEA[i].y)\n", "end\n", "plot(4:j,nFEA,label=\"FEA\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "@webio": { "lastCommId": null, "lastKernelId": null }, "kernelspec": { "display_name": "Julia 1.2.0", "language": "julia", "name": "julia-1.2" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.2.0" } }, "nbformat": 4, "nbformat_minor": 4 }