diff --git a/MbDCode/AbsConstraint.cpp b/MbDCode/AbsConstraint.cpp index 94ad287..2b7827c 100644 --- a/MbDCode/AbsConstraint.cpp +++ b/MbDCode/AbsConstraint.cpp @@ -1,14 +1,8 @@ #include "AbsConstraint.h" +#include "PartFrame.h" using namespace MbD; -std::shared_ptr MbD::AbsConstraint::Create(const char* name) -{ - auto item = std::make_shared(name); - item->initialize(); - return item; -} - AbsConstraint::AbsConstraint() {} AbsConstraint::AbsConstraint(const char* str) : Constraint(str) {} @@ -26,4 +20,10 @@ void AbsConstraint::initialize() void MbD::AbsConstraint::calcPostDynCorrectorIteration() { + if (axis < 3) { + aG = static_cast(owner)->qX->at(axis); + } + else { + aG = static_cast(owner)->qE->at(axis - 3); + } } diff --git a/MbDCode/AbsConstraint.h b/MbDCode/AbsConstraint.h index f2923ee..14f3510 100644 --- a/MbDCode/AbsConstraint.h +++ b/MbDCode/AbsConstraint.h @@ -5,7 +5,6 @@ namespace MbD { { //axis iqXminusOnePlusAxis public: - static std::shared_ptr Create(const char* name); AbsConstraint(); AbsConstraint(const char* str); AbsConstraint(int axis); diff --git a/MbDCode/AnyPosICNewtonRaphson.cpp b/MbDCode/AnyPosICNewtonRaphson.cpp index e69de29..1bd666d 100644 --- a/MbDCode/AnyPosICNewtonRaphson.cpp +++ b/MbDCode/AnyPosICNewtonRaphson.cpp @@ -0,0 +1,7 @@ +#include "AnyPosICNewtonRaphson.h" + +void MbD::AnyPosICNewtonRaphson::initialize() +{ + NewtonRaphson::initialize(); + nSingularMatrixError = 0; +} diff --git a/MbDCode/AnyPosICNewtonRaphson.h b/MbDCode/AnyPosICNewtonRaphson.h index 2f91791..6a19bbf 100644 --- a/MbDCode/AnyPosICNewtonRaphson.h +++ b/MbDCode/AnyPosICNewtonRaphson.h @@ -7,6 +7,8 @@ namespace MbD { { //nqsu qsuOld qsuWeights nSingularMatrixError public: + void initialize() override; + int nqsu; std::shared_ptr> qsuOld, qsuWeights; int nSingularMatrixError; diff --git a/MbDCode/Array.h b/MbDCode/Array.h index c0b8ce2..146c9ad 100644 --- a/MbDCode/Array.h +++ b/MbDCode/Array.h @@ -1,34 +1,63 @@ #pragma once #include #include +#include namespace MbD { template class Array : public std::vector { public: - Array(){} - Array(size_t count) : std::vector(count) {} - Array(size_t count, const T& value) : std::vector(count, value) {} - Array(std::initializer_list list) : std::vector{ list } {} - void copy(std::shared_ptr> x); - void zeroSelf(); - }; - template - inline void Array::copy(std::shared_ptr> x) - { - for (int i = 0; i < x->size(); i++) { - this->at(i) = x->at(i); - } - } - template <> - inline void Array::zeroSelf() { - for (int i = 0; i < this->size(); i++) { - this->at(i) = 0.0;; - } - } - using ListD = std::initializer_list; - using ListListD = std::initializer_list>; - using ListListPairD = std::initializer_list>>; + Array() {} + Array(size_t count) : std::vector(count) {} + Array(size_t count, const T& value) : std::vector(count, value) {} + Array(std::initializer_list list) : std::vector{ list } {} + void copyFrom(std::shared_ptr> x); + void zeroSelf(); + double sumOfSquares(); + double sumOfSquaresOfVector(); + }; + template + inline void Array::copyFrom(std::shared_ptr> x) + { + for (size_t i = 0; i < x->size(); i++) { + this->at(i) = x->at(i); + } + } + template <> + inline void Array::zeroSelf() { + for (size_t i = 0; i < this->size(); i++) { + this->at(i) = 0.0;; + } + } + template + inline double Array::sumOfSquares() + { + if (std::is_arithmetic) { + return this->sumOfSquaresOfVector(); + } + else { + double sum = 0.0; + for (size_t i = 0; i < this->size(); i++) + { + sum += this->at(i)->sumOfSquares(); + } + return sum; + } + } + template + inline double Array::sumOfSquaresOfVector() + { + double sum = 0.0; + for (size_t i = 0; i < this->size(); i++) + { + double element = this->at(i); + sum += element * element; + } + return sum; + } + using ListD = std::initializer_list; + using ListListD = std::initializer_list>; + using ListListPairD = std::initializer_list>>; } diff --git a/MbDCode/AtPointConstraintIJ.cpp b/MbDCode/AtPointConstraintIJ.cpp index c4758b1..9398f3b 100644 --- a/MbDCode/AtPointConstraintIJ.cpp +++ b/MbDCode/AtPointConstraintIJ.cpp @@ -1,15 +1,9 @@ #include "AtPointConstraintIJ.h" #include "DispCompIecJecO.h" +#include "CREATE.h" using namespace MbD; -std::shared_ptr MbD::AtPointConstraintIJ::Create(EndFrmcptr frmi, EndFrmcptr frmj, int axisi) -{ - auto item = std::make_shared(frmi, frmj, axisi); - item->initialize(); - return item; -} - AtPointConstraintIJ::AtPointConstraintIJ(EndFrmcptr frmi, EndFrmcptr frmj, int axisi) : ConstraintIJ(frmi, frmj), axis(axisi) { @@ -17,6 +11,7 @@ AtPointConstraintIJ::AtPointConstraintIJ(EndFrmcptr frmi, EndFrmcptr frmj, int a void AtPointConstraintIJ::initialize() { + initriIeJeO(); } void MbD::AtPointConstraintIJ::initializeLocally() @@ -31,7 +26,7 @@ void MbD::AtPointConstraintIJ::initializeGlobally() void AtPointConstraintIJ::initriIeJeO() { - riIeJeO = std::make_shared(); + riIeJeO = CREATE::With(frmI, frmJ, axis); } void MbD::AtPointConstraintIJ::postInput() @@ -40,4 +35,11 @@ void MbD::AtPointConstraintIJ::postInput() void MbD::AtPointConstraintIJ::calcPostDynCorrectorIteration() { + aG = riIeJeO->riIeJeO - aConstant; +} + +void MbD::AtPointConstraintIJ::prePosIC() +{ + riIeJeO->prePosIC(); + Constraint::prePosIC(); } diff --git a/MbDCode/AtPointConstraintIJ.h b/MbDCode/AtPointConstraintIJ.h index bc05668..1228a58 100644 --- a/MbDCode/AtPointConstraintIJ.h +++ b/MbDCode/AtPointConstraintIJ.h @@ -9,7 +9,6 @@ namespace MbD { { //axis riIeJeO public: - static std::shared_ptr Create(EndFrmcptr frmi, EndFrmcptr frmj, int axisi); AtPointConstraintIJ(EndFrmcptr frmi, EndFrmcptr frmj, int axisi); void initialize(); void initializeLocally() override; @@ -17,6 +16,7 @@ namespace MbD { virtual void initriIeJeO(); void postInput() override; void calcPostDynCorrectorIteration() override; + void prePosIC() override; int axis; std::shared_ptr riIeJeO; diff --git a/MbDCode/AtPointConstraintIqcJc.cpp b/MbDCode/AtPointConstraintIqcJc.cpp index 0578a64..858aeee 100644 --- a/MbDCode/AtPointConstraintIqcJc.cpp +++ b/MbDCode/AtPointConstraintIqcJc.cpp @@ -1,5 +1,7 @@ #include "AtPointConstraintIqcJc.h" #include "DispCompIeqcJecO.h" +#include "CREATE.h" +#include "EndFrameqc.h" using namespace MbD; @@ -8,15 +10,25 @@ AtPointConstraintIqcJc::AtPointConstraintIqcJc(EndFrmcptr frmi, EndFrmcptr frmj, { } -void AtPointConstraintIqcJc::initialize() +void MbD::AtPointConstraintIqcJc::initializeGlobally() { + AtPointConstraintIJ::initializeGlobally(); + ppGpEIpEI = (std::static_pointer_cast(riIeJeO))->ppriIeJeOpEIpEI; } void AtPointConstraintIqcJc::initriIeJeO() { - riIeJeO = std::make_shared(); + riIeJeO = CREATE::With(frmI, frmJ, axis); } void MbD::AtPointConstraintIqcJc::calcPostDynCorrectorIteration() { + AtPointConstraintIJ::calcPostDynCorrectorIteration(); + pGpEI = std::static_pointer_cast(riIeJeO)->priIeJeOpEI; +} + +void MbD::AtPointConstraintIqcJc::useEquationNumbers() +{ + iqXIminusOnePlusAxis = std::static_pointer_cast(frmI)->iqX() - 1 + axis; + iqEI = std::static_pointer_cast(frmI)->iqE(); } diff --git a/MbDCode/AtPointConstraintIqcJc.h b/MbDCode/AtPointConstraintIqcJc.h index 0c9fe5b..aa1132a 100644 --- a/MbDCode/AtPointConstraintIqcJc.h +++ b/MbDCode/AtPointConstraintIqcJc.h @@ -3,18 +3,20 @@ #include "AtPointConstraintIJ.h" namespace MbD { - class AtPointConstraintIqcJc : public AtPointConstraintIJ - { - //pGpEI ppGpEIpEI iqXIminusOnePlusAxis iqEI - public: - AtPointConstraintIqcJc(EndFrmcptr frmi, EndFrmcptr frmj, int axisi); - void initialize(); - void initriIeJeO() override; - void calcPostDynCorrectorIteration() override; + class AtPointConstraintIqcJc : public AtPointConstraintIJ + { + //pGpEI ppGpEIpEI iqXIminusOnePlusAxis iqEI + public: + AtPointConstraintIqcJc(EndFrmcptr frmi, EndFrmcptr frmj, int axisi); + void initializeGlobally() override; + void initriIeJeO() override; + void calcPostDynCorrectorIteration() override; + void useEquationNumbers() override; - FRowDsptr pGpEI; - FMatDsptr ppGpEIpEI; - int iqXIminusOnePlusAxis, iqEI; - }; + FRowDsptr pGpEI; + FMatDsptr ppGpEIpEI; + int iqXIminusOnePlusAxis = -1; + int iqEI = -1; + }; } diff --git a/MbDCode/AtPointConstraintIqcJqc.cpp b/MbDCode/AtPointConstraintIqcJqc.cpp index a9467c8..e8f96d5 100644 --- a/MbDCode/AtPointConstraintIqcJqc.cpp +++ b/MbDCode/AtPointConstraintIqcJqc.cpp @@ -1,5 +1,7 @@ #include "AtPointConstraintIqcJqc.h" #include "DispCompIeqcJeqcO.h" +#include "CREATE.h" +#include "EndFrameqc.h" using namespace MbD; @@ -8,15 +10,26 @@ AtPointConstraintIqcJqc::AtPointConstraintIqcJqc(EndFrmcptr frmi, EndFrmcptr frm { } -void AtPointConstraintIqcJqc::initialize() +void MbD::AtPointConstraintIqcJqc::initializeGlobally() { + AtPointConstraintIqcJc::initializeGlobally(); + ppGpEJpEJ = (std::static_pointer_cast(riIeJeO))->ppriIeJeOpEJpEJ; } void AtPointConstraintIqcJqc::initriIeJeO() { - riIeJeO = std::make_shared(); + riIeJeO = CREATE::With(frmI, frmJ, axis); } void MbD::AtPointConstraintIqcJqc::calcPostDynCorrectorIteration() { + AtPointConstraintIqcJc::calcPostDynCorrectorIteration(); + pGpEJ = std::static_pointer_cast(riIeJeO)->priIeJeOpEJ; +} + +void MbD::AtPointConstraintIqcJqc::useEquationNumbers() +{ + AtPointConstraintIqcJc::useEquationNumbers(); + iqXJminusOnePlusAxis = std::static_pointer_cast(frmJ)->iqX() - 1 + axis; + iqEJ = std::static_pointer_cast(frmJ)->iqE(); } diff --git a/MbDCode/AtPointConstraintIqcJqc.h b/MbDCode/AtPointConstraintIqcJqc.h index 6f4a79b..ed5b531 100644 --- a/MbDCode/AtPointConstraintIqcJqc.h +++ b/MbDCode/AtPointConstraintIqcJqc.h @@ -8,9 +8,10 @@ namespace MbD { //pGpEJ ppGpEJpEJ iqXJminusOnePlusAxis iqEJ public: AtPointConstraintIqcJqc(EndFrmcptr frmi, EndFrmcptr frmj, int axisi); - void initialize(); + void initializeGlobally() override; void initriIeJeO() override; void calcPostDynCorrectorIteration() override; + void useEquationNumbers() override; FRowDsptr pGpEJ; FMatDsptr ppGpEJpEJ; diff --git a/MbDCode/AtPointConstraintIqctJqc.cpp b/MbDCode/AtPointConstraintIqctJqc.cpp index d5ef975..6387e99 100644 --- a/MbDCode/AtPointConstraintIqctJqc.cpp +++ b/MbDCode/AtPointConstraintIqctJqc.cpp @@ -1,5 +1,6 @@ #include "AtPointConstraintIqctJqc.h" #include "DispCompIeqctJeqcO.h" +#include "CREATE.h" using namespace MbD; @@ -8,15 +9,21 @@ AtPointConstraintIqctJqc::AtPointConstraintIqctJqc(EndFrmcptr frmi, EndFrmcptr f { } -void AtPointConstraintIqctJqc::initialize() +void MbD::AtPointConstraintIqctJqc::initializeGlobally() { + riIeJeO->initializeGlobally(); + ppGpEJpEJ = (std::static_pointer_cast(riIeJeO))->ppriIeJeOpEJpEJ; } void AtPointConstraintIqctJqc::initriIeJeO() { - riIeJeO = std::make_shared(); + riIeJeO = CREATE::With(frmI, frmJ, axis); } void MbD::AtPointConstraintIqctJqc::calcPostDynCorrectorIteration() { + //"ppGpEIpEI is no longer constant." + + ppGpEIpEI = std::static_pointer_cast(riIeJeO)->ppriIeJeOpEIpEI; + AtPointConstraintIqcJqc::calcPostDynCorrectorIteration(); } diff --git a/MbDCode/AtPointConstraintIqctJqc.h b/MbDCode/AtPointConstraintIqctJqc.h index 9412e4f..b8432aa 100644 --- a/MbDCode/AtPointConstraintIqctJqc.h +++ b/MbDCode/AtPointConstraintIqctJqc.h @@ -8,7 +8,7 @@ namespace MbD { //pGpt ppGpEIpt ppGptpt public: AtPointConstraintIqctJqc(EndFrmcptr frmi, EndFrmcptr frmj, int axisi); - void initialize(); + void initializeGlobally() override; void initriIeJeO() override; void calcPostDynCorrectorIteration() override; diff --git a/MbDCode/CREATE.h b/MbDCode/CREATE.h index 2166532..58a1c0c 100644 --- a/MbDCode/CREATE.h +++ b/MbDCode/CREATE.h @@ -1,21 +1,89 @@ #pragma once #include +//#include "EndFramec.h" +#include "EndFrameqct.h" +#include "AtPointConstraintIqctJqc.h" +#include "DirectionCosineConstraintIqctJqc.h" +#include "TranslationConstraintIqctJqc.h" +#include "DispCompIeqctJeqcKeqct.h" +#include "DispCompIeqctJeqcO.h" namespace MbD { - template - class CREATE { - public: - static std::shared_ptr With(const char* name) { - auto inst = std::make_shared(name); - inst->initialize(); - return inst; - } - static std::shared_ptr With() { - auto inst = std::make_shared(); - inst->initialize(); - return inst; - } - }; + template + class CREATE { + public: + static std::shared_ptr With(const char* name) { + auto inst = std::make_shared(name); + inst->initialize(); + return inst; + } + static std::shared_ptr With() { + auto inst = std::make_shared(); + inst->initialize(); + return inst; + } + static std::shared_ptr With(int n) { + auto inst = std::make_shared(n); + inst->initialize(); + return inst; + } + static std::shared_ptr With(std::initializer_list listD) { + auto inst = std::make_shared(listD); + inst->initialize(); + return inst; + } + static std::shared_ptr With(EndFrmcptr frmi, EndFrmcptr frmj, int axis) { + auto inst = std::make_shared(frmi, frmj, axis); + inst->initialize(); + return inst; + } + static std::shared_ptr With(EndFrmcptr frmi, EndFrmcptr frmj, EndFrmcptr frmk, int axisk) { + auto inst = std::make_shared(frmi, frmj, frmk, axisk); + inst->initialize(); + return inst; + } + static std::shared_ptr ConstraintWith(EndFrmcptr frmi, EndFrmcptr frmj, int axis) { + std::shared_ptr inst; + std::string str = typeid(T(frmi, frmj, axis)).name(); + if (str == "class MbD::AtPointConstraintIJ") { + if (std::dynamic_pointer_cast(frmi)) { + inst = std::make_shared(frmi, frmj, axis); + } + else { + inst = std::make_shared(frmi, frmj, axis); + } + } + else if(str == "class MbD::TranslationConstraintIJ") { + if (std::dynamic_pointer_cast(frmi)) { + inst = std::make_shared(frmi, frmj, axis); + } + else { + inst = std::make_shared(frmi, frmj, axis); + } + } + inst->initialize(); + return inst; + } + static std::shared_ptr With(EndFrmcptr frmi, EndFrmcptr frmj, int axisi, int axisj) { + auto inst = std::make_shared(frmi, frmj, axisi, axisj); + inst->initialize(); + return inst; + } + static std::shared_ptr ConstraintWith(EndFrmcptr frmi, EndFrmcptr frmj, int axisi, int axisj) { + std::shared_ptr inst; + std::string str = typeid(T(frmi, frmj, axisi, axisj)).name(); + if (str == "class MbD::DirectionCosineConstraintIJ") { + if (std::dynamic_pointer_cast(frmi)) { + inst = std::make_shared(frmi, frmj, axisi, axisj); + } + else { + inst = std::make_shared(frmi, frmj, axisi, axisj); + } + } + inst->initialize(); + return inst; + } + }; } diff --git a/MbDCode/Constant.cpp b/MbDCode/Constant.cpp index a25769a..6648041 100644 --- a/MbDCode/Constant.cpp +++ b/MbDCode/Constant.cpp @@ -10,7 +10,17 @@ Constant::Constant(double val) : Variable(val) { } -std::shared_ptr Constant::differentiateWRT(std::shared_ptr var) +Symsptr Constant::differentiateWRT(Symsptr sptr, Symsptr var) { return std::make_shared(0.0); } + +bool MbD::Constant::isConstant() +{ + return true; +} + +std::ostream& MbD::Constant::printOn(std::ostream& s) const +{ + return s << this->value; +} diff --git a/MbDCode/Constant.h b/MbDCode/Constant.h index 5ac5a89..bd007ba 100644 --- a/MbDCode/Constant.h +++ b/MbDCode/Constant.h @@ -8,7 +8,9 @@ namespace MbD { public: Constant(); Constant(double val); - std::shared_ptr differentiateWRT(std::shared_ptr var) override; + Symsptr differentiateWRT(Symsptr sptr, Symsptr var) override; + bool isConstant() override; + std::ostream& printOn(std::ostream& s) const override; }; } diff --git a/MbDCode/Constraint.cpp b/MbDCode/Constraint.cpp index 403d87f..790c8f5 100644 --- a/MbDCode/Constraint.cpp +++ b/MbDCode/Constraint.cpp @@ -31,3 +31,10 @@ Item* Constraint::getOwner() { return owner; } + +void MbD::Constraint::prePosIC() +{ + lam = 0.0; + iG = -1; + Item::prePosIC(); +} diff --git a/MbDCode/Constraint.h b/MbDCode/Constraint.h index 23c6f95..c6ed8af 100644 --- a/MbDCode/Constraint.h +++ b/MbDCode/Constraint.h @@ -14,6 +14,8 @@ namespace MbD { void postInput() override; void setOwner(Item* x); Item* getOwner(); + void prePosIC() override; + int iG; double aG; //Constraint function diff --git a/MbDCode/ConstraintIJ.cpp b/MbDCode/ConstraintIJ.cpp index ad2fae6..a0261b6 100644 --- a/MbDCode/ConstraintIJ.cpp +++ b/MbDCode/ConstraintIJ.cpp @@ -5,10 +5,10 @@ using namespace MbD; ConstraintIJ::ConstraintIJ(EndFrmcptr frmi, EndFrmcptr frmj) : frmI(frmi), frmJ(frmj) { - aConstant = 0.0; } void ConstraintIJ::initialize() { + Constraint::initialize(); aConstant = 0.0; } diff --git a/MbDCode/CylindricalJoint.cpp b/MbDCode/CylindricalJoint.cpp index 5e90d42..96de886 100644 --- a/MbDCode/CylindricalJoint.cpp +++ b/MbDCode/CylindricalJoint.cpp @@ -2,6 +2,7 @@ #include "System.h" #include "DirectionCosineConstraintIJ.h" #include "TranslationConstraintIJ.h" +#include "CREATE.h" using namespace MbD; @@ -13,12 +14,12 @@ CylindricalJoint::CylindricalJoint(const char* str) : Joint(str) { void MbD::CylindricalJoint::initializeGlobally() { - if (!constraints) + if (constraints->empty()) { - addConstraint(std::make_shared (frmI, frmJ, 1)); - addConstraint(std::make_shared (frmI, frmJ, 2)); - addConstraint(std::make_shared(frmI, frmJ, 3, 1)); - addConstraint(std::make_shared(frmI, frmJ, 3, 2)); + addConstraint(CREATE::ConstraintWith(frmI, frmJ, 0)); + addConstraint(CREATE::ConstraintWith(frmI, frmJ, 1)); + addConstraint(CREATE::ConstraintWith(frmI, frmJ, 2, 0)); + addConstraint(CREATE::ConstraintWith(frmI, frmJ, 2, 1)); System::getInstance().hasChanged = true; } else { diff --git a/MbDCode/CylindricalJoint.h b/MbDCode/CylindricalJoint.h index 5811e28..02ab376 100644 --- a/MbDCode/CylindricalJoint.h +++ b/MbDCode/CylindricalJoint.h @@ -6,10 +6,9 @@ namespace MbD { { //frmI frmJ constraints friction public: - static std::shared_ptr Create(const char* name); CylindricalJoint(); CylindricalJoint(const char* str); - void initializeGlobally(); + void initializeGlobally() override; }; } diff --git a/MbDCode/DirectionCosineConstraintIJ.cpp b/MbDCode/DirectionCosineConstraintIJ.cpp index daa24ce..9ea51c7 100644 --- a/MbDCode/DirectionCosineConstraintIJ.cpp +++ b/MbDCode/DirectionCosineConstraintIJ.cpp @@ -1,16 +1,10 @@ #include "DirectionCosineConstraintIJ.h" #include "DirectionCosineIecJec.h" #include "EndFramec.h" +#include "CREATE.h" using namespace MbD; -std::shared_ptr MbD::DirectionCosineConstraintIJ::Create(EndFrmcptr frmi, EndFrmcptr frmj, int axisi, int axisj) -{ - auto item = std::make_shared(frmi, frmj, axisi, axisj); - item->initialize(); - return item; -} - DirectionCosineConstraintIJ::DirectionCosineConstraintIJ(EndFrmcptr frmi, EndFrmcptr frmj, int axisi, int axisj) : ConstraintIJ(frmi, frmj), axisI(axisi), axisJ(axisj) { @@ -18,6 +12,7 @@ DirectionCosineConstraintIJ::DirectionCosineConstraintIJ(EndFrmcptr frmi, EndFrm void DirectionCosineConstraintIJ::initialize() { + initaAijIeJe(); } void MbD::DirectionCosineConstraintIJ::initializeLocally() @@ -32,7 +27,7 @@ void MbD::DirectionCosineConstraintIJ::initializeGlobally() void DirectionCosineConstraintIJ::initaAijIeJe() { - aAijIeJe = std::make_shared(); + aAijIeJe = CREATE::With(frmI, frmJ, axisI, axisJ); } void MbD::DirectionCosineConstraintIJ::postInput() @@ -41,4 +36,11 @@ void MbD::DirectionCosineConstraintIJ::postInput() void MbD::DirectionCosineConstraintIJ::calcPostDynCorrectorIteration() { + aG = aAijIeJe->aAijIeJe - aConstant; +} + +void MbD::DirectionCosineConstraintIJ::prePosIC() +{ + aAijIeJe->prePosIC(); + Constraint::prePosIC(); } diff --git a/MbDCode/DirectionCosineConstraintIJ.h b/MbDCode/DirectionCosineConstraintIJ.h index 62c805d..12470ec 100644 --- a/MbDCode/DirectionCosineConstraintIJ.h +++ b/MbDCode/DirectionCosineConstraintIJ.h @@ -9,7 +9,6 @@ namespace MbD { { //axisI axisJ aAijIeJe public: - static std::shared_ptr Create(EndFrmcptr frmi, EndFrmcptr frmj, int axisi, int axisj); DirectionCosineConstraintIJ(EndFrmcptr frmi, EndFrmcptr frmj, int axisi, int axisj); void initialize(); void initializeLocally() override; @@ -17,6 +16,7 @@ namespace MbD { virtual void initaAijIeJe(); void postInput() override; void calcPostDynCorrectorIteration() override; + void prePosIC() override; int axisI, axisJ; std::shared_ptr aAijIeJe; diff --git a/MbDCode/DirectionCosineConstraintIqcJc.cpp b/MbDCode/DirectionCosineConstraintIqcJc.cpp index ca2caea..6e4431b 100644 --- a/MbDCode/DirectionCosineConstraintIqcJc.cpp +++ b/MbDCode/DirectionCosineConstraintIqcJc.cpp @@ -1,5 +1,7 @@ #include "DirectionCosineConstraintIqcJc.h" #include "DirectionCosineIeqcJec.h" +#include "EndFrameqc.h" +#include "CREATE.h" using namespace MbD; @@ -8,15 +10,20 @@ DirectionCosineConstraintIqcJc::DirectionCosineConstraintIqcJc(EndFrmcptr frmi, { } -void DirectionCosineConstraintIqcJc::initialize() -{ -} - void DirectionCosineConstraintIqcJc::initaAijIeJe() { - aAijIeJe = std::make_shared(); + aAijIeJe = CREATE::With(frmI, frmJ, axisI, axisJ); } void MbD::DirectionCosineConstraintIqcJc::calcPostDynCorrectorIteration() { + DirectionCosineConstraintIJ::calcPostDynCorrectorIteration(); + auto aAijIeqJe = std::static_pointer_cast(aAijIeJe); + pGpEI = aAijIeqJe->pAijIeJepEI; + ppGpEIpEI = aAijIeqJe->ppAijIeJepEIpEI; +} + +void MbD::DirectionCosineConstraintIqcJc::useEquationNumbers() +{ + iqEI = std::static_pointer_cast(frmI)->iqE(); } diff --git a/MbDCode/DirectionCosineConstraintIqcJc.h b/MbDCode/DirectionCosineConstraintIqcJc.h index 28f1783..336176e 100644 --- a/MbDCode/DirectionCosineConstraintIqcJc.h +++ b/MbDCode/DirectionCosineConstraintIqcJc.h @@ -8,9 +8,9 @@ namespace MbD { //pGpEI ppGpEIpEI iqEI public: DirectionCosineConstraintIqcJc(EndFrmcptr frmi, EndFrmcptr frmj, int axisi, int axisj); - void initialize(); void initaAijIeJe() override; void calcPostDynCorrectorIteration() override; + void useEquationNumbers() override; FRowDsptr pGpEI; FMatDsptr ppGpEIpEI; diff --git a/MbDCode/DirectionCosineConstraintIqcJqc.cpp b/MbDCode/DirectionCosineConstraintIqcJqc.cpp index 7391e0e..726d4dd 100644 --- a/MbDCode/DirectionCosineConstraintIqcJqc.cpp +++ b/MbDCode/DirectionCosineConstraintIqcJqc.cpp @@ -1,5 +1,7 @@ #include "DirectionCosineConstraintIqcJqc.h" #include "DirectionCosineIeqcJeqc.h" +#include "EndFrameqc.h" +#include "CREATE.h" using namespace MbD; @@ -8,15 +10,22 @@ DirectionCosineConstraintIqcJqc::DirectionCosineConstraintIqcJqc(EndFrmcptr frmi { } -void DirectionCosineConstraintIqcJqc::initialize() -{ -} - void DirectionCosineConstraintIqcJqc::initaAijIeJe() { - aAijIeJe = std::make_shared(); + aAijIeJe = CREATE::With(frmI, frmJ, axisI, axisJ); } void MbD::DirectionCosineConstraintIqcJqc::calcPostDynCorrectorIteration() { + DirectionCosineConstraintIqcJc::calcPostDynCorrectorIteration(); + auto aAijIeqJqe = std::static_pointer_cast(aAijIeJe); + pGpEJ = aAijIeqJqe->pAijIeJepEJ; + ppGpEIpEJ = aAijIeqJqe->ppAijIeJepEIpEJ; + ppGpEJpEJ = aAijIeqJqe->ppAijIeJepEJpEJ; +} + +void MbD::DirectionCosineConstraintIqcJqc::useEquationNumbers() +{ + DirectionCosineConstraintIqcJc::useEquationNumbers(); + iqEJ = std::static_pointer_cast(frmJ)->iqE(); } diff --git a/MbDCode/DirectionCosineConstraintIqcJqc.h b/MbDCode/DirectionCosineConstraintIqcJqc.h index 57f1eb5..8952e2b 100644 --- a/MbDCode/DirectionCosineConstraintIqcJqc.h +++ b/MbDCode/DirectionCosineConstraintIqcJqc.h @@ -8,9 +8,9 @@ namespace MbD { //pGpEJ ppGpEIpEJ ppGpEJpEJ iqEJ public: DirectionCosineConstraintIqcJqc(EndFrmcptr frmi, EndFrmcptr frmj, int axisi, int axisj); - void initialize(); void initaAijIeJe() override; void calcPostDynCorrectorIteration() override; + void useEquationNumbers() override; FRowDsptr pGpEJ; FMatDsptr ppGpEIpEJ; diff --git a/MbDCode/DirectionCosineConstraintIqctJqc.cpp b/MbDCode/DirectionCosineConstraintIqctJqc.cpp index 57fb084..a15cdbf 100644 --- a/MbDCode/DirectionCosineConstraintIqctJqc.cpp +++ b/MbDCode/DirectionCosineConstraintIqctJqc.cpp @@ -1,5 +1,6 @@ #include "DirectionCosineConstraintIqctJqc.h" #include "DirectionCosineIeqctJeqc.h" +#include "CREATE.h" using namespace MbD; @@ -8,15 +9,7 @@ DirectionCosineConstraintIqctJqc::DirectionCosineConstraintIqctJqc(EndFrmcptr fr { } -void DirectionCosineConstraintIqctJqc::initialize() -{ -} - void DirectionCosineConstraintIqctJqc::initaAijIeJe() { - aAijIeJe = std::make_shared(); -} - -void MbD::DirectionCosineConstraintIqctJqc::calcPostDynCorrectorIteration() -{ + aAijIeJe = CREATE::With(frmI, frmJ, axisI, axisJ); } diff --git a/MbDCode/DirectionCosineConstraintIqctJqc.h b/MbDCode/DirectionCosineConstraintIqctJqc.h index 3283486..9ed5c7b 100644 --- a/MbDCode/DirectionCosineConstraintIqctJqc.h +++ b/MbDCode/DirectionCosineConstraintIqctJqc.h @@ -8,9 +8,7 @@ namespace MbD { //pGpt ppGpEIpt ppGpEJpt ppGptpt public: DirectionCosineConstraintIqctJqc(EndFrmcptr frmi, EndFrmcptr frmj, int axisi, int axisj); - void initialize(); void initaAijIeJe() override; - void calcPostDynCorrectorIteration() override; double pGpt; FRowDsptr ppGpEIpt; diff --git a/MbDCode/DirectionCosineIecJec.cpp b/MbDCode/DirectionCosineIecJec.cpp index 16f2623..fa9a966 100644 --- a/MbDCode/DirectionCosineIecJec.cpp +++ b/MbDCode/DirectionCosineIecJec.cpp @@ -15,13 +15,9 @@ DirectionCosineIecJec::DirectionCosineIecJec(EndFrmcptr frmi, EndFrmcptr frmj, i } -void MbD::DirectionCosineIecJec::initialize() -{ - aAijIeJe = 0.0; - aAjOIe = std::make_shared>(3); - aAjOJe = std::make_shared>(3); -} - void MbD::DirectionCosineIecJec::calcPostDynCorrectorIteration() { + aAjOIe = frmI->aAjOe(axisI); + aAjOJe = frmJ->aAjOe(axisJ); + aAijIeJe = aAjOIe->dot(aAjOJe); } diff --git a/MbDCode/DirectionCosineIecJec.h b/MbDCode/DirectionCosineIecJec.h index 25a044b..205f22c 100644 --- a/MbDCode/DirectionCosineIecJec.h +++ b/MbDCode/DirectionCosineIecJec.h @@ -13,10 +13,9 @@ namespace MbD { public: DirectionCosineIecJec(); DirectionCosineIecJec(EndFrmcptr frmi, EndFrmcptr frmj, int axisi, int axisj); - void initialize(); void calcPostDynCorrectorIteration() override; - int axisI, axisJ; + int axisI, axisJ; //0, 1, 2 = x, y, z double aAijIeJe; std::shared_ptr> aAjOIe, aAjOJe; }; diff --git a/MbDCode/DirectionCosineIeqcJec.cpp b/MbDCode/DirectionCosineIeqcJec.cpp index ff6048e..022aab0 100644 --- a/MbDCode/DirectionCosineIeqcJec.cpp +++ b/MbDCode/DirectionCosineIeqcJec.cpp @@ -14,6 +14,7 @@ DirectionCosineIeqcJec::DirectionCosineIeqcJec(EndFrmcptr frmi, EndFrmcptr frmj, void DirectionCosineIeqcJec::initialize() { + DirectionCosineIecJec::initialize(); pAijIeJepEI = std::make_shared>(4); ppAijIeJepEIpEI = std::make_shared>(4, 4); } @@ -25,4 +26,20 @@ void MbD::DirectionCosineIeqcJec::initializeGlobally() void MbD::DirectionCosineIeqcJec::calcPostDynCorrectorIteration() { + DirectionCosineIecJec::calcPostDynCorrectorIteration(); + pAjOIepEIT = std::static_pointer_cast(frmI)->pAjOepET(axisI); + for (size_t i = 0; i < 4; i++) + { + pAijIeJepEI->at(i) = pAjOIepEIT->at(i)->dot(aAjOJe); + } + for (size_t i = 0; i < 4; i++) + { + auto& ppAijIeJepEIipEI = ppAijIeJepEIpEI->at(i); + auto& ppAjOIepEIipEI = ppAjOIepEIpEI->at(i); + for (size_t j = 0; j < 4; j++) + { + ppAijIeJepEIipEI->at(j) = ppAjOIepEIipEI->at(j)->dot(aAjOJe); + } + } + ppAijIeJepEIpEI->symLowerWithUpper(); } diff --git a/MbDCode/DirectionCosineIeqcJeqc.cpp b/MbDCode/DirectionCosineIeqcJeqc.cpp index 656ce0a..f60a1b9 100644 --- a/MbDCode/DirectionCosineIeqcJeqc.cpp +++ b/MbDCode/DirectionCosineIeqcJeqc.cpp @@ -14,6 +14,7 @@ DirectionCosineIeqcJeqc::DirectionCosineIeqcJeqc(EndFrmcptr frmi, EndFrmcptr frm void DirectionCosineIeqcJeqc::initialize() { + DirectionCosineIeqcJec::initialize(); pAijIeJepEJ = std::make_shared>(4); ppAijIeJepEIpEJ = std::make_shared>(4, 4); ppAijIeJepEJpEJ = std::make_shared>(4, 4); @@ -27,4 +28,28 @@ void MbD::DirectionCosineIeqcJeqc::initializeGlobally() void MbD::DirectionCosineIeqcJeqc::calcPostDynCorrectorIteration() { + DirectionCosineIeqcJec::calcPostDynCorrectorIteration(); + pAjOJepEJT = std::static_pointer_cast(frmJ)->pAjOepET(axisJ); + for (size_t i = 0; i < 4; i++) + { + pAijIeJepEJ->at(i) = aAjOIe->dot(pAjOJepEJT->at(i)); + } + for (size_t i = 0; i < 4; i++) + { + auto& ppAijIeJepEIipEJ = ppAijIeJepEIpEJ->at(i); + for (size_t j = 0; j < 4; j++) + { + ppAijIeJepEIipEJ->at(j) = pAjOIepEIT->at(i)->dot(pAjOJepEJT->at(j)); + } + } + for (size_t i = 0; i < 4; i++) + { + auto& ppAijIeJepEJipEJ = ppAijIeJepEJpEJ->at(i); + auto& ppAjOJepEJipEJ = ppAjOJepEJpEJ->at(i); + for (size_t j = 0; j < 4; j++) + { + ppAijIeJepEJipEJ->at(j) = aAjOIe->dot(ppAjOJepEJipEJ->at(j)); + } + } + ppAijIeJepEJpEJ->symLowerWithUpper(); } diff --git a/MbDCode/DirectionCosineIeqctJeqc.cpp b/MbDCode/DirectionCosineIeqctJeqc.cpp index ae39837..b184775 100644 --- a/MbDCode/DirectionCosineIeqctJeqc.cpp +++ b/MbDCode/DirectionCosineIeqctJeqc.cpp @@ -5,17 +5,16 @@ using namespace MbD; DirectionCosineIeqctJeqc::DirectionCosineIeqctJeqc() { - } DirectionCosineIeqctJeqc::DirectionCosineIeqctJeqc(EndFrmcptr frmi, EndFrmcptr frmj, int axisi, int axisj) : DirectionCosineIeqcJeqc(frmi, frmj, axisi, axisj) { - } void DirectionCosineIeqctJeqc::initialize() { + DirectionCosineIeqcJeqc::initialize(); ppAijIeJepEIpt = std::make_shared>(4); ppAijIeJepEJpt = std::make_shared>(4); } @@ -27,4 +26,8 @@ void MbD::DirectionCosineIeqctJeqc::initializeGlobally() void MbD::DirectionCosineIeqctJeqc::calcPostDynCorrectorIteration() { + //"ppAjOIepEIpEI is not longer constant and must be set before any calculation." + + ppAjOIepEIpEI = std::static_pointer_cast(frmI)->ppAjOepEpE(axisI); + DirectionCosineIeqcJeqc::calcPostDynCorrectorIteration(); } diff --git a/MbDCode/DispCompIecJecKec.cpp b/MbDCode/DispCompIecJecKec.cpp index 8b94427..3ee1f38 100644 --- a/MbDCode/DispCompIecJecKec.cpp +++ b/MbDCode/DispCompIecJecKec.cpp @@ -1 +1,14 @@ #include "DispCompIecJecKec.h" + +MbD::DispCompIecJecKec::DispCompIecJecKec() +{ +} + +MbD::DispCompIecJecKec::DispCompIecJecKec(EndFrmcptr frmi, EndFrmcptr frmj, EndFrmcptr frmk, int axisk): KinematicIeJe(frmi, frmj), efrmK(frmk), axisK(axisk) +{ +} + +double MbD::DispCompIecJecKec::value() +{ + return riIeJeKe; +} diff --git a/MbDCode/DispCompIecJecKec.h b/MbDCode/DispCompIecJecKec.h index 3ac0318..b088c30 100644 --- a/MbDCode/DispCompIecJecKec.h +++ b/MbDCode/DispCompIecJecKec.h @@ -7,7 +7,10 @@ namespace MbD { { //efrmK axisK riIeJeKe aAjOKe rIeJeO public: - + DispCompIecJecKec(); + DispCompIecJecKec(EndFrmcptr frmi, EndFrmcptr frmj, EndFrmcptr frmk, int axisk); + + virtual double value(); EndFrmcptr efrmK; int axisK; double riIeJeKe; diff --git a/MbDCode/DispCompIecJecKeqc.cpp b/MbDCode/DispCompIecJecKeqc.cpp index 4b9eac9..676c0ae 100644 --- a/MbDCode/DispCompIecJecKeqc.cpp +++ b/MbDCode/DispCompIecJecKeqc.cpp @@ -1 +1,53 @@ #include "DispCompIecJecKeqc.h" +#include "EndFrameqc.h" + +using namespace MbD; + +MbD::DispCompIecJecKeqc::DispCompIecJecKeqc() +{ +} + +MbD::DispCompIecJecKeqc::DispCompIecJecKeqc(EndFrmcptr frmi, EndFrmcptr frmj, EndFrmcptr frmk, int axisk) : DispCompIecJecKec(frmi, frmj, frmk, axisk) +{ +} + +void MbD::DispCompIecJecKeqc::initialize() +{ + priIeJeKepEK = std::make_shared>(4); + ppriIeJeKepEKpEK = std::make_shared>(4, 4); +} + +void MbD::DispCompIecJecKeqc::initializeGlobally() +{ + ppAjOKepEKpEK = std::static_pointer_cast(efrmK)->ppAjOepEpE(axisK); +} + +void MbD::DispCompIecJecKeqc::calcPostDynCorrectorIteration() +{ + auto frmIqc = std::static_pointer_cast(frmI); + auto frmJqc = std::static_pointer_cast(frmJ); + auto efrmKqc = std::static_pointer_cast(efrmK); + aAjOKe = efrmKqc->aAjOe(axisK); + rIeJeO = frmJqc->rOeO->minusFullColumn(frmIqc->rOeO); + riIeJeKe = aAjOKe->dot(rIeJeO); + pAjOKepEKT = efrmKqc->pAjOepET(axisK); + ppAjOKepEKpEK = efrmKqc->ppAjOepEpE(axisK); + for (size_t i = 0; i < 4; i++) + { + priIeJeKepEK->at(i) = ((pAjOKepEKT->at(i))->dot(rIeJeO)); + auto& ppAjOKepEKipEK = ppAjOKepEKpEK->at(i); + auto& ppriIeJeKepEKipEK = ppriIeJeKepEKpEK->at(i); + ppriIeJeKepEKipEK->at(i) = ((ppAjOKepEKipEK->at(i))->dot(rIeJeO)); + for (size_t j = i + 1; j < 4; j++) + { + auto ppriIeJeKepEKipEKj = (ppAjOKepEKipEK->at(i))->dot(rIeJeO); + ppriIeJeKepEKipEK->at(j) = ppriIeJeKepEKipEKj; + ppriIeJeKepEKpEK->at(j)->at(i) = ppriIeJeKepEKipEKj; + } + } +} + +FMatDsptr MbD::DispCompIecJecKeqc::ppvaluepEKpEK() +{ + return ppriIeJeKepEKpEK; +} diff --git a/MbDCode/DispCompIecJecKeqc.h b/MbDCode/DispCompIecJecKeqc.h index aea94a4..c559993 100644 --- a/MbDCode/DispCompIecJecKeqc.h +++ b/MbDCode/DispCompIecJecKeqc.h @@ -7,7 +7,13 @@ namespace MbD { { //priIeJeKepEK ppriIeJeKepEKpEK pAjOKepEKT ppAjOKepEKpEK public: + DispCompIecJecKeqc(); + DispCompIecJecKeqc(EndFrmcptr frmi, EndFrmcptr frmj, EndFrmcptr frmk, int axisk); + void initialize() override; + void initializeGlobally() override; + void calcPostDynCorrectorIteration() override; + FMatDsptr ppvaluepEKpEK(); FRowDsptr priIeJeKepEK; FMatDsptr ppriIeJeKepEKpEK; FMatDsptr pAjOKepEKT; diff --git a/MbDCode/DispCompIecJecO.cpp b/MbDCode/DispCompIecJecO.cpp index 1786e5c..ceb2467 100644 --- a/MbDCode/DispCompIecJecO.cpp +++ b/MbDCode/DispCompIecJecO.cpp @@ -1 +1,14 @@ #include "DispCompIecJecO.h" + +MbD::DispCompIecJecO::DispCompIecJecO() +{ +} + +MbD::DispCompIecJecO::DispCompIecJecO(EndFrmcptr frmi, EndFrmcptr frmj, int axis) : KinematicIeJe(frmi, frmj), axis(axis) +{ +} + +void MbD::DispCompIecJecO::calcPostDynCorrectorIteration() +{ + riIeJeO = frmJ->riOeO(axis) - frmI->riOeO(axis); +} diff --git a/MbDCode/DispCompIecJecO.h b/MbDCode/DispCompIecJecO.h index f7aeda3..78656f1 100644 --- a/MbDCode/DispCompIecJecO.h +++ b/MbDCode/DispCompIecJecO.h @@ -7,6 +7,9 @@ namespace MbD { { //axis riIeJeO public: + DispCompIecJecO(); + DispCompIecJecO(EndFrmcptr frmi, EndFrmcptr frmj, int axis); + void calcPostDynCorrectorIteration() override; int axis; double riIeJeO; diff --git a/MbDCode/DispCompIeqcJecKeqc.cpp b/MbDCode/DispCompIeqcJecKeqc.cpp index 1aa90b9..cb49af5 100644 --- a/MbDCode/DispCompIeqcJecKeqc.cpp +++ b/MbDCode/DispCompIeqcJecKeqc.cpp @@ -1 +1,97 @@ #include "DispCompIeqcJecKeqc.h" +#include "EndFrameqc.h" + +using namespace MbD; + +MbD::DispCompIeqcJecKeqc::DispCompIeqcJecKeqc() +{ +} + +MbD::DispCompIeqcJecKeqc::DispCompIeqcJecKeqc(EndFrmcptr frmi, EndFrmcptr frmj, EndFrmcptr frmk, int axisk) : DispCompIecJecKeqc(frmi, frmj, frmk, axisk) +{ +} + +void MbD::DispCompIeqcJecKeqc::initialize() +{ + DispCompIecJecKeqc::initialize(); + priIeJeKepXI = std::make_shared>(3); + priIeJeKepEI = std::make_shared>(4); + ppriIeJeKepEIpEI = std::make_shared>(4, 4); + ppriIeJeKepXIpEK = std::make_shared>(3, 4); + ppriIeJeKepEIpEK = std::make_shared>(4, 4); +} + +void MbD::DispCompIeqcJecKeqc::calcPostDynCorrectorIteration() +{ + DispCompIecJecKeqc::calcPostDynCorrectorIteration(); + auto frmIqc = std::static_pointer_cast(frmI); + auto mprIeJeOpEIT = frmIqc->prOeOpE->transpose(); + auto mpprIeJeOpEIpEI = frmIqc->pprOeOpEpE; + for (size_t i = 0; i < 3; i++) + { + priIeJeKepXI->at(i) = 0.0 - (aAjOKe->at(i)); + } + for (size_t i = 0; i < 4; i++) + { + priIeJeKepEI->at(i) = 0.0 - (aAjOKe->dot(mprIeJeOpEIT->at(i))); + } + for (size_t i = 0; i < 3; i++) + { + auto& ppriIeJeKepXIipEK = ppriIeJeKepXIpEK->at(i); + for (size_t j = 0; j < 4; j++) + { + ppriIeJeKepXIipEK->at(j) = 0.0 - (pAjOKepEKT->at(j)->at(i)); + } + } + for (size_t i = 0; i < 4; i++) + { + auto& mpprIeJeOpEIipEI = mpprIeJeOpEIpEI->at(i); + auto& ppriIeJeKepEIipEI = ppriIeJeKepEIpEI->at(i); + ppriIeJeKepEIipEI->at(i) = 0.0 - (aAjOKe->dot(mpprIeJeOpEIipEI->at(i))); + for (size_t j = 0; j < 4; j++) + { + auto ppriIeJeKepEIipEIj = 0.0 - (aAjOKe->dot(mpprIeJeOpEIipEI->at(j))); + ppriIeJeKepEIipEI->at(j) = ppriIeJeKepEIipEIj; + ppriIeJeKepEIpEI->at(j)->at(i) = ppriIeJeKepEIipEIj; + } + } + for (size_t i = 0; i < 4; i++) + { + auto& mprIeJeOpEITi = mprIeJeOpEIT->at(i); + auto& ppriIeJeKepEIipEK = ppriIeJeKepEIpEK->at(i); + for (size_t j = 0; j < 4; j++) + { + ppriIeJeKepEIipEK->at(j) = 0.0 - (pAjOKepEKT->at(j)->dot(mprIeJeOpEITi)); + } + } +} + +FRowDsptr MbD::DispCompIeqcJecKeqc::pvaluepXI() +{ + return priIeJeKepXI; +} + +FRowDsptr MbD::DispCompIeqcJecKeqc::pvaluepEI() +{ + return priIeJeKepEI; +} + +FRowDsptr MbD::DispCompIeqcJecKeqc::pvaluepEK() +{ + return priIeJeKepEK; +} + +FMatDsptr MbD::DispCompIeqcJecKeqc::ppvaluepXIpEK() +{ + return ppriIeJeKepXIpEK; +} + +FMatDsptr MbD::DispCompIeqcJecKeqc::ppvaluepEIpEK() +{ + return ppriIeJeKepEIpEK; +} + +FMatDsptr MbD::DispCompIeqcJecKeqc::ppvaluepEIpEI() +{ + return ppriIeJeKepEIpEI; +} diff --git a/MbDCode/DispCompIeqcJecKeqc.h b/MbDCode/DispCompIeqcJecKeqc.h index 740ea95..7e28a3a 100644 --- a/MbDCode/DispCompIeqcJecKeqc.h +++ b/MbDCode/DispCompIeqcJecKeqc.h @@ -7,7 +7,17 @@ namespace MbD { { //priIeJeKepXI priIeJeKepEI ppriIeJeKepXIpEK ppriIeJeKepEIpEI ppriIeJeKepEIpEK public: + DispCompIeqcJecKeqc(); + DispCompIeqcJecKeqc(EndFrmcptr frmi, EndFrmcptr frmj, EndFrmcptr frmk, int axisk); + void initialize() override; + void calcPostDynCorrectorIteration() override; + FRowDsptr pvaluepXI(); + FRowDsptr pvaluepEI(); + FRowDsptr pvaluepEK(); + FMatDsptr ppvaluepXIpEK(); + FMatDsptr ppvaluepEIpEK(); + FMatDsptr ppvaluepEIpEI(); FRowDsptr priIeJeKepXI; FRowDsptr priIeJeKepEI; FMatDsptr ppriIeJeKepXIpEK; diff --git a/MbDCode/DispCompIeqcJecO.cpp b/MbDCode/DispCompIeqcJecO.cpp index 8eb7ab5..d894db2 100644 --- a/MbDCode/DispCompIeqcJecO.cpp +++ b/MbDCode/DispCompIeqcJecO.cpp @@ -1 +1,23 @@ #include "DispCompIeqcJecO.h" +#include "EndFrameqc.h" + +MbD::DispCompIeqcJecO::DispCompIeqcJecO() +{ +} + +MbD::DispCompIeqcJecO::DispCompIeqcJecO(EndFrmcptr frmi, EndFrmcptr frmj, int axis) : DispCompIecJecO(frmi, frmj, axis) +{ +} + +void MbD::DispCompIeqcJecO::initializeGlobally() +{ + priIeJeOpXI = std::make_shared>(3, 0.0); + priIeJeOpXI->at(axis) = -1.0; + ppriIeJeOpEIpEI = std::static_pointer_cast(frmI)->ppriOeOpEpE(axis)->negated(); +} + +void MbD::DispCompIeqcJecO::calcPostDynCorrectorIteration() +{ + DispCompIecJecO::calcPostDynCorrectorIteration(); + priIeJeOpEI = std::static_pointer_cast(frmI)->priOeOpE(axis)->negated(); +} diff --git a/MbDCode/DispCompIeqcJecO.h b/MbDCode/DispCompIeqcJecO.h index 78741fd..862b51d 100644 --- a/MbDCode/DispCompIeqcJecO.h +++ b/MbDCode/DispCompIeqcJecO.h @@ -7,6 +7,10 @@ namespace MbD { { //priIeJeOpXI priIeJeOpEI ppriIeJeOpEIpEI public: + DispCompIeqcJecO(); + DispCompIeqcJecO(EndFrmcptr frmi, EndFrmcptr frmj, int axis); + void initializeGlobally() override; + void calcPostDynCorrectorIteration() override; FRowDsptr priIeJeOpXI; FRowDsptr priIeJeOpEI; diff --git a/MbDCode/DispCompIeqcJeqcKeqc.cpp b/MbDCode/DispCompIeqcJeqcKeqc.cpp index 2686a3c..ae1ccb0 100644 --- a/MbDCode/DispCompIeqcJeqcKeqc.cpp +++ b/MbDCode/DispCompIeqcJeqcKeqc.cpp @@ -1 +1,65 @@ #include "DispCompIeqcJeqcKeqc.h" +#include "EndFrameqc.h" + +MbD::DispCompIeqcJeqcKeqc::DispCompIeqcJeqcKeqc() +{ +} + +MbD::DispCompIeqcJeqcKeqc::DispCompIeqcJeqcKeqc(EndFrmcptr frmi, EndFrmcptr frmj, EndFrmcptr frmk, int axisk) : DispCompIeqcJecKeqc(frmi, frmj, frmk, axisk) +{ +} + +void MbD::DispCompIeqcJeqcKeqc::initialize() +{ + DispCompIeqcJecKeqc::initialize(); + priIeJeKepXJ = std::make_shared>(3); + priIeJeKepEJ = std::make_shared>(4); + ppriIeJeKepEJpEJ = std::make_shared>(4, 4); + ppriIeJeKepXJpEK = std::make_shared>(3, 4); + ppriIeJeKepEJpEK = std::make_shared>(4, 4); +} + +void MbD::DispCompIeqcJeqcKeqc::calcPostDynCorrectorIteration() +{ + DispCompIeqcJecKeqc::calcPostDynCorrectorIteration(); + auto frmJqc = std::static_pointer_cast(frmJ); + auto prIeJeOpEJT = frmJqc->prOeOpE->transpose(); + auto pprIeJeOpEJpEJ = frmJqc->pprOeOpEpE; + for (size_t i = 0; i < 3; i++) + { + priIeJeKepXJ->at(i) = (aAjOKe->at(i)); + } + for (size_t i = 0; i < 4; i++) + { + priIeJeKepEJ->at(i) = (aAjOKe->dot(prIeJeOpEJT->at(i))); + } + for (size_t i = 0; i < 3; i++) + { + auto& ppriIeJeKepXJipEK = ppriIeJeKepXJpEK->at(i); + for (size_t j = 0; j < 4; j++) + { + ppriIeJeKepXJipEK->at(j) = (pAjOKepEKT->at(j)->at(i)); + } + } + for (size_t i = 0; i < 4; i++) + { + auto& pprIeJeOpEJipEJ = pprIeJeOpEJpEJ->at(i); + auto& ppriIeJeKepEJipEJ = ppriIeJeKepEJpEJ->at(i); + ppriIeJeKepEJipEJ->at(i) = (aAjOKe->dot(pprIeJeOpEJipEJ->at(i))); + for (size_t j = 0; j < 4; j++) + { + auto ppriIeJeKepEJipEJj = (aAjOKe->dot(pprIeJeOpEJipEJ->at(j))); + ppriIeJeKepEJipEJ->at(j) = ppriIeJeKepEJipEJj; + ppriIeJeKepEJpEJ->at(j)->at(i) = ppriIeJeKepEJipEJj; + } + } + for (size_t i = 0; i < 4; i++) + { + auto& prIeJeOpEJTi = prIeJeOpEJT->at(i); + auto& ppriIeJeKepEJipEK = ppriIeJeKepEJpEK->at(i); + for (size_t j = 0; j < 4; j++) + { + ppriIeJeKepEJipEK->at(j) = (pAjOKepEKT->at(j)->dot(prIeJeOpEJTi)); + } + } +} diff --git a/MbDCode/DispCompIeqcJeqcKeqc.h b/MbDCode/DispCompIeqcJeqcKeqc.h index 34e26f9..c6752c0 100644 --- a/MbDCode/DispCompIeqcJeqcKeqc.h +++ b/MbDCode/DispCompIeqcJeqcKeqc.h @@ -7,6 +7,10 @@ namespace MbD { { //priIeJeKepXJ priIeJeKepEJ ppriIeJeKepXJpEK ppriIeJeKepEJpEJ ppriIeJeKepEJpEK public: + DispCompIeqcJeqcKeqc(); + DispCompIeqcJeqcKeqc(EndFrmcptr frmi, EndFrmcptr frmj, EndFrmcptr frmk, int axisk); + void initialize() override; + void calcPostDynCorrectorIteration() override; FRowDsptr priIeJeKepXJ; FRowDsptr priIeJeKepEJ; diff --git a/MbDCode/DispCompIeqcJeqcKeqct.cpp b/MbDCode/DispCompIeqcJeqcKeqct.cpp index aa1aa54..e4eb5b2 100644 --- a/MbDCode/DispCompIeqcJeqcKeqct.cpp +++ b/MbDCode/DispCompIeqcJeqcKeqct.cpp @@ -1 +1,28 @@ #include "DispCompIeqcJeqcKeqct.h" +#include "EndFrameqc.h" + +MbD::DispCompIeqcJeqcKeqct::DispCompIeqcJeqcKeqct() +{ +} + +MbD::DispCompIeqcJeqcKeqct::DispCompIeqcJeqcKeqct(EndFrmcptr frmi, EndFrmcptr frmj, EndFrmcptr frmk, int axisk) : DispCompIeqcJeqcKeqc(frmi, frmj, frmk, axisk) +{ +} + +void MbD::DispCompIeqcJeqcKeqct::initialize() +{ + DispCompIeqcJeqcKeqc::initialize(); + ppriIeJeKepXIpt = std::make_shared>(3); + ppriIeJeKepEIpt = std::make_shared>(4); + ppriIeJeKepXJpt = std::make_shared>(3); + ppriIeJeKepEJpt = std::make_shared>(4); + ppriIeJeKepEKpt = std::make_shared>(4); +} + +void MbD::DispCompIeqcJeqcKeqct::calcPostDynCorrectorIteration() +{ + //"ppAjOIepEKpEK is not longer constant and must be set before any calculation." + auto efrmKqc = std::static_pointer_cast(efrmK); + ppAjOKepEKpEK = efrmKqc->ppAjOepEpE(axisK); + DispCompIeqcJeqcKeqc::calcPostDynCorrectorIteration(); +} diff --git a/MbDCode/DispCompIeqcJeqcKeqct.h b/MbDCode/DispCompIeqcJeqcKeqct.h index 4f1ced2..0ebb021 100644 --- a/MbDCode/DispCompIeqcJeqcKeqct.h +++ b/MbDCode/DispCompIeqcJeqcKeqct.h @@ -7,6 +7,10 @@ namespace MbD { { //priIeJeKept ppriIeJeKepXIpt ppriIeJeKepEIpt ppriIeJeKepXJpt ppriIeJeKepEJpt ppriIeJeKepEKpt ppriIeJeKeptpt public: + DispCompIeqcJeqcKeqct(); + DispCompIeqcJeqcKeqct(EndFrmcptr frmi, EndFrmcptr frmj, EndFrmcptr frmk, int axisk); + void initialize() override; + void calcPostDynCorrectorIteration() override; double priIeJeKept; FRowDsptr ppriIeJeKepXIpt; diff --git a/MbDCode/DispCompIeqcJeqcO.cpp b/MbDCode/DispCompIeqcJeqcO.cpp index 05ac82c..684f91e 100644 --- a/MbDCode/DispCompIeqcJeqcO.cpp +++ b/MbDCode/DispCompIeqcJeqcO.cpp @@ -1 +1,24 @@ #include "DispCompIeqcJeqcO.h" +#include "EndFrameqc.h" + +MbD::DispCompIeqcJeqcO::DispCompIeqcJeqcO() +{ +} + +MbD::DispCompIeqcJeqcO::DispCompIeqcJeqcO(EndFrmcptr frmi, EndFrmcptr frmj, int axis) : DispCompIeqcJecO(frmi, frmj, axis) +{ +} + +void MbD::DispCompIeqcJeqcO::initializeGlobally() +{ + DispCompIeqcJecO::initializeGlobally(); + priIeJeOpXJ = std::make_shared>(3, 0.0); + priIeJeOpXJ->at(axis) = 1.0; + ppriIeJeOpEJpEJ = std::static_pointer_cast(frmJ)->ppriOeOpEpE(axis); +} + +void MbD::DispCompIeqcJeqcO::calcPostDynCorrectorIteration() +{ + DispCompIeqcJecO::calcPostDynCorrectorIteration(); + priIeJeOpEJ = std::static_pointer_cast(frmJ)->priOeOpE(axis); +} diff --git a/MbDCode/DispCompIeqcJeqcO.h b/MbDCode/DispCompIeqcJeqcO.h index f272f14..b4dc305 100644 --- a/MbDCode/DispCompIeqcJeqcO.h +++ b/MbDCode/DispCompIeqcJeqcO.h @@ -7,6 +7,10 @@ namespace MbD { { //priIeJeOpXJ priIeJeOpEJ ppriIeJeOpEJpEJ public: + DispCompIeqcJeqcO(); + DispCompIeqcJeqcO(EndFrmcptr frmi, EndFrmcptr frmj, int axis); + void initializeGlobally() override; + void calcPostDynCorrectorIteration() override; FRowDsptr priIeJeOpXJ; FRowDsptr priIeJeOpEJ; diff --git a/MbDCode/DispCompIeqctJeqcKeqct.cpp b/MbDCode/DispCompIeqctJeqcKeqct.cpp index 689a1d1..6f998ba 100644 --- a/MbDCode/DispCompIeqctJeqcKeqct.cpp +++ b/MbDCode/DispCompIeqctJeqcKeqct.cpp @@ -1 +1,9 @@ #include "DispCompIeqctJeqcKeqct.h" + +MbD::DispCompIeqctJeqcKeqct::DispCompIeqctJeqcKeqct() +{ +} + +MbD::DispCompIeqctJeqcKeqct::DispCompIeqctJeqcKeqct(EndFrmcptr frmi, EndFrmcptr frmj, EndFrmcptr frmk, int axisk) : DispCompIeqcJeqcKeqct(frmi, frmj, frmk, axisk) +{ +} diff --git a/MbDCode/DispCompIeqctJeqcKeqct.h b/MbDCode/DispCompIeqctJeqcKeqct.h index e2eea94..55a9926 100644 --- a/MbDCode/DispCompIeqctJeqcKeqct.h +++ b/MbDCode/DispCompIeqctJeqcKeqct.h @@ -7,6 +7,8 @@ namespace MbD { { // public: + DispCompIeqctJeqcKeqct(); + DispCompIeqctJeqcKeqct(EndFrmcptr frmi, EndFrmcptr frmj, EndFrmcptr frmk, int axisk); }; } diff --git a/MbDCode/DispCompIeqctJeqcO.cpp b/MbDCode/DispCompIeqctJeqcO.cpp index 3552ffb..024ed44 100644 --- a/MbDCode/DispCompIeqctJeqcO.cpp +++ b/MbDCode/DispCompIeqctJeqcO.cpp @@ -1 +1,23 @@ #include "DispCompIeqctJeqcO.h" +#include "EndFrameqct.h" + +MbD::DispCompIeqctJeqcO::DispCompIeqctJeqcO() +{ +} + +MbD::DispCompIeqctJeqcO::DispCompIeqctJeqcO(EndFrmcptr frmi, EndFrmcptr frmj, int axis) : DispCompIeqcJeqcO(frmi, frmj, axis) +{ +} + +void MbD::DispCompIeqctJeqcO::initializeGlobally() +{ + //ToDo: Check why not using super classes. + ppriIeJeOpEJpEJ = std::static_pointer_cast(frmJ)->ppriOeOpEpE(axis); +} + +void MbD::DispCompIeqctJeqcO::calcPostDynCorrectorIteration() +{ + //"ppriIeJeOpEIpEI is not a constant now." + DispCompIeqcJeqcO::calcPostDynCorrectorIteration(); + ppriIeJeOpEIpEI = std::static_pointer_cast(frmI)->ppriOeOpEpE(axis)->negated(); +} diff --git a/MbDCode/DispCompIeqctJeqcO.h b/MbDCode/DispCompIeqctJeqcO.h index e140ce8..eb45cb4 100644 --- a/MbDCode/DispCompIeqctJeqcO.h +++ b/MbDCode/DispCompIeqctJeqcO.h @@ -7,6 +7,10 @@ namespace MbD { { //priIeJeOpt ppriIeJeOpEIpt ppriIeJeOptpt public: + DispCompIeqctJeqcO(); + DispCompIeqctJeqcO(EndFrmcptr frmi, EndFrmcptr frmj, int axis); + void initializeGlobally() override; + void calcPostDynCorrectorIteration() override; double priIeJeOpt; FRowDsptr ppriIeJeOpEIpt; diff --git a/MbDCode/EndFramec.cpp b/MbDCode/EndFramec.cpp index 7d6d253..b49837a 100644 --- a/MbDCode/EndFramec.cpp +++ b/MbDCode/EndFramec.cpp @@ -2,6 +2,7 @@ #include #include "EndFramec.h" +#include "MarkerFrame.h" using namespace MbD; @@ -40,4 +41,16 @@ void EndFramec::initEndFrameqct() void MbD::EndFramec::calcPostDynCorrectorIteration() { + rOeO = markerFrame->rOmO; + aAOe = markerFrame->aAOm; +} + +FColDsptr MbD::EndFramec::aAjOe(int j) +{ + return aAOe->column(j); +} + +double MbD::EndFramec::riOeO(int i) +{ + return rOeO->at(i); } diff --git a/MbDCode/EndFramec.h b/MbDCode/EndFramec.h index 6f9ddab..510764b 100644 --- a/MbDCode/EndFramec.h +++ b/MbDCode/EndFramec.h @@ -26,6 +26,8 @@ namespace MbD { void initializeGlobally() override; virtual void initEndFrameqct(); void calcPostDynCorrectorIteration() override; + FColDsptr aAjOe(int j); + double riOeO(int i); MarkerFrame* markerFrame; FColDsptr rOeO = std::make_shared>(3); diff --git a/MbDCode/EndFrameqc.cpp b/MbDCode/EndFrameqc.cpp index 95d1c54..b1cdc48 100644 --- a/MbDCode/EndFrameqc.cpp +++ b/MbDCode/EndFrameqc.cpp @@ -4,16 +4,10 @@ #include "EndFrameqct.h" #include "Variable.h" #include "MarkerFrame.h" +#include "CREATE.h" using namespace MbD; -std::shared_ptr MbD::EndFrameqc::Create(const char* name) -{ - auto item = std::make_shared(name); - item->initialize(); - return item; -} - EndFrameqc::EndFrameqc() { } @@ -28,46 +22,28 @@ void EndFrameqc::initialize() ppAOepEpE = std::make_shared>>>(4, 4); } -void EndFrameqc::initializeLocally() -{ - if (endFrameqct) { - endFrameqct->initializeLocally(); - } -} - void EndFrameqc::initializeGlobally() { - if (endFrameqct) { - endFrameqct->initializeGlobally(); - } - else { - pprOeOpEpE = markerFrame->pprOmOpEpE; - ppAOepEpE = markerFrame->ppAOmpEpE; - } + pprOeOpEpE = markerFrame->pprOmOpEpE; + ppAOepEpE = markerFrame->ppAOmpEpE; } void EndFrameqc::initEndFrameqct() { - endFrameqct = EndFrameqct::Create(this->getName().data()); -} - -void EndFrameqc::setrmemBlks(std::shared_ptr>> xyzBlks) -{ - std::static_pointer_cast(endFrameqct)->rmemBlks = xyzBlks; -} - -void EndFrameqc::setphiThePsiBlks(std::shared_ptr>> xyzRotBlks) -{ - std::static_pointer_cast(endFrameqct)->phiThePsiBlks = xyzRotBlks; + endFrameqct = CREATE::With(this->getName().data()); + endFrameqct->prOeOpE = prOeOpE; + endFrameqct->pprOeOpEpE = pprOeOpEpE; + endFrameqct->pAOepE = pAOepE; + endFrameqct->ppAOepEpE = ppAOepEpE; } FMatFColDsptr MbD::EndFrameqc::ppAjOepEpE(int jj) { auto answer = std::make_shared>>>(4, 4); - for (int i = 0; i < 4; i++) { - auto answeri = answer->at(i); - auto ppAOepEipE = ppAOepEpE->at(i); - for (int j = i; j < 4; j++) { + for (size_t i = 0; i < 4; i++) { + auto& answeri = answer->at(i); + auto& ppAOepEipE = ppAOepEpE->at(i); + for (size_t j = i; j < 4; j++) { answeri->at(j) = ppAOepEipE->at(j)->column(jj); } } @@ -77,4 +53,50 @@ FMatFColDsptr MbD::EndFrameqc::ppAjOepEpE(int jj) void MbD::EndFrameqc::calcPostDynCorrectorIteration() { + EndFramec::calcPostDynCorrectorIteration(); + prOeOpE = markerFrame->prOmOpE; + pAOepE = markerFrame->pAOmpE; +} + +FMatDsptr MbD::EndFrameqc::pAjOepET(int axis) +{ + auto answer = std::make_shared>(4, 3); + for (size_t i = 0; i < 4; i++) { + auto& answeri = answer->at(i); + auto& pAOepEi = pAOepE->at(i); + for (size_t j = 0; j < 3; j++) { + auto& answerij = pAOepEi->at(j)->at(axis); + answeri->at(j) = answerij; + } + } + return answer; +} + +FMatDsptr MbD::EndFrameqc::ppriOeOpEpE(int ii) +{ + auto answer = std::make_shared>(4, 4); + for (size_t i = 0; i < 4; i++) { + auto& answeri = answer->at(i); + auto& pprOeOpEipE = pprOeOpEpE->at(i); + for (size_t j = 0; j < 4; j++) { + auto& answerij = pprOeOpEipE->at(j)->at(ii); + answeri->at(j) = answerij; + } + } + return answer; +} + +int MbD::EndFrameqc::iqX() +{ + return markerFrame->iqX(); +} + +int MbD::EndFrameqc::iqE() +{ + return markerFrame->iqE(); +} + +FRowDsptr MbD::EndFrameqc::priOeOpE(int i) +{ + return prOeOpE->at(i); } diff --git a/MbDCode/EndFrameqc.h b/MbDCode/EndFrameqc.h index 748e813..042604f 100644 --- a/MbDCode/EndFrameqc.h +++ b/MbDCode/EndFrameqc.h @@ -1,31 +1,33 @@ #pragma once #include "EndFramec.h" +#include "Symbolic.h" namespace MbD { - class Symbolic; + class EndFrameqct; class EndFrameqc : public EndFramec { //prOeOpE pprOeOpEpE pAOepE ppAOepEpE public: - static std::shared_ptr Create(const char* name); EndFrameqc(); EndFrameqc(const char* str); void initialize(); - void initializeLocally() override; void initializeGlobally() override; void initEndFrameqct() override; - void setrmemBlks(std::shared_ptr>> xyzBlks); - void setphiThePsiBlks(std::shared_ptr>> xyzRotBlks); - FMatFColDsptr ppAjOepEpE(int axis); + FMatFColDsptr ppAjOepEpE(int j); void calcPostDynCorrectorIteration() override; + FMatDsptr pAjOepET(int j); + FMatDsptr ppriOeOpEpE(int i); + int iqX(); + int iqE(); + FRowDsptr priOeOpE(int i); FMatDsptr prOeOpE; std::shared_ptr>>> pprOeOpEpE; std::shared_ptr>>> pAOepE; FMatFMatDsptr ppAOepEpE; - std::shared_ptr endFrameqct; + std::shared_ptr endFrameqct; }; } diff --git a/MbDCode/EndFrameqct.cpp b/MbDCode/EndFrameqct.cpp index 4ae861c..3ae7cd5 100644 --- a/MbDCode/EndFrameqct.cpp +++ b/MbDCode/EndFrameqct.cpp @@ -1,19 +1,14 @@ #include "EndFrameqct.h" +#include "MarkerFrame.h" #include "System.h" #include "Symbolic.h" #include "Time.h" +#include "EulerParameters.h" +#include "CREATE.h" +#include "EulerAngleszxz.h" using namespace MbD; -//class Symbolic; - -std::shared_ptr MbD::EndFrameqct::Create(const char* name) -{ - auto item = std::make_shared(name); - item->initialize(); - return item; -} - EndFrameqct::EndFrameqct() { } @@ -22,14 +17,15 @@ EndFrameqct::EndFrameqct(const char* str) : EndFrameqc(str) { void EndFrameqct::initialize() { - rmem = std::make_shared>(3); - prmempt = std::make_shared>(3); - pprmemptpt = std::make_shared>(3); + EndFrameqc::initialize(); + rmem = std::make_shared>(3); + prmempt = std::make_shared>(3); + pprmemptpt = std::make_shared>(3); aAme = std::make_shared>(3, 3); pAmept = std::make_shared>(3, 3); ppAmeptpt = std::make_shared>(3, 3); pprOeOpEpt = std::make_shared>(3, 4); - pprOeOptpt = std::make_shared>(3); + pprOeOptpt = std::make_shared>(3); ppAOepEpt = std::make_shared>>>(4); ppAOeptpt = std::make_shared>(3, 3); } @@ -62,11 +58,12 @@ void EndFrameqct::initializeGlobally() void EndFrameqct::initprmemptBlks() { - time = System::getInstance().time; - prmemptBlks = std::make_shared< FullColumn>>(3); - for (int i = 0; i < 3; i++) { - auto disp = rmemBlks->at(i); - auto vel = (disp->differentiateWRT(time))->simplified(); + auto& mbdTime = System::getInstance().time; + prmemptBlks = std::make_shared< FullColumn>(3); + for (size_t i = 0; i < 3; i++) { + auto& disp = rmemBlks->at(i); + auto var = disp->differentiateWRT(disp, mbdTime); + auto vel = var->simplified(var); prmemptBlks->at(i) = vel; } } @@ -77,9 +74,19 @@ void EndFrameqct::initpprmemptptBlks() void EndFrameqct::initpPhiThePsiptBlks() { + auto& mbdTime = System::getInstance().time; + pPhiThePsiptBlks = std::make_shared< FullColumn>(3); + for (size_t i = 0; i < 3; i++) { + auto& angle = phiThePsiBlks->at(i); + auto var = angle->differentiateWRT(angle, mbdTime); + std::cout << "var " << *var << std::endl; + auto vel = var->simplified(var); + std::cout << "vel " << *vel << std::endl; + pPhiThePsiptBlks->at(i) = vel; + } } -void EndFrameqct::initppPhiThePsiptptBlks() +void MbD::EndFrameqct::initppPhiThePsiptptBlks() { } @@ -89,4 +96,63 @@ void MbD::EndFrameqct::postInput() void MbD::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 (size_t i = 0; i < 3; i++) + { + auto& prOmOpEi = prOmOpE->at(i); + auto& prOeOpEi = prOeOpE->at(i); + for (size_t 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::ppApEpEtimesColumn(rpep); + aAOe = aAOm->timesFullMatrix(aAme); + for (size_t i = 0; i < 4; i++) + { + pAOepE->at(i) = pAOmpE->at(i)->timesFullMatrix(aAme); + } + auto aApe = markerFrame->aApm->timesFullMatrix(aAme); + ppAOepEpE = EulerParameters::ppApEpEtimesMatrix(aApe); +} + +void MbD::EndFrameqct::prePosIC() +{ + time = System::getInstance().mbdTimeValue(); + this->evalrmem(); + this->evalAme(); + EndFrameqc::prePosIC(); +} + +void MbD::EndFrameqct::evalrmem() +{ + if (rmemBlks) { + for (size_t i = 0; i < 3; i++) + { + auto& expression = rmemBlks->at(i); + double value = expression->getValue(); + rmem->at(i) = value; + } + } +} + +void MbD::EndFrameqct::evalAme() +{ + if (phiThePsiBlks) { + auto phiThePsi = CREATE>::With(); + for (size_t i = 0; i < 3; i++) + { + auto& expression = phiThePsiBlks->at(i); + auto value = expression->getValue(); + phiThePsi->at(i) = value; + } + phiThePsi->calc(); + aAme = phiThePsi->aA; + } } diff --git a/MbDCode/EndFrameqct.h b/MbDCode/EndFrameqct.h index b4658a0..4deb721 100644 --- a/MbDCode/EndFrameqct.h +++ b/MbDCode/EndFrameqct.h @@ -1,9 +1,8 @@ #pragma once #include "EndFrameqc.h" +#include "Symbolic.h" namespace MbD { - - class Symbolic; class Time; class EndFrameqct : public EndFrameqc @@ -11,7 +10,6 @@ namespace MbD { //time rmemBlks prmemptBlks pprmemptptBlks phiThePsiBlks pPhiThePsiptBlks ppPhiThePsiptptBlks //rmem prmempt pprmemptpt aAme pAmept ppAmeptpt prOeOpt pprOeOpEpt pprOeOptpt pAOept ppAOepEpt ppAOeptpt public: - static std::shared_ptr Create(const char* name); EndFrameqct(); EndFrameqct(const char* str); void initialize(); @@ -23,10 +21,13 @@ namespace MbD { void initppPhiThePsiptptBlks(); void postInput() override; void calcPostDynCorrectorIteration() override; + void prePosIC() override; + void evalrmem(); + void evalAme(); - std::shared_ptr