Skip to content

Instantly share code, notes, and snippets.

@ashiqopu
Last active August 22, 2020 01:42
Show Gist options
  • Save ashiqopu/a66ad48f1f2bb9f5a22facd88fc6ed39 to your computer and use it in GitHub Desktop.
Save ashiqopu/a66ad48f1f2bb9f5a22facd88fc6ed39 to your computer and use it in GitHub Desktop.
TCP Throughput above link capacity
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2009 The Boeing Company
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"
#include "ns3/flow-monitor-helper.h"
#include "ns3/ipv4-flow-classifier.h"
#include "ns3/traffic-control-module.h"
#include <fstream>
#include <vector>
#include <string>
#include <iomanip>
#include <map>
using namespace ns3;
NS_LOG_COMPONENT_DEFINE ("wired-tcp");
Ptr<PacketSink> sink; /* Pointer to the packet sink application */
uint64_t lastTotalRx = 0; /* The value of the last total received bytes */
std::ofstream thWriter;
typedef struct D {
uint32_t rxPkts;
uint32_t txPkts;
double throughput;
double cwnd;
double rtt;
} Data;
std::map<uint32_t, Data> data;
void
CalculateThroughput ()
{
Time now = Simulator::Now (); /* Return the simulator's virtual time. */
double cur = (sink->GetTotalRx () - lastTotalRx) * (double) 8.0 / 1e5; /* Convert Application RX Packets to MBits. */
thWriter << now.GetSeconds() << "\t"
<< cur << "\n";
lastTotalRx = sink->GetTotalRx ();
Simulator::Schedule (MilliSeconds (100), &CalculateThroughput);
}
void SimRun (uint32_t payloadSize, uint64_t maxBytes, uint32_t totalNodes, bool enableBtl,
double errRate, double simTime, std::string tcpVariant, uint32_t runID)
{
std::string tcpAlg = tcpVariant;
tcpVariant = std::string ("ns3::") + tcpVariant;
// Select TCP variant
if (tcpVariant.compare ("ns3::TcpWestwoodPlus") == 0)
{
// TcpWestwoodPlus is not an actual TypeId name; we need TcpWestwood here
Config::SetDefault ("ns3::TcpL4Protocol::SocketType", TypeIdValue (TcpWestwood::GetTypeId ()));
// the default protocol type in ns3::TcpWestwood is WESTWOOD
Config::SetDefault ("ns3::TcpWestwood::ProtocolType", EnumValue (TcpWestwood::WESTWOODPLUS));
}
else
{
TypeId tcpTid;
NS_ABORT_MSG_UNLESS (TypeId::LookupByNameFailSafe (tcpVariant, &tcpTid), "TypeId " << tcpVariant << " not found");
Config::SetDefault ("ns3::TcpL4Protocol::SocketType", TypeIdValue (TypeId::LookupByName (tcpVariant)));
}
/* Configure TCP Options */
Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (payloadSize));
Config::SetDefault ("ns3::TcpSocketBase::Sack", BooleanValue (true));
TrafficControlHelper tchCoDel;
tchCoDel.SetRootQueueDisc ("ns3::CoDelQueueDisc");
Config::SetDefault ("ns3::CoDelQueueDisc::UseEcn", BooleanValue (true));
Config::SetDefault ("ns3::TcpSocketBase::EcnMode", StringValue ("ClassicEcn"));
NodeContainer c;
c.Create (totalNodes);
InternetStackHelper stack;
stack.Install (c);
// totalNodes-1 links and subnets
uint32_t midNode = (totalNodes/2.0);
PointToPointHelper p2p;
std::vector<NetDeviceContainer> devices(totalNodes-1);
for (uint32_t i = 0; i < totalNodes-1; i++) {
if ( i > 0 && i == midNode && enableBtl) {
p2p.SetDeviceAttribute ("DataRate", StringValue ("1Mbps"));
p2p.SetChannelAttribute ("Delay", StringValue ("10ms"));
}
else {
p2p.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
p2p.SetChannelAttribute ("Delay", StringValue ("1ms"));
}
devices[i] = p2p.Install(c.Get(i), c.Get(i+1));
tchCoDel.Install (devices[i]);
}
NS_LOG_INFO ("assigning ip address");
Ipv4AddressHelper ipv4;
NS_LOG_INFO ("Assign IP Addresses.");
std::vector<Ipv4InterfaceContainer> iface (totalNodes-1);
// set the n-1 subnets
for (uint32_t i = 0; i < totalNodes-1; i++) {
std::string subnetIP= "10.1." + std::to_string(i+1) + ".0";
ipv4.SetBase (subnetIP.c_str(), "255.255.255.0");
iface[i] = ipv4.Assign (devices[i]);
}
// Create router nodes, initialize routing database and set up the routing
// tables in the nodes.
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
DoubleValue rate (errRate);
Ptr<RateErrorModel> em1 =
CreateObjectWithAttributes<RateErrorModel> ("RanVar", StringValue ("ns3::UniformRandomVariable[Min=0.0|Max=1.0]"), "ErrorRate", rate);
Ptr<RateErrorModel> em2 =
CreateObjectWithAttributes<RateErrorModel> ("RanVar", StringValue ("ns3::UniformRandomVariable[Min=0.0|Max=1.0]"), "ErrorRate", rate);
// This enables the specified errRate on both link endpoints.
devices[0].Get (0)->SetAttribute ("ReceiveErrorModel", PointerValue (em1));
devices[totalNodes-2].Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (em2));
NS_LOG_INFO ("Create Applications.");
//
// Create a BulkSendApplication and install it on node 0
//
uint16_t port = 9; // well-known echo port number
BulkSendHelper source ("ns3::TcpSocketFactory",
InetSocketAddress (iface[totalNodes-2].GetAddress(1), port));
// Set the amount of data to send in bytes. Zero is unlimited.
source.SetAttribute ("MaxBytes", UintegerValue (maxBytes));
ApplicationContainer sourceApps = source.Install (c.Get (0));
sourceApps.Start (Seconds (0.0));
sourceApps.Stop (Seconds (simTime));
//
// Create a PacketSinkApplication and install it on node 1
//
PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory",
InetSocketAddress (Ipv4Address::GetAny (), port));
ApplicationContainer sinkApps = sinkHelper.Install (c.Get (totalNodes-1));
sink = StaticCast<PacketSink> (sinkApps.Get (0));
sinkApps.Start (Seconds (0.0));
sinkApps.Stop (Seconds (simTime));
FlowMonitorHelper flowmon;
Ptr<FlowMonitor> monitor = flowmon.InstallAll ();
thWriter.open ("test-tcp-throughput.txt");
Simulator::Schedule (Seconds (0.1), &CalculateThroughput);
Simulator::Stop (Seconds (simTime+2.0));
Simulator::Run ();
double throughput = ((sink->GetTotalRx () * 8) / (1e6 * simTime));
uint64_t totalRxPkts = sink->GetTotalRx()/payloadSize;
uint32_t totalTxPkts = 0;
// 10. Print per flow statistics
monitor->CheckForLostPackets ();
Ptr<Ipv4FlowClassifier> classifier = DynamicCast<Ipv4FlowClassifier> (flowmon.GetClassifier ());
FlowMonitor::FlowStatsContainer stats = monitor->GetFlowStats ();
for (std::map<FlowId, FlowMonitor::FlowStats>::const_iterator i = stats.begin (); i != stats.end (); ++i)
{
Ipv4FlowClassifier::FiveTuple t = classifier->FindFlow (i->first);
if (t.sourceAddress == iface[0].GetAddress (0) &&
t.destinationAddress == iface[totalNodes-2].GetAddress (1) )
{
//std::cout << "Flow " << i->first << " (" << t.sourceAddress << " -> " << t.destinationAddress << ")\n";
totalTxPkts = i->second.txPackets;
break;
// std::cout << " Tx Bytes: " << i->second.txBytes << "\n";
// std::cout << " TxOffered: " << i->second.txBytes * 8.0 / 9.0 / 1024 / 1024 << " Mbps\n";
// std::cout << " Rx Packets: " << i->second.rxPackets << "\n";
// std::cout << " Rx Bytes: " << i->second.rxBytes << "\n";
// std::cout << " Throughput: " << i->second.rxBytes * 8.0 / 9.0 / 1024 / 1024 << " Mbps\n";
// std::cout << " Lost Packets: " << i->second.lostPackets << "\n";
}
}
if ( data.find(totalNodes) == data.end() ) {
data[totalNodes].rxPkts = 0;
data[totalNodes].txPkts = 0;
data[totalNodes].throughput = 0.0;
data[totalNodes].cwnd = 0.0;
data[totalNodes].rtt = 0.0;
}
data[totalNodes].rxPkts += totalRxPkts;
data[totalNodes].txPkts += totalTxPkts;
data[totalNodes].throughput += throughput;
thWriter.close();
Simulator::Destroy ();
}
int main (int argc, char *argv[])
{
uint32_t payloadSize = 1460; // bytes
uint64_t maxBytes = std::numeric_limits<uint64_t>::max()-10; // 10*1024*1024; // 10MB=10*1024*1024
double simTime = 50.0;
std::string tcpVariant = "TcpBic"; // "TcpNewReno"; /* TCP variant type. */
uint32_t totalNodes = 20;
uint32_t seed = 1;
bool enableBtl = true;
double errRate = 0.000010; // or 0.000001
CommandLine cmd;
cmd.AddValue ("payloadSize", "size of application payload sent", payloadSize);
cmd.AddValue ("maxBytes","Total number of bytes for application to send", maxBytes);
cmd.AddValue ("totalNodes","Total number of nodes in the chain", totalNodes);
cmd.AddValue ("tcpVariant","TCP congestion control algorithm", tcpVariant);
cmd.AddValue ("enableBtl","Enable or Disable bottleneck link", enableBtl);
cmd.AddValue ("errRate", "Error rate to apply to link", errRate);
cmd.AddValue ("simTime","Set simulation time limit", simTime);
cmd.AddValue ("seed","Set simulation seed", seed);
cmd.Parse (argc, argv);
RngSeedManager::SetSeed (seed); // Changes seed from default of 1 to 3
// RngSeedManager::SetRun (7); // Changes run number from default of 1 to 7
SimRun(payloadSize, maxBytes, totalNodes, enableBtl,
errRate, simTime, tcpVariant, seed);
std::cout << "Throughput (Mbps): " << data[totalNodes].throughput << "\n";
return 0;
}
+0.09999999999999999997 0
+0.19999999999999999999 0.1168
+0.29999999999999999996 0.2336
+0.39999999999999999998 0.2336
+0.5 0.1168
+0.59999999999999999997 0.3504
+0.69999999999999999999 0.7008
+0.79999999999999999996 0.584
+0.89999999999999999998 0.8176
+1.0 0.9344
+1.09999999999999999997 0.9344
+1.19999999999999999999 0.9344
+1.29999999999999999996 0.9344
+1.39999999999999999998 0.9344
+1.5 1.0512
+1.59999999999999999997 0.9344
+1.69999999999999999999 0.9344
+1.79999999999999999996 0.9344
+1.89999999999999999998 0.9344
+2.0 0.9344
+2.09999999999999999997 0.9344
+2.19999999999999999999 0.7008
+2.29999999999999999996 0
+2.39999999999999999998 0
+2.5 0
+2.59999999999999999997 0
+2.69999999999999999999 0
+2.79999999999999999996 0
+2.89999999999999999998 0
+3.0 0
+3.09999999999999999997 2.5696
+3.19999999999999999999 7.008
+3.29999999999999999996 0.87936
+3.39999999999999999998 0
+3.5 0
+3.59999999999999999997 0
+3.69999999999999999999 0.1168
+3.79999999999999999996 0.9344
+3.89999999999999999998 0.9344
+4.0 0.9344
+4.09999999999999999997 1.0512
+4.19999999999999999999 0.9344
+4.29999999999999999996 0.9344
+4.39999999999999999998 0.9344
+4.5 0.9344
+4.59999999999999999997 0.9344
+4.69999999999999999999 0.9344
+4.79999999999999999996 1.0512
+4.89999999999999999998 0.9344
+5.0 0.9344
+5.09999999999999999997 0.9344
+5.19999999999999999999 0.4672
+5.29999999999999999996 0
+5.39999999999999999998 0
+5.5 0
+5.59999999999999999997 0
+5.69999999999999999999 0
+5.79999999999999999996 6.0736
+5.89999999999999999998 0.9344
+6.0 0.9344
+6.09999999999999999997 0.9344
+6.19999999999999999999 0.8176
+6.29999999999999999996 0
+6.39999999999999999998 0
+6.5 0
+6.59999999999999999997 0
+6.69999999999999999999 4.7888
+6.79999999999999999996 0.9344
+6.89999999999999999998 0.9344
+7.0 1.0512
+7.09999999999999999997 0.9344
+7.19999999999999999999 0
+7.29999999999999999996 0
+7.39999999999999999998 0
+7.5 1.5184
+7.59999999999999999997 2.92
+7.69999999999999999999 0.8176
+7.79999999999999999996 0
+7.89999999999999999998 0
+8.0 0
+8.09999999999999999997 3.7376
+8.19999999999999999999 0.9344
+8.29999999999999999996 0.9344
+8.39999999999999999998 1.0512
+8.5 0.9344
+8.59999999999999999997 0.9344
+8.69999999999999999999 0.9344
+8.79999999999999999996 0.9344
+8.89999999999999999998 0.9344
+9.0 0.9344
+9.09999999999999999997 0.3504
+9.19999999999999999999 0
+9.29999999999999999996 0
+9.39999999999999999998 3.3872
+9.5 0.9344
+9.59999999999999999997 0.9344
+9.69999999999999999999 0.9344
+9.79999999999999999996 0.9344
+9.89999999999999999998 1.0512
+10.0 0.9344
+10.09999999999999999997 0.2336
+10.19999999999999999999 0
+10.29999999999999999996 2.4528
+10.39999999999999999998 0.9344
+10.5 0.9344
+10.59999999999999999997 1.0512
+10.69999999999999999999 0.9344
+10.79999999999999999996 0.9344
+10.89999999999999999998 0.9344
+11.0 0.9344
+11.09999999999999999997 0.9344
+11.19999999999999999999 0.9344
+11.29999999999999999996 1.0512
+11.39999999999999999998 0.9344
+11.5 0.9344
+11.59999999999999999997 0.9344
+11.69999999999999999999 0.9344
+11.79999999999999999996 0.9344
+11.89999999999999999998 0.9344
+12.0 1.0512
+12.09999999999999999997 0.9344
+12.19999999999999999999 0.9344
+12.29999999999999999996 0.8176
+12.39999999999999999998 0
+12.5 0
+12.59999999999999999997 2.8032
+12.69999999999999999999 0.9344
+12.79999999999999999996 0.7008
+12.89999999999999999998 0
+13.0 0
+13.09999999999999999997 3.0368
+13.19999999999999999999 0.9344
+13.29999999999999999996 0.9344
+13.39999999999999999998 0.9344
+13.5 1.0512
+13.59999999999999999997 0.9344
+13.69999999999999999999 0.9344
+13.79999999999999999996 0.9344
+13.89999999999999999998 0.9344
+14.0 0.9344
+14.09999999999999999997 0.9344
+14.19999999999999999999 1.0512
+14.29999999999999999996 0.9344
+14.39999999999999999998 0.584
+14.5 0
+14.59999999999999999997 0
+14.69999999999999999999 2.6864
+14.79999999999999999996 0
+14.89999999999999999998 2.2192
+15.0 0.9344
+15.09999999999999999997 0.9344
+15.19999999999999999999 0.9344
+15.29999999999999999996 0.9344
+15.39999999999999999998 0.9344
+15.5 0.9344
+15.59999999999999999997 0.9344
+15.69999999999999999999 1.0512
+15.79999999999999999996 0.9344
+15.89999999999999999998 0.9344
+16.0 0.9344
+16.09999999999999999997 0.9344
+16.19999999999999999999 0.9344
+16.29999999999999999996 0.3504
+16.39999999999999999998 0
+16.5 0
+16.59999999999999999997 2.4528
+16.69999999999999999999 0
+16.79999999999999999996 1.2848
+16.89999999999999999998 2.2192
+17.0 0.9344
+17.09999999999999999997 1.0512
+17.19999999999999999999 0.9344
+17.29999999999999999996 0.9344
+17.39999999999999999998 0.9344
+17.5 0.9344
+17.59999999999999999997 0.9344
+17.69999999999999999999 0.9344
+17.79999999999999999996 0.7008
+17.89999999999999999998 0
+18.0 2.1024
+18.09999999999999999997 0.9344
+18.19999999999999999999 0.9344
+18.29999999999999999996 0
+18.39999999999999999998 1.752
+18.5 0.4672
+18.59999999999999999997 0.3504
+18.69999999999999999999 0.3504
+18.79999999999999999996 0
+18.89999999999999999998 1.0512
+19.0 0.2336
+19.09999999999999999997 0.2336
+19.19999999999999999999 0.1168
+19.29999999999999999996 0.2336
+19.39999999999999999998 0.2336
+19.5 0.3504
+19.59999999999999999997 0.4672
+19.69999999999999999999 0.3504
+19.79999999999999999996 0.3504
+19.89999999999999999998 0.4672
+20.0 0.7008
+20.09999999999999999997 0.7008
+20.19999999999999999999 0.4672
+20.29999999999999999996 0.7008
+20.39999999999999999998 0.8176
+20.5 0.9344
+20.59999999999999999997 0.7008
+20.69999999999999999999 0
+20.79999999999999999996 1.5184
+20.89999999999999999998 0.4672
+21.0 0.4672
+21.09999999999999999997 0.3504
+21.19999999999999999999 0.3504
+21.29999999999999999996 0.4672
+21.39999999999999999998 0.1168
+21.5 0
+21.59999999999999999997 0
+21.69999999999999999999 0
+21.79999999999999999996 0
+21.89999999999999999998 0
+22.0 0
+22.09999999999999999997 0
+22.19999999999999999999 0
+22.29999999999999999996 0
+22.39999999999999999998 0
+22.5 1.9856
+22.59999999999999999997 0.2336
+22.69999999999999999999 0.2336
+22.79999999999999999996 0
+22.89999999999999999998 0.3504
+23.0 0.2336
+23.09999999999999999997 0.3504
+23.19999999999999999999 0.4672
+23.29999999999999999996 0.1168
+23.39999999999999999998 0.4672
+23.5 0.584
+23.59999999999999999997 0.7008
+23.69999999999999999999 0.4672
+23.79999999999999999996 0.584
+23.89999999999999999998 0.7008
+24.0 0.9344
+24.09999999999999999997 0.8176
+24.19999999999999999999 0.8176
+24.29999999999999999996 0.9344
+24.39999999999999999998 0.9344
+24.5 0.9344
+24.59999999999999999997 1.0512
+24.69999999999999999999 0.9344
+24.79999999999999999996 0.9344
+24.89999999999999999998 0.9344
+25.0 0.9344
+25.09999999999999999997 0.9344
+25.19999999999999999999 0.9344
+25.29999999999999999996 0.9344
+25.39999999999999999998 1.0512
+25.5 0.9344
+25.59999999999999999997 0.9344
+25.69999999999999999999 0.9344
+25.79999999999999999996 0.9344
+25.89999999999999999998 0.9344
+26.0 0.8176
+26.09999999999999999997 0
+26.19999999999999999999 0
+26.29999999999999999996 0
+26.39999999999999999998 0
+26.5 0
+26.59999999999999999997 3.504
+26.69999999999999999999 0
+26.79999999999999999996 4.088
+26.89999999999999999998 0.8176
+27.0 0.9344
+27.09999999999999999997 0.9344
+27.19999999999999999999 0.9344
+27.29999999999999999996 0.9344
+27.39999999999999999998 0.9344
+27.5 1.0512
+27.59999999999999999997 0.9344
+27.69999999999999999999 0.4672
+27.79999999999999999996 0
+27.89999999999999999998 0
+28.0 0
+28.09999999999999999997 0
+28.19999999999999999999 3.9712
+28.29999999999999999996 0
+28.39999999999999999998 0
+28.5 3.8544
+28.59999999999999999997 0.9344
+28.69999999999999999999 0.9344
+28.79999999999999999996 0.9344
+28.89999999999999999998 0.9344
+29.0 1.0512
+29.09999999999999999997 0.9344
+29.19999999999999999999 0.9344
+29.29999999999999999996 0.9344
+29.39999999999999999998 0.9344
+29.5 0.9344
+29.59999999999999999997 0.2336
+29.69999999999999999999 0
+29.79999999999999999996 0
+29.89999999999999999998 0
+30.0 1.752
+30.09999999999999999997 3.504
+30.19999999999999999999 0.8176
+30.29999999999999999996 0.9344
+30.39999999999999999998 1.0512
+30.5 0.9344
+30.59999999999999999997 0.9344
+30.69999999999999999999 0.9344
+30.79999999999999999996 0.9344
+30.89999999999999999998 0.9344
+31.0 0.9344
+31.09999999999999999997 0.9344
+31.19999999999999999999 0.4672
+31.29999999999999999996 0
+31.39999999999999999998 0
+31.5 3.2704
+31.59999999999999999997 0.9344
+31.69999999999999999999 0.9344
+31.79999999999999999996 0.9344
+31.89999999999999999998 1.0512
+32.0 0.9344
+32.09999999999999999997 0.9344
+32.19999999999999999999 0.9344
+32.29999999999999999996 0.9344
+32.39999999999999999998 0.9344
+32.5 0.9344
+32.59999999999999999997 1.0512
+32.69999999999999999999 0.9344
+32.79999999999999999996 0.9344
+32.89999999999999999998 0.9344
+33.0 0.9344
+33.09999999999999999997 0.9344
+33.19999999999999999999 0.9344
+33.29999999999999999996 1.0512
+33.39999999999999999998 0.9344
+33.5 0.9344
+33.59999999999999999997 0.9344
+33.69999999999999999999 0.9344
+33.79999999999999999996 0.9344
+33.89999999999999999998 0.9344
+34.0 0.9344
+34.09999999999999999997 1.0512
+34.19999999999999999999 0.9344
+34.29999999999999999996 0.9344
+34.39999999999999999998 0.9344
+34.5 0.9344
+34.59999999999999999997 0.9344
+34.69999999999999999999 0.9344
+34.79999999999999999996 1.0512
+34.89999999999999999998 0.9344
+35.0 0.9344
+35.09999999999999999997 0.9344
+35.19999999999999999999 0.9344
+35.29999999999999999996 0.9344
+35.39999999999999999998 0.9344
+35.5 1.0512
+35.59999999999999999997 0.9344
+35.69999999999999999999 0.9344
+35.79999999999999999996 0.9344
+35.89999999999999999998 0.9344
+36.0 0.9344
+36.09999999999999999997 0.9344
+36.19999999999999999999 1.0512
+36.29999999999999999996 0.9344
+36.39999999999999999998 0.9344
+36.5 0.9344
+36.59999999999999999997 0
+36.69999999999999999999 0
+36.79999999999999999996 0
+36.89999999999999999998 0
+37.0 0
+37.09999999999999999997 0
+37.19999999999999999999 0
+37.29999999999999999996 0
+37.39999999999999999998 5.0224
+37.5 0
+37.59999999999999999997 0
+37.69999999999999999999 3.1536
+37.79999999999999999996 0
+37.89999999999999999998 0
+38.0 2.65952
+38.09999999999999999997 0.9344
+38.19999999999999999999 1.0512
+38.29999999999999999996 0.2336
+38.39999999999999999998 0
+38.5 0
+38.59999999999999999997 0
+38.69999999999999999999 0
+38.79999999999999999996 0
+38.89999999999999999998 0
+39.0 0
+39.09999999999999999997 0
+39.19999999999999999999 8.8768
+39.29999999999999999996 0
+39.39999999999999999998 0.2336
+39.5 0.3504
+39.59999999999999999997 0.3504
+39.69999999999999999999 0.3504
+39.79999999999999999996 0.4672
+39.89999999999999999998 0.9344
+40.0 0.8176
+40.09999999999999999997 0.9344
+40.19999999999999999999 0.9344
+40.29999999999999999996 0.9344
+40.39999999999999999998 0.9344
+40.5 0.9344
+40.59999999999999999997 0.9344
+40.69999999999999999999 1.0512
+40.79999999999999999996 0.9344
+40.89999999999999999998 0.9344
+41.0 0.9344
+41.09999999999999999997 0.9344
+41.19999999999999999999 0.9344
+41.29999999999999999996 0.9344
+41.39999999999999999998 1.0512
+41.5 0.9344
+41.59999999999999999997 0.9344
+41.69999999999999999999 0.9344
+41.79999999999999999996 0.9344
+41.89999999999999999998 0.9344
+42.0 0.9344
+42.09999999999999999997 0.8176
+42.19999999999999999999 0
+42.29999999999999999996 0
+42.39999999999999999998 2.92
+42.5 0.9344
+42.59999999999999999997 0.9344
+42.69999999999999999999 0.9344
+42.79999999999999999996 1.0512
+42.89999999999999999998 0.9344
+43.0 0.9344
+43.09999999999999999997 0.9344
+43.19999999999999999999 0.9344
+43.29999999999999999996 0.9344
+43.39999999999999999998 0.9344
+43.5 0.9344
+43.59999999999999999997 1.0512
+43.69999999999999999999 0.9344
+43.79999999999999999996 0.9344
+43.89999999999999999998 0.9344
+44.0 0.9344
+44.09999999999999999997 0.9344
+44.19999999999999999999 0.9344
+44.29999999999999999996 1.0512
+44.39999999999999999998 0.9344
+44.5 0.9344
+44.59999999999999999997 0.9344
+44.69999999999999999999 0.9344
+44.79999999999999999996 0.9344
+44.89999999999999999998 0.9344
+45.0 1.0512
+45.09999999999999999997 0
+45.19999999999999999999 0
+45.29999999999999999996 0
+45.39999999999999999998 1.168
+45.5 1.0512
+45.59999999999999999997 2.8032
+45.69999999999999999999 0.8176
+45.79999999999999999996 0.9344
+45.89999999999999999998 0.2336
+46.0 0
+46.09999999999999999997 0
+46.19999999999999999999 3.3872
+46.29999999999999999996 0.9344
+46.39999999999999999998 0.9344
+46.5 1.0512
+46.59999999999999999997 0.9344
+46.69999999999999999999 0.9344
+46.79999999999999999996 0.9344
+46.89999999999999999998 0.9344
+47.0 0.9344
+47.09999999999999999997 0.9344
+47.19999999999999999999 1.0512
+47.29999999999999999996 0.9344
+47.39999999999999999998 0.9344
+47.5 0.9344
+47.59999999999999999997 0.9344
+47.69999999999999999999 0.9344
+47.79999999999999999996 0.9344
+47.89999999999999999998 1.0512
+48.0 0.9344
+48.09999999999999999997 0.9344
+48.19999999999999999999 0.9344
+48.29999999999999999996 0.9344
+48.39999999999999999998 0.9344
+48.5 0.9344
+48.59999999999999999997 1.0512
+48.69999999999999999999 0.9344
+48.79999999999999999996 0.9344
+48.89999999999999999998 0.9344
+49.0 0.9344
+49.09999999999999999997 0.9344
+49.19999999999999999999 0.9344
+49.29999999999999999996 0.9344
+49.39999999999999999998 0.3504
+49.5 0
+49.59999999999999999997 0
+49.69999999999999999999 0
+49.79999999999999999996 0
+49.89999999999999999998 5.256
+50.0 0.9344
+50.09999999999999999997 1.0512
+50.19999999999999999999 0.9344
+50.29999999999999999996 0.9344
+50.39999999999999999998 0.9344
+50.5 0.9344
+50.59999999999999999997 0.9344
+50.69999999999999999999 0.9344
+50.79999999999999999996 1.0512
+50.89999999999999999998 0.2336
+51.0 0
+51.09999999999999999997 0
+51.19999999999999999999 0
+51.29999999999999999996 0
+51.39999999999999999998 0
+51.5 0
+51.59999999999999999997 0
+51.69999999999999999999 0
+51.79999999999999999996 0
+51.89999999999999999998 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment