From 0c66ef79eea0b38dc7afec8bf2cfab7ab38a3a35 Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Mon, 1 Aug 2022 12:42:16 +0200 Subject: [PATCH] changed: facilitate reuse of ForceBase derived integrands previously there was no way to clear the buffers used during integration. now initBuffer resizes only if necessary, but always zeros the underlying buffer --- src/ASM/IntegrandBase.C | 36 +++++++++++++++++++++++------------- src/ASM/IntegrandBase.h | 5 ++++- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/ASM/IntegrandBase.C b/src/ASM/IntegrandBase.C index e047d2df..ce8bf0a2 100644 --- a/src/ASM/IntegrandBase.C +++ b/src/ASM/IntegrandBase.C @@ -571,26 +571,36 @@ bool NormBase::reducedInt (LocalIntegral& elmInt, ForceBase::~ForceBase () { - for (LocalIntegral* lint : eForce) - delete lint; - delete[] eBuffer; + this->clearBuffer(); } -bool ForceBase::initBuffer (size_t nel) +void ForceBase::clearBuffer () { - if (eBuffer) return false; + for (LocalIntegral* lint : eForce) + delete lint; + eForce.clear(); + delete[] eBuffer; + eBuffer = nullptr; +} + +void ForceBase::initBuffer (size_t nel) +{ size_t ncmp = this->getNoComps(); - eBuffer = new double[ncmp*nel]; + + if (eForce.size() != nel) { + this->clearBuffer(); + + eBuffer = new double[ncmp*nel]; + + eForce.reserve(nel); + double* q = eBuffer; + for (size_t i = 0; i < nel; i++, q += ncmp) + eForce.push_back(new ElmNorm(q,ncmp)); + } + memset(eBuffer,0,ncmp*nel*sizeof(double)); - - eForce.reserve(nel); - double* q = eBuffer; - for (size_t i = 0; i < nel; i++, q += ncmp) - eForce.push_back(new ElmNorm(q,ncmp)); - - return true; } diff --git a/src/ASM/IntegrandBase.h b/src/ASM/IntegrandBase.h index 1b81a49f..c1a95cd7 100644 --- a/src/ASM/IntegrandBase.h +++ b/src/ASM/IntegrandBase.h @@ -481,7 +481,7 @@ public: virtual ~ForceBase(); //! \brief Allocates internal element force buffers. - bool initBuffer(size_t nel); + void initBuffer(size_t nel); //! \brief Assembles the global forces. void assemble(RealArray& force) const; @@ -536,6 +536,9 @@ public: virtual bool hasBoundaryTerms() const { return true; } protected: + //! \brief Clears out internal buffers. + void clearBuffer(); + IntegrandBase& myProblem; //!< The problem-specific data LintegralVec eForce; //!< Local integrals used during force integration double* eBuffer; //!< Element force buffer used during integration