diff --git a/src/ASM/IntegrandBase.h b/src/ASM/IntegrandBase.h index cb201c72..86e78775 100644 --- a/src/ASM/IntegrandBase.h +++ b/src/ASM/IntegrandBase.h @@ -74,6 +74,8 @@ public: //! \details This method is invoked once before starting the numerical //! integration over the entire spatial domain. virtual void initIntegration(const TimeDomain&, const Vector&, bool = false){} + //! \brief Initializes and toggles the use of left-hand-side matrix buffers. + virtual void initLHSbuffers(size_t) {} //! \brief Initializes the integrand for a new result point loop. //! \details This method is invoked once before starting the evaluation of //! the secondary solution at all result sampling points, after the converged diff --git a/src/SIM/NewmarkSIM.C b/src/SIM/NewmarkSIM.C index 0fd97006..04a0c9d1 100644 --- a/src/SIM/NewmarkSIM.C +++ b/src/SIM/NewmarkSIM.C @@ -149,6 +149,8 @@ void NewmarkSIM::initPrm () model.setIntegrationPrm(1,fabs(alpha2)); model.setIntegrationPrm(2,solveDisp ? -beta : beta); model.setIntegrationPrm(3,gamma); + if (nupdat < maxit) + model.initLHSbuffers(); } diff --git a/src/SIM/SIMbase.C b/src/SIM/SIMbase.C index 8b0f9ce7..96fdb60c 100644 --- a/src/SIM/SIMbase.C +++ b/src/SIM/SIMbase.C @@ -544,6 +544,13 @@ bool SIMbase::initSystem (const SIMbase* that) } +void SIMbase::initLHSbuffers () +{ + if (myProblem) + myProblem->initLHSbuffers(this->getNoElms()); +} + + bool SIMbase::setAssociatedRHS (size_t iMat, size_t iVec) { return myEqSys ? myEqSys->setAssociatedVector(iMat,iVec) : false; @@ -945,6 +952,9 @@ bool SIMbase::assembleSystem (const TimeDomain& time, const Vectors& prevSol, if (&sysQ != myEqSys && isAssembling && mdFlag <= 1) sysQ.initialize(newLHSmatrix); + if (isAssembling && mdFlag <= 1) + it->second->initLHSbuffers(newLHSmatrix); + if (!prevSol.empty()) it->second->initIntegration(time,prevSol.front(),poorConvg); diff --git a/src/SIM/SIMbase.h b/src/SIM/SIMbase.h index 47ad1ecc..b4fbb227 100644 --- a/src/SIM/SIMbase.h +++ b/src/SIM/SIMbase.h @@ -121,6 +121,9 @@ public: //! \brief Lets this simulator share equation system with \a that simulator. bool initSystem(const SIMbase* that); + //! \brief Initializes left-hand-side element matrix buffers for integrand. + void initLHSbuffers(); + //! \brief Associates a system vector to a system matrix. //! \sa AlgEqSystem::setAssociatedVector //! \param[in] iMat Index of a coefficient matrix