#include "AtPointConstraintIqcJqc.h" #include "DispCompIeqcJeqcO.h" #include "CREATE.h" #include "EndFrameqc.h" using namespace MbD; AtPointConstraintIqcJqc::AtPointConstraintIqcJqc(EndFrmcptr frmi, EndFrmcptr frmj, int axisi) : AtPointConstraintIqcJc(frmi, frmj, axisi) { } void MbD::AtPointConstraintIqcJqc::initializeGlobally() { AtPointConstraintIqcJc::initializeGlobally(); ppGpEJpEJ = (std::static_pointer_cast(riIeJeO))->ppriIeJeOpEJpEJ; } void AtPointConstraintIqcJqc::initriIeJeO() { 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() + axis; iqEJ = std::static_pointer_cast(frmJ)->iqE(); } void MbD::AtPointConstraintIqcJqc::fillPosICError(FColDsptr col) { AtPointConstraintIqcJc::fillPosICError(col); col->at(iqXJminusOnePlusAxis) += lam; col->atiplusFullVectortimes(iqEJ, pGpEJ, lam); } void MbD::AtPointConstraintIqcJqc::fillPosICJacob(SpMatDsptr mat) { AtPointConstraintIqcJc::fillPosICJacob(mat); mat->atijplusNumber(iG, iqXJminusOnePlusAxis, 1.0); mat->atijplusNumber(iqXJminusOnePlusAxis, iG, 1.0); mat->atijplusFullRow(iG, iqEJ, pGpEJ); mat->atijplusFullColumn(iqEJ, iG, pGpEJ->transpose()); mat->atijplusFullMatrixtimes(iqEJ, iqEJ, ppGpEJpEJ, lam); } void MbD::AtPointConstraintIqcJqc::fillPosKineJacob(SpMatDsptr mat) { AtPointConstraintIqcJc::fillPosKineJacob(mat); mat->atijplusNumber(iG, iqXJminusOnePlusAxis, 1.0); mat->atijplusFullRow(iG, iqEJ, pGpEJ); } void MbD::AtPointConstraintIqcJqc::fillVelICJacob(SpMatDsptr mat) { AtPointConstraintIqcJc::fillVelICJacob(mat); mat->atijplusNumber(iG, iqXJminusOnePlusAxis, 1.0); mat->atijplusNumber(iqXJminusOnePlusAxis, iG, 1.0); mat->atijplusFullRow(iG, iqEJ, pGpEJ); mat->atijplusFullColumn(iqEJ, iG, pGpEJ->transpose()); } void MbD::AtPointConstraintIqcJqc::fillAccICIterError(FColDsptr col) { AtPointConstraintIqcJc::fillAccICIterError(col); col->atiplusNumber(iqXJminusOnePlusAxis, lam); col->atiplusFullVectortimes(iqEJ, pGpEJ, lam); auto efrmJqc = std::static_pointer_cast(frmJ); auto qEdotJ = efrmJqc->qEdot(); auto sum = efrmJqc->qXddot()->at(axis); sum += pGpEJ->timesFullColumn(efrmJqc->qEddot()); sum += qEdotJ->transposeTimesFullColumn(ppGpEJpEJ->timesFullColumn(qEdotJ)); col->atiplusNumber(iG, sum); }