ASMT output, MBDyn input and output done.

This commit is contained in:
Aik-Siong Koh
2023-11-06 18:00:24 -07:00
parent 34858977b1
commit 678d03db1f
96 changed files with 8806 additions and 4043 deletions

View File

@@ -18,7 +18,7 @@ namespace MbD {
void parseASMT(std::vector<std::string>& lines) override;
void storeOnLevel(std::ofstream& os, int level) override;
int nframe = 1000000, icurrent = 0, istart = 0, iend = 1000000, framesPerSecond = 30;
int nframe = 1000000, icurrent = 1, istart = 1, iend = 1000000, framesPerSecond = 30;
bool isForward = true;

View File

@@ -1212,6 +1212,7 @@ void MbD::ASMTAssembly::storeOnLevelGeneralConstraintSets(std::ofstream& os, int
void MbD::ASMTAssembly::storeOnTimeSeries(std::ofstream& os)
{
if (times->empty()) return;
os << "TimeSeries" << std::endl;
os << "Number\tInput\t";
for (int i = 1; i < times->size(); i++)

View File

@@ -121,7 +121,7 @@ namespace MbD {
void storeOnLevelGeneralConstraintSets(std::ofstream& os, int level);
void storeOnTimeSeries(std::ofstream& os) override;
std::string notes;
std::string notes = "(Text string: '' runs: (Core.RunArray runs: #() values: #()))";
std::shared_ptr<std::vector<std::shared_ptr<ASMTPart>>> parts = std::make_shared<std::vector<std::shared_ptr<ASMTPart>>>();
std::shared_ptr<std::vector<std::shared_ptr<ASMTKinematicIJ>>> kinematicIJs = std::make_shared<std::vector<std::shared_ptr<ASMTKinematicIJ>>>();
std::shared_ptr<std::vector<std::shared_ptr<ASMTConstraintSet>>> constraintSets = std::make_shared<std::vector<std::shared_ptr<ASMTConstraintSet>>>();
@@ -129,11 +129,11 @@ namespace MbD {
std::shared_ptr<std::vector<std::shared_ptr<ASMTMotion>>> motions = std::make_shared<std::vector<std::shared_ptr<ASMTMotion>>>();
std::shared_ptr<std::vector<std::shared_ptr<ASMTForceTorque>>> forcesTorques = std::make_shared<std::vector<std::shared_ptr<ASMTForceTorque>>>();
std::shared_ptr<ASMTConstantGravity> constantGravity = std::make_shared<ASMTConstantGravity>();
std::shared_ptr<ASMTSimulationParameters> simulationParameters;
std::shared_ptr<ASMTAnimationParameters> animationParameters;
std::shared_ptr<std::vector<double>> times;
std::shared_ptr<ASMTSimulationParameters> simulationParameters = std::make_shared<ASMTSimulationParameters>();
std::shared_ptr<ASMTAnimationParameters> animationParameters = std::make_shared<ASMTAnimationParameters>();
std::shared_ptr<std::vector<double>> times = std::make_shared<std::vector<double>>();
std::shared_ptr<ASMTTime> asmtTime = std::make_shared<ASMTTime>();
std::shared_ptr<Units> mbdUnits;
std::shared_ptr<Units> mbdUnits = std::make_shared<Units>();
MBDynSystem* mbdynItem = nullptr;
};
}

View File

@@ -92,21 +92,21 @@ void MbD::ASMTGeneralMotion::createMbD(std::shared_ptr<System> mbdSys, std::shar
userFunc = std::make_shared<BasicUserFunction>(rIJI->at(0), 1.0);
parser->parseUserFunction(userFunc);
auto geoX = parser->stack->top();
geoX = Symbolic::times(geoX, std::make_shared<Constant>(1.0 / mbdUnits->length));
geoX = Symbolic::times(geoX, sptrConstant(1.0 / mbdUnits->length));
geoX->createMbD(mbdSys, mbdUnits);
auto xBlk = geoX->simplified(geoX);
userFunc = std::make_shared<BasicUserFunction>(rIJI->at(1), 1.0);
parser->parseUserFunction(userFunc);
auto geoY = parser->stack->top();
geoY = Symbolic::times(geoY, std::make_shared<Constant>(1.0 / mbdUnits->length));
geoY = Symbolic::times(geoY, sptrConstant(1.0 / mbdUnits->length));
geoY->createMbD(mbdSys, mbdUnits);
auto yBlk = geoY->simplified(geoY);
userFunc = std::make_shared<BasicUserFunction>(rIJI->at(2), 1.0);
parser->parseUserFunction(userFunc);
auto geoZ = parser->stack->top();
geoZ = Symbolic::times(geoZ, std::make_shared<Constant>(1.0 / mbdUnits->length));
geoZ = Symbolic::times(geoZ, sptrConstant(1.0 / mbdUnits->length));
geoZ->createMbD(mbdSys, mbdUnits);
auto zBlk = geoZ->simplified(geoZ);
@@ -117,21 +117,21 @@ void MbD::ASMTGeneralMotion::createMbD(std::shared_ptr<System> mbdSys, std::shar
userFunc = std::make_shared<BasicUserFunction>(angIJJ->at(0), 1.0);
parser->parseUserFunction(userFunc);
auto geoPhi = parser->stack->top();
geoPhi = Symbolic::times(geoPhi, std::make_shared<Constant>(1.0 / mbdUnits->angle));
geoPhi = Symbolic::times(geoPhi, sptrConstant(1.0 / mbdUnits->angle));
geoPhi->createMbD(mbdSys, mbdUnits);
auto phiBlk = geoPhi->simplified(geoPhi);
userFunc = std::make_shared<BasicUserFunction>(angIJJ->at(1), 1.0);
parser->parseUserFunction(userFunc);
auto geoThe = parser->stack->top();
geoThe = Symbolic::times(geoThe, std::make_shared<Constant>(1.0 / mbdUnits->angle));
geoThe = Symbolic::times(geoThe, sptrConstant(1.0 / mbdUnits->angle));
geoThe->createMbD(mbdSys, mbdUnits);
auto theBlk = geoThe->simplified(geoThe);
userFunc = std::make_shared<BasicUserFunction>(angIJJ->at(2), 1.0);
parser->parseUserFunction(userFunc);
auto geoPsi = parser->stack->top();
geoPsi = Symbolic::times(geoPsi, std::make_shared<Constant>(1.0 / mbdUnits->angle));
geoPsi = Symbolic::times(geoPsi, sptrConstant(1.0 / mbdUnits->angle));
geoPsi->createMbD(mbdSys, mbdUnits);
auto psiBlk = geoPsi->simplified(geoPsi);

View File

@@ -12,6 +12,11 @@
using namespace MbD;
MbD::ASMTPrincipalMassMarker::ASMTPrincipalMassMarker()
{
name = "MassMarker";
}
void MbD::ASMTPrincipalMassMarker::parseASMT(std::vector<std::string>& lines)
{
size_t pos = lines[0].find_first_not_of("\t");

View File

@@ -5,29 +5,30 @@
* *
* See LICENSE file for details about copyright. *
***************************************************************************/
#pragma once
#include "ASMTSpatialItem.h"
namespace MbD {
class EXPORT ASMTPrincipalMassMarker : public ASMTSpatialItem
{
//
public:
void parseASMT(std::vector<std::string>& lines) override;
void setMass(double mass);
void setDensity(double density);
void setMomentOfInertias(DiagMatDsptr momentOfInertias);
class EXPORT ASMTPrincipalMassMarker : public ASMTSpatialItem
{
//
public:
ASMTPrincipalMassMarker();
void parseASMT(std::vector<std::string>& lines) override;
void setMass(double mass);
void setDensity(double density);
void setMomentOfInertias(DiagMatDsptr momentOfInertias);
// Overloads to simplify syntax.
void setMomentOfInertias(double a, double b, double c);
void storeOnLevel(std::ofstream& os, int level) override;
// Overloads to simplify syntax.
void setMomentOfInertias(double a, double b, double c);
void storeOnLevel(std::ofstream& os, int level) override;
double mass = 0.0;
double density = 0.0;
DiagMatDsptr momentOfInertias = std::make_shared<DiagonalMatrix>(ListD{ 0.,0.,0. });
double mass = 1.0;
double density = 10.0;
DiagMatDsptr momentOfInertias = std::make_shared<DiagonalMatrix<double>>(ListD{ 1.0, 2.0, 3.0 });
};
};
}

View File

@@ -68,9 +68,13 @@ void MbD::ASMTRotationalMotion::createMbD(std::shared_ptr<System> mbdSys, std::s
auto userFunc = std::make_shared<BasicUserFunction>(rotationZ, 1.0);
parser->parseUserFunction(userFunc);
auto geoPhi = parser->stack->top();
geoPhi = Symbolic::times(geoPhi, std::make_shared<Constant>(1.0 / mbdUnits->angle));
std::cout << *geoPhi << std::endl;
geoPhi = Symbolic::times(geoPhi, sptrConstant(1.0 / mbdUnits->angle));
geoPhi->createMbD(mbdSys, mbdUnits);
std::static_pointer_cast<ZRotation>(mbdObject)->phiBlk = geoPhi->simplified(geoPhi);
std::cout << *geoPhi << std::endl;
auto simple = geoPhi->simplified(geoPhi);
std::cout << *simple << std::endl;
std::static_pointer_cast<ZRotation>(mbdObject)->phiBlk = simple;
}
std::shared_ptr<Joint> MbD::ASMTRotationalMotion::mbdClassNew()

View File

@@ -550,13 +550,25 @@ void MbD::ASMTSpatialContainer::setOmega3D(double a, double b, double c)
void MbD::ASMTSpatialContainer::storeOnLevelVelocity(std::ofstream& os, int level)
{
storeOnLevelString(os, level, "Velocity3D");
storeOnLevelArray(os, level + 1, *velocity3D);
if (vxs == nullptr || vxs->empty()) {
storeOnLevelArray(os, level + 1, *velocity3D);
}
else {
auto array = getVelocity3D(0);
storeOnLevelArray(os, level + 1, *array);
}
}
void MbD::ASMTSpatialContainer::storeOnLevelOmega(std::ofstream& os, int level)
{
storeOnLevelString(os, level, "Omega3D");
storeOnLevelArray(os, level + 1, *omega3D);
if (omexs == nullptr || omexs->empty()) {
storeOnLevelArray(os, level + 1, *omega3D);
}
else {
auto array = getOmega3D(0);
storeOnLevelArray(os, level + 1, *array);
}
}
void MbD::ASMTSpatialContainer::storeOnLevelRefPoints(std::ofstream& os, int level)
@@ -697,3 +709,21 @@ void MbD::ASMTSpatialContainer::storeOnTimeSeries(std::ofstream& os)
}
os << std::endl;
}
FColDsptr MbD::ASMTSpatialContainer::getVelocity3D(size_t i)
{
auto vec3 = std::make_shared<FullColumn<double>>(3);
vec3->atiput(0, vxs->at(i));
vec3->atiput(1, vys->at(i));
vec3->atiput(2, vzs->at(i));
return vec3;
}
FColDsptr MbD::ASMTSpatialContainer::getOmega3D(size_t i)
{
auto vec3 = std::make_shared<FullColumn<double>>(3);
vec3->atiput(0, omexs->at(i));
vec3->atiput(1, omeys->at(i));
vec3->atiput(2, omezs->at(i));
return vec3;
}

View File

@@ -86,16 +86,16 @@ namespace MbD {
void storeOnLevelRefCurves(std::ofstream& os, int level);
void storeOnLevelRefSurfaces(std::ofstream& os, int level);
void storeOnTimeSeries(std::ofstream& os) override;
FColDsptr getVelocity3D(size_t i);
FColDsptr getOmega3D(size_t i);
FColDsptr velocity3D = std::make_shared<FullColumn<double>>(3);
FColDsptr omega3D = std::make_shared<FullColumn<double>>(3);
std::shared_ptr<std::vector<std::shared_ptr<ASMTRefPoint>>> refPoints;
std::shared_ptr<std::vector<std::shared_ptr<ASMTRefCurve>>> refCurves;
std::shared_ptr<std::vector<std::shared_ptr<ASMTRefSurface>>> refSurfaces;
FRowDsptr xs, ys, zs, bryxs, bryys, bryzs;
FRowDsptr vxs, vys, vzs, omexs, omeys, omezs;
FRowDsptr axs, ays, azs, alpxs, alpys, alpzs;
FRowDsptr inxs, inys, inzs, inbryxs, inbryys, inbryzs;
FRowDsptr invxs, invys, invzs, inomexs, inomeys, inomezs;
FRowDsptr inaxs, inays, inazs, inalpxs, inalpys, inalpzs;
std::shared_ptr<ASMTPrincipalMassMarker> principalMassMarker = std::make_shared<ASMTPrincipalMassMarker>();

View File

@@ -10,6 +10,7 @@
#include "Units.h"
#include "Part.h"
#include "ASMTSpatialContainer.h"
#include "EulerAngles.h"
using namespace MbD;
@@ -102,14 +103,50 @@ void MbD::ASMTSpatialItem::storeOnLevel(std::ofstream& os, int level)
void MbD::ASMTSpatialItem::storeOnLevelPosition(std::ofstream& os, int level)
{
storeOnLevelString(os, level, "Position3D");
storeOnLevelArray(os, level + 1, *position3D);
if (xs == nullptr || xs->empty()) {
storeOnLevelArray(os, level + 1, *position3D);
}
else {
auto array = getPosition3D(0);
storeOnLevelArray(os, level + 1, *array);
}
}
void MbD::ASMTSpatialItem::storeOnLevelRotationMatrix(std::ofstream& os, int level)
{
storeOnLevelString(os, level, "RotationMatrix");
for (int i = 0; i < 3; i++)
{
storeOnLevelArray(os, level + 1, *rotationMatrix->at(i));
if (xs == nullptr || xs->empty()) {
for (int i = 0; i < 3; i++)
{
storeOnLevelArray(os, level + 1, *rotationMatrix->at(i));
}
}
else {
auto rotMat = getRotationMatrix(0);
for (int i = 0; i < 3; i++)
{
storeOnLevelArray(os, level + 1, *rotMat->at(i));
}
}
}
FColDsptr MbD::ASMTSpatialItem::getPosition3D(size_t i)
{
auto vec3 = std::make_shared<FullColumn<double>>(3);
vec3->atiput(0, xs->at(i));
vec3->atiput(1, ys->at(i));
vec3->atiput(2, zs->at(i));
return vec3;
}
FMatDsptr MbD::ASMTSpatialItem::getRotationMatrix(size_t i)
{
auto bryantAngles = std::make_shared<EulerAngles<double>>();
bryantAngles->setRotOrder(1, 2, 3);
bryantAngles->at(0) = bryxs->at(i);
bryantAngles->at(1) = bryys->at(i);
bryantAngles->at(2) = bryzs->at(i);
bryantAngles->calc();
return bryantAngles->aA;
}

View File

@@ -31,6 +31,8 @@ namespace MbD {
void storeOnLevel(std::ofstream& os, int level) override;
void storeOnLevelPosition(std::ofstream& os, int level);
void storeOnLevelRotationMatrix(std::ofstream& os, int level);
FColDsptr getPosition3D(size_t i);
FMatDsptr getRotationMatrix(size_t i);
FColDsptr position3D = std::make_shared<FullColumn<double>>(3);
FMatDsptr rotationMatrix = std::make_shared<FullMatrixDouble>(ListListD{
@@ -38,6 +40,9 @@ namespace MbD {
{ 0, 1, 0 },
{ 0, 0, 1 }
});
FRowDsptr xs, ys, zs, bryxs, bryys, bryzs;
FRowDsptr inxs, inys, inzs, inbryxs, inbryys, inbryzs;
};
}

View File

@@ -25,7 +25,27 @@ void MbD::ASMTTime::createMbD(std::shared_ptr<System> mbdSys, std::shared_ptr<Un
{
auto mbdTime = mbdSys->time;
if (xx == mbdTime) return;
auto timeScale = std::make_shared<Constant>(mbdUnits->time);
auto timeScale = sptrConstant(mbdUnits->time);
auto geoTime = std::make_shared<Product>(timeScale, mbdTime);
this->xexpression(mbdTime, geoTime->simplified(geoTime));
}
Symsptr MbD::ASMTTime::expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
return sptr;
}
Symsptr MbD::ASMTTime::simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
return sptr;
}
bool MbD::ASMTTime::isVariable()
{
return true;
}
void MbD::ASMTTime::setValue(double val)
{
xx->setValue(val);
}

View File

@@ -19,6 +19,10 @@ namespace MbD {
public:
void deleteMbD();
void createMbD(std::shared_ptr<System> mbdSys, std::shared_ptr<Units> mbdUnits);
Symsptr expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
Symsptr simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
bool isVariable() override;
void setValue(double val) override;
};
}

View File

@@ -42,7 +42,7 @@ void MbD::ASMTTranslationalMotion::createMbD(std::shared_ptr<System> mbdSys, std
auto userFunc = std::make_shared<BasicUserFunction>(translationZ, 1.0);
parser->parseUserFunction(userFunc);
auto zIJ = parser->stack->top();
zIJ = Symbolic::times(zIJ, std::make_shared<Constant>(1.0 / mbdUnits->length));
zIJ = Symbolic::times(zIJ, sptrConstant(1.0 / mbdUnits->length));
zIJ->createMbD(mbdSys, mbdUnits);
std::static_pointer_cast<ZTranslation>(mbdObject)->zBlk = zIJ->simplified(zIJ);
}

View File

@@ -19,8 +19,13 @@ double MbD::Abs::getValue()
return std::abs(xx->getValue());
}
Symsptr MbD::Abs::copyWith(Symsptr arg)
{
return std::make_shared<Abs>(arg);
}
std::ostream& MbD::Abs::printOn(std::ostream& s) const
{
s << "abs(" << xx << ")";
s << "abs(" << *xx << ")";
return s;
}

View File

@@ -18,6 +18,7 @@ namespace MbD {
Abs() = default;
Abs(Symsptr arg);
double getValue() override;
Symsptr copyWith(Symsptr arg) override;
std::ostream& printOn(std::ostream& s) const override;

View File

@@ -19,8 +19,13 @@ double MbD::ArcSine::getValue()
return std::asin(xx->getValue());
}
Symsptr MbD::ArcSine::copyWith(Symsptr arg)
{
return std::make_shared<ArcSine>(arg);
}
std::ostream& MbD::ArcSine::printOn(std::ostream& s) const
{
s << "arcsin(" << xx << ")";
s << "arcsin(" << *xx << ")";
return s;
}

View File

@@ -18,6 +18,7 @@ namespace MbD {
ArcSine() = default;
ArcSine(Symsptr arg);
double getValue() override;
Symsptr copyWith(Symsptr arg) override;
std::ostream& printOn(std::ostream& s) const override;

View File

@@ -19,8 +19,13 @@ double MbD::ArcTan::getValue()
return std::atan(xx->getValue());
}
Symsptr MbD::ArcTan::copyWith(Symsptr arg)
{
return std::make_shared<ArcTan>(arg);
}
std::ostream& MbD::ArcTan::printOn(std::ostream& s) const
{
s << "arctan(" << xx << ")";
s << "arctan(" << *xx << ")";
return s;
}

View File

@@ -18,6 +18,7 @@ namespace MbD {
ArcTan() = default;
ArcTan(Symsptr arg);
double getValue() override;
Symsptr copyWith(Symsptr arg) override;
std::ostream& printOn(std::ostream& s) const override;

View File

@@ -16,5 +16,5 @@ MbD::ArcTan2::ArcTan2(Symsptr arg, Symsptr arg1) : FunctionXY(arg, arg1)
double MbD::ArcTan2::getValue()
{
return std::atan2(y->getValue(), x->getValue());;
return std::atan2(y->getValue(), x->getValue());
}

View File

@@ -9,6 +9,7 @@
#include "Constant.h"
#include "System.h"
#include "Units.h"
#include "Polynomial.h"
using namespace MbD;
@@ -22,7 +23,23 @@ Constant::Constant(double val) : Variable(val)
Symsptr MbD::Constant::differentiateWRT(Symsptr var)
{
return std::make_shared<Constant>(0.0);
return sptrConstant(0.0);
}
Symsptr MbD::Constant::integrateWRT(Symsptr var)
{
if (value == 0.0) return clonesptr();
auto slope = sptrConstant(value);
auto intercept = sptrConstant(0.0);
auto coeffs = std::make_shared<std::vector<Symsptr>>();
coeffs->push_back(intercept);
coeffs->push_back(slope);
return std::make_shared<Polynomial>(var, coeffs);
}
Symsptr MbD::Constant::expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
return sptr;
}
bool Constant::isConstant()
@@ -30,11 +47,6 @@ bool Constant::isConstant()
return true;
}
Symsptr MbD::Constant::expandUntil(std::shared_ptr<std::unordered_set<Symsptr>> set)
{
return clonesptr();
}
Symsptr MbD::Constant::clonesptr()
{
return std::make_shared<Constant>(*this);
@@ -60,6 +72,11 @@ double MbD::Constant::getValue()
return value;
}
double MbD::Constant::getValue(double arg)
{
return value;
}
std::ostream& Constant::printOn(std::ostream& s) const
{
return s << this->value;

View File

@@ -17,13 +17,15 @@ namespace MbD {
Constant();
Constant(double val);
Symsptr differentiateWRT(Symsptr var) override;
Symsptr integrateWRT(Symsptr var) override;
Symsptr expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
bool isConstant() override;
Symsptr expandUntil(std::shared_ptr<std::unordered_set<Symsptr>> set) override;
Symsptr clonesptr() override;
bool isZero() override;
bool isOne() override;
void createMbD(std::shared_ptr<System> mbdSys, std::shared_ptr<Units> mbdUnits) override;
double getValue() override;
double getValue(double arg) override;
std::ostream& printOn(std::ostream& s) const override;
};

View File

@@ -26,8 +26,13 @@ Symsptr MbD::Cosine::differentiateWRTx()
return std::make_shared<Negative>(std::make_shared<Sine>(xx));
}
Symsptr MbD::Cosine::copyWith(Symsptr arg)
{
return std::make_shared<Cosine>(arg);
}
std::ostream& MbD::Cosine::printOn(std::ostream& s) const
{
s << "cos(" << xx << ")";
s << "cos(" << *xx << ")";
return s;
}

View File

@@ -19,6 +19,7 @@ namespace MbD {
Cosine(Symsptr arg);
double getValue() override;
Symsptr differentiateWRTx() override;
Symsptr copyWith(Symsptr arg) override;
std::ostream& printOn(std::ostream& s) const override;

View File

@@ -34,6 +34,6 @@ Symsptr MbD::DifferentiatedGeneralSpline::clonesptr()
std::ostream& MbD::DifferentiatedGeneralSpline::printOn(std::ostream& s) const
{
s << "deriv(" << generalSpline << ", " << derivativeOrder << ")";
s << "deriv(" << *generalSpline << ", " << derivativeOrder << ")";
return s;
}

View File

@@ -322,3 +322,346 @@ namespace MbD {
}
}
EndFrameqct::EndFrameqct(const char* str) : EndFrameqc(str) {
}
void EndFrameqct::initialize()
{
EndFrameqc::initialize();
rmem = std::make_shared<FullColumn<double>>(3);
prmempt = std::make_shared<FullColumn<double>>(3);
pprmemptpt = std::make_shared<FullColumn<double>>(3);
aAme = FullMatrix<double>::identitysptr(3);
pAmept = std::make_shared<FullMatrix<double>>(3, 3);
ppAmeptpt = std::make_shared<FullMatrix<double>>(3, 3);
pprOeOpEpt = std::make_shared<FullMatrix<double>>(3, 4);
pprOeOptpt = std::make_shared<FullColumn<double>>(3);
ppAOepEpt = std::make_shared<FullColumn<FMatDsptr>>(4);
ppAOeptpt = std::make_shared<FullMatrix<double>>(3, 3);
}
void EndFrameqct::initializeLocally()
{
if (!rmemBlks) {
rmem->zeroSelf();
prmempt->zeroSelf();
pprmemptpt->zeroSelf();
}
if (!phiThePsiBlks) {
aAme->identity();
pAmept->zeroSelf();
ppAmeptpt->zeroSelf();
}
}
void EndFrameqct::initializeGlobally()
{
if (rmemBlks) {
initprmemptBlks();
initpprmemptptBlks();
}
if (phiThePsiBlks) {
initpPhiThePsiptBlks();
initppPhiThePsiptptBlks();
}
}
void EndFrameqct::initprmemptBlks()
{
auto& mbdTime = this->root()->time;
prmemptBlks = std::make_shared< FullColumn<Symsptr>>(3);
for (int i = 0; i < 3; i++) {
auto& disp = rmemBlks->at(i);
auto var = disp->differentiateWRT(mbdTime);
auto vel = var->simplified(var);
prmemptBlks->at(i) = vel;
}
}
void EndFrameqct::initpprmemptptBlks()
{
auto& mbdTime = this->root()->time;
pprmemptptBlks = std::make_shared< FullColumn<Symsptr>>(3);
for (int i = 0; i < 3; i++) {
auto& vel = prmemptBlks->at(i);
auto var = vel->differentiateWRT(mbdTime);
auto acc = var->simplified(var);
pprmemptptBlks->at(i) = acc;
}
}
void EndFrameqct::initpPhiThePsiptBlks()
{
auto& mbdTime = this->root()->time;
pPhiThePsiptBlks = std::make_shared< FullColumn<Symsptr>>(3);
for (int i = 0; i < 3; i++) {
auto& angle = phiThePsiBlks->at(i);
auto var = angle->differentiateWRT(mbdTime);
//std::cout << "var " << *var << std::endl;
auto vel = var->simplified(var);
//std::cout << "vel " << *vel << std::endl;
pPhiThePsiptBlks->at(i) = vel;
//std::cout << *angle << std::endl;
//std::cout << *vel << std::endl;
}
}
void EndFrameqct::initppPhiThePsiptptBlks()
{
auto& mbdTime = this->root()->time;
ppPhiThePsiptptBlks = std::make_shared< FullColumn<Symsptr>>(3);
for (int i = 0; i < 3; i++) {
auto& angleVel = pPhiThePsiptBlks->at(i);
auto var = angleVel->differentiateWRT(mbdTime);
auto angleAcc = var->simplified(var);
ppPhiThePsiptptBlks->at(i) = angleAcc;
//std::cout << *angleVel << std::endl;
//std::cout << *angleAcc << std::endl;
}
}
void EndFrameqct::postInput()
{
this->evalrmem();
this->evalAme();
Item::postInput();
}
void EndFrameqct::calcPostDynCorrectorIteration()
{
auto& rOmO = markerFrame->rOmO;
auto& aAOm = markerFrame->aAOm;
rOeO = rOmO->plusFullColumn(aAOm->timesFullColumn(rmem));
auto& prOmOpE = markerFrame->prOmOpE;
auto& pAOmpE = markerFrame->pAOmpE;
for (int i = 0; i < 3; i++)
{
auto& prOmOpEi = prOmOpE->at(i);
auto& prOeOpEi = prOeOpE->at(i);
for (int j = 0; j < 4; j++)
{
auto prOeOpEij = prOmOpEi->at(j) + pAOmpE->at(j)->at(i)->timesFullColumn(rmem);
prOeOpEi->at(j) = prOeOpEij;
}
}
auto rpep = markerFrame->rpmp->plusFullColumn(markerFrame->aApm->timesFullColumn(rmem));
pprOeOpEpE = EulerParameters<double>::ppApEpEtimesColumn(rpep);
aAOe = aAOm->timesFullMatrix(aAme);
for (int i = 0; i < 4; i++)
{
pAOepE->at(i) = pAOmpE->at(i)->timesFullMatrix(aAme);
}
auto aApe = markerFrame->aApm->timesFullMatrix(aAme);
ppAOepEpE = EulerParameters<double>::ppApEpEtimesMatrix(aApe);
}
void EndFrameqct::prePosIC()
{
time = this->root()->mbdTimeValue();
this->evalrmem();
this->evalAme();
EndFrameqc::prePosIC();
}
void EndFrameqct::evalrmem()
{
if (rmemBlks) {
for (int i = 0; i < 3; i++)
{
auto& expression = rmemBlks->at(i);
double value = expression->getValue();
rmem->at(i) = value;
}
}
}
void EndFrameqct::evalAme()
{
if (phiThePsiBlks) {
auto phiThePsi = CREATE<EulerAngleszxz<double>>::With();
for (int i = 0; i < 3; i++)
{
auto& expression = phiThePsiBlks->at(i);
auto value = expression->getValue();
phiThePsi->at(i) = value;
}
phiThePsi->calc();
aAme = phiThePsi->aA;
}
}
void EndFrameqct::preVelIC()
{
time = this->root()->mbdTimeValue();
this->evalrmem();
this->evalAme();
Item::preVelIC();
this->evalprmempt();
this->evalpAmept();
auto& aAOm = markerFrame->aAOm;
prOeOpt = aAOm->timesFullColumn(prmempt);
pAOept = aAOm->timesFullMatrix(pAmept);
}
void EndFrameqct::postVelIC()
{
auto& pAOmpE = markerFrame->pAOmpE;
for (int i = 0; i < 3; i++)
{
auto& pprOeOpEpti = pprOeOpEpt->at(i);
for (int j = 0; j < 4; j++)
{
auto pprOeOpEptij = pAOmpE->at(j)->at(i)->dot(prmempt);
pprOeOpEpti->atiput(j, pprOeOpEptij);
}
}
for (int i = 0; i < 4; i++)
{
ppAOepEpt->atiput(i, pAOmpE->at(i)->timesFullMatrix(pAmept));
}
}
FColDsptr EndFrameqct::pAjOept(int j)
{
return pAOept->column(j);
}
FMatDsptr EndFrameqct::ppAjOepETpt(int jj)
{
auto answer = std::make_shared<FullMatrix<double>>(4, 3);
for (int i = 0; i < 4; i++)
{
auto& answeri = answer->at(i);
auto& ppAOepEipt = ppAOepEpt->at(i);
for (int j = 0; j < 3; j++)
{
auto& answerij = ppAOepEipt->at(j)->at(jj);
answeri->atiput(j, answerij);
}
}
return answer;
}
FColDsptr EndFrameqct::ppAjOeptpt(int j)
{
return ppAOeptpt->column(j);
}
double EndFrameqct::priOeOpt(int i)
{
return prOeOpt->at(i);
}
FRowDsptr EndFrameqct::ppriOeOpEpt(int i)
{
return pprOeOpEpt->at(i);
}
double EndFrameqct::ppriOeOptpt(int i)
{
return pprOeOptpt->at(i);
}
void EndFrameqct::evalprmempt()
{
if (rmemBlks) {
for (int i = 0; i < 3; i++)
{
auto& derivative = prmemptBlks->at(i);
auto value = derivative->getValue();
prmempt->at(i) = value;
}
}
}
void EndFrameqct::evalpAmept()
{
if (phiThePsiBlks) {
auto phiThePsi = CREATE<EulerAngleszxz<double>>::With();
auto phiThePsiDot = CREATE<EulerAngleszxzDot<double>>::With();
phiThePsiDot->phiThePsi = phiThePsi;
for (int i = 0; i < 3; i++)
{
auto& expression = phiThePsiBlks->at(i);
auto& derivative = pPhiThePsiptBlks->at(i);
auto value = expression->getValue();
auto valueDot = derivative->getValue();
phiThePsi->at(i) = value;
phiThePsiDot->at(i) = valueDot;
}
phiThePsi->calc();
phiThePsiDot->calc();
pAmept = phiThePsiDot->aAdot;
}
}
void EndFrameqct::evalpprmemptpt()
{
if (rmemBlks) {
for (int i = 0; i < 3; i++)
{
auto& secondDerivative = pprmemptptBlks->at(i);
auto value = secondDerivative->getValue();
pprmemptpt->atiput(i, value);
}
}
}
void EndFrameqct::evalppAmeptpt()
{
if (phiThePsiBlks) {
auto phiThePsi = CREATE<EulerAngleszxz<double>>::With();
auto phiThePsiDot = CREATE<EulerAngleszxzDot<double>>::With();
phiThePsiDot->phiThePsi = phiThePsi;
auto phiThePsiDDot = CREATE<EulerAngleszxzDDot<double>>::With();
phiThePsiDDot->phiThePsiDot = phiThePsiDot;
for (int i = 0; i < 3; i++)
{
auto& expression = phiThePsiBlks->at(i);
auto& derivative = pPhiThePsiptBlks->at(i);
auto& secondDerivative = ppPhiThePsiptptBlks->at(i);
auto value = expression->getValue();
auto valueDot = derivative->getValue();
auto valueDDot = secondDerivative->getValue();
phiThePsi->atiput(i, value);
phiThePsiDot->atiput(i, valueDot);
phiThePsiDDot->atiput(i, valueDDot);
}
phiThePsi->calc();
phiThePsiDot->calc();
phiThePsiDDot->calc();
ppAmeptpt = phiThePsiDDot->aAddot;
}
}
FColDsptr EndFrameqct::rmeO()
{
return markerFrame->aAOm->timesFullColumn(rmem);
}
FColDsptr EndFrameqct::rpep()
{
auto& rpmp = markerFrame->rpmp;
auto& aApm = markerFrame->aApm;
auto rpep = rpmp->plusFullColumn(aApm->timesFullColumn(rmem));
return rpep;
}
void EndFrameqct::preAccIC()
{
time = this->root()->mbdTimeValue();
this->evalrmem();
this->evalAme();
Item::preVelIC();
this->evalprmempt();
this->evalpAmept();
auto& aAOm = markerFrame->aAOm;
prOeOpt = aAOm->timesFullColumn(prmempt);
pAOept = aAOm->timesFullMatrix(pAmept);
Item::preAccIC();
this->evalpprmemptpt();
this->evalppAmeptpt();
aAOm = markerFrame->aAOm;
pprOeOptpt = aAOm->timesFullColumn(pprmemptpt);
ppAOeptpt = aAOm->timesFullMatrix(ppAmeptpt);
}

View File

@@ -19,8 +19,13 @@ double MbD::Exponential::getValue()
return std::log(xx->getValue());
}
Symsptr MbD::Exponential::copyWith(Symsptr arg)
{
return std::make_shared<Exponential>(arg);
}
std::ostream& MbD::Exponential::printOn(std::ostream& s) const
{
s << "exp(" << xx << ")";
s << "exp(" << *xx << ")";
return s;
}

View File

@@ -18,6 +18,7 @@ namespace MbD {
Exponential() = default;
Exponential(Symsptr arg);
double getValue() override;
Symsptr copyWith(Symsptr arg) override;
std::ostream& printOn(std::ostream& s) const override;

View File

@@ -7,6 +7,7 @@
***************************************************************************/
#include "ExpressionX.h"
#include "Constant.h"
using namespace MbD;
@@ -23,8 +24,14 @@ void MbD::ExpressionX::xexpression(Symsptr arg, Symsptr func)
expression = func;
}
Symsptr MbD::ExpressionX::differentiateWRTx()
{
return expression->differentiateWRT(xx);
}
Symsptr MbD::ExpressionX::differentiateWRT(Symsptr var)
{
if (this == var.get()) return sptrConstant(1.0);
return expression->differentiateWRT(var);
}

View File

@@ -17,6 +17,7 @@ namespace MbD {
public:
void xexpression(Symsptr arg, Symsptr func);
Symsptr differentiateWRTx() override;
Symsptr differentiateWRT(Symsptr var) override;
double getValue() override;

View File

@@ -5,7 +5,7 @@
* *
* See LICENSE file for details about copyright. *
***************************************************************************/
#include "FunctionX.h"
#include "Constant.h"
#include "Sum.h"
@@ -24,9 +24,43 @@ void MbD::FunctionX::arguments(Symsptr args)
xx = sum->terms->front();
}
Symsptr MbD::FunctionX::copyWith(Symsptr arg)
{
assert(false);
return Symsptr();
}
Symsptr MbD::FunctionX::expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
auto itr = std::find_if(set->begin(), set->end(), [sptr](Symsptr sym) {return sptr.get() == sym.get(); });
if (itr != set->end()) return sptr;
auto newx = xx->expandUntil(xx, set);
auto copy = copyWith(newx);
if (newx->isConstant()) {
return sptrConstant(copy->getValue());
}
else {
return copy;
}
}
Symsptr MbD::FunctionX::simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
auto itr = std::find_if(set->begin(), set->end(), [sptr](Symsptr sym) {return sptr.get() == sym.get(); });
if (itr != set->end()) return sptr;
auto newx = xx->simplifyUntil(xx, set);
auto copy = copyWith(newx);
if (newx->isConstant()) {
return sptrConstant(copy->getValue());
}
else {
return copy;
}
}
Symsptr MbD::FunctionX::differentiateWRT(Symsptr var)
{
if (this == var.get()) return std::make_shared<Constant>(1.0);
if (this == var.get()) return sptrConstant(1.0);
auto dfdx = differentiateWRTx();
auto dxdvar = xx->differentiateWRT(var);
return Symbolic::times(dfdx, dxdvar);
@@ -42,3 +76,24 @@ void MbD::FunctionX::createMbD(std::shared_ptr<System> mbdSys, std::shared_ptr<U
{
xx->createMbD(mbdSys, mbdUnits);
}
double MbD::FunctionX::getValue()
{
assert(false);
return 0.0;
}
double MbD::FunctionX::getValue(double arg)
{
double answer;
if (xx->isVariable()) {
auto oldVal = xx->getValue();
xx->setValue(arg);
answer = getValue();
xx->setValue(oldVal);
}
else {
assert(false);
}
return answer;
}

View File

@@ -21,9 +21,14 @@ namespace MbD {
FunctionX() = default;
FunctionX(Symsptr arg);
void arguments(Symsptr args) override;
virtual Symsptr copyWith(Symsptr arg);
Symsptr expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
Symsptr simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
Symsptr differentiateWRT(Symsptr var) override;
virtual Symsptr differentiateWRTx();
void createMbD(std::shared_ptr<System> mbdSys, std::shared_ptr<Units> mbdUnits) override;
double getValue() override;
double getValue(double arg) override;
Symsptr xx;

View File

@@ -249,15 +249,13 @@ std::ostream& MbD::GeneralSpline::printOn(std::ostream& s) const
{
s << ", " << xs->at(i);
}
s << "}" << std::endl;;
s << "}, " << std::endl;
s << "ys{";
s << ys->at(0);
for (int i = 1; i < ys->size(); i++)
{
s << ", " << ys->at(i);
}
s << "}";
s << ")";
s << std::endl;
s << "})" << std::endl;
return s;
}

View File

@@ -18,9 +18,9 @@ IndependentVariable::IndependentVariable()
Symsptr MbD::IndependentVariable::differentiateWRT(Symsptr var)
{
if (this == var.get()) {
return std::make_shared<Constant>(1.0);
return sptrConstant(1.0);
}
else {
return std::make_shared<Constant>(0.0);
return sptrConstant(0.0);
}
}

45
OndselSolver/Integral.cpp Normal file
View File

@@ -0,0 +1,45 @@
#include "Integral.h"
using namespace MbD;
MbD::Integral::Integral(Symsptr var, Symsptr integrand)
{
assert(false);
}
void MbD::Integral::arguments(Symsptr args)
{
auto arguments = args->getTerms();
xx = arguments->at(0);
integrand = arguments->at(1);
expression = integrand->integrateWRT(xx);
}
Symsptr MbD::Integral::expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
auto expand = expression->expandUntil(expression, set);
auto answer = std::make_shared<Integral>();
answer->xx = xx;
answer->expression = expand;
answer->integrand = integrand;
answer->integrationConstant = integrationConstant;
return answer;
}
Symsptr MbD::Integral::simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
auto simple = expression->simplifyUntil(expression, set);
auto answer = std::make_shared<Integral>();
answer->xx = xx;
answer->expression = simple;
answer->integrand = integrand;
answer->integrationConstant = integrationConstant;
return answer;
}
std::ostream& MbD::Integral::printOn(std::ostream& s) const
{
s << *expression << " + ";
s << *integrationConstant;
return s;
}

29
OndselSolver/Integral.h Normal file
View File

@@ -0,0 +1,29 @@
/***************************************************************************
* Copyright (c) 2023 Ondsel, Inc. *
* *
* This file is part of OndselSolver. *
* *
* See LICENSE file for details about copyright. *
***************************************************************************/
#pragma once
#include "ExpressionX.h"
#include "Constant.h"
namespace MbD {
class Integral : public ExpressionX
{
public:
Integral() = default;
Integral(Symsptr var, Symsptr integrand);
void arguments(Symsptr args) override;
Symsptr expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
Symsptr simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
std::ostream& printOn(std::ostream& s) const override;
Symsptr integrand;
Symsptr integrationConstant = sptrConstant(0.0);
};
}

View File

@@ -13,6 +13,7 @@
#include "Item.h"
#include "System.h"
#include "Symbolic.h"
using namespace MbD;
@@ -41,7 +42,7 @@ std::ostream& Item::printOn(std::ostream& s) const
{
std::string str = typeid(*this).name();
auto classname = str.substr(11, str.size() - 11);
s << classname << std::endl;
s << classname; //Why classname() cannot be used?
return s;
}

View File

@@ -18,3 +18,8 @@ double MbD::Ln::getValue()
{
return std::log(xx->getValue());
}
Symsptr MbD::Ln::copyWith(Symsptr arg)
{
return std::make_shared<Ln>(arg);
}

View File

@@ -18,6 +18,7 @@ namespace MbD {
Ln() = default;
Ln(Symsptr arg);
double getValue() override;
Symsptr copyWith(Symsptr arg) override;

View File

@@ -19,8 +19,13 @@ double MbD::Log10::getValue()
return std::log(xx->getValue());
}
Symsptr MbD::Log10::copyWith(Symsptr arg)
{
return std::make_shared<Log10>(arg);
}
std::ostream& MbD::Log10::printOn(std::ostream& s) const
{
s << "lg(" << xx << ")";
s << "lg(" << *xx << ")";
return s;
}

View File

@@ -18,6 +18,7 @@ namespace MbD {
Log10() = default;
Log10(Symsptr arg);
double getValue() override;
Symsptr copyWith(Symsptr arg) override;
std::ostream& printOn(std::ostream& s) const override;

View File

@@ -19,8 +19,13 @@ double MbD::LogN::getValue()
return std::log(xx->getValue());
}
Symsptr MbD::LogN::copyWith(Symsptr arg)
{
return std::make_shared<LogN>(arg);
}
std::ostream& MbD::LogN::printOn(std::ostream& s) const
{
s << "ln(" << xx << ")";
s << "ln(" << *xx << ")";
return s;
}

View File

@@ -18,6 +18,7 @@ namespace MbD {
LogN() = default;
LogN(Symsptr arg);
double getValue() override;
Symsptr copyWith(Symsptr arg) override;
std::ostream& printOn(std::ostream& s) const override;

View File

@@ -19,7 +19,7 @@ namespace MbD {
void readInertiaMatrix(std::vector<std::string>& args);
void createASMT() override;
std::string bodyString, name, nodeName;
std::string bodyString, nodeName;
double mass;
FColDsptr rPcmP;
FMatDsptr aJmat;

View File

@@ -1,324 +1,324 @@
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749178 -0.09687939551894122 -3.252606517456513e-19 0.9999846242181696 -0.005545387925678226 0.09688088513829464 0.005519302327492587 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051885 0.9952948074630237 -0.001621407113303408 -0.09687939551894119 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.09688683977859862 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981437 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894111 2.168404344971009e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123014 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894122 -6.505213034913027e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749175 -0.09687939551894111 0 0.9999846242181696 -0.005545387925678225 0.09688088513829453 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 0.121 8.796847998598882e-19 0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 0.1853423520676719 -0.0003049963359123015 0.1415220993435272 0.9952959831601956 -0.0005372420906749176 -0.09687939551894122 -4.336808689942018e-19 0.9999846242181696 -0.005545387925678225 0.09688088513829464 0.005519302327492586 0.995280679706302 0 -0 -0 0 0 0
3 0.3222616402245218 -0.0002911328660981436 0.1799682739051886 0.9952948074630237 -0.001621407113303408 -0.09687939551894117 0.001089272628257954 0.9999840309514423 -0.005545387925678226 0.0968868397785986 0.005413767734014727 0.995280679706302 0 0 0 0 0 0
4 0.4640248981573186 -7.44074583944898e-17 0.1600000000000001 1 0 0 0 1 0 0 0 1 0 0 -0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975219 0.04313916854059263 2.168404344971009e-18 0.9993482542271943 -0.03609801619284766 -0.04316730264761665 0.03606436769945951 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124541 -0.009155819605617083 0.9990537652981445 -0.005530477486285016 0.04313916854059265 0.007090681752166227 0.9993230986318842 -0.03609801619284764 -0.04291032831253404 0.03636974511243224 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814532 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419695 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.469446951953614e-18 0.9993482542271943 -0.03609801619284765 -0.04316730264761659 0.0360643676994595 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617056 0.9990537652981445 -0.00553047748628502 0.04313916854059259 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253398 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606623 -0.02810879162419695 0.9990678575462876 0.001558253989975217 0.04313916854059247 -1.084202172485504e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761648 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617056 0.9990537652981445 -0.005530477486285023 0.04313916854059251 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.0429103283125339 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419695 0.9990678575462876 0.001558253989975214 0.04313916854059258 5.204170427930421e-18 0.9993482542271943 -0.03609801619284765 -0.04316730264761659 0.0360643676994595 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285021 0.04313916854059257 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253396 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975221 0.04313916854059258 -1.301042606982605e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124541 -0.009155819605617063 0.9990537652981445 -0.005530477486285021 0.04313916854059256 0.007090681752166228 0.9993230986318842 -0.03609801619284764 -0.04291032831253395 0.03636974511243224 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606623 -0.02810879162419695 0.9990678575462876 0.001558253989975222 0.04313916854059258 -1.517883041479706e-18 0.9993482542271943 -0.03609801619284768 -0.04316730264761659 0.03606436769945953 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285022 0.04313916854059257 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253396 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606623 -0.02810879162419695 0.9990678575462876 0.001558253989975214 0.04313916854059247 1.517883041479706e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761648 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617042 0.9990537652981445 -0.005530477486285025 0.04313916854059247 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253386 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419695 0.9990678575462876 0.001558253989975217 0.04313916854059252 2.168404344971009e-19 0.9993482542271943 -0.03609801619284767 -0.04316730264761653 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617056 0.9990537652981445 -0.005530477486285023 0.04313916854059251 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253391 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419695 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617056 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.007090681752166231 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606623 -0.02810879162419695 0.9990678575462876 0.001558253989975217 0.04313916854059247 -1.084202172485504e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761648 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617056 0.9990537652981445 -0.005530477486285022 0.04313916854059251 0.007090681752166228 0.9993230986318842 -0.03609801619284766 -0.04291032831253391 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419695 0.9990678575462876 0.001558253989975215 0.04313916854059258 4.77048955893622e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285021 0.04313916854059257 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253396 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975215 0.04313916854059252 2.168404344971009e-18 0.9993482542271943 -0.03609801619284766 -0.04316730264761653 0.03606436769945951 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059256 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253395 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975218 0.04313916854059258 1.301042606982605e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124541 -0.009155819605617069 0.9990537652981445 -0.00553047748628502 0.04313916854059258 0.007090681752166228 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975219 0.04313916854059263 2.602085213965211e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761665 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617069 0.9990537652981445 -0.00553047748628502 0.0431391685405926 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.042910328312534 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.00155825398997522 0.04313916854059258 -4.336808689942018e-19 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.0431391685405926 0.007090681752166231 0.9993230986318842 -0.03609801619284766 -0.04291032831253399 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606623 -0.02810879162419695 0.9990678575462876 0.001558253989975219 0.04313916854059252 -8.673617379884035e-19 0.9993482542271943 -0.03609801619284767 -0.04316730264761653 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617056 0.9990537652981445 -0.005530477486285022 0.04313916854059256 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253395 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419695 0.9990678575462876 0.00155825398997522 0.04313916854059258 -4.336808689942018e-19 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606623 -0.02810879162419695 0.9990678575462876 0.001558253989975218 0.04313916854059252 0 0.9993482542271943 -0.03609801619284767 -0.04316730264761653 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059256 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253395 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419695 0.9990678575462876 0.001558253989975218 0.04313916854059263 3.469446951953614e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761665 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285019 0.0431391685405926 0.007090681752166229 0.9993230986318842 -0.03609801619284767 -0.04291032831253399 0.03636974511243227 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975215 0.04313916854059258 4.336808689942018e-18 0.9993482542271943 -0.03609801619284765 -0.04316730264761659 0.0360643676994595 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124541 -0.009155819605617069 0.9990537652981445 -0.005530477486285019 0.04313916854059258 0.007090681752166228 0.9993230986318842 -0.03609801619284766 -0.04291032831253398 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419695 0.9990678575462876 0.001558253989975221 0.04313916854059263 8.673617379884035e-19 0.9993482542271943 -0.03609801619284767 -0.04316730264761665 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285019 0.04313916854059261 0.007090681752166228 0.9993230986318842 -0.03609801619284766 -0.042910328312534 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.00155825398997522 0.04313916854059258 -4.336808689942018e-19 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285021 0.04313916854059255 0.007090681752166228 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419695 0.9990678575462876 0.00155825398997522 0.04313916854059263 1.734723475976807e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761665 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617056 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253398 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606623 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059252 8.673617379884035e-19 0.9993482542271943 -0.03609801619284768 -0.04316730264761653 0.03606436769945953 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617056 0.9990537652981445 -0.005530477486285025 0.04313916854059252 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253391 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606623 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.818925648462312e-18 0.9993482542271943 -0.03609801619284768 -0.04316730264761659 0.03606436769945953 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617056 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284767 -0.04291032831253392 0.03636974511243227 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606623 -0.02810879162419694 0.9990678575462876 0.001558253989975219 0.04313916854059252 -8.673617379884035e-19 0.9993482542271943 -0.03609801619284767 -0.04316730264761653 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285022 0.04313916854059253 0.00709068175216623 0.9993230986318842 -0.03609801619284767 -0.04291032831253393 0.03636974511243227 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606623 -0.02810879162419696 0.9990678575462876 0.001558253989975221 0.04313916854059258 -6.505213034913027e-19 0.9993482542271943 -0.03609801619284768 -0.04316730264761659 0.03606436769945953 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285021 0.04313916854059255 0.007090681752166228 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606623 -0.02810879162419696 0.9990678575462876 0.00155825398997522 0.04313916854059258 -4.336808689942018e-19 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.007090681752166231 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.001558253989975219 0.04313916854059252 -2.168404344971009e-19 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124543 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284767 -0.04291032831253393 0.03636974511243227 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.035766082959412e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.00709068175216623 0.9993230986318842 -0.03609801619284767 -0.04291032831253394 0.03636974511243227 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606623 -0.02810879162419696 0.9990678575462876 0.00155825398997522 0.04313916854059258 2.168404344971009e-19 0.9993482542271943 -0.03609801619284768 -0.04316730264761659 0.03606436769945953 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285021 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284767 -0.04291032831253397 0.03636974511243227 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606623 -0.02810879162419694 0.9990678575462876 0.001558253989975219 0.04313916854059252 -8.673617379884035e-19 0.9993482542271943 -0.03609801619284767 -0.04316730264761653 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124543 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284767 -0.04291032831253393 0.03636974511243227 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.00155825398997522 0.04313916854059258 -4.336808689942018e-19 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285021 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284767 -0.04291032831253394 0.03636974511243227 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975219 0.04313916854059258 4.336808689942018e-19 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202728 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975217 0.04313916854059258 2.168404344971009e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322783 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059258 0.00709068175216623 0.9993230986318842 -0.03609801619284766 -0.04291032831253397 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.04869259570202727 -0.001985390890606624 -0.02810879162419694 0.9990678575462876 0.00155825398997522 0.04313916854059252 -1.951563910473908e-18 0.9993482542271943 -0.03609801619284769 -0.04316730264761653 0.03606436769945954 0.9984167192933857 0 -0 -0 0 0 0
3 0.09225341065322781 -0.001895145850124542 -0.009155819605617049 0.9990537652981445 -0.005530477486285024 0.04313916854059253 0.007090681752166232 0.9993230986318842 -0.03609801619284766 -0.04291032831253393 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
1 -0.121 -8.796847998598882e-19 -0.08 1 0 0 0 1 0 0 0 1 -0 -0 0 -0 0 0
2 -0.0486925957020273 -0.001985390890606622 -0.02810879162419696 0.9990678575462876 0.001558253989975216 0.04313916854059258 3.903127820947816e-18 0.9993482542271943 -0.03609801619284767 -0.04316730264761659 0.03606436769945952 0.9984167192933857 0 -0 -0 0 0 0
3 0.0922534106532278 -0.001895145850124542 -0.009155819605617063 0.9990537652981445 -0.005530477486285022 0.04313916854059255 0.007090681752166229 0.9993230986318842 -0.03609801619284766 -0.04291032831253394 0.03636974511243225 0.9984167192933857 0 0 0 0 0 -0
4 0.2310424585814533 -7.816912863716824e-17 7.816912871471643e-17 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0

297
OndselSolver/MBDynCase2.mbd Normal file
View File

@@ -0,0 +1,297 @@
#-----------------------------------------------------------------------------
# [Data Block]
begin: data;
problem: initial value;
end: data;
#-----------------------------------------------------------------------------
# [Problem Block]
begin: initial value;
initial time: 0.0;
final time: 3.0;
time step: 0.01;
max iterations: 100;
tolerance: 1e-06;
derivatives tolerance: 0.0001;
derivatives max iterations: 100;
derivatives coefficient: auto;
end: initial value;
#-----------------------------------------------------------------------------
# [Control Data Block]
begin: control data;
max iterations: 1000;
default orientation: euler321;
omega rotates: no;
print: none;
initial stiffness: 1.0, 1.0;
structural nodes: 4;
rigid bodies: 3;
joints: 6;
end: control data;
#-----------------------------------------------------------------------------
# [Design Variables]
#Generic bodies
#body: 2
set: integer body_2 = 2; #body label
set: real mass_2 = 1.448636188351172; #mass [kg]
set: real volume_2 = 0.00018337166941154076; #volume [m^3]
#body: 3
set: integer body_3 = 3; #body label
set: real mass_3 = 2.8529486557067685; #mass [kg]
set: real volume_3 = 0.0003611327412287049; #volume [m^3]
#body: 4
set: integer body_4 = 4; #body label
set: real mass_4 = 10.859427202622141; #mass [kg]
set: real volume_4 = 0.0013746110383066003; #volume [m^3]
#Nodes
#node: 1
set: integer structural_node_1 = 1; #node label
#node: 2
set: integer structural_node_2 = 2; #node label
#node: 3
set: integer structural_node_3 = 3; #node label
#node: 4
set: integer structural_node_4 = 4; #node label
#Joints
#joint: 1
set: integer joint_1 = 1; #joint label
#joint: 2
set: integer joint_2 = 2; #joint label
#joint: 3
set: integer joint_3 = 3; #joint label
#joint: 4
set: integer joint_4 = 4; #joint label
#joint: 5
set: integer joint_5 = 5; #joint label
#joint: 6
set: integer joint_6 = 6; #joint label
#Nodes: initial conditions
#node: 1
set: real Px_1 = -0.121; #X component of the absolute position [m]
set: real Py_1 = -1.218180697837851e-18; #Y component of the absolute position [m]
set: real Pz_1 = -0.08; #Z component of the absolute position [m]
set: real Vx_1 = 0.0; #X component of the absolute velocity [m/s]
set: real Vy_1 = 0.0; #Y component of the absolute velocity [m/s]
set: real Vz_1 = 0.0; #Z component of the absolute velocity [m/s]
set: real Wx_1 = 0.0; #X component of the absolute angular velocity [rad/s]
set: real Wy_1 = 0.0; #Y component of the absolute angular velocity [rad/s]
set: real Wz_1 = 0.0; #Z component of the absolute angular velocity [rad/s]
#node: 2
set: real Px_2 = -0.047537048944738425; #X component of the absolute position [m]
set: real Py_2 = 0.09742200410568831; #Y component of the absolute position [m]
set: real Pz_2 = -0.030293476812230588; #Z component of the absolute position [m]
set: real Vx_2 = 0.0; #X component of the absolute velocity [m/s]
set: real Vy_2 = 0.0; #Y component of the absolute velocity [m/s]
set: real Vz_2 = 0.0; #Z component of the absolute velocity [m/s]
set: real Wx_2 = 0.0; #X component of the absolute angular velocity [rad/s]
set: real Wy_2 = 0.0; #Y component of the absolute angular velocity [rad/s]
set: real Wz_2 = 0.0; #Z component of the absolute angular velocity [rad/s]
#node: 3
set: real Px_3 = 0.07099630277370235; #X component of the absolute position [m]
set: real Py_3 = -0.07364765799707981; #Y component of the absolute position [m]
set: real Pz_3 = 0.058407900823760565; #Z component of the absolute position [m]
set: real Vx_3 = 0.0; #X component of the absolute velocity [m/s]
set: real Vy_3 = 0.0; #Y component of the absolute velocity [m/s]
set: real Vz_3 = 0.0; #Z component of the absolute velocity [m/s]
set: real Wx_3 = 0.0; #X component of the absolute angular velocity [rad/s]
set: real Wy_3 = 0.0; #Y component of the absolute angular velocity [rad/s]
set: real Wz_3 = 0.0; #Z component of the absolute angular velocity [rad/s]
#node: 4
set: real Px_4 = 0.3723079639890564; #X component of the absolute position [m]
set: real Py_4 = 0.04333150035096042; #Y component of the absolute position [m]
set: real Pz_4 = 0.008140985321785409; #Z component of the absolute position [m]
set: real Vx_4 = 0.0; #X component of the absolute velocity [m/s]
set: real Vy_4 = 0.0; #Y component of the absolute velocity [m/s]
set: real Vz_4 = 0.0; #Z component of the absolute velocity [m/s]
set: real Wx_4 = 0.0; #X component of the absolute angular velocity [rad/s]
set: real Wy_4 = 0.0; #Y component of the absolute angular velocity [rad/s]
set: real Wz_4 = 0.0; #Z component of the absolute angular velocity [rad/s]
#-----------------------------------------------------------------------------
# [Intermediate Variables]
#Moments of inertia and relative center of mass
#body 2:
set: real Ixx_2 = 0.0028717510150880004; #moment of inertia [kg*m^2]
set: real Iyy_2 = 0.002864447840812; #moment of inertia [kg*m^2]
set: real Izz_2 = 0.0007089594589930001; #moment of inertia [kg*m^2]
set: real Rx_2 = 7.105427357601002e-18; #X component of the relative center of mass [m]
set: real Ry_2 = 0.0; #Y component of the relative center of mass [m]
set: real Rz_2 = 7.105427357601002e-18; #Z component of the relative center of mass [m]
#body 3:
set: real Ixx_3 = 0.033837921987970004; #moment of inertia [kg*m^2]
set: real Iyy_3 = 0.033715148099504; #moment of inertia [kg*m^2]
set: real Izz_3 = 0.001956310318013; #moment of inertia [kg*m^2]
set: real Rx_3 = 2.842170943040401e-17; #X component of the relative center of mass [m]
set: real Ry_3 = -1.4210854715202004e-17; #Y component of the relative center of mass [m]
set: real Rz_3 = 0.0; #Z component of the relative center of mass [m]
#body 4:
set: real Ixx_4 = 0.07706742098794901; #moment of inertia [kg*m^2]
set: real Iyy_4 = 0.066351815798527; #moment of inertia [kg*m^2]
set: real Izz_4 = 0.061792350456255; #moment of inertia [kg*m^2]
set: real Rx_4 = 2.842170943040401e-16; #X component of the relative center of mass [m]
set: real Ry_4 = 2.1316282072803006e-17; #Y component of the relative center of mass [m]
set: real Rz_4 = 2.2737367544323206e-16; #Z component of the relative center of mass [m]
#-----------------------------------------------------------------------------
# [Nodes Block]
begin: nodes;
structural: structural_node_1,
static,
Px_1, Py_1, Pz_1, #<absolute_position> [m]
3, 0.0, 0.0, 1.0, 2, 0.0, 1.0, 0.0, #<absolute_orientation_matrix>
Vx_1, Vy_1, Vz_1, #<absolute_velocity> [m/s]
Wx_1, Wy_1, Wz_1; #<absolute_angular_velocity> [rad/s]
structural: structural_node_2,
dynamic,
Px_2, Py_2, Pz_2, #<absolute_position> [m]
3, 0.28116838555915347, -0.12674940821214617, 0.9512512425641977, 2, -0.12674940821214617, 0.9776506595433675, 0.16773125949652098, #<absolute_orientation_matrix>
Vx_2, Vy_2, Vz_2, #<absolute_velocity> [m/s]
Wx_2, Wy_2, Wz_2; #<absolute_angular_velocity> [rad/s]
structural: structural_node_3,
dynamic,
Px_3, Py_3, Pz_3, #<absolute_position> [m]
3, -0.27178893568691503, -0.25783416049630004, 0.9271743741709766, 2, 0.014330116918634624, 0.9622501868990581, 0.271788935686915, #<absolute_orientation_matrix>
Vx_3, Vy_3, Vz_3, #<absolute_velocity> [m/s]
Wx_3, Wy_3, Wz_3; #<absolute_angular_velocity> [rad/s]
structural: structural_node_4,
dynamic,
Px_4, Py_4, Pz_4, #<absolute_position> [m]
3, 0.2588190451025211, 0.0, 0.9659258262890682, 2, 0.0, 1.0, 0.0, #<absolute_orientation_matrix>
Vx_4, Vy_4, Vz_4, #<absolute_velocity> [m/s]
Wx_4, Wy_4, Wz_4; #<absolute_angular_velocity> [rad/s]
end: nodes;
#-----------------------------------------------------------------------------
# [Elements Block]
begin: elements;
#-----------------------------------------------------------------------------
# [Bodies]
body: body_2,
structural_node_2, #<node_label>
mass_2, #<mass> [kg]
Rx_2, Ry_2, Rz_2, #<relative_center_of_mass> [m]
diag, Ixx_2, Iyy_2, Izz_2, #<inertia matrix> [kg*m^2]
orientation, 3, -0.0054384608129255385, 0.8559103374577453, 0.5150405937686557, 2, 0.9969290667160357, -0.0024978913689130133, 0.0023196850194898005;
body: body_3,
structural_node_3, #<node_label>
mass_3, #<mass> [kg]
Rx_3, Ry_3, Rz_3, #<relative_center_of_mass> [m]
diag, Ixx_3, Iyy_3, Izz_3, #<inertia matrix> [kg*m^2]
orientation, 3, 0.9973238325492868, 0.0012847690482160057, -0.002629529780301787, 2, -0.00011328308715380375, 1.0027304733964244, 0.004450235157436283;
body: body_4,
structural_node_4, #<node_label>
mass_4, #<mass> [kg]
Rx_4, Ry_4, Rz_4, #<relative_center_of_mass> [m]
diag, Ixx_4, Iyy_4, Izz_4, #<inertia matrix> [kg*m^2]
orientation, 3, -8.551421488581235e-05, 0.0, 0.9957768995806164, 2, 0.0, 1.0, 0.0;
#-----------------------------------------------------------------------------
# [Joints]
joint: joint_1,
clamp,
structural_node_1, #<node_label>
-0.121, -1.218180697837851e-18, -0.08, #<absolute_pin_position> [m]
3, 0.0, 0.0, 1.0, 2, 0.0, 1.0, 0.0; #<absolute_orientation_matrix>
joint: joint_2,
axial rotation,
structural_node_1, #<node_1_label>
0.0, 1.218180697837851e-18, 0.05, #<relative_offset_1> [m]
orientation, 3, 0.0, 0.0, 1.0, 2, 0.0, 1.0, 0.0, #<relative_orientation_matrix_1>
structural_node_2, #<node_2_label>
-0.03739853284269051, 0.0, 0.0032867622552210634, #<relative_offset_2> [m]
orientation, 3, 5.204170427930421e-18, 0.0, 1.0, 2, guess, #<relative_orientation_matrix_2>
string, "model::drive(1, Time)"; #<angular_velocity> [rad/s]
joint: joint_3,
revolute hinge,
structural_node_2, #<node_1_label>
0.03260146715730949, 1.4210854715202004e-17, 0.05328676225522106, #<relative_position_1> [m]
orientation, 3, 5.204170427930421e-18, 0.0, 1.0, 2, 0.0, 1.0, 0.0, #<relative_pin_orientation_matrix_1>
structural_node_3, #<node_2_label>
-0.1400000000000079, -1.0444978215673472e-15, 0.024999999999998038, #<relative_position_2> [m]
orientation, 3, -5.551115123125784e-17, -5.984795992119986e-17, 1.0, 2, guess; #<relative_pin_orientation_matrix_2>
joint: joint_4,
in line,
structural_node_3, #<node_1_label>
0.13999999999999133, 4.4231285301066236e-16, 9.79127889877418e-15, #<relative_line_position> [m]
3, 2.7195091690402506e-15, 1.2586758486779817e-14, 1.0, 2, 0.6882367162699149, 0.7254861972346578, -1.1003185610451133e-14, #<relative_orientation>
structural_node_4, #<node_2_label>
offset, -0.045580834634119244, -2.0299354019925886e-10, 1.2562251640702015e-08; #<relative_offset> [m]
joint: joint_5,
in line,
structural_node_1, #<node_1_label>
0.0, 1.2181806978377854e-18, 0.08, #<relative_line_position> [m]
3, 1.0, -2.220446049250313e-16, 2.220446049250313e-16, 2, -2.220446049250313e-16, 0.0, 1.0, #<relative_orientation>
structural_node_4, #<node_2_label>
offset, -0.045580834634119244, -2.0299354019925886e-10, 1.2562251640702015e-08; #<relative_offset> [m]
joint: joint_6,
prismatic,
structural_node_1, #<node_1_label>
orientation, 3, 0.0, 0.0, 1.0, 2, 0.0, 1.0, 0.0, #relative_orientation_matrix_1>
structural_node_4, #<node_2_label>
orientation, 3, 0, 0, 1, 2, 0, 1, 0; #relative_orientation_matrix_2>
#-----------------------------------------------------------------------------
# [Drive callers]
drive caller: 1, name,"drive:1", ramp, 6.28, 0.0, 1.0, 0.0;
end: elements;

1204
OndselSolver/MBDynCase2.mov Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -40,18 +40,18 @@
#body: 2
set: integer body_2 = 2; #body label
set: real mass_2 = 1.4486361883511718; #mass [kg]
set: real volume_2 = 0.00018337166941154073; #volume [m^3]
set: real mass_2 = 1.448636188351172; #mass [kg]
set: real volume_2 = 0.00018337166941154076; #volume [m^3]
#body: 3
set: integer body_3 = 3; #body label
set: real mass_3 = 2.852948655706769; #mass [kg]
set: real volume_3 = 0.00036113274122870494; #volume [m^3]
set: real mass_3 = 2.8529486557067685; #mass [kg]
set: real volume_3 = 0.0003611327412287049; #volume [m^3]
#body: 4
set: integer body_4 = 4; #body label
set: real mass_4 = 10.859427202622149; #mass [kg]
set: real volume_4 = 0.001374611038306601; #volume [m^3]
set: real mass_4 = 10.859427202622141; #mass [kg]
set: real volume_4 = 0.0013746110383066003; #volume [m^3]
#Nodes
@@ -103,9 +103,9 @@
set: real Wz_1 = 0.0; #Z component of the absolute angular velocity [rad/s]
#node: 2
set: real Px_2 = -0.04942161873703145; #X component of the absolute position [m]
set: real Py_2 = 0.10494947176309491; #Y component of the absolute position [m]
set: real Pz_2 = -0.03019496284287986; #Z component of the absolute position [m]
set: real Px_2 = -0.047537048944738425; #X component of the absolute position [m]
set: real Py_2 = 0.09742200410568831; #Y component of the absolute position [m]
set: real Pz_2 = -0.030293476812230588; #Z component of the absolute position [m]
set: real Vx_2 = 0.0; #X component of the absolute velocity [m/s]
set: real Vy_2 = 0.0; #Y component of the absolute velocity [m/s]
@@ -116,9 +116,9 @@
set: real Wz_2 = 0.0; #Z component of the absolute angular velocity [rad/s]
#node: 3
set: real Px_3 = 0.0745132790133479; #X component of the absolute position [m]
set: real Py_3 = -0.07931074487337057; #Y component of the absolute position [m]
set: real Pz_3 = 0.047693362858105263; #Z component of the absolute position [m]
set: real Px_3 = 0.07099630277370235; #X component of the absolute position [m]
set: real Py_3 = -0.07364765799707981; #Y component of the absolute position [m]
set: real Pz_3 = 0.058407900823760565; #Z component of the absolute position [m]
set: real Vx_3 = 0.0; #X component of the absolute velocity [m/s]
set: real Vy_3 = 0.0; #Y component of the absolute velocity [m/s]
@@ -129,9 +129,9 @@
set: real Wz_3 = 0.0; #Z component of the absolute angular velocity [rad/s]
#node: 4
set: real Px_4 = 0.3575148357029521; #X component of the absolute position [m]
set: real Py_4 = 0.043331500350960436; #Y component of the absolute position [m]
set: real Pz_4 = 0.10422397969746418; #Z component of the absolute position [m]
set: real Px_4 = 0.3723079639890564; #X component of the absolute position [m]
set: real Py_4 = 0.04333150035096042; #Y component of the absolute position [m]
set: real Pz_4 = 0.008140985321785409; #Z component of the absolute position [m]
set: real Vx_4 = 0.0; #X component of the absolute velocity [m/s]
set: real Vy_4 = 0.0; #Y component of the absolute velocity [m/s]
@@ -151,17 +151,17 @@
set: real Iyy_2 = 0.002864447840812; #moment of inertia [kg*m^2]
set: real Izz_2 = 0.0007089594589930001; #moment of inertia [kg*m^2]
set: real Rx_2 = 0.0; #X component of the relative center of mass [m]
set: real Rx_2 = 7.105427357601002e-18; #X component of the relative center of mass [m]
set: real Ry_2 = 0.0; #Y component of the relative center of mass [m]
set: real Rz_2 = 0.0; #Z component of the relative center of mass [m]
set: real Rz_2 = 7.105427357601002e-18; #Z component of the relative center of mass [m]
#body 3:
set: real Ixx_3 = 0.033837921987970004; #moment of inertia [kg*m^2]
set: real Iyy_3 = 0.033715148099504; #moment of inertia [kg*m^2]
set: real Izz_3 = 0.001956310318013; #moment of inertia [kg*m^2]
set: real Rx_3 = 0.0; #X component of the relative center of mass [m]
set: real Ry_3 = 0.0; #Y component of the relative center of mass [m]
set: real Rx_3 = 2.842170943040401e-17; #X component of the relative center of mass [m]
set: real Ry_3 = -1.4210854715202004e-17; #Y component of the relative center of mass [m]
set: real Rz_3 = 0.0; #Z component of the relative center of mass [m]
#body 4:
@@ -169,9 +169,9 @@
set: real Iyy_4 = 0.066351815798527; #moment of inertia [kg*m^2]
set: real Izz_4 = 0.061792350456255; #moment of inertia [kg*m^2]
set: real Rx_4 = 0.0; #X component of the relative center of mass [m]
set: real Ry_4 = 0.0; #Y component of the relative center of mass [m]
set: real Rz_4 = 0.0; #Z component of the relative center of mass [m]
set: real Rx_4 = 2.842170943040401e-16; #X component of the relative center of mass [m]
set: real Ry_4 = 2.1316282072803006e-17; #Y component of the relative center of mass [m]
set: real Rz_4 = 2.2737367544323206e-16; #Z component of the relative center of mass [m]
#-----------------------------------------------------------------------------
# [Nodes Block]
@@ -188,21 +188,21 @@
structural: structural_node_2,
dynamic,
Px_2, Py_2, Pz_2, #<absolute_position> [m]
3, 0.24321034680169393, 0.08852132690137694, 0.9659258262890683, 2, -0.3420201433256683, 0.9396926207859085, -1.8041124150158794e-16, #<absolute_orientation_matrix>
3, 0.28116838555915347, -0.12674940821214617, 0.9512512425641977, 2, -0.12674940821214617, 0.9776506595433675, 0.16773125949652098, #<absolute_orientation_matrix>
Vx_2, Vy_2, Vz_2, #<absolute_velocity> [m/s]
Wx_2, Wy_2, Wz_2; #<absolute_angular_velocity> [rad/s]
structural: structural_node_3,
dynamic,
Px_3, Py_3, Pz_3, #<absolute_position> [m]
3, -0.17364817766693005, -3.122502256758253e-16, 0.9848077530122081, 2, 0.17101007166283402, 0.9848077530122081, 0.030153689607046008, #<absolute_orientation_matrix>
3, -0.27178893568691503, -0.25783416049630004, 0.9271743741709766, 2, 0.014330116918634624, 0.9622501868990581, 0.271788935686915, #<absolute_orientation_matrix>
Vx_3, Vy_3, Vz_3, #<absolute_velocity> [m/s]
Wx_3, Wy_3, Wz_3; #<absolute_angular_velocity> [rad/s]
structural: structural_node_4,
dynamic,
Px_4, Py_4, Pz_4, #<absolute_position> [m]
3, 0.0, 0.0, 1.0, 2, 0.0, 1.0, 0.0, #<absolute_orientation_matrix>
3, 0.2588190451025211, 0.0, 0.9659258262890682, 2, 0.0, 1.0, 0.0, #<absolute_orientation_matrix>
Vx_4, Vy_4, Vz_4, #<absolute_velocity> [m/s]
Wx_4, Wy_4, Wz_4; #<absolute_angular_velocity> [rad/s]
@@ -220,22 +220,22 @@
structural_node_2, #<node_label>
mass_2, #<mass> [kg]
Rx_2, Ry_2, Rz_2, #<relative_center_of_mass> [m]
diag, Ixx_2, Iyy_2, Izz_2, #<inertia_matrix> [kg*m^2]
orientation, 3, -6.071532165918825e-17, -2.775557561562891e-17, 1.0, 2, 1.1102230246251565e-16, 1.0, 2.775557561562892e-17;
diag, Ixx_2, Iyy_2, Izz_2, #<inertia matrix> [kg*m^2]
orientation, 3, -0.0054384608129255385, 0.8559103374577453, 0.5150405937686557, 2, 0.9969290667160357, -0.0024978913689130133, 0.0023196850194898005;
body: body_3,
structural_node_3, #<node_label>
mass_3, #<mass> [kg]
Rx_3, Ry_3, Rz_3, #<relative_center_of_mass> [m]
diag, Ixx_3, Iyy_3, Izz_3, #<inertia_matrix> [kg*m^2]
orientation, 3, -4.119968255444917e-18, -1.734723475976807e-18, 1.0, 2, -3.573502826499754e-36, 1.0, 1.734723475976807e-18;
diag, Ixx_3, Iyy_3, Izz_3, #<inertia matrix> [kg*m^2]
orientation, 3, 0.9973238325492868, 0.0012847690482160057, -0.002629529780301787, 2, -0.00011328308715380375, 1.0027304733964244, 0.004450235157436283;
body: body_4,
structural_node_4, #<node_label>
mass_4, #<mass> [kg]
Rx_4, Ry_4, Rz_4, #<relative_center_of_mass> [m]
diag, Ixx_4, Iyy_4, Izz_4, #<inertia_matrix> [kg*m^2]
orientation, 3, 0.0, 0.0, 1.0, 2, 0.0, 1.0, 0.0;
diag, Ixx_4, Iyy_4, Izz_4, #<inertia matrix> [kg*m^2]
orientation, 3, -8.551421488581235e-05, 0.0, 0.9957768995806164, 2, 0.0, 1.0, 0.0;
#-----------------------------------------------------------------------------
# [Joints]
@@ -248,50 +248,50 @@
joint: joint_2,
axial rotation,
1,#<node_1>
structural_node_1, #<node_1_label>
0.0, 1.218180697837851e-18, 0.05, #<relative_offset_1> [m]
orientation, 3, 0.0, 0.0, 1.0, 2, 0.0, 1.0, 0.0, #<relative_orientation_matrix_1>
2, #<node_2>
-0.03739853284269052, 0.0, 0.0032867622552210526, #<relative_offset_2> [m]
orientation, 3, -6.678685382510707e-17, -2.0816681711721682e-17, 1.0, 2, guess, #<relative_orientation_matrix_2>
structural_node_2, #<node_2_label>
-0.03739853284269051, 0.0, 0.0032867622552210634, #<relative_offset_2> [m]
orientation, 3, 5.204170427930421e-18, 0.0, 1.0, 2, guess, #<relative_orientation_matrix_2>
string, "model::drive(1, Time)"; #<angular_velocity> [rad/s]
joint: joint_3,
revolute hinge,
structural_node_2, #<node_1_label>
0.03260146715730951, 0.0, 0.05328676225522103, #<relative_position_1> [m]
orientation, 3, -6.678685382510707e-17, -2.0816681711721682e-17, 1.0, 2, 1.1102230246251565e-16, 1.0, 2.0816681711721688e-17, #<relative_pin_orientation_matrix_1>
0.03260146715730949, 1.4210854715202004e-17, 0.05328676225522106, #<relative_position_1> [m]
orientation, 3, 5.204170427930421e-18, 0.0, 1.0, 2, 0.0, 1.0, 0.0, #<relative_pin_orientation_matrix_1>
structural_node_3, #<node_2_label>
-0.14000000000000795, -1.0302869668521452e-15, 0.024999999999998076, #<relative_position_2> [m]
orientation, 3, -4.119968255444917e-18, -0.0, 1.0, 2, guess; #<relative_pin_orientation_matrix_2>
-0.1400000000000079, -1.0444978215673472e-15, 0.024999999999998038, #<relative_position_2> [m]
orientation, 3, -5.551115123125784e-17, -5.984795992119986e-17, 1.0, 2, guess; #<relative_pin_orientation_matrix_2>
joint: joint_4,
in line,
structural_node_3, #<node_1_label>
0.13999999999999274, -9.25814980234918e-16, 4.0323300254385686e-15, #<relative_line_position> [m]
3, -5.818367705906288e-15, -7.134403807651544e-16, 1.0, 2, 0.9848077530122082, 0.1736481776669303, 5.853861248646238e-15, #<relative_orientation>
0.13999999999999133, 4.4231285301066236e-16, 9.79127889877418e-15, #<relative_line_position> [m]
3, 2.7195091690402506e-15, 1.2586758486779817e-14, 1.0, 2, 0.6882367162699149, 0.7254861972346578, -1.1003185610451133e-14, #<relative_orientation>
structural_node_4, #<node_2_label>
offset, -0.045580834634119466, -2.0299355441011357e-10, 1.2562251569647742e-08; #<relative_offset> [m]
offset, -0.045580834634119244, -2.0299354019925886e-10, 1.2562251640702015e-08; #<relative_offset> [m]
joint: joint_5,
in line,
structural_node_1, #<node_1_label>
0.0, 1.2181806978377854e-18, 0.08, #<relative_line_position> [m]
3, 1.0, -2.220446049250313e-16, 2.220446049250313e-16, 2, -2.220446049250313e-16, 0.0, 1.0, #<relative_orientation>
structural_node_4, #<node_2_label>
offset, -0.045580834634119244, -2.0299354019925886e-10, 1.2562251640702015e-08; #<relative_offset> [m]
joint: joint_6,
prismatic,
structural_node_1, #<node_1_label>
orientation, 3, 0.0, 0.0, 1.0, 2, 0.0, 1.0, 0.0, #relative_orientation_matrix_1>
structural_node_4, #<node_2_label>
orientation, 3, 0, 0, 1, 2, 0, 1, 0; #relative_orientation_matrix_2>
joint: joint_6,
in line,
structural_node_1, #<node_1_label>
0.0, 1.218180697837851e-18, 0.071, #<relative_line_position> [m]
3, 1.0, 0.0, 2.220446049250313e-16, 2, 0.0, 1.0, 0.0, #<relative_orientation>
structural_node_4, #<node_2_label>
offset, 0.0, 0.0, 0.0; #<relative_offset> [m]
#-----------------------------------------------------------------------------
# [Drive callers]
drive caller: 1, name,"drive:1", cosine, 0.25, 3.1416, 10.0, half, 0.0;
drive caller: 1, name,"drive:1", ramp, 6.28, 0.0, 1.0, 0.0;
end: elements;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,78 @@
#include <regex>
#include "MBDynDrive.h"
using namespace MbD;
void MbD::MBDynDrive::parseMBDyn(std::string line)
{
driveString = line;
size_t previousPos = 0;
auto pos = line.find(":");
auto front = line.substr(previousPos, pos - previousPos);
assert(front.find("drive caller") != std::string::npos);
auto arguments = std::vector<std::string>();
std::string argument;
while (true) {
previousPos = pos;
pos = line.find(",", pos + 1);
if (pos != std::string::npos) {
argument = line.substr(previousPos + 1, pos - previousPos - 1);
arguments.push_back(argument);
}
else {
argument = line.substr(previousPos + 1);
arguments.push_back(argument);
break;
}
}
auto iss = std::istringstream(arguments.at(0));
iss >> name;
arguments.erase(arguments.begin());
assert(arguments.at(0).find("name") != std::string::npos);
arguments.erase(arguments.begin());
iss = std::istringstream(arguments.at(0));
iss >> driveName;
driveName = std::regex_replace(driveName, std::regex("\""), "");
arguments.erase(arguments.begin());
readFunction(arguments);
}
void MbD::MBDynDrive::readFunction(std::vector<std::string>& args)
{
if (args.empty()) return;
std::string str;
auto iss = std::istringstream(args.at(0));
iss >> str;
if (str.find("ramp") != std::string::npos) {
args.erase(args.begin());
std::string slope, initValue, initTime, finalTime;
slope = popOffTop(args);
initTime = popOffTop(args);
finalTime = popOffTop(args);
initValue = popOffTop(args);
slope.erase(remove_if(slope.begin(), slope.end(), isspace), slope.end());
initTime.erase(remove_if(initTime.begin(), initTime.end(), isspace), initTime.end());
finalTime.erase(remove_if(finalTime.begin(), finalTime.end(), isspace), finalTime.end());
initValue.erase(remove_if(initValue.begin(), initValue.end(), isspace), initValue.end());
//f = slope*(time - t0) + f0
//rampstep(time, t0, f0, t1, f1)
//t0 = initTime
//f0 = initValue
//t1 = finalTime
//f1 = initValue + slope * (finalTime - initTime)
auto ss = std::stringstream();
ss << "rampstep(time, " << initTime << ", " << initValue << ", " << finalTime << ", "
<< initValue << " + " << slope << "*(" << finalTime << " - " << initTime << "))";
formula = ss.str();
}
else {
assert(false);
}
}
void MbD::MBDynDrive::createASMT()
{
assert(false);
}

24
OndselSolver/MBDynDrive.h Normal file
View File

@@ -0,0 +1,24 @@
/***************************************************************************
* Copyright (c) 2023 Ondsel, Inc. *
* *
* This file is part of OndselSolver. *
* *
* See LICENSE file for details about copyright. *
***************************************************************************/
#pragma once
#include "MBDynElement.h"
namespace MbD {
class MBDynDrive : public MBDynElement
{
public:
void parseMBDyn(std::string line);
void readFunction(std::vector<std::string>& args);
void createASMT() override;
std::string driveString, driveName, formula;
};
}

View File

@@ -32,6 +32,55 @@ void MbD::MBDynItem::parseMBDyn(std::vector<std::string>& lines)
assert(false);
}
std::vector<std::string> MbD::MBDynItem::collectArgumentsFor(std::string title, std::string& statement)
{
size_t previousPos = 0;
auto pos = statement.find(":");
auto front = statement.substr(previousPos, pos - previousPos);
assert(front.find(title) != std::string::npos);
auto arguments = std::vector<std::string>();
std::string argument;
while (true) {
previousPos = pos;
pos = statement.find(",", pos + 1);
if (pos != std::string::npos) {
argument = statement.substr(previousPos + 1, pos - previousPos - 1);
arguments.push_back(argument);
}
else {
argument = statement.substr(previousPos + 1);
arguments.push_back(argument);
break;
}
}
auto arguments2 = std::vector<std::string>();
while (!arguments.empty()) {
argument = arguments[0];
auto n = std::count(argument.begin(), argument.end(), '"');
if ((n % 2) == 0) {
arguments2.push_back(argument);
arguments.erase(arguments.begin());
}
else {
//Need to find matching '"'
auto it = std::find_if(arguments.begin() + 1, arguments.end(), [](const std::string& s) {
auto nn = std::count(s.begin(), s.end(), '"');
if ((nn % 2) == 1) return true;
});
std::vector<std::string> needToCombineArgs(arguments.begin(), it + 1);
arguments.erase(arguments.begin(), it + 1);
std::stringstream ss;
ss << needToCombineArgs[0];
needToCombineArgs.erase(needToCombineArgs.begin());
for (auto& arg : needToCombineArgs) {
ss << ',' << arg;
}
arguments2.push_back(ss.str());
}
}
return arguments2;
}
std::vector<std::string>::iterator MbD::MBDynItem::findLineWith(std::vector<std::string>& lines, std::vector<std::string>& tokens)
{
auto it = std::find_if(lines.begin(), lines.end(), [&](const std::string& line) {
@@ -56,6 +105,21 @@ std::shared_ptr<std::vector<std::shared_ptr<MBDynNode>>> MbD::MBDynItem::mbdynNo
return owner->mbdynNodes();
}
std::shared_ptr<std::vector<std::shared_ptr<MBDynBody>>> MbD::MBDynItem::mbdynBodies()
{
return owner->mbdynBodies();
}
std::shared_ptr<std::vector<std::shared_ptr<MBDynJoint>>> MbD::MBDynItem::mbdynJoints()
{
return owner->mbdynJoints();
}
std::shared_ptr<std::vector<std::shared_ptr<MBDynDrive>>> MbD::MBDynItem::mbdynDrives()
{
return owner->mbdynDrives();
}
std::vector<std::string> MbD::MBDynItem::nodeNames()
{
return owner->nodeNames();
@@ -96,6 +160,18 @@ std::shared_ptr<ASMTAssembly> MbD::MBDynItem::asmtAssembly()
return owner->asmtAssembly();
}
std::string MbD::MBDynItem::formulaFromDrive(std::string driveName, std::string varName)
{
std::vector<std::string> tokens{ "drive:", driveName };
auto drives = mbdynDrives();
auto it = std::find_if(drives->begin(), drives->end(), [&](auto& drive) {
return lineHasTokens(drive->driveName, tokens);
});
auto formula = (*it)->formula;
assert(varName == "Time");
return formula;
}
FColDsptr MbD::MBDynItem::readVector3(std::vector<std::string>& args)
{
auto parser = std::make_shared<SymbolicParser>();
@@ -336,3 +412,11 @@ std::string MbD::MBDynItem::readStringOffTop(std::vector<std::string>& args)
iss >> str;
return str;
}
std::string MbD::MBDynItem::readToken(std::string& line)
{
auto iss = std::istringstream(line);
std::string str;
iss >> str;
return str;
}

View File

@@ -16,6 +16,8 @@ namespace MbD {
class MBDynNode;
class ASMTItem;
class MBDynBody;
class MBDynJoint;
class MBDynDrive;
class ASMTAssembly;
class MBDynItem
@@ -28,9 +30,13 @@ namespace MbD {
void noop();
//void setName(std::string str);
virtual void parseMBDyn(std::vector<std::string>& lines);
static std::vector<std::string> collectArgumentsFor(std::string title, std::string& statement);
std::vector<std::string>::iterator findLineWith(std::vector<std::string>& lines, std::vector<std::string>& tokens);
bool lineHasTokens(const std::string& line, std::vector<std::string>& tokens);
virtual std::shared_ptr<std::vector<std::shared_ptr<MBDynNode>>> mbdynNodes();
virtual std::shared_ptr<std::vector<std::shared_ptr<MBDynBody>>> mbdynBodies();
virtual std::shared_ptr<std::vector<std::shared_ptr<MBDynJoint>>> mbdynJoints();
virtual std::shared_ptr<std::vector<std::shared_ptr<MBDynDrive>>> mbdynDrives();
virtual std::vector<std::string> nodeNames();
virtual std::shared_ptr<std::map<std::string, Symsptr>> mbdynVariables();
virtual std::shared_ptr<std::map<std::string, std::shared_ptr<MBDynReference>>> mbdynReferences();
@@ -39,6 +45,7 @@ namespace MbD {
virtual int nodeidAt(std::string nodeName);
virtual std::shared_ptr<MBDynBody> bodyWithNode(std::string nodeName);
virtual std::shared_ptr<ASMTAssembly> asmtAssembly();
virtual std::string formulaFromDrive(std::string driveName, std::string varName);
FColDsptr readVector3(std::vector<std::string>& args);
FColDsptr readPosition(std::vector<std::string>& args);
@@ -47,6 +54,7 @@ namespace MbD {
FMatDsptr readBasicOrientation(std::vector<std::string>& args);
std::string popOffTop(std::vector<std::string>& args);
std::string readStringOffTop(std::vector<std::string>& args);
std::string readToken(std::string& line);
std::string name;
MBDynItem* owner;

View File

@@ -20,25 +20,26 @@ void MbD::MBDynJoint::initialize()
void MbD::MBDynJoint::parseMBDyn(std::string line)
{
jointString = line;
size_t previousPos = 0;
auto pos = line.find(":");
auto front = line.substr(previousPos, pos - previousPos);
assert(front.find("joint") != std::string::npos);
auto arguments = std::vector<std::string>();
std::string argument;
while (true) {
previousPos = pos;
pos = line.find(",", pos + 1);
if (pos != std::string::npos) {
argument = line.substr(previousPos + 1, pos - previousPos - 1);
arguments.push_back(argument);
}
else {
argument = line.substr(previousPos + 1);
arguments.push_back(argument);
break;
}
}
auto arguments = collectArgumentsFor("joint", line);
//size_t previousPos = 0;
//auto pos = line.find(":");
//auto front = line.substr(previousPos, pos - previousPos);
//assert(front.find("joint") != std::string::npos);
//auto arguments = std::vector<std::string>();
//std::string argument;
//while (true) {
// previousPos = pos;
// pos = line.find(",", pos + 1);
// if (pos != std::string::npos) {
// argument = line.substr(previousPos + 1, pos - previousPos - 1);
// arguments.push_back(argument);
// }
// else {
// argument = line.substr(previousPos + 1);
// arguments.push_back(argument);
// break;
// }
//}
auto ss = std::stringstream();
auto iss = std::istringstream(arguments.at(0));
iss >> name;
@@ -119,7 +120,7 @@ void MbD::MBDynJoint::parseMBDyn(std::string line)
mkr1->nodeStr = "Assembly";
mkr1->rPmP = std::make_shared<FullColumn<double>>(3);
mkr1->aAPm = FullMatrixDouble::identitysptr(3);
readMarkerJ(arguments);
readClampMarkerJ(arguments);
return;
}
else if (joint_type == "prismatic") {
@@ -160,6 +161,15 @@ void MbD::MBDynJoint::readMarkerJ(std::vector<std::string>& args)
mkr2->parseMBDyn(args);
}
void MbD::MBDynJoint::readClampMarkerJ(std::vector<std::string>& args)
{
if (args.empty()) return;
mkr2 = std::make_shared<MBDynMarker>();
mkr2->owner = this;
mkr2->nodeStr = readStringOffTop(args);
mkr2->parseMBDynClamp(args);
}
void MbD::MBDynJoint::readFunction(std::vector<std::string>& args)
{
if (args.empty()) return;
@@ -177,7 +187,8 @@ void MbD::MBDynJoint::readFunction(std::vector<std::string>& args)
auto ss = std::stringstream();
ss << slope << "*(time - " << initTime << ") + " << initValue;
formula = ss.str();
} else if (str.find("single") != std::string::npos) {
}
else if (str.find("single") != std::string::npos) {
args.erase(args.begin());
auto vec3 = readVector3(args);
assert(vec3->at(0) == 0 && vec3->at(1) == 0 && vec3->at(2) == 1);
@@ -185,6 +196,11 @@ void MbD::MBDynJoint::readFunction(std::vector<std::string>& args)
formula = popOffTop(args);
formula = std::regex_replace(formula, std::regex("\""), "");
}
else if (str.find("string") != std::string::npos) {
args.erase(args.begin());
formula = popOffTop(args);
formula = std::regex_replace(formula, std::regex("\""), "");
}
else {
assert(false);
}
@@ -216,7 +232,7 @@ void MbD::MBDynJoint::createASMT()
asmtItem = asmtMotion;
asmtMotion->setName(name.append("Motion"));
asmtMotion->setMotionJoint(asmtJoint->fullName(""));
asmtMotion->setRotationZ(formula);
asmtMotion->setRotationZ(asmtFormulaIntegral());
asmtAsm->addMotion(asmtMotion);
return;
}
@@ -252,3 +268,37 @@ void MbD::MBDynJoint::createASMT()
asmtJoint->setMarkerJ(mkr2->asmtItem->fullName(""));
asmtAssembly()->addJoint(asmtJoint);
}
std::string MbD::MBDynJoint::asmtFormula()
{
auto ss = std::stringstream();
std::string drivestr = "model::drive";
size_t previousPos = 0;
auto pos = formula.find(drivestr);
ss << formula.substr(previousPos, pos - previousPos);
while (pos != std::string::npos) {
previousPos = pos;
pos = formula.find('(', pos + 1);
previousPos = pos;
pos = formula.find(',', pos + 1);
auto driveName = formula.substr(previousPos + 1, pos - previousPos - 1);
driveName = readToken(driveName);
previousPos = pos;
pos = formula.find(')', pos + 1);
auto varName = formula.substr(previousPos + 1, pos - previousPos - 1);
varName = readToken(varName);
//Insert drive formula
ss << formulaFromDrive(driveName, varName);
previousPos = pos;
pos = formula.find(drivestr, pos + 1);
ss << formula.substr(previousPos + 1, pos - previousPos);
}
return ss.str();
}
std::string MbD::MBDynJoint::asmtFormulaIntegral()
{
auto ss = std::stringstream();
ss << "integral(time, " << asmtFormula() << ")";
return ss.str();
}

View File

@@ -18,8 +18,11 @@ namespace MbD {
void parseMBDyn(std::string line);
void readMarkerI(std::vector<std::string>& args);
void readMarkerJ(std::vector<std::string>& args);
void readClampMarkerJ(std::vector<std::string>& args);
void readFunction(std::vector<std::string>& args);
void createASMT() override;
std::string asmtFormula();
std::string asmtFormulaIntegral();
std::string jointString, joint_type, node_1_label, node_2_label;
std::shared_ptr<MBDynMarker> mkr1, mkr2;

View File

@@ -32,6 +32,18 @@ void MbD::MBDynMarker::parseMBDyn(std::vector<std::string>& args)
}
}
void MbD::MBDynMarker::parseMBDynClamp(std::vector<std::string>& args)
{
//rOmO = rOPO + aAOP*rPmP
//aAOm = aAOP * aAPm
auto rOmO = std::make_shared<FullColumn<double>>(3);
auto aAOm = FullMatrix<double>::identitysptr(3);
auto rOPO = readPosition(args);
auto aAOP = readOrientation(args);
rPmP = aAOP->transposeTimesFullColumn(rOmO->minusFullColumn(rOPO));
aAPm = aAOP->transposeTimesFullMatrix(aAOm);
}
void MbD::MBDynMarker::createASMT()
{
auto asmtAsm = asmtAssembly();

View File

@@ -14,7 +14,8 @@ namespace MbD {
class MBDynMarker : public MBDynItem
{
public:
void parseMBDyn(std::vector<std::string>& args) override;
void parseMBDyn(std::vector<std::string>& args);
void parseMBDynClamp(std::vector<std::string>& args);
void createASMT() override;
std::string nodeStr;

View File

@@ -20,13 +20,7 @@ void MbD::MBDynNode::outputLine(int i, std::ostream& os)
auto x = asmtPart->xs->at(i);
auto y = asmtPart->ys->at(i);
auto z = asmtPart->zs->at(i);
auto bryantAngles = std::make_shared<EulerAngles<double>>();
bryantAngles->setRotOrder(1, 2, 3);
bryantAngles->at(0) = asmtPart->bryxs->at(i);
bryantAngles->at(1) = asmtPart->bryys->at(i);
bryantAngles->at(2) = asmtPart->bryzs->at(i);
bryantAngles->calc();
auto aA = bryantAngles->aA;
auto aA = asmtPart->getRotationMatrix(i);
auto vx = asmtPart->vxs->at(i);
auto vy = asmtPart->vys->at(i);
auto vz = asmtPart->vzs->at(i);

View File

@@ -3,6 +3,7 @@
#include <fstream>
#include <algorithm>
#include <numeric>
#include <iomanip>
#include "MBDynSystem.h"
#include "CREATE.h"
@@ -14,12 +15,12 @@
#include "ASMTConstantGravity.h"
#include "ASMTTime.h"
#include "MBDynBody.h"
#include "MBDynJoint.h"
#include "MBDynStructural.h"
#include "SymbolicParser.h"
#include "BasicUserFunction.h"
#include "MBDynJoint.h"
#include "MBDynReference.h"
#include <iomanip>
#include "MBDynDrive.h"
using namespace MbD;
@@ -38,7 +39,6 @@ void MbD::MBDynSystem::runFile(const char* filename)
system->setFilename(filename);
system->parseMBDyn(statements);
system->runKINEMATIC();
system->outputFiles();
}
void MbD::MBDynSystem::parseMBDyn(std::vector<std::string>& lines)
@@ -51,7 +51,7 @@ void MbD::MBDynSystem::parseMBDyn(std::vector<std::string>& lines)
readReferences(lines);
readNodesBlock(lines);
readElementsBlock(lines);
assert(lines.empty());
}
std::shared_ptr<std::vector<std::shared_ptr<MBDynNode>>> MbD::MBDynSystem::mbdynNodes()
@@ -59,6 +59,21 @@ std::shared_ptr<std::vector<std::shared_ptr<MBDynNode>>> MbD::MBDynSystem::mbdyn
return nodes;
}
std::shared_ptr<std::vector<std::shared_ptr<MBDynBody>>> MbD::MBDynSystem::mbdynBodies()
{
return bodies;
}
std::shared_ptr<std::vector<std::shared_ptr<MBDynJoint>>> MbD::MBDynSystem::mbdynJoints()
{
return joints;
}
std::shared_ptr<std::vector<std::shared_ptr<MBDynDrive>>> MbD::MBDynSystem::mbdynDrives()
{
return drives;
}
std::shared_ptr<std::map<std::string, Symsptr>> MbD::MBDynSystem::mbdynVariables()
{
return variables;
@@ -77,7 +92,8 @@ void MbD::MBDynSystem::createASMT()
asmtItem->setName("Assembly");
initialValue->createASMT();
for (auto& node : *nodes) node->createASMT();
for (auto& element : *elements) element->createASMT();
for (auto& body : *bodies) body->createASMT();
for (auto& joint : *joints) joint->createASMT();
}
std::shared_ptr<MBDynNode> MbD::MBDynSystem::nodeAt(std::string nodeName)
@@ -95,12 +111,8 @@ int MbD::MBDynSystem::nodeidAt(std::string nodeName)
std::shared_ptr<MBDynBody> MbD::MBDynSystem::bodyWithNode(std::string nodeName)
{
for (auto& element : *elements) {
std::string str = typeid(element).name();
if (str.find("MBDynBody") != std::string::npos) {
auto body = std::static_pointer_cast<MBDynBody>(element);
if (body->nodeName == nodeName) return body;
}
for (auto& body : *bodies) {
if (body->nodeName == nodeName) return body;
}
return nullptr;
}
@@ -122,8 +134,10 @@ std::vector<std::string> MbD::MBDynSystem::nodeNames()
void MbD::MBDynSystem::runKINEMATIC()
{
createASMT();
asmtAssembly()->outputFile("assembly.asmt");
std::static_pointer_cast<ASMTAssembly>(asmtItem)->runKINEMATIC();
outputFiles();
asmtAssembly()->outputFile("assembly2.asmt");
}
void MbD::MBDynSystem::outputFiles()
@@ -302,31 +316,47 @@ void MbD::MBDynSystem::parseMBDynNodes(std::vector<std::string>& lines)
void MbD::MBDynSystem::parseMBDynElements(std::vector<std::string>& lines)
{
elements = std::make_shared<std::vector<std::shared_ptr<MBDynElement>>>();
std::vector<std::string> bodyToken{ "body:" };
std::vector<std::string> jointToken{ "joint:" };
assert(lines[0].find("begin: elements") != std::string::npos);
lines.erase(lines.begin());
bodies = std::make_shared<std::vector<std::shared_ptr<MBDynBody>>>();
joints = std::make_shared<std::vector<std::shared_ptr<MBDynJoint>>>();
drives = std::make_shared<std::vector<std::shared_ptr<MBDynDrive>>>();
std::vector<std::string> bodyTokens{ "body:" };
std::vector<std::string> jointTokens{ "joint:" };
std::vector<std::string> driveTokens{ "drive", "caller:" };
std::vector<std::string>::iterator it;
while (true) {
it = findLineWith(lines, bodyToken);
it = findLineWith(lines, bodyTokens);
if (it != lines.end()) {
auto body = std::make_shared<MBDynBody>();
body->owner = this;
body->parseMBDyn(*it);
elements->push_back(body);
bodies->push_back(body);
lines.erase(it);
continue;
}
it = findLineWith(lines, jointToken);
it = findLineWith(lines, jointTokens);
if (it != lines.end()) {
auto joint = std::make_shared<MBDynJoint>();
joint->owner = this;
joint->parseMBDyn(*it);
elements->push_back(joint);
joints->push_back(joint);
lines.erase(it);
continue;
}
it = findLineWith(lines, driveTokens);
if (it != lines.end()) {
auto drive = std::make_shared<MBDynDrive>();
drive->owner = this;
drive->parseMBDyn(*it);
drives->push_back(drive);
lines.erase(it);
continue;
}
break;
}
assert(lines[0].find("end: elements") != std::string::npos);
lines.erase(lines.begin());
}
void MbD::MBDynSystem::parseMBDynVariables(std::vector<std::string>& lines)
@@ -349,6 +379,7 @@ void MbD::MBDynSystem::parseMBDynVariables(std::vector<std::string>& lines)
auto userFunc = std::make_shared<BasicUserFunction>(str, 1.0);
parser->parseUserFunction(userFunc);
auto sym = parser->stack->top();
auto val = sym->getValue();
variables->insert(std::make_pair(variable, sym));
lines.erase(it);
}

View File

@@ -11,6 +11,7 @@
#include <string>
#include "MBDynItem.h"
#include "MBDynDrive.h"
namespace MbD {
class MBDynData;
@@ -37,6 +38,9 @@ namespace MbD {
void parseMBDynLabels(std::vector<std::string>& lines);
void parseMBDynReferences(std::vector<std::string>& lines);
std::shared_ptr<std::vector<std::shared_ptr<MBDynNode>>> mbdynNodes() override;
std::shared_ptr<std::vector<std::shared_ptr<MBDynBody>>> mbdynBodies() override;
std::shared_ptr<std::vector<std::shared_ptr<MBDynJoint>>> mbdynJoints() override;
std::shared_ptr<std::vector<std::shared_ptr<MBDynDrive>>> mbdynDrives() override;
std::shared_ptr<std::map<std::string, Symsptr>> mbdynVariables() override;
std::shared_ptr<std::map<std::string, std::shared_ptr<MBDynReference>>> mbdynReferences() override;
void createASMT() override;
@@ -63,7 +67,9 @@ namespace MbD {
std::shared_ptr<MBDynInitialValue> initialValue;
std::shared_ptr<MBDynControlData> controlData;
std::shared_ptr<std::vector<std::shared_ptr<MBDynNode>>> nodes;
std::shared_ptr<std::vector<std::shared_ptr<MBDynElement>>> elements;
std::shared_ptr<std::vector<std::shared_ptr<MBDynBody>>> bodies;
std::shared_ptr<std::vector<std::shared_ptr<MBDynJoint>>> joints;
std::shared_ptr<std::vector<std::shared_ptr<MBDynDrive>>> drives;
std::shared_ptr<std::map<std::string, Symsptr>> variables;
std::shared_ptr<std::map<std::string, int>> labels;
std::shared_ptr<std::map<std::string, std::shared_ptr<MBDynReference>>> references;

View File

@@ -6,4 +6,9 @@
* See LICENSE file for details about copyright. *
***************************************************************************/
#include "MbdMath.h"
#include "MbDMath.h"
void MbD::MbDMath::noop()
{
//No Operations
}

View File

@@ -9,8 +9,11 @@
#pragma once
namespace MbD {
class MbdMath
class MbDMath
{
public:
void noop();
};
}

View File

@@ -22,11 +22,31 @@ double MbD::Negative::getValue()
Symsptr MbD::Negative::differentiateWRTx()
{
return std::make_shared<Constant>(-1);
return sptrConstant(-1);
}
Symsptr MbD::Negative::expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
auto expand = xx->expandUntil(xx, set);
return std::make_shared<Negative>(expand);
}
Symsptr MbD::Negative::simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
auto simple = xx->simplifyUntil(xx, set);
if (simple->isConstant()) {
return sptrConstant(-simple->getValue());
}
return std::make_shared<Negative>(simple);
}
Symsptr MbD::Negative::copyWith(Symsptr arg)
{
return std::make_shared<Negative>(arg);
}
std::ostream& MbD::Negative::printOn(std::ostream& s) const
{
s << "-(" << xx << ")";
s << "-(" << *xx << ")";
return s;
}

View File

@@ -19,6 +19,9 @@ namespace MbD {
Negative(Symsptr arg);
double getValue() override;
Symsptr differentiateWRTx() override;
Symsptr expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
Symsptr simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
Symsptr copyWith(Symsptr arg) override;
std::ostream& printOn(std::ostream& s) const override;

View File

@@ -9,10 +9,10 @@
#pragma once
#include <vector>
#include "MbdMath.h"
#include "MbDMath.h"
namespace MbD {
class Numeric : public MbdMath
class Numeric : public MbDMath
{
//
public:

View File

@@ -219,6 +219,7 @@
<ClCompile Include="FunctionXcParameter.cpp" />
<ClCompile Include="FunctionXY.cpp" />
<ClCompile Include="GeneralSpline.cpp" />
<ClCompile Include="Integral.cpp" />
<ClCompile Include="Ln.cpp" />
<ClCompile Include="Log10.cpp" />
<ClCompile Include="LogN.cpp" />
@@ -226,6 +227,7 @@
<ClCompile Include="MBDynBody.cpp" />
<ClCompile Include="MBDynControlData.cpp" />
<ClCompile Include="MBDynData.cpp" />
<ClCompile Include="MBDynDrive.cpp" />
<ClCompile Include="MBDynElement.cpp" />
<ClCompile Include="MBDynInitialValue.cpp" />
<ClCompile Include="MBDynItem.cpp" />
@@ -237,6 +239,8 @@
<ClCompile Include="MBDynSystem.cpp" />
<ClCompile Include="MomentOfInertiaSolver.cpp" />
<ClCompile Include="Negative.cpp" />
<ClCompile Include="PiecewiseFunction.cpp" />
<ClCompile Include="Polynomial.cpp" />
<ClCompile Include="PosVelAccData.cpp" />
<ClCompile Include="DiagonalMatrix.cpp" />
<ClCompile Include="DifferenceOperator.cpp" />
@@ -337,7 +341,7 @@
<ClCompile Include="MatrixLDU.cpp" />
<ClCompile Include="MatrixSolver.cpp" />
<ClCompile Include="MaximumIterationError.cpp" />
<ClCompile Include="MbdMath.cpp" />
<ClCompile Include="MbDMath.cpp" />
<ClCompile Include="NewtonRaphson.cpp" />
<ClCompile Include="NewtonRaphsonError.cpp" />
<ClCompile Include="NoRotationJoint.cpp" />
@@ -367,6 +371,7 @@
<ClCompile Include="RackPinConstraintIqcJc.cpp" />
<ClCompile Include="RackPinConstraintIqcJqc.cpp" />
<ClCompile Include="RackPinJoint.cpp" />
<ClCompile Include="RampStepFunction.cpp" />
<ClCompile Include="Reciprocal.cpp" />
<ClCompile Include="RedundantConstraint.cpp" />
<ClCompile Include="RevCylJoint.cpp" />
@@ -390,6 +395,7 @@
<ClCompile Include="StableBackwardDifference.cpp" />
<ClCompile Include="LDUFullMat.cpp" />
<ClCompile Include="StateData.cpp" />
<ClCompile Include="StepFunction.cpp" />
<ClCompile Include="Sum.cpp" />
<ClCompile Include="Symbolic.cpp" />
<ClCompile Include="SymbolicParser.cpp" />
@@ -505,6 +511,7 @@
<ClInclude Include="FunctionXcParameter.h" />
<ClInclude Include="FunctionXY.h" />
<ClInclude Include="GeneralSpline.h" />
<ClInclude Include="Integral.h" />
<ClInclude Include="Ln.h" />
<ClInclude Include="Log10.h" />
<ClInclude Include="LogN.h" />
@@ -512,6 +519,7 @@
<ClInclude Include="MBDynBody.h" />
<ClInclude Include="MBDynControlData.h" />
<ClInclude Include="MBDynData.h" />
<ClInclude Include="MBDynDrive.h" />
<ClInclude Include="MBDynElement.h" />
<ClInclude Include="MBDynInitialValue.h" />
<ClInclude Include="MBDynItem.h" />
@@ -523,6 +531,8 @@
<ClInclude Include="MBDynSystem.h" />
<ClInclude Include="MomentOfInertiaSolver.h" />
<ClInclude Include="Negative.h" />
<ClInclude Include="PiecewiseFunction.h" />
<ClInclude Include="Polynomial.h" />
<ClInclude Include="PosVelAccData.h" />
<ClInclude Include="DiagonalMatrix.h" />
<ClInclude Include="DifferenceOperator.h" />
@@ -624,7 +634,7 @@
<ClInclude Include="MatrixLDU.h" />
<ClInclude Include="MatrixSolver.h" />
<ClInclude Include="MaximumIterationError.h" />
<ClInclude Include="MbdMath.h" />
<ClInclude Include="MbDMath.h" />
<ClInclude Include="NewtonRaphson.h" />
<ClInclude Include="NewtonRaphsonError.h" />
<ClInclude Include="NoRotationJoint.h" />
@@ -654,6 +664,7 @@
<ClInclude Include="RackPinConstraintIqcJc.h" />
<ClInclude Include="RackPinConstraintIqcJqc.h" />
<ClInclude Include="RackPinJoint.h" />
<ClInclude Include="RampStepFunction.h" />
<ClInclude Include="Reciprocal.h" />
<ClInclude Include="RedundantConstraint.h" />
<ClInclude Include="resource.h" />
@@ -678,6 +689,7 @@
<ClInclude Include="StableBackwardDifference.h" />
<ClInclude Include="LDUFullMat.h" />
<ClInclude Include="StateData.h" />
<ClInclude Include="StepFunction.h" />
<ClInclude Include="Sum.h" />
<ClInclude Include="Symbolic.h" />
<ClInclude Include="SymbolicParser.h" />

View File

@@ -867,6 +867,24 @@
<ClCompile Include="MomentOfInertiaSolver.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MBDynDrive.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="PiecewiseFunction.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Polynomial.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RampStepFunction.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="StepFunction.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Integral.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Array.h">
@@ -1727,6 +1745,24 @@
<ClInclude Include="MomentOfInertiaSolver.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="MBDynDrive.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="PiecewiseFunction.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Polynomial.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="RampStepFunction.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="StepFunction.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Integral.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="OndselSolver.rc">

View File

@@ -0,0 +1,115 @@
/***************************************************************************
* Copyright (c) 2023 Ondsel, Inc. *
* *
* This file is part of OndselSolver. *
* *
* See LICENSE file for details about copyright. *
***************************************************************************/
#include <algorithm>
#include "PiecewiseFunction.h"
using namespace MbD;
MbD::PiecewiseFunction::PiecewiseFunction()
{
noop();
}
MbD::PiecewiseFunction::PiecewiseFunction(Symsptr var, std::shared_ptr<std::vector<Symsptr>> funcs, std::shared_ptr<std::vector<Symsptr>> trans)
{
assert(var);
assert(functions->empty());
xx = var;
functions->clear();
functions->insert(functions->end(), funcs->begin(), funcs->end());
transitions->clear();
transitions->insert(transitions->end(), trans->begin(), trans->end());
}
Symsptr MbD::PiecewiseFunction::expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
auto expansions = std::make_shared<std::vector<Symsptr>>();
std::transform(functions->begin(),
functions->end(),
std::back_inserter(*expansions),
[&](auto& func) { return func->expandUntil(func, set); }
);
return std::make_shared<PiecewiseFunction>(xx, expansions, transitions);
}
Symsptr MbD::PiecewiseFunction::simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
auto simplifications = std::make_shared<std::vector<Symsptr>>();
std::transform(functions->begin(),
functions->end(),
std::back_inserter(*simplifications),
[&](auto& func) { return func->simplifyUntil(func, set); }
);
return std::make_shared<PiecewiseFunction>(xx, simplifications, transitions);
}
Symsptr MbD::PiecewiseFunction::differentiateWRTx()
{
auto derivatives = std::make_shared<std::vector<Symsptr>>();
std::transform(functions->begin(),
functions->end(),
std::back_inserter(*derivatives),
[&](auto& func) { return func->differentiateWRT(xx); }
);
return std::make_shared<PiecewiseFunction>(xx, derivatives, transitions);
}
Symsptr MbD::PiecewiseFunction::integrateWRT(Symsptr var)
{
assert(xx == var);
auto integrals = std::make_shared<std::vector<Symsptr>>();
std::transform(functions->begin(),
functions->end(),
std::back_inserter(*integrals),
[var](auto& func) { return func->integrateWRT(var); }
);
for (int i = 0; i < transitions->size(); i++)
{
auto x = transitions->at(i)->getValue();
auto fi = integrals->at(i)->getValue(x);
auto fi1 = integrals->at(i + 1)->getValue(x);
auto integConstant = fi - fi1;
integrals->at(i + 1)->integrationConstant(integConstant);
noop();
}
return std::make_shared<PiecewiseFunction>(var, integrals, transitions);
}
double MbD::PiecewiseFunction::getValue()
{
auto xval = xx->getValue();
for (int i = 0; i < transitions->size(); i++)
{
if (xval < transitions->at(i)->getValue()) {
return functions->at(i)->getValue();
}
}
return functions->back()->getValue();
}
std::ostream& MbD::PiecewiseFunction::printOn(std::ostream& s) const
{
s << "PiecewiseFunction(" << *xx << ", " << std::endl;
s << "functions{" << std::endl;
s << *functions->at(0) << std::endl;
for (int i = 1; i < functions->size(); i++)
{
s << *functions->at(i) << std::endl;
}
s << "}, " << std::endl;
s << "transitions{" << std::endl;
s << *transitions->at(0) << std::endl;
for (int i = 1; i < transitions->size(); i++)
{
s << *transitions->at(i) << std::endl;
}
s << "})" << std::endl;
return s;
}

View File

@@ -0,0 +1,36 @@
/***************************************************************************
* Copyright (c) 2023 Ondsel, Inc. *
* *
* This file is part of OndselSolver. *
* *
* See LICENSE file for details about copyright. *
***************************************************************************/
#pragma once
#include "FunctionXcParameter.h"
namespace MbD {
class Symbolic;
using Symsptr = std::shared_ptr<Symbolic>;
class PiecewiseFunction : public FunctionXcParameter
{
//functions transitions
//func0 tran0 func1 tran1 func2
public:
PiecewiseFunction();
PiecewiseFunction(Symsptr var, std::shared_ptr<std::vector<Symsptr>> funcs, std::shared_ptr<std::vector<Symsptr>> trans);
Symsptr expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
Symsptr simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
Symsptr differentiateWRTx() override;
Symsptr integrateWRT(Symsptr var) override;
double getValue() override;
std::ostream& printOn(std::ostream& s) const override;
std::shared_ptr<std::vector<Symsptr>> functions = std::make_shared<std::vector<Symsptr>>();
std::shared_ptr<std::vector<Symsptr>> transitions = std::make_shared<std::vector<Symsptr>>();
};
}

122
OndselSolver/Polynomial.cpp Normal file
View File

@@ -0,0 +1,122 @@
/***************************************************************************
* Copyright (c) 2023 Ondsel, Inc. *
* *
* This file is part of OndselSolver. *
* *
* See LICENSE file for details about copyright. *
***************************************************************************/
#include <algorithm>
#include "Polynomial.h"
#include "Constant.h"
#include "Sum.h"
using namespace MbD;
MbD::Polynomial::Polynomial(Symsptr var, std::shared_ptr<std::vector<double>> coefficients)
{
assert(!coefficients->empty());
xx = var;
std::transform(coefficients->begin(), coefficients->end(), coeffs->begin(),
[&](auto& coeff) { return sptrConstant(coeff); }
);
}
MbD::Polynomial::Polynomial(Symsptr var, std::shared_ptr<std::vector<Symsptr>> coefficients)
{
assert(!coefficients->empty());
xx = var;
coeffs->insert(coeffs->end(), coefficients->begin(), coefficients->end());
}
Symsptr MbD::Polynomial::expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
auto newCoeffs = std::make_shared<std::vector<Symsptr>>();
for (int i = 0; i < coeffs->size(); i++)
{
auto coeff = coeffs->at(i);
auto newCoeff = coeff->expandUntil(coeff, set);
newCoeffs->push_back(newCoeff);
}
return std::make_shared<Polynomial>(xx, newCoeffs);
}
Symsptr MbD::Polynomial::simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
auto newCoeffs = std::make_shared<std::vector<Symsptr>>();
for (int i = 0; i < coeffs->size(); i++)
{
auto coeff = coeffs->at(i);
auto newCoeff = coeff->simplifyUntil(coeff, set);
newCoeffs->push_back(newCoeff);
}
return std::make_shared<Polynomial>(xx, newCoeffs);
}
Symsptr MbD::Polynomial::differentiateWRTx()
{
//Differentiate powers
if (coeffs->size() == 1) return sptrConstant(0.0);
auto newCoeffs = std::make_shared<std::vector<Symsptr>>();
for (int i = 1; i < coeffs->size(); i++)
{
auto newCoeff = i * coeffs->at(i)->getValue();
newCoeffs->push_back(sptrConstant(newCoeff));
}
auto poly1 = std::make_shared<Polynomial>(xx, newCoeffs);
//Differentiate coeffs
auto coeffDerivs = std::make_shared<std::vector<Symsptr>>();
std::transform(coeffs->begin(),
coeffs->end(),
std::back_inserter(*coeffDerivs),
[&](auto& coeff) { return coeff->differentiateWRT(xx); }
);
auto poly2 = std::make_shared<Polynomial>(xx, coeffDerivs);
return std::make_shared<Sum>(poly1, poly2);
}
Symsptr MbD::Polynomial::integrateWRT(Symsptr var)
{
assert(xx == var);
auto newCoeffs = std::make_shared<std::vector<Symsptr>>();
newCoeffs->push_back(sptrConstant(0.0));
for (int i = 0; i < coeffs->size(); i++)
{
auto newCoeff = coeffs->at(i)->getValue() / (i + 1);
newCoeffs->push_back(sptrConstant(newCoeff));
}
return std::make_shared<Polynomial>(var, newCoeffs);
}
double MbD::Polynomial::getValue()
{
auto xvalue = xx->getValue();
auto xpower = 1.0;
auto answer = 0.0;
for (int i = 0; i < coeffs->size(); i++)
{
answer += coeffs->at(i)->getValue() * xpower;
xpower *= xvalue;
}
return answer;
}
void MbD::Polynomial::integrationConstant(double integConstant)
{
auto coeff0 = coeffs->at(0);
coeff0->setValue(coeff0->getValue() + integConstant);
}
std::ostream& MbD::Polynomial::printOn(std::ostream& s) const
{
s << "Polynomial(";
s << *xx << ", ";
s << "coeffs{";
s << *coeffs->at(0);
for (int i = 1; i < coeffs->size(); i++)
{
s << ", " << *coeffs->at(i);
}
s << "})";
return s;
}

33
OndselSolver/Polynomial.h Normal file
View File

@@ -0,0 +1,33 @@
/***************************************************************************
* Copyright (c) 2023 Ondsel, Inc. *
* *
* This file is part of OndselSolver. *
* *
* See LICENSE file for details about copyright. *
***************************************************************************/
#pragma once
#include "FunctionXcParameter.h"
namespace MbD {
class Polynomial : public FunctionXcParameter
{
//pn = a0*x^0 + a1*x^1 ... an*x^n
public:
Polynomial(Symsptr var, std::shared_ptr<std::vector<double>> coeffs);
Polynomial(Symsptr var, std::shared_ptr<std::vector<Symsptr>> coeffs);
Symsptr expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
Symsptr simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
Symsptr differentiateWRTx() override;
Symsptr integrateWRT(Symsptr var) override;
double getValue() override;
void integrationConstant(double integConstant) override;
std::ostream& printOn(std::ostream& s) const override;
std::shared_ptr<std::vector<Symsptr>> coeffs = std::make_shared<std::vector<Symsptr>>();
};
}

View File

@@ -22,7 +22,7 @@ MbD::Power::Power(Symsptr bse, Symsptr ex) : FunctionXY(bse, ex)
Symsptr MbD::Power::differentiateWRTx()
{
auto yminus1 = Symbolic::sum(y, std::make_shared<Constant>(-1.0));
auto yminus1 = Symbolic::sum(y, sptrConstant(-1.0));
auto power = Symbolic::raisedTo(x, yminus1);
auto deriv = Symbolic::times(y, power);
return deriv->simplified(deriv);
@@ -37,6 +37,7 @@ Symsptr MbD::Power::differentiateWRTy()
Symsptr MbD::Power::simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
assert(false);
return Symsptr();
}

View File

@@ -43,6 +43,13 @@ Symsptr MbD::Product::differentiateWRT(Symsptr var)
return answer;
}
Symsptr MbD::Product::integrateWRT(Symsptr var)
{
//ToDo: Integration by parts
assert(false);
return Symsptr();
}
Symsptr Product::expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
auto itr = std::find_if(set->begin(), set->end(), [sptr](Symsptr sym) {return sptr.get() == sym.get(); });
@@ -67,7 +74,8 @@ Symsptr Product::expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Sy
}
auto factor = std::make_shared<Product>();
factor->terms = productTerms;
auto sumOfProductsOfSums = std::make_shared<Sum>(std::make_shared<Constant>(1));
//sumOfProductsOfSums = (a + b + ...)*(c + d + ...)
auto sumOfProductsOfSums = std::make_shared<Sum>(sptrConstant(1));
for (const auto& term : *sumTerms) {
sumOfProductsOfSums = std::static_pointer_cast<Sum>(Symbolic::times(sumOfProductsOfSums, term));
}
@@ -94,14 +102,14 @@ Symsptr Product::simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<
}
}
if (factor == 0.0) {
return std::make_shared<Constant>(0.0);
return sptrConstant(0.0);
}
if (factor != 1.0) {
newTerms->insert(newTerms->begin(), std::make_shared<Constant>(factor));
newTerms->insert(newTerms->begin(), sptrConstant(factor));
}
auto newSize = newTerms->size();
if (newSize == 0) {
return std::make_shared<Constant>(1.0);
return sptrConstant(1.0);
}
else if (newSize == 1) {
return newTerms->at(0);

View File

@@ -24,6 +24,7 @@ namespace MbD {
Product(Symsptr term, Symsptr term1, Symsptr term2) : FunctionWithManyArgs(term, term1, term2) {}
Product(std::shared_ptr<std::vector<Symsptr>> _terms) : FunctionWithManyArgs(_terms) {}
Symsptr differentiateWRT(Symsptr var) override;
Symsptr integrateWRT(Symsptr var) override;
Symsptr expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
Symsptr simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
bool isProduct() override;

View File

@@ -0,0 +1,62 @@
#include <algorithm>
#include "RampStepFunction.h"
#include "Constant.h"
#include "Polynomial.h"
using namespace MbD;
MbD::RampStepFunction::RampStepFunction(Symsptr var, std::shared_ptr<std::vector<double>> consts, std::shared_ptr<std::vector<double>> trans)
{
double x0 = trans->at(0);
double x1 = trans->at(1);
double y0 = consts->at(0);
double y1 = consts->at(1);
initFunctionsTransitions(var, x0, y0, x1, y1);
}
void MbD::RampStepFunction::arguments(Symsptr args)
{
auto arguments = args->getTerms();
auto var = arguments->at(0);
auto symx0 = arguments->at(1);
auto symy0 = arguments->at(2);
auto symx1 = arguments->at(3);
auto symy1 = arguments->at(4);
double x0 = symx0->getValue();
double y0 = symy0->getValue();
double x1 = symx1->getValue();
double y1 = symy1->getValue();
initFunctionsTransitions(var, x0, y0, x1, y1, symx0, symy0, symx1, symy1);
}
void MbD::RampStepFunction::initFunctionsTransitions(Symsptr var, double x0, double y0, double x1, double y1)
{
auto symx0 = sptrConstant(x0);
auto symy0 = sptrConstant(y0);
auto symx1 = sptrConstant(x1);
auto symy1 = sptrConstant(y1);
initFunctionsTransitions(var, x0, y0, x1, y1, symx0, symy0, symx1, symy1);
}
void MbD::RampStepFunction::initFunctionsTransitions(Symsptr var, double x0, double y0, double x1, double y1, Symsptr symx0, Symsptr symy0, Symsptr symx1, Symsptr symy1)
{
//(y - y0)/(x - x0) = (y1 - y0)/(x1 - x0)
//y = (x - x0)(y1 - y0)/(x1 - x0) + y0
//y = (y1 - y0)*x/(x1 - x0) + y0 - (y1 - y0)*x0/(x1 - x0)
xx = var;
auto func0 = symy0;
auto slope = sptrConstant((y1 - y0) / (x1 - x0));
auto intercept = sptrConstant(y0 - (y1 - y0) * x0 / (x1 - x0));
auto coeffs = std::make_shared<std::vector<Symsptr>>();
coeffs->push_back(intercept);
coeffs->push_back(slope);
auto func1 = std::make_shared<Polynomial>(var, coeffs);
auto func2 = symy1;
functions->push_back(func0);
functions->push_back(func1);
functions->push_back(func2);
transitions->push_back(symx0);
transitions->push_back(symx1);
}

View File

@@ -0,0 +1,25 @@
/***************************************************************************
* Copyright (c) 2023 Ondsel, Inc. *
* *
* This file is part of OndselSolver. *
* *
* See LICENSE file for details about copyright. *
***************************************************************************/
#pragma once
#include "PiecewiseFunction.h"
namespace MbD {
class RampStepFunction : public PiecewiseFunction
{
public:
RampStepFunction() = default;
RampStepFunction(Symsptr var, std::shared_ptr<std::vector<double>> consts, std::shared_ptr<std::vector<double>> trans);
void arguments(Symsptr args) override;
void initFunctionsTransitions(Symsptr var, double x0, double y0, double x1, double y1);
void initFunctionsTransitions(Symsptr var, double x0, double y0, double x1, double y1, Symsptr symx0, Symsptr symy0, Symsptr symx1, Symsptr symy1);
};
}

View File

@@ -24,13 +24,18 @@ double MbD::Reciprocal::getValue()
Symsptr MbD::Reciprocal::differentiateWRTx()
{
auto two = std::make_shared<Constant>(2);
auto two = sptrConstant(2);
auto sq = std::make_shared<Power>(xx, two);
return std::make_shared<Negative>(sq);
}
Symsptr MbD::Reciprocal::copyWith(Symsptr arg)
{
return std::make_shared<Reciprocal>(arg);
}
std::ostream& MbD::Reciprocal::printOn(std::ostream& s) const
{
s << "/(" << xx << ")";
s << "/(" << *xx << ")";
return s;
}

View File

@@ -19,6 +19,7 @@ namespace MbD {
Reciprocal(Symsptr arg);
double getValue() override;
Symsptr differentiateWRTx() override;
Symsptr copyWith(Symsptr arg) override;
std::ostream& printOn(std::ostream& s) const override;

View File

@@ -25,8 +25,13 @@ Symsptr MbD::Sine::differentiateWRTx()
return std::make_shared<Cosine>(xx);
}
Symsptr MbD::Sine::copyWith(Symsptr arg)
{
return std::make_shared<Sine>(arg);
}
std::ostream& MbD::Sine::printOn(std::ostream& s) const
{
s << "sin(" << xx << ")";
s << "sin(" << *xx << ")";
return s;
}

View File

@@ -19,6 +19,7 @@ namespace MbD {
Sine(Symsptr arg);
double getValue() override;
Symsptr differentiateWRTx() override;
Symsptr copyWith(Symsptr arg) override;
std::ostream& printOn(std::ostream& s) const override;

View File

@@ -0,0 +1,25 @@
/***************************************************************************
* Copyright (c) 2023 Ondsel, Inc. *
* *
* This file is part of OndselSolver. *
* *
* See LICENSE file for details about copyright. *
***************************************************************************/
#include <algorithm>
#include "StepFunction.h"
#include "Constant.h"
using namespace MbD;
MbD::StepFunction::StepFunction(Symsptr var, std::shared_ptr<std::vector<double>> consts, std::shared_ptr<std::vector<double>> trans)
{
xx = var;
std::transform(consts->begin(), consts->end(), functions->begin(),
[&](auto& constant) { return sptrConstant(constant); }
);
std::transform(trans->begin(), trans->end(), transitions->begin(),
[&](auto& constant) { return sptrConstant(constant); }
);
}

View File

@@ -0,0 +1,21 @@
/***************************************************************************
* Copyright (c) 2023 Ondsel, Inc. *
* *
* This file is part of OndselSolver. *
* *
* See LICENSE file for details about copyright. *
***************************************************************************/
#pragma once
#include "PiecewiseFunction.h"
namespace MbD {
class StepFunction : public PiecewiseFunction
{
public:
StepFunction(Symsptr var, std::shared_ptr<std::vector<double>> consts, std::shared_ptr<std::vector<double>> trans);
};
}

View File

@@ -5,7 +5,7 @@
* *
* See LICENSE file for details about copyright. *
***************************************************************************/
#include <sstream>
#include <string>
@@ -72,7 +72,7 @@ Symsptr Sum::expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symspt
}
auto newSize = newTerms->size();
if (newSize == 0) {
return std::make_shared<Constant>(0.0);
return sptrConstant(0.0);
}
else if (newSize == 1) {
return newTerms->at(0);
@@ -104,11 +104,11 @@ Symsptr Sum::simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Syms
}
}
if (constant != 0.0) {
newTerms->insert(newTerms->begin(), std::make_shared<Constant>(constant));
newTerms->insert(newTerms->begin(), sptrConstant(constant));
}
auto newSize = newTerms->size();
if (newSize == 0) {
return std::make_shared<Constant>(0.0);
return sptrConstant(0.0);
}
else if (newSize == 1) {
return newTerms->at(0);
@@ -140,7 +140,8 @@ Symsptr MbD::Sum::clonesptr()
Symsptr MbD::Sum::differentiateWRT(Symsptr var)
{
auto derivatives = std::make_shared<std::vector<Symsptr>>();
std::transform(terms->begin(), terms->end(),
std::transform(terms->begin(),
terms->end(),
std::back_inserter(*derivatives),
[var](Symsptr term) { return term->differentiateWRT(var); }
);
@@ -149,6 +150,26 @@ Symsptr MbD::Sum::differentiateWRT(Symsptr var)
return answer;
}
Symsptr MbD::Sum::integrateWRT(Symsptr var)
{
auto simple = simplified();
if (simple->isSum()) {
auto newTerms = simple->getTerms();
auto integrals = std::make_shared<std::vector<Symsptr>>();
std::transform(newTerms->begin(),
newTerms->end(),
std::back_inserter(*integrals),
[var](Symsptr term) { return term->integrateWRT(var); }
);
auto answer = std::make_shared<Sum>();
answer->terms = integrals;
return answer;
}
else {
return simple->integrateWRT(var);
}
}
std::ostream& Sum::printOn(std::ostream& s) const
{
s << "(";

View File

@@ -31,6 +31,7 @@ namespace MbD {
double getValue() override;
Symsptr clonesptr() override;
Symsptr differentiateWRT(Symsptr var) override;
Symsptr integrateWRT(Symsptr var) override;
std::ostream& printOn(std::ostream& s) const override;

View File

@@ -86,6 +86,12 @@ Symsptr MbD::Symbolic::differentiateWRT(Symsptr var)
return Symsptr();
}
Symsptr MbD::Symbolic::integrateWRT(Symsptr var)
{
assert(false);
return Symsptr();
}
Symsptr MbD::Symbolic::simplified()
{
//std::cout << "sptr " << *sptr << std::endl;
@@ -112,17 +118,18 @@ Symsptr Symbolic::simplified(Symsptr sptr)
Symsptr MbD::Symbolic::expandUntil(std::shared_ptr<std::unordered_set<Symsptr>> set)
{
assert(false);
return clonesptr();
return expandUntil(clonesptr(), set);
}
Symsptr Symbolic::expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
assert(false);
return sptr;
}
Symsptr Symbolic::simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
assert(false);
return sptr;
}
@@ -153,7 +160,10 @@ bool Symbolic::isConstant()
std::ostream& Symbolic::printOn(std::ostream& s) const
{
return s << "(" << typeid(*this).name() << ")";
std::string str = typeid(*this).name();
auto classname = str.substr(11, str.size() - 11);
s << classname;
return s;
}
std::shared_ptr<std::vector<Symsptr>> Symbolic::getTerms()
@@ -173,6 +183,17 @@ double Symbolic::getValue()
return 0.0;
}
double MbD::Symbolic::getValue(double arg)
{
assert(false);
return 0.0;
}
void MbD::Symbolic::setValue(double val)
{
assert(false);
}
void MbD::Symbolic::createMbD(std::shared_ptr<System> mbdSys, std::shared_ptr<Units> mbdUnits)
{
assert(false);
@@ -191,6 +212,16 @@ std::shared_ptr<Constant> MbD::Symbolic::sptrConstant(double value)
return std::make_shared<Constant>(value);
}
bool MbD::Symbolic::isVariable()
{
return false;
}
void MbD::Symbolic::integrationConstant(double integConstant)
{
assert(false);
}
Symsptr MbD::Symbolic::raisedTo(Symsptr x, Symsptr y)
{
return std::make_shared<Power>(x, y);

View File

@@ -13,7 +13,7 @@
#include <memory>
#include <ostream>
#include "MbdMath.h"
#include "MbDMath.h"
#include "System.h"
#include "Units.h"
//#include "Constant.h"
@@ -23,7 +23,7 @@ namespace MbD {
class Symbolic;
using Symsptr = std::shared_ptr<Symbolic>;
class Symbolic : public MbdMath
class Symbolic : public MbDMath
{
public:
Symbolic();
@@ -33,6 +33,7 @@ namespace MbD {
virtual void initialize();
virtual Symsptr differentiateWRT(Symsptr var);
virtual Symsptr integrateWRT(Symsptr var);
virtual Symsptr simplified();
virtual Symsptr simplified(Symsptr sptr);
virtual Symsptr expandUntil(std::shared_ptr<std::unordered_set<Symsptr>> set);
@@ -46,9 +47,13 @@ namespace MbD {
virtual std::shared_ptr<std::vector<Symsptr>> getTerms();
virtual void addTerm(Symsptr trm);
virtual double getValue();
virtual double getValue(double arg);
virtual void setValue(double val);
virtual void createMbD(std::shared_ptr<System> mbdSys, std::shared_ptr<Units> mbdUnits);
virtual Symsptr clonesptr();
std::shared_ptr<Constant> sptrConstant(double value);
virtual bool isVariable();
virtual void integrationConstant(double integConstant);
virtual std::ostream& printOn(std::ostream& s) const;
friend std::ostream& operator<<(std::ostream& s, const Symbolic& sym)

View File

@@ -25,6 +25,8 @@
#include "Reciprocal.h"
#include "GeneralSpline.h"
#include "ArcSine.h"
#include "Integral.h"
#include "RampStepFunction.h"
MbD::SymbolicParser::SymbolicParser()
{
@@ -361,6 +363,12 @@ bool MbD::SymbolicParser::intrinsic()
else if (peekForTypevalue("word", "spline")) {
symfunc = std::make_shared<GeneralSpline>();
}
else if (peekForTypevalue("word", "integral")) {
symfunc = std::make_shared<Integral>();
}
else if (peekForTypevalue("word", "rampstep")) {
symfunc = std::make_shared<RampStepFunction>();
}
if (symfunc != nullptr) {
stack->push(symfunc);
if (peekForTypeNoPush("(")) {

View File

@@ -52,3 +52,18 @@ void Variable::setValue(double val)
{
value = val;
}
Symsptr MbD::Variable::expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
return sptr;
}
Symsptr MbD::Variable::simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set)
{
return sptr;
}
bool MbD::Variable::isVariable()
{
return true;
}

View File

@@ -24,7 +24,10 @@ namespace MbD {
const std::string& getName() const;
double getValue() override;
std::ostream& printOn(std::ostream& s) const override;
virtual void setValue(double val);
void setValue(double val) override;
Symsptr expandUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
Symsptr simplifyUntil(Symsptr sptr, std::shared_ptr<std::unordered_set<Symsptr>> set) override;
bool isVariable() override;
std::string name;
double value;

620
OndselSolver/assembly2.asmt Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,435 @@
OndselSolver
Assembly
Notes
(Text string: '' runs: (Core.RunArray runs: #() values: #()))
Name
Assembly
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Velocity3D
0 0 0
Omega3D
0 0 0
RefPoints
RefPoint
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Markers
Marker
Name
Marker0
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
RefCurves
RefSurfaces
Parts
Part
Name
structural_node_1
Position3D
-0.121 -1.218180697837851e-18 -0.08
RotationMatrix
1 0 0
0 1 0
0 0 1
Velocity3D
0 0 0
Omega3D
0 0 0
FeatureOrder
PrincipalMassMarker
Name
MassMarker
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Mass
1
MomentOfInertias
1 2 3
Density
10
RefPoints
RefPoint
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Markers
Marker
Name
Marker0
Position3D
0.121 1.218180697837851e-18 0.08
RotationMatrix
1 0 0
0 1 0
0 0 1
RefPoint
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Markers
Marker
Name
Marker1
Position3D
0 1.218180697837851e-18 0.05
RotationMatrix
1 0 0
0 1 0
0 0 1
RefPoint
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Markers
Marker
Name
Marker2
Position3D
0 1.218180697837785e-18 0.08
RotationMatrix
2.220446049250313e-16 -2.220446049250313e-16 1
1 0 -2.220446049250313e-16
4.930380657631324e-32 1 2.220446049250313e-16
RefPoint
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Markers
Marker
Name
Marker3
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
RefCurves
RefSurfaces
Part
Name
structural_node_2
Position3D
-0.04753704894473842 0.09742200410568831 -0.03029347681223059
RotationMatrix
0.9512512425641979 -0.1267494082121462 0.2811683855591535
0.167731259496521 0.9776506595433678 -0.1267494082121462
-0.258819045102521 0.167731259496521 0.9512512425641977
Velocity3D
0 0 0
Omega3D
0 0 0
FeatureOrder
PrincipalMassMarker
Name
MassMarker
Position3D
7.105427357601002e-18 0 7.105427357601002e-18
RotationMatrix
1 0 0
0 1 0
0 0 1
Mass
1.448636188351172
MomentOfInertias
0.002871751015088 0.002864447840812 0.0007089594589930001
Density
10
RefPoints
RefPoint
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Markers
Marker
Name
Marker0
Position3D
-0.03739853284269051 0 0.003286762255221063
RotationMatrix
1 0 5.204170427930421e-18
-0 1 0
-5.204170427930421e-18 -0 1
RefPoint
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Markers
Marker
Name
Marker1
Position3D
0.03260146715730949 1.4210854715202e-17 0.05328676225522106
RotationMatrix
1 -0 5.204170427930421e-18
0 1 0
-5.204170427930421e-18 0 1
RefCurves
RefSurfaces
Part
Name
structural_node_3
Position3D
0.07099630277370235 -0.07364765799707981 0.05840790082376057
RotationMatrix
0.9622501868990581 0.01433011691863463 -0.271788935686915
-0.08715574274765801 0.9622501868990581 -0.2578341604963
0.2578341604963001 0.271788935686915 0.9271743741709766
Velocity3D
0 0 0
Omega3D
0 0 0
FeatureOrder
PrincipalMassMarker
Name
MassMarker
Position3D
2.842170943040401e-17 -1.4210854715202e-17 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Mass
2.852948655706768
MomentOfInertias
0.03383792198797 0.033715148099504 0.001956310318013
Density
10
RefPoints
RefPoint
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Markers
Marker
Name
Marker0
Position3D
-0.1400000000000079 -1.044497821567347e-15 0.02499999999999804
RotationMatrix
3.322229154067983e-33 1 -5.551115123125784e-17
-1 0 -5.984795992119986e-17
-5.984795992119986e-17 5.551115123125784e-17 1
RefPoint
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Markers
Marker
Name
Marker1
Position3D
0.1399999999999913 4.423128530106624e-16 9.79127889877418e-15
RotationMatrix
0.7254861972346578 0.6882367162699149 2.719509169040251e-15
-0.6882367162699149 0.7254861972346578 1.258675848677982e-14
6.689702964032028e-15 -1.100318561045113e-14 1
RefCurves
RefSurfaces
Part
Name
structural_node_4
Position3D
0.3723079639890564 0.04333150035096042 0.008140985321785409
RotationMatrix
0.9659258262890682 -0 0.2588190451025211
0 1 0
-0.2588190451025211 0 0.9659258262890682
Velocity3D
0 0 0
Omega3D
0 0 0
FeatureOrder
PrincipalMassMarker
Name
MassMarker
Position3D
2.842170943040401e-16 2.131628207280301e-17 2.273736754432321e-16
RotationMatrix
1 0 0
0 1 0
0 0 1
Mass
10.85942720262214
MomentOfInertias
0.07706742098794901 0.066351815798527 0.061792350456255
Density
10
RefPoints
RefPoint
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Markers
Marker
Name
Marker0
Position3D
-0.04558083463411924 -2.029935401992589e-10 1.256225164070202e-08
RotationMatrix
1 0 0
0 1 0
0 0 1
RefPoint
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Markers
Marker
Name
Marker1
Position3D
-0.04558083463411924 -2.029935401992589e-10 1.256225164070202e-08
RotationMatrix
1 0 0
0 1 0
0 0 1
RefPoint
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
Markers
Marker
Name
Marker2
Position3D
0 0 0
RotationMatrix
1 0 0
0 1 0
0 0 1
RefCurves
RefSurfaces
KinematicIJs
ConstraintSets
Joints
FixedJoint
Name
joint_1
MarkerI
/Assembly/Marker0
MarkerJ
/Assembly/structural_node_1/Marker0
RevoluteJoint
Name
joint_2
MarkerI
/Assembly/structural_node_1/Marker1
MarkerJ
/Assembly/structural_node_2/Marker0
RevoluteJoint
Name
joint_3
MarkerI
/Assembly/structural_node_2/Marker1
MarkerJ
/Assembly/structural_node_3/Marker0
PointInLineJoint
Name
joint_4
MarkerI
/Assembly/structural_node_3/Marker1
MarkerJ
/Assembly/structural_node_4/Marker0
PointInLineJoint
Name
joint_5
MarkerI
/Assembly/structural_node_1/Marker2
MarkerJ
/Assembly/structural_node_4/Marker1
NoRotationJoint
Name
joint_6
MarkerI
/Assembly/structural_node_1/Marker3
MarkerJ
/Assembly/structural_node_4/Marker2
Motions
RotationalMotion
Name
joint_2Motion
MotionJoint
/Assembly/joint_2
RotationZ
2.0*pi*time
GeneralConstraintSets
ForceTorques
ConstantGravity
0 0 0
SimulationParameters
tstart
0
tend
0.1
hmin
1e-09
hmax
1
hout
0.01
errorTol
1e-06
AnimationParameters
nframe
1000000
icurrent
1
istart
1
iend
1000000
isForward
true
framesPerSecond
30

File diff suppressed because one or more lines are too long

View File

@@ -22,13 +22,14 @@
using namespace MbD;
void runSpMat();
void sharedptrTest();
int main()
{
////ASMTAssembly::readWriteFile("piston.asmt");
//MBDynSystem::runFile("MBDynCaseJose.mbd");
//MBDynSystem::runFile("MBDynCase.mbd");
//MBDynSystem::runFile("crank_slider.mbd");
ASMTAssembly::readWriteFile("piston.asmt");
MBDynSystem::runFile("MBDynCase2.mbd");
MBDynSystem::runFile("MBDynCase.mbd");
//MBDynSystem::runFile("crank_slider.mbd"); //Needs integration of product
////ASMTAssembly::runSinglePendulumSuperSimplified(); //Mass is missing
////ASMTAssembly::runSinglePendulumSuperSimplified2(); //DOF has infinite acceleration due to zero mass and inertias
ASMTAssembly::runSinglePendulumSimplified();
@@ -49,8 +50,25 @@ int main()
cadSystem->runPiston();
runSpMat();
MomentOfInertiaSolver::example1();
sharedptrTest();
}
void sharedptrTest() {
auto assm = std::make_shared<ASMTAssembly>();
auto assm1 = assm; //New shared_ptr to old object. Reference count incremented.
assert(assm == assm1);
assert(assm.get() == assm1.get());
assert(&assm != &assm1);
assert(assm->constantGravity == assm1->constantGravity);
assert(&(assm->constantGravity) == &(assm1->constantGravity));
auto assm2 = std::make_shared<ASMTAssembly>(*assm); //New shared_ptr to new object. Member variables copy old member variables
assert(assm != assm2);
assert(assm.get() != assm2.get());
assert(&assm != &assm2);
assert(assm->constantGravity == assm2->constantGravity); //constantGravity is same object pointed to
assert(&(assm->constantGravity) != &(assm2->constantGravity)); //Different shared_ptrs of same reference counter
}
void runSpMat() {
auto spMat = std::make_shared<SparseMatrix<double>>(3, 3);
spMat->atijput(0, 0, 1.0);

File diff suppressed because one or more lines are too long