Changed: Unified the class GenAlphaMats into the class HHTMats.
This commit is contained in:
@@ -1,102 +0,0 @@
|
||||
// $Id$
|
||||
//==============================================================================
|
||||
//!
|
||||
//! \file GenAlphaMats.C
|
||||
//!
|
||||
//! \date Jul 04 2013
|
||||
//!
|
||||
//! \author Knut Morten Okstad / SINTEF
|
||||
//!
|
||||
//! \brief Representation of the element matrices for a dynamic FEM problem.
|
||||
//!
|
||||
//==============================================================================
|
||||
|
||||
#include "GenAlphaMats.h"
|
||||
|
||||
|
||||
GenAlphaMats::GenAlphaMats (double alpha, double a, double b) : NewmarkMats(a,b)
|
||||
{
|
||||
beta = 0.25*(1.0-alpha)*(1.0-alpha);
|
||||
gamma = 0.5 - alpha;
|
||||
}
|
||||
|
||||
|
||||
const Matrix& GenAlphaMats::getNewtonMatrix () const
|
||||
{
|
||||
Matrix& N = const_cast<Matrix&>(A.front());
|
||||
double alphaPlus1 = 1.5 - gamma; // = 1.0 + alpha
|
||||
|
||||
N = A[2];
|
||||
N.multiply(alphaPlus1*(1.0 + alpha2*gamma/(beta*h)));
|
||||
if (A.size() > 3)
|
||||
N.add(A[3],alphaPlus1);
|
||||
N.add(A[1],(alphaPlus1*gamma*alpha1 + 1.0/h)/(beta*h));
|
||||
|
||||
#if SP_DEBUG > 2
|
||||
std::cout <<"\nElement mass matrix"<< A[1];
|
||||
if (A.size() > 3)
|
||||
std::cout <<"Material stiffness matrix"<< A[2]
|
||||
<<"Geometric stiffness matrix"<< A[3];
|
||||
else
|
||||
std::cout <<"Tangent stiffness matrix"<< A[2];
|
||||
std::cout <<"Resulting Newton matrix"<< A[0];
|
||||
#endif
|
||||
|
||||
return A.front();
|
||||
}
|
||||
|
||||
|
||||
const Vector& GenAlphaMats::getRHSVector () const
|
||||
{
|
||||
int ia = vec.size() - 1; // index to element acceleration vector (a)
|
||||
int iv = vec.size() - 2; // index to element velocity vector (v)
|
||||
|
||||
#if SP_DEBUG > 2
|
||||
std::cout <<"GenAlphaMats::getRHSVector "
|
||||
<< (isPredictor ? "predictor" : "corrector") << std::endl;
|
||||
#endif
|
||||
|
||||
if (A.size() > 2 && b.size() > 1 && vec.size() > 2)
|
||||
{
|
||||
Vector& Fi = const_cast<Vector&>(b[1]);
|
||||
|
||||
// Find the actual inertia force from the dynamic equilibrium equation
|
||||
// (Fi = Fext - Fs - Fd) and store it in the second RHS vector Fi=b[1]
|
||||
Fi = b.front(); // Fi = Fext - Fs
|
||||
if (alpha1 > 0.0 && iv > 0)
|
||||
Fi.add(A[1]*vec[iv],-alpha1); // Fi -= alpha1*M*v
|
||||
if (alpha2 > 0.0 && iv > 0)
|
||||
Fi.add(A[2]*vec[iv],-alpha2); // Fi -= alpha2*K*v
|
||||
|
||||
#if SP_DEBUG > 2
|
||||
std::cout <<"Element inertia vector"<< Fi;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (A.size() > 2 && vec.size() > 2)
|
||||
{
|
||||
Vector& RHS = const_cast<Vector&>(b.front());
|
||||
#if SP_DEBUG > 2
|
||||
std::cout <<"\nElement velocity vector"<< vec[iv];
|
||||
std::cout <<"Element acceleration vector"<< vec[ia];
|
||||
std::cout <<"S_ext - S_int"<< b.front();
|
||||
std::cout <<"S_i"<< A[1]*vec[ia];
|
||||
#endif
|
||||
|
||||
// Find the right-hand-side vector
|
||||
double alphaPlus1 = 1.5 - gamma;
|
||||
RHS *= alphaPlus1;
|
||||
if (alpha1 > 0.0)
|
||||
RHS.add(A[1]*vec[iv], alpha1*(isPredictor ? alphaPlus1 : -alphaPlus1));
|
||||
if (alpha2 > 0.0)
|
||||
RHS.add(A[2]*vec[iv], alpha2*(isPredictor ? alphaPlus1 : -alphaPlus1));
|
||||
|
||||
RHS.add(A[1]*vec[ia], isPredictor ? 1.0 : -1.0);
|
||||
}
|
||||
|
||||
#if SP_DEBUG > 2
|
||||
std::cout <<"\nElement right-hand-side vector"<< b.front();
|
||||
#endif
|
||||
|
||||
return b.front();
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
// $Id$
|
||||
//==============================================================================
|
||||
//!
|
||||
//! \file GenAlphaMats.h
|
||||
//!
|
||||
//! \date Jul 04 2013
|
||||
//!
|
||||
//! \author Knut Morten Okstad / SINTEF
|
||||
//!
|
||||
//! \brief Representation of the element matrices for a dynamic FEM problem.
|
||||
//!
|
||||
//==============================================================================
|
||||
|
||||
#ifndef _GEN_ALPHA_MATS_H
|
||||
#define _GEN_ALPHA_MATS_H
|
||||
|
||||
#include "NewmarkMats.h"
|
||||
|
||||
|
||||
/*!
|
||||
\brief Class representing the element matrices for a dynamic FEM problem
|
||||
based on generalized alpha time integration.
|
||||
*/
|
||||
|
||||
class GenAlphaMats : public NewmarkMats
|
||||
{
|
||||
public:
|
||||
//! \brief The constructor initializes the time integration parameters.
|
||||
GenAlphaMats(double alpha, double a, double b);
|
||||
//! \brief Empty destructor.
|
||||
virtual ~GenAlphaMats() {}
|
||||
|
||||
//! \brief Returns the element-level Newton matrix.
|
||||
virtual const Matrix& getNewtonMatrix() const;
|
||||
//! \brief Returns the element-level right-hand-side vector.
|
||||
virtual const Vector& getRHSVector() const;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -14,10 +14,11 @@
|
||||
#include "HHTMats.h"
|
||||
|
||||
|
||||
HHTMats::HHTMats (double alpha, double a, double b) : NewmarkMats(a,b)
|
||||
HHTMats::HHTMats (double alpha, double a, double b, bool old) : NewmarkMats(a,b)
|
||||
{
|
||||
beta = 0.25*(1.0-alpha)*(1.0-alpha);
|
||||
gamma = 0.5 - alpha;
|
||||
oldHHT = old;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,7 +38,7 @@ const Matrix& HHTMats::getNewtonMatrix () const
|
||||
N.add(A[1],(alphaPlus1*alpha1*gamma + 1.0/h)/(beta*h));
|
||||
|
||||
#if SP_DEBUG > 2
|
||||
std::cout <<"\nDynElmMats::getNewtonMatrix";
|
||||
std::cout <<"\nHHTMats::getNewtonMatrix";
|
||||
std::cout <<"\nElement mass matrix"<< A[1];
|
||||
if (A.size() > 3)
|
||||
std::cout <<"Material stiffness matrix"<< A[2]
|
||||
@@ -63,7 +64,7 @@ const Vector& HHTMats::getRHSVector () const
|
||||
int ia = vec.size() - 1; // index to element acceleration vector (a)
|
||||
int iv = vec.size() - 2; // index to element velocity vector (v)
|
||||
|
||||
if (isPredictor && b.size() > 1)
|
||||
if ((isPredictor || oldHHT) && b.size() > 1)
|
||||
{
|
||||
Vector& Fia = const_cast<Vector&>(b[1]);
|
||||
|
||||
@@ -76,11 +77,12 @@ const Vector& HHTMats::getRHSVector () const
|
||||
Fia.add(A[1]*vec[iv],-alpha1); // Fia -= alpha1*M*v
|
||||
if (alpha2 > 0.0 && iv > 0)
|
||||
Fia.add(A[2]*vec[iv],-alpha2); // Fia -= alpha2*K*v
|
||||
#if SP_DEBUG > 2
|
||||
std::cout <<"Element inertia vector"<< Fia;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if SP_DEBUG > 2
|
||||
if (isPredictor && b.size() > 1)
|
||||
std::cout <<"Element inertia vector"<< b[1];
|
||||
std::cout <<"Element velocity vector"<< vec[iv];
|
||||
std::cout <<"Element acceleration vector"<< vec[ia];
|
||||
if (b.size() > 2)
|
||||
@@ -97,7 +99,9 @@ const Vector& HHTMats::getRHSVector () const
|
||||
// the predictor step force vector after the element assembly.
|
||||
Vector& RHS = const_cast<Vector&>(b.front());
|
||||
double alphaPlus1 = 1.5 - gamma;
|
||||
if (isPredictor)
|
||||
if (oldHHT)
|
||||
RHS *= alphaPlus1; // RHS = -(1+alphaH)*S_int
|
||||
else if (isPredictor)
|
||||
{
|
||||
int pa = iv - 1; // index to predicted element acceleration vector (A)
|
||||
A[1].multiply(vec[pa]-vec[ia],RHS); // RHS = M*(A-a)
|
||||
@@ -121,9 +125,10 @@ const Vector& HHTMats::getRHSVector () const
|
||||
RHS.add(A[1]*vec[iv],alphaPlus1*alpha1); // RHS -= (1+alphaH)*alpha1*M*v
|
||||
if (alpha2 > 0.0)
|
||||
RHS.add(A[2]*vec[iv],alphaPlus1*alpha2); // RHS -= (1+alphaH)*alpha2*K*v
|
||||
|
||||
if (oldHHT)
|
||||
RHS.add(A[1]*vec[ia], isPredictor ? 1.0 : -1.0); // RHS (+/-)= M*a
|
||||
#if SP_DEBUG > 2
|
||||
std::cout <<"Element right-hand-side vector"<< b.front();
|
||||
std::cout <<"\nElement right-hand-side vector"<< b.front();
|
||||
#endif
|
||||
|
||||
return b.front();
|
||||
|
||||
@@ -26,7 +26,7 @@ class HHTMats : public NewmarkMats
|
||||
{
|
||||
public:
|
||||
//! \brief The constructor initializes the time integration parameters.
|
||||
HHTMats(double alpha, double a, double b);
|
||||
HHTMats(double alpha, double a, double b, bool old = false);
|
||||
//! \brief Empty destructor.
|
||||
virtual ~HHTMats() {}
|
||||
|
||||
@@ -34,6 +34,9 @@ public:
|
||||
virtual const Matrix& getNewtonMatrix() const;
|
||||
//! \brief Returns the element-level right-hand-side vector.
|
||||
virtual const Vector& getRHSVector() const;
|
||||
|
||||
private:
|
||||
bool oldHHT; //!< If \e true, used toghether with NewmarkNLSIM
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user