Skip to content

Commit

Permalink
Merge pull request #1032 from LLNL/bugfix/bramwell/memory_leak
Browse files Browse the repository at this point in the history
Fix the finite element dual assignment operators
  • Loading branch information
jamiebramwell committed Dec 20, 2023
2 parents b2ab378 + c3962f1 commit b571c8f
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 9 deletions.
8 changes: 2 additions & 6 deletions src/serac/physics/solid_mechanics.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1167,12 +1167,8 @@ class SolidMechanics<order, dim, Parameters<parameter_space...>, std::integer_se
// the material state buffers to be updated
residual_->update_qdata = true;

// this seems like the wrong way to be doing this assignment, but
// reactions_ = residual(displacement, ...);
// isn't currently supported

reactions_.Vector::operator=((*residual_)(ode_time_point_, displacement_, acceleration_, shape_displacement_,
*parameters_[parameter_indices].state...));
reactions_ = (*residual_)(ode_time_point_, displacement_, acceleration_, shape_displacement_,
*parameters_[parameter_indices].state...);

residual_->update_qdata = false;
}
Expand Down
29 changes: 27 additions & 2 deletions src/serac/physics/state/finite_element_dual.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,35 @@ class FiniteElementDual : public FiniteElementVector {
*
* @param[in] rhs The input Dual used for construction
*/
FiniteElementDual(const FiniteElementDual& rhs) : FiniteElementVector(rhs) {}
FiniteElementDual(const FiniteElementDual& rhs) : FiniteElementVector(rhs)
{
if (rhs.linear_form_) {
linearForm();
*linear_form_ = *rhs.linear_form_;
}
}

/**
* @brief Move construct a new Finite Element Dual object
*
* @param[in] rhs The input vector used for construction
*/
FiniteElementDual(FiniteElementDual&& rhs) : FiniteElementVector(std::move(rhs)) {}
FiniteElementDual(FiniteElementDual&& rhs) : FiniteElementVector(rhs)
{
this->linear_form_ = std::move(rhs.linear_form_);
}

/**
* @brief Move assignment
*
* @param rhs The right hand side input Dual
* @return The assigned FiniteElementDual
*/
FiniteElementDual& operator=(FiniteElementDual&& rhs)
{
this->linear_form_ = std::move(rhs.linear_form_);
return *this;
}

/**
* @brief Copy assignment
Expand All @@ -54,6 +75,10 @@ class FiniteElementDual : public FiniteElementVector {
FiniteElementDual& operator=(const FiniteElementDual& rhs)
{
FiniteElementVector::operator=(rhs);
if (rhs.linear_form_) {
linearForm();
*linear_form_ = *rhs.linear_form_;
}
return *this;
}

Expand Down
49 changes: 48 additions & 1 deletion src/serac/physics/state/finite_element_state.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ inline bool is_vector_valued(const GeneralCoefficient& coef)
class FiniteElementState : public FiniteElementVector {
public:
using FiniteElementVector::FiniteElementVector;
using FiniteElementVector::operator=;
using mfem::Vector::Print;

/**
Expand Down Expand Up @@ -77,6 +76,54 @@ class FiniteElementState : public FiniteElementVector {
return *this;
}

/**
* @brief Move assignment
*
* @param rhs The right hand side input State
* @return The assigned FiniteElementState
*/
FiniteElementState& operator=(FiniteElementState&& rhs)
{
FiniteElementVector::operator=(rhs);
return *this;
}

/**
* @brief Copy assignment with HypreParVector
*
* @param rhs The right hand side input HypreParVector
* @return The assigned FiniteElementState
*/
FiniteElementState& operator=(const mfem::HypreParVector& rhs)
{
FiniteElementVector::operator=(rhs);
return *this;
}

/**
* @brief Copy assignment with mfem::Vector
*
* @param rhs The right hand side input State
* @return The assigned FiniteElementState
*/
FiniteElementState& operator=(const mfem::Vector& rhs)
{
FiniteElementVector::operator=(rhs);
return *this;
}

/**
* @brief Copy assignment with double
*
* @param rhs The right hand side input double
* @return The assigned FiniteElementState
*/
FiniteElementState& operator=(double rhs)
{
FiniteElementVector::operator=(rhs);
return *this;
}

/**
* @brief Fill a user-provided grid function based on the underlying true vector
*
Expand Down
6 changes: 6 additions & 0 deletions src/serac/physics/state/finite_element_vector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ FiniteElementVector& FiniteElementVector::operator=(const mfem::HypreParVector&
return *this;
}

FiniteElementVector& FiniteElementVector::operator=(const mfem::Vector& rhs)
{
Vector::operator=(rhs);
return *this;
}

FiniteElementVector& FiniteElementVector::operator=(const FiniteElementVector& rhs)
{
SLIC_ERROR_IF(Size() != rhs.Size(),
Expand Down
8 changes: 8 additions & 0 deletions src/serac/physics/state/finite_element_vector.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,14 @@ class FiniteElementVector : public mfem::HypreParVector {
*/
FiniteElementVector& operator=(const mfem::HypreParVector& rhs);

/**
* @brief Copy assignment from a hypre par vector
*
* @param rhs The rhs input hypre par vector
* @return The copy assigned input vector
*/
FiniteElementVector& operator=(const mfem::Vector& rhs);

/**
* @brief Returns the MPI communicator for the state
* @return The underlying MPI communicator
Expand Down

0 comments on commit b571c8f

Please sign in to comment.