Files
solver/OndselSolver/EulerConstraint.cpp
aiksiongkoh 3d6a23a678 Cmake gtest (#72)
* Check rackpin and gear for zero radii

* rebase zero-radii-check (#69)

* contributing

* Update push-freecad.yml

updated actions/checkout to v4

* dragging log for debugging

* fix calcdxNorm crash

* setDebug and remove MBDyn*

* Update cmakelists.txt

* fix includes for gcc-14

gcc-14 is more disciplined about not including <algorithm> transitively.

* fix runDragStep

* backhoe files (#65)

* Mark unused variables to silence compiler warnings. (#64)

* Backhoe issues (#67)

* backhoe issues

* runDragStep edit

* backhoe issues

* runDragStep edit

* Reduce large drag step progressively until convergence.

* Switch to using built-in M_PI, even on MSVC (#68)

---------

Co-authored-by: Brad Collette <bradcollette@pop-os.localdomain>
Co-authored-by: mosfet80 <realeandrea@yahoo.it>
Co-authored-by: PaddleStroke <pierrelouis.boyer@gmail.com>
Co-authored-by: Jed Brown <jed@jedbrown.org>
Co-authored-by: sliptonic <shopinthewoods@gmail.com>
Co-authored-by: Chris Hennes <chennes@pioneerlibrarysystem.org>

* in progress

* Gtest added

---------

Co-authored-by: Brad Collette <bradcollette@pop-os.localdomain>
Co-authored-by: mosfet80 <realeandrea@yahoo.it>
Co-authored-by: PaddleStroke <pierrelouis.boyer@gmail.com>
Co-authored-by: Jed Brown <jed@jedbrown.org>
Co-authored-by: sliptonic <shopinthewoods@gmail.com>
Co-authored-by: Chris Hennes <chennes@pioneerlibrarysystem.org>
2024-07-30 14:45:59 -06:00

86 lines
2.2 KiB
C++

/***************************************************************************
* Copyright (c) 2023 Ondsel, Inc. *
* *
* This file is part of OndselSolver. *
* *
* See LICENSE file for details about copyright. *
***************************************************************************/
#include "EulerConstraint.h"
#include "Item.h"
#include "PartFrame.h"
using namespace MbD;
EulerConstraint::EulerConstraint()
{
}
EulerConstraint::EulerConstraint(const std::string& str) : Constraint(str)
{
}
void EulerConstraint::initialize()
{
Constraint::initialize();
pGpE = std::make_shared<FullRow<double>>(4);
}
void EulerConstraint::calcPostDynCorrectorIteration()
{
auto& qE = static_cast<PartFrame*>(owner)->qE;
aG = qE->sumOfSquares() - 1.0;
for (size_t i = 0; i < 4; i++)
{
pGpE->at(i) = 2.0 * qE->at(i);
}
}
void EulerConstraint::useEquationNumbers()
{
iqE = static_cast<PartFrame*>(owner)->iqE;
}
void EulerConstraint::fillPosICError(FColDsptr col)
{
Constraint::fillPosICError(col);
col->atiplusFullVectortimes(iqE, pGpE, lam);
}
void EulerConstraint::fillPosICJacob(SpMatDsptr mat)
{
//"ppGpEpE is a diag(2,2,2,2)."
mat->atijplusFullRow(iG, iqE, pGpE);
mat->atijplusFullColumn(iqE, iG, pGpE->transpose());
auto twolam = 2.0 * lam;
for (size_t i = 0; i < 4; i++)
{
auto ii = iqE + i;
mat->atijplusNumber(ii, ii, twolam);
}
}
void EulerConstraint::fillPosKineJacob(SpMatDsptr mat)
{
mat->atijplusFullRow(iG, iqE, pGpE);
}
void EulerConstraint::fillVelICJacob(SpMatDsptr mat)
{
mat->atijplusFullRow(iG, iqE, pGpE);
mat->atijplusFullColumn(iqE, iG, pGpE->transpose());
}
void EulerConstraint::fillAccICIterError(FColDsptr col)
{
//"qdotT[ppGpqpq]*qdot."
//"qdotT[2 2 2 2 diag]*qdot."
col->atiplusFullVectortimes(iqE, pGpE, lam);
auto partFrame = static_cast<PartFrame*>(owner);
double sum = pGpE->timesFullColumn(partFrame->qEddot);
sum += 2.0 * partFrame->qEdot->sumOfSquares();
col->atiplusNumber(iG, sum);
}