From e108538d3e7a1c95deca3ce9f6549d1008137c53 Mon Sep 17 00:00:00 2001 From: Aik-Siong Koh Date: Thu, 5 Oct 2023 07:48:48 -0600 Subject: [PATCH] MBDyn classes for reading --- OndselSolver/MBDynBody.cpp | 40 +++++++- OndselSolver/MBDynBody.h | 8 +- OndselSolver/MBDynElements.cpp | 27 +++++- OndselSolver/MBDynElements.h | 3 + OndselSolver/MBDynItem.cpp | 109 ++++++++++++++++++++++ OndselSolver/MBDynItem.h | 22 ++--- OndselSolver/MBDynNodes.cpp | 2 +- OndselSolver/MBDynReference.cpp | 153 +------------------------------ OndselSolver/MBDynReference.h | 6 -- OndselSolver/MBDynReferences.cpp | 2 +- OndselSolver/MBDynStructural.cpp | 148 +----------------------------- OndselSolver/MBDynStructural.h | 6 -- OndselSolver/MBDynSystem.cpp | 32 +++++-- OndselSolver/MBDynSystem.h | 1 + OndselSolver/OndselSolver.cpp | 2 +- 15 files changed, 223 insertions(+), 338 deletions(-) diff --git a/OndselSolver/MBDynBody.cpp b/OndselSolver/MBDynBody.cpp index 0b05c87..ff17f7c 100644 --- a/OndselSolver/MBDynBody.cpp +++ b/OndselSolver/MBDynBody.cpp @@ -1,4 +1,9 @@ #include "MBDynBody.h" +#include "MBDynReferences.h" +#include "MBDynReference.h" +#include "SymbolicParser.h" +#include "BasicUserFunction.h" +#include "MBDynVariables.h" using namespace MbD; @@ -6,7 +11,38 @@ void MbD::MBDynBody::initialize() { } -void MbD::MBDynBody::parseMBDyn(std::vector& lines) +void MbD::MBDynBody::parseMBDyn(std::string line) +{ + bodyString = line; + size_t previousPos = 0; + auto pos = line.find(":"); + auto front = line.substr(previousPos, pos - previousPos); + assert(front.find("body") != std::string::npos); + auto arguments = std::make_shared>(); + 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()); + iss = std::istringstream(arguments->at(0)); + iss >> node; + arguments->erase(arguments->begin()); + rOfO = readPosition(arguments); + readInertiaMatrix(arguments); +} + +void MbD::MBDynBody::readInertiaMatrix(std::shared_ptr>& args) { - assert(false); } diff --git a/OndselSolver/MBDynBody.h b/OndselSolver/MBDynBody.h index 9eae6cb..b1148ee 100644 --- a/OndselSolver/MBDynBody.h +++ b/OndselSolver/MBDynBody.h @@ -14,7 +14,13 @@ namespace MbD { { public: void initialize() override; - void parseMBDyn(std::vector& lines) override; + void parseMBDyn(std::string line); + void readInertiaMatrix(std::shared_ptr>& args); + + std::string bodyString, name, node; + double mass; + FColDsptr rOfO; + FMatDsptr aAOf; }; } diff --git a/OndselSolver/MBDynElements.cpp b/OndselSolver/MBDynElements.cpp index 9d3559f..1d0fafe 100644 --- a/OndselSolver/MBDynElements.cpp +++ b/OndselSolver/MBDynElements.cpp @@ -1,4 +1,5 @@ #include "MBDynElements.h" +#include "MBDynBody.h" using namespace MbD; @@ -8,5 +9,29 @@ void MbD::MBDynElements::initialize() void MbD::MBDynElements::parseMBDyn(std::vector& lines) { - assert(false); + elements = std::make_shared>>(); + std::vector bodyToken{ "body:" }; + std::vector jointToken{ "joint:" }; + std::vector::iterator it; + while (true) { + it = findLineWith(lines, bodyToken); + if (it != lines.end()) { + auto body = std::make_shared(); + body->owner = this; + body->parseMBDyn(*it); + elements->push_back(body); + lines.erase(it); + continue; + } + it = findLineWith(lines, jointToken); + if (it != lines.end()) { + auto body = std::make_shared(); + body->owner = this; + body->parseMBDyn(*it); + elements->push_back(body); + lines.erase(it); + continue; + } + break; + } } diff --git a/OndselSolver/MBDynElements.h b/OndselSolver/MBDynElements.h index 0b5cd21..b72d81b 100644 --- a/OndselSolver/MBDynElements.h +++ b/OndselSolver/MBDynElements.h @@ -10,11 +10,14 @@ #include "MBDynBlock.h" namespace MbD { + class MBDynElement; + class MBDynElements : public MBDynBlock { public: void initialize() override; void parseMBDyn(std::vector& lines) override; + std::shared_ptr>> elements; }; } diff --git a/OndselSolver/MBDynItem.cpp b/OndselSolver/MBDynItem.cpp index 12625e2..40482c4 100644 --- a/OndselSolver/MBDynItem.cpp +++ b/OndselSolver/MBDynItem.cpp @@ -1,5 +1,13 @@ #include "MBDynItem.h" #include "MBDynSystem.h" +#include "MBDynVariables.h" +#include "SymbolicParser.h" +#include "BasicUserFunction.h" +#include "EulerAngles.h" +#include "Constant.h" +#include "MBDynReferences.h" +#include "MBDynReference.h" + using namespace MbD; @@ -41,3 +49,104 @@ std::shared_ptr MbD::MBDynItem::mbdynVariables() { return owner->mbdynVariables(); } + +std::shared_ptr MbD::MBDynItem::mbdynReferences() +{ + return owner->mbdynReferences(); +} + +FColDsptr MbD::MBDynItem::readPosition(std::shared_ptr>& args) +{ + auto rOfO = std::make_shared>(3); + auto str = args->at(0); + if (str.find("reference") != std::string::npos) { + args->erase(args->begin()); + std::string refName; + std::istringstream iss(args->at(0)); + iss >> refName; + auto ref = mbdynReferences()->references->at(refName); + args->erase(args->begin()); + auto rFfF = readBasicPosition(args); + auto rOFO = ref->rOfO; + auto aAOF = ref->aAOf; + rOfO = rOFO->plusFullColumn(aAOF->timesFullColumn(rFfF)); + } + else { + rOfO = readBasicPosition(args); + } + return rOfO; +} + +FColDsptr MbD::MBDynItem::readBasicPosition(std::shared_ptr>& args) +{ + auto parser = CREATE::With(); + parser->variables = mbdynVariables()->variables; + auto rFfF = std::make_shared>(3); + std::string str; + for (int i = 0; i < 3; i++) + { + str = args->at(0); + args->erase(args->begin()); + auto userFunc = CREATE::With(str, 1.0); + parser->parseUserFunction(userFunc); + auto sym = parser->stack->top(); + rFfF->at(i) = sym->getValue(); + } + return rFfF; +} + +FMatDsptr MbD::MBDynItem::readOrientation(std::shared_ptr>& args) +{ + auto aAOf = std::make_shared>(3, 3); + auto str = args->at(0); + if (str.find("reference") != std::string::npos) { + args->erase(args->begin()); + std::string refName; + std::istringstream iss(args->at(0)); + iss >> refName; + auto ref = mbdynReferences()->references->at(refName); + args->erase(args->begin()); + auto aAFf = readBasicOrientation(args); + auto aAOF = ref->aAOf; + aAOf = aAOF->timesFullMatrix(aAFf); + } + else { + aAOf = readBasicOrientation(args); + } + return aAOf; +} + +FMatDsptr MbD::MBDynItem::readBasicOrientation(std::shared_ptr>& args) +{ + auto parser = CREATE::With(); + parser->variables = mbdynVariables()->variables; + auto euler = std::make_shared>(); + auto str = args->at(0); + if (str.find("euler") != std::string::npos) { + args->erase(args->begin()); + euler->rotOrder = std::make_shared>(std::initializer_list{ 1, 2, 3 }); + for (int i = 0; i < 3; i++) + { + str = args->at(0); + args->erase(args->begin()); + auto userFunc = CREATE::With(str, 1.0); + parser->parseUserFunction(userFunc); + auto sym = parser->stack->top(); + euler->at(i) = sym; + } + } + else if (str.find("eye") != std::string::npos) { + args->erase(args->begin()); + euler->rotOrder = std::make_shared>(std::initializer_list{ 1, 2, 3 }); + for (int i = 0; i < 3; i++) + { + euler->at(i) = std::make_shared(0.0); + } + } + else { + assert(false); + } + euler->calc(); + auto aAFf = euler->aA; + return aAFf; +} diff --git a/OndselSolver/MBDynItem.h b/OndselSolver/MBDynItem.h index bfd267b..f9c6fb8 100644 --- a/OndselSolver/MBDynItem.h +++ b/OndselSolver/MBDynItem.h @@ -12,6 +12,7 @@ namespace MbD { class MBDynSystem; class MBDynVariables; + class MBDynReferences; class MBDynItem { @@ -25,22 +26,11 @@ namespace MbD { std::vector::iterator findLineWith(std::vector& lines, std::vector& tokens); bool lineHasTokens(const std::string& line, std::vector& tokens); virtual std::shared_ptr mbdynVariables(); - //FRowDsptr readRowOfDoubles(std::string& line); - //FColDsptr readColumnOfDoubles(std::string& line); - //double readDouble(std::string& line); - //int readInt(std::string& line); - //bool readBool(std::string& line); - //std::string readString(std::string& line); - //void readName(std::vector& lines); - //virtual std::string fullName(std::string partialName); - //void readDoublesInto(std::string& str, std::string label, FRowDsptr& row); - //virtual void deleteMbD(); - //virtual void createMbD(std::shared_ptr mbdSys, std::shared_ptr mbdUnits); - //virtual void updateFromMbD(); - //virtual void compareResults(AnalysisType type); - //virtual void outputResults(AnalysisType type); - //std::shared_ptr mbdUnits(); - //std::shared_ptr sptrConstant(double value); + virtual std::shared_ptr mbdynReferences(); + FColDsptr readPosition(std::shared_ptr>& args); + FColDsptr readBasicPosition(std::shared_ptr>& args); + FMatDsptr readOrientation(std::shared_ptr>& args); + FMatDsptr readBasicOrientation(std::shared_ptr>& args); std::string name; MBDynItem* owner; diff --git a/OndselSolver/MBDynNodes.cpp b/OndselSolver/MBDynNodes.cpp index 5a3f20b..f19ee3c 100644 --- a/OndselSolver/MBDynNodes.cpp +++ b/OndselSolver/MBDynNodes.cpp @@ -15,7 +15,7 @@ void MbD::MBDynNodes::parseMBDyn(std::vector& lines) while (true) { auto it = findLineWith(lines, tokens); if (it != lines.end()) { - auto structural = CREATE::With(); + auto structural = std::make_shared(); structural->owner = this; structural->parseMBDyn(*it); nodes->push_back(structural); diff --git a/OndselSolver/MBDynReference.cpp b/OndselSolver/MBDynReference.cpp index 8fa2a89..9c125bf 100644 --- a/OndselSolver/MBDynReference.cpp +++ b/OndselSolver/MBDynReference.cpp @@ -36,161 +36,12 @@ void MbD::MBDynReference::parseMBDyn(std::string line) iss >> name; arguments->erase(arguments->begin()); - readPosition(arguments); - readOrientation(arguments); + rOfO = readPosition(arguments); + aAOf = readOrientation(arguments); readVelocity(arguments); readOmega(arguments); } -//void MbD::MBDynReference::parseMBDyn(std::string line) -//{ -// refString = line; -// std::replace(line.begin(), line.end(), ',', ' '); -// std::istringstream iss(line); -// std::string str; -// iss >> str; -// assert(str == "reference:"); -// iss >> name; -// readPosition(iss); -// readOrientation(iss); -// readVelocity(iss); -// readOmega(iss); -//} - -void MbD::MBDynReference::readPosition(std::istringstream& iss) -{ - auto dddd = iss.str(); - auto parser = CREATE::With(); - parser->variables = mbdynVariables()->variables; - rOfO = std::make_shared>(3); - std::string str; - for (int i = 0; i < 3; i++) - { - iss >> str; - auto userFunc = CREATE::With(str, 1.0); - parser->parseUserFunction(userFunc); - auto sym = parser->stack->top(); - rOfO->at(i) = sym->getValue(); - } -} - -void MbD::MBDynReference::readOrientation(std::istringstream& iss) -{ - std::string str; - iss >> str; - auto parser = CREATE::With(); - parser->variables = mbdynVariables()->variables; - auto euler = std::make_shared>(); - if (str.find("euler") != std::string::npos) { - euler->rotOrder = std::make_shared>(std::initializer_list{ 1, 2, 3 }); - for (int i = 0; i < 3; i++) - { - iss >> str; - auto userFunc = CREATE::With(str, 1.0); - parser->parseUserFunction(userFunc); - auto sym = parser->stack->top(); - euler->at(i) = sym; - double ddd = sym->getValue(); - } - } - else { - assert(false); - } - euler->calc(); - aAOf = euler->aA; -} - -void MbD::MBDynReference::readVelocity(std::istringstream& iss) -{ - auto parser = CREATE::With(); - parser->variables = mbdynVariables()->variables; - vOfO = std::make_shared>(3); - std::string str; - auto p = iss.tellg(); - iss >> str; - if (str.find("null") != std::string::npos) { - return; - } - else { - iss.seekg(p); - for (int i = 0; i < 3; i++) - { - iss >> str; - auto userFunc = CREATE::With(str, 1.0); - parser->parseUserFunction(userFunc); - auto sym = parser->stack->top(); - vOfO->at(i) = sym->getValue(); - } - } -} - -void MbD::MBDynReference::readOmega(std::istringstream& iss) -{ - auto parser = CREATE::With(); - parser->variables = mbdynVariables()->variables; - omeOfO = std::make_shared>(3); - std::string str; - auto p = iss.tellg(); - iss >> str; - if (str.find("null") != std::string::npos) { - return; - } - else { - iss.seekg(p); - for (int i = 0; i < 3; i++) - { - iss >> str; - auto userFunc = CREATE::With(str, 1.0); - parser->parseUserFunction(userFunc); - auto sym = parser->stack->top(); - omeOfO->at(i) = sym->getValue(); - } - } -} - -void MbD::MBDynReference::readPosition(std::shared_ptr>& args) -{ - auto parser = CREATE::With(); - parser->variables = mbdynVariables()->variables; - rOfO = std::make_shared>(3); - std::string str; - for (int i = 0; i < 3; i++) - { - str = args->at(0); - args->erase(args->begin()); - auto userFunc = CREATE::With(str, 1.0); - parser->parseUserFunction(userFunc); - auto sym = parser->stack->top(); - rOfO->at(i) = sym->getValue(); - } -} - -void MbD::MBDynReference::readOrientation(std::shared_ptr>& args) -{ - auto str = args->at(0); - auto parser = CREATE::With(); - parser->variables = mbdynVariables()->variables; - auto euler = std::make_shared>(); - if (str.find("euler") != std::string::npos) { - args->erase(args->begin()); - euler->rotOrder = std::make_shared>(std::initializer_list{ 1, 2, 3 }); - for (int i = 0; i < 3; i++) - { - str = args->at(0); - args->erase(args->begin()); - auto userFunc = CREATE::With(str, 1.0); - parser->parseUserFunction(userFunc); - auto sym = parser->stack->top(); - euler->at(i) = sym; - } - } - else { - assert(false); - } - euler->calc(); - aAOf = euler->aA; -} - void MbD::MBDynReference::readVelocity(std::shared_ptr>& args) { auto parser = CREATE::With(); diff --git a/OndselSolver/MBDynReference.h b/OndselSolver/MBDynReference.h index 4fcd6db..a73e6c1 100644 --- a/OndselSolver/MBDynReference.h +++ b/OndselSolver/MBDynReference.h @@ -16,12 +16,6 @@ namespace MbD { public: void initialize() override; void parseMBDyn(std::string line); - void readPosition(std::istringstream& iss); - void readOrientation(std::istringstream& iss); - void readVelocity(std::istringstream& iss); - void readOmega(std::istringstream& iss); - void readPosition(std::shared_ptr>& args); - void readOrientation(std::shared_ptr>& args); void readVelocity(std::shared_ptr>& args); void readOmega(std::shared_ptr>& args); diff --git a/OndselSolver/MBDynReferences.cpp b/OndselSolver/MBDynReferences.cpp index 4d2ef91..6aec4a1 100644 --- a/OndselSolver/MBDynReferences.cpp +++ b/OndselSolver/MBDynReferences.cpp @@ -16,7 +16,7 @@ void MbD::MBDynReferences::parseMBDyn(std::vector& lines) while (true) { auto it = findLineWith(lines, tokens); if (it != lines.end()) { - auto reference = CREATE::With(); + auto reference = std::make_shared(); reference->owner = this; reference->parseMBDyn(*it); references->insert(std::make_pair(reference->name, reference)); diff --git a/OndselSolver/MBDynStructural.cpp b/OndselSolver/MBDynStructural.cpp index 72ccae7..70267b2 100644 --- a/OndselSolver/MBDynStructural.cpp +++ b/OndselSolver/MBDynStructural.cpp @@ -3,6 +3,9 @@ #include "SymbolicParser.h" #include "BasicUserFunction.h" #include "EulerAngles.h" +#include "Constant.h" +#include "MBDynReferences.h" +#include "MBDynReference.h" using namespace MbD; @@ -39,153 +42,12 @@ void MbD::MBDynStructural::parseMBDyn(std::string line) iss >> type; arguments->erase(arguments->begin()); - readPosition(arguments); - readOrientation(arguments); + rOfO = readPosition(arguments); + aAOf = readOrientation(arguments); readVelocity(arguments); readOmega(arguments); } -void MbD::MBDynStructural::readPosition(std::istringstream& iss) -{ - auto parser = CREATE::With(); - parser->variables = mbdynVariables()->variables; - rOfO = std::make_shared>(3); - std::string str; - for (int i = 0; i < 3; i++) - { - iss >> str; - auto userFunc = CREATE::With(str, 1.0); - parser->parseUserFunction(userFunc); - auto sym = parser->stack->top(); - rOfO->at(i) = sym->getValue(); - } -} - -void MbD::MBDynStructural::readOrientation(std::istringstream& iss) -{ - std::string str; - iss >> str; - auto parser = CREATE::With(); - parser->variables = mbdynVariables()->variables; - auto euler = std::make_shared>(); - if (str.find("eye") != std::string::npos) { - aAOf = std::make_shared>(3, 3); - aAOf->identity(); - return; - } - else if (str.find("euler") != std::string::npos) { - euler->rotOrder = std::make_shared>(std::initializer_list{ 1, 2, 3 }); - for (int i = 0; i < 3; i++) - { - iss >> str; - auto userFunc = CREATE::With(str, 1.0); - parser->parseUserFunction(userFunc); - auto sym = parser->stack->top(); - euler->at(i) = sym; - } - } - else { - assert(false); - } - euler->calc(); - aAOf = euler->aA; -} - -void MbD::MBDynStructural::readVelocity(std::istringstream& iss) -{ - auto parser = CREATE::With(); - parser->variables = mbdynVariables()->variables; - vOfO = std::make_shared>(3); - std::string str; - auto p = iss.tellg(); - iss >> str; - if (str.find("null") != std::string::npos) { - return; - } - else { - iss.seekg(p); - for (int i = 0; i < 3; i++) - { - iss >> str; - auto userFunc = CREATE::With(str, 1.0); - parser->parseUserFunction(userFunc); - auto sym = parser->stack->top(); - vOfO->at(i) = sym->getValue(); - } - } -} - -void MbD::MBDynStructural::readOmega(std::istringstream& iss) -{ - auto parser = CREATE::With(); - parser->variables = mbdynVariables()->variables; - omeOfO = std::make_shared>(3); - std::string str; - auto p = iss.tellg(); - iss >> str; - if (str.find("null") != std::string::npos) { - return; - } - else { - iss.seekg(p); - for (int i = 0; i < 3; i++) - { - iss >> str; - auto userFunc = CREATE::With(str, 1.0); - parser->parseUserFunction(userFunc); - auto sym = parser->stack->top(); - omeOfO->at(i) = sym->getValue(); - } - } -} - -void MbD::MBDynStructural::readPosition(std::shared_ptr>& args) -{ - auto parser = CREATE::With(); - parser->variables = mbdynVariables()->variables; - rOfO = std::make_shared>(3); - std::string str; - for (int i = 0; i < 3; i++) - { - str = args->at(0); - args->erase(args->begin()); - auto userFunc = CREATE::With(str, 1.0); - parser->parseUserFunction(userFunc); - auto sym = parser->stack->top(); - rOfO->at(i) = sym->getValue(); - } -} - -void MbD::MBDynStructural::readOrientation(std::shared_ptr>& args) -{ - auto str = args->at(0); - auto parser = CREATE::With(); - parser->variables = mbdynVariables()->variables; - auto euler = std::make_shared>(); - if (str.find("euler") != std::string::npos) { - args->erase(args->begin()); - euler->rotOrder = std::make_shared>(std::initializer_list{ 1, 2, 3 }); - for (int i = 0; i < 3; i++) - { - str = args->at(0); - args->erase(args->begin()); - auto userFunc = CREATE::With(str, 1.0); - parser->parseUserFunction(userFunc); - auto sym = parser->stack->top(); - euler->at(i) = sym; - } - } - else if (str.find("eye") != std::string::npos) { - args->erase(args->begin()); - euler->rotOrder = std::make_shared>(std::initializer_list{ 1, 2, 3 }); - } - else { - assert(false); - } - euler->calc(); - aAOf = euler->aA; -} - void MbD::MBDynStructural::readVelocity(std::shared_ptr>& args) { auto parser = CREATE::With(); diff --git a/OndselSolver/MBDynStructural.h b/OndselSolver/MBDynStructural.h index 1ff012f..84f5a07 100644 --- a/OndselSolver/MBDynStructural.h +++ b/OndselSolver/MBDynStructural.h @@ -15,12 +15,6 @@ namespace MbD { public: void initialize() override; void parseMBDyn(std::string line); - void readPosition(std::istringstream& iss); - void readOrientation(std::istringstream& iss); - void readVelocity(std::istringstream& iss); - void readOmega(std::istringstream& iss); - void readPosition(std::shared_ptr>& args); - void readOrientation(std::shared_ptr>& args); void readVelocity(std::shared_ptr>& args); void readOmega(std::shared_ptr>& args); diff --git a/OndselSolver/MBDynSystem.cpp b/OndselSolver/MBDynSystem.cpp index 253e2b4..920264d 100644 --- a/OndselSolver/MBDynSystem.cpp +++ b/OndselSolver/MBDynSystem.cpp @@ -14,6 +14,7 @@ #include "MBDynVariables.h" #include "MBDynReferences.h" #include "MBDynNodes.h" +#include "MBDynElements.h" using namespace MbD; @@ -28,7 +29,7 @@ void MbD::MBDynSystem::runFile(const char* filename) eraseComments(lines); auto statements = collectStatements(lines); - auto system = CREATE::With(); + auto system = std::make_shared(); system->setFilename(filename); system->parseMBDyn(statements); system->runKINEMATIC(); @@ -52,6 +53,11 @@ std::shared_ptr MbD::MBDynSystem::mbdynVariables() return variables; } +std::shared_ptr MbD::MBDynSystem::mbdynReferences() +{ + return references; +} + void MbD::MBDynSystem::runKINEMATIC() { assert(false); @@ -69,7 +75,7 @@ void MbD::MBDynSystem::readDataBlock(std::vector& lines) std::vector tokens1{"end:", "data;"}; auto endit = findLineWith(lines, tokens1); std::vector blocklines = { beginit, endit + 1 }; - dataBlk = CREATE::With(); + dataBlk = std::make_shared(); dataBlk->owner = this; dataBlk->parseMBDyn(blocklines); lines.erase(beginit, endit + 1); @@ -82,7 +88,7 @@ void MbD::MBDynSystem::readInitialValueBlock(std::vector& lines) std::vector tokens1{"end:", "initial", "value"}; auto endit = findLineWith(lines, tokens1); std::vector blocklines = { beginit, endit + 1 }; - initialValueBlk = CREATE::With(); + initialValueBlk = std::make_shared(); initialValueBlk->owner = this; initialValueBlk->parseMBDyn(blocklines); lines.erase(beginit, endit + 1); @@ -95,7 +101,7 @@ void MbD::MBDynSystem::readControlDataBlock(std::vector& lines) std::vector tokens1{"end:", "control", "data"}; auto endit = findLineWith(lines, tokens1); std::vector blocklines = { beginit, endit + 1 }; - controlDataBlk = CREATE::With(); + controlDataBlk = std::make_shared(); controlDataBlk->owner = this; controlDataBlk->parseMBDyn(blocklines); lines.erase(beginit, endit + 1); @@ -103,21 +109,21 @@ void MbD::MBDynSystem::readControlDataBlock(std::vector& lines) void MbD::MBDynSystem::readLabels(std::vector& lines) { - labels = CREATE::With(); + labels = std::make_shared(); labels->owner = this; labels->parseMBDyn(lines); } void MbD::MBDynSystem::readVariables(std::vector& lines) { - variables = CREATE::With(); + variables = std::make_shared(); variables->owner = this; variables->parseMBDyn(lines); } void MbD::MBDynSystem::readReferences(std::vector& lines) { - references = CREATE::With(); + references = std::make_shared(); references->owner = this; references->parseMBDyn(lines); } @@ -129,7 +135,7 @@ void MbD::MBDynSystem::readNodesBlock(std::vector& lines) std::vector tokens1{ "end:", "nodes;" }; auto endit = findLineWith(lines, tokens1); std::vector blocklines = { beginit, endit + 1 }; - nodesBlk = CREATE::With(); + nodesBlk = std::make_shared(); nodesBlk->owner = this; nodesBlk->parseMBDyn(blocklines); lines.erase(beginit, endit + 1); @@ -137,7 +143,15 @@ void MbD::MBDynSystem::readNodesBlock(std::vector& lines) void MbD::MBDynSystem::readElementsBlock(std::vector& lines) { - assert(false); + std::vector tokens{ "begin:", "elements;" }; + auto beginit = findLineWith(lines, tokens); + std::vector tokens1{ "end:", "elements;" }; + auto endit = findLineWith(lines, tokens1); + std::vector blocklines = { beginit, endit + 1 }; + elementsBlk = std::make_shared(); + elementsBlk->owner = this; + elementsBlk->parseMBDyn(blocklines); + lines.erase(beginit, endit + 1); } void MbD::MBDynSystem::eraseComments(std::vector& lines) diff --git a/OndselSolver/MBDynSystem.h b/OndselSolver/MBDynSystem.h index a22e21b..69f3d3d 100644 --- a/OndselSolver/MBDynSystem.h +++ b/OndselSolver/MBDynSystem.h @@ -31,6 +31,7 @@ namespace MbD { void initialize() override; void parseMBDyn(std::vector& lines) override; std::shared_ptr mbdynVariables() override; + std::shared_ptr mbdynReferences() override; void runKINEMATIC(); void setFilename(std::string filename); diff --git a/OndselSolver/OndselSolver.cpp b/OndselSolver/OndselSolver.cpp index 4ffea9c..5113114 100644 --- a/OndselSolver/OndselSolver.cpp +++ b/OndselSolver/OndselSolver.cpp @@ -24,7 +24,7 @@ void runSpMat(); int main() { - //MBDynSystem::runFile("crank_slider.mbd"); //To be completed + MBDynSystem::runFile("crank_slider.mbd"); //To be completed //ASMTAssembly::runSinglePendulumSuperSimplified(); //Mass is missing ASMTAssembly::runSinglePendulumSimplified(); ASMTAssembly::runSinglePendulum();