Nektar++
Public Member Functions | Public Attributes | List of all members
Nektar::SolverUtils::Newmark_BetaSolver Class Reference

#include <ForcingMovingReferenceFrame.h>

Public Member Functions

 Newmark_BetaSolver ()
 
 ~Newmark_BetaSolver ()
 
void SetNewmarkBeta (NekDouble beta, NekDouble gamma, NekDouble dt, DNekMatSharedPtr M, DNekMatSharedPtr C, DNekMatSharedPtr K, std::set< int > DirDoFs)
 
void Solve (Array< OneD, Array< OneD, NekDouble > > u, Array< OneD, NekDouble > force, std::map< int, NekDouble > motionPrescribed)
 

Public Attributes

int m_rows
 
Array< OneD, NekDoublem_coeffs
 
DNekMatSharedPtr m_M
 
DNekMatSharedPtr m_C
 
DNekMatSharedPtr m_K
 
DNekMatSharedPtr m_coeffMatrix
 
DNekMatSharedPtr m_inverseMatrix
 

Detailed Description

Definition at line 65 of file ForcingMovingReferenceFrame.h.

Constructor & Destructor Documentation

◆ Newmark_BetaSolver()

Nektar::SolverUtils::Newmark_BetaSolver::Newmark_BetaSolver ( )
inline

Definition at line 68 of file ForcingMovingReferenceFrame.h.

68{};

◆ ~Newmark_BetaSolver()

Nektar::SolverUtils::Newmark_BetaSolver::~Newmark_BetaSolver ( )
inline

Definition at line 69 of file ForcingMovingReferenceFrame.h.

69{};

Member Function Documentation

◆ SetNewmarkBeta()

void Nektar::SolverUtils::Newmark_BetaSolver::SetNewmarkBeta ( NekDouble  beta,
NekDouble  gamma,
NekDouble  dt,
DNekMatSharedPtr  M,
DNekMatSharedPtr  C,
DNekMatSharedPtr  K,
std::set< int >  DirDoFs 
)

Definition at line 1011 of file ForcingMovingReferenceFrame.cpp.

1015{
1016 m_coeffs = Array<OneD, NekDouble>(5, 0.);
1017 m_coeffs[0] = 1. / (gamma * dt);
1018 m_coeffs[1] = 1. / gamma - 1.;
1019 m_coeffs[2] = beta * dt / gamma;
1020 m_coeffs[3] = dt * (1. - beta / gamma);
1021 m_coeffs[4] = (0.5 - beta / gamma) * dt * dt;
1022
1023 m_rows = M->GetRows();
1028 for (int i = 0; i < m_rows; ++i)
1029 {
1030 for (int j = 0; j < m_rows; ++j)
1031 {
1032 NekDouble value = m_coeffs[0] * M->GetValue(i, j) +
1033 C->GetValue(i, j) +
1034 m_coeffs[2] * K->GetValue(i, j);
1035 m_coeffMatrix->SetValue(i, j, value);
1036 if (DirDoFs.find(i) != DirDoFs.end() ||
1037 DirDoFs.find(j) != DirDoFs.end())
1038 {
1039 value = (i == j) ? 1. : 0.;
1040 }
1041 m_inverseMatrix->SetValue(i, j, value);
1042 }
1043 }
1044 m_inverseMatrix->Invert();
1045 m_M = M;
1046 m_C = C;
1047 m_K = K;
1048}
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
@ beta
Gauss Radau pinned at x=-1,.
Definition: PointsType.h:59
double NekDouble

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::LibUtilities::beta, Nektar::eFULL, m_C, m_coeffMatrix, m_coeffs, m_inverseMatrix, m_K, m_M, and m_rows.

Referenced by Nektar::SolverUtils::ForcingMovingReferenceFrame::InitBodySolver().

◆ Solve()

void Nektar::SolverUtils::Newmark_BetaSolver::Solve ( Array< OneD, Array< OneD, NekDouble > >  u,
Array< OneD, NekDouble force,
std::map< int, NekDouble motionPrescribed 
)

Definition at line 1050 of file ForcingMovingReferenceFrame.cpp.

1053{
1054 NekVector<NekDouble> bm(m_rows);
1055 for (int i = 0; i < m_rows; ++i)
1056 {
1057 bm[i] = m_coeffs[0] * u[1][i] + m_coeffs[1] * u[2][i];
1058 }
1059 NekVector<NekDouble> fbm(m_rows);
1060 Multiply(fbm, *m_M, bm);
1061 NekVector<NekDouble> bk(m_rows);
1062 for (int i = 0; i < m_rows; ++i)
1063 {
1064 bk[i] = u[0][i] + m_coeffs[3] * u[1][i] + m_coeffs[4] * u[2][i];
1065 }
1066 NekVector<NekDouble> fbk(m_rows);
1067 Multiply(fbk, *m_K, bk);
1068 NekVector<NekDouble> rhs(m_rows);
1069 for (int i = 0; i < m_rows; ++i)
1070 {
1071 rhs[i] = force[i] - fbk[i] + fbm[i];
1072 }
1073 // apply Dirichelet DoFs
1074 for (int i = 0; i < 3; ++i)
1075 {
1076 if (motionPrescribed.find(i) != motionPrescribed.end())
1077 {
1078 rhs[i] = motionPrescribed[i];
1079 }
1080 else
1081 {
1082 for (auto it : motionPrescribed)
1083 {
1084 rhs[i] -= it.second * m_coeffMatrix->GetValue(it.first, i);
1085 }
1086 }
1087 }
1088 // solve
1089 NekVector<NekDouble> b(m_rows);
1090 Multiply(b, *m_inverseMatrix, rhs);
1091 for (int i = 0; i < m_rows; ++i)
1092 {
1093 u[1][i] = b[i];
1094 u[0][i] = m_coeffs[2] * u[1][i] + bk[i];
1095 u[2][i] = m_coeffs[0] * u[1][i] - bm[i];
1096 }
1097}
void Multiply(NekMatrix< ResultDataType, StandardMatrixTag > &result, const NekMatrix< LhsDataType, LhsMatrixType > &lhs, const ResultDataType &rhs)

References m_coeffMatrix, m_coeffs, m_inverseMatrix, m_K, m_M, m_rows, and Nektar::Multiply().

Referenced by Nektar::SolverUtils::ForcingMovingReferenceFrame::SolveBodyMotion().

Member Data Documentation

◆ m_C

DNekMatSharedPtr Nektar::SolverUtils::Newmark_BetaSolver::m_C

Definition at line 79 of file ForcingMovingReferenceFrame.h.

Referenced by SetNewmarkBeta().

◆ m_coeffMatrix

DNekMatSharedPtr Nektar::SolverUtils::Newmark_BetaSolver::m_coeffMatrix

Definition at line 81 of file ForcingMovingReferenceFrame.h.

Referenced by SetNewmarkBeta(), and Solve().

◆ m_coeffs

Array<OneD, NekDouble> Nektar::SolverUtils::Newmark_BetaSolver::m_coeffs

Definition at line 77 of file ForcingMovingReferenceFrame.h.

Referenced by SetNewmarkBeta(), and Solve().

◆ m_inverseMatrix

DNekMatSharedPtr Nektar::SolverUtils::Newmark_BetaSolver::m_inverseMatrix

Definition at line 82 of file ForcingMovingReferenceFrame.h.

Referenced by SetNewmarkBeta(), and Solve().

◆ m_K

DNekMatSharedPtr Nektar::SolverUtils::Newmark_BetaSolver::m_K

Definition at line 80 of file ForcingMovingReferenceFrame.h.

Referenced by SetNewmarkBeta(), and Solve().

◆ m_M

DNekMatSharedPtr Nektar::SolverUtils::Newmark_BetaSolver::m_M

Definition at line 78 of file ForcingMovingReferenceFrame.h.

Referenced by SetNewmarkBeta(), and Solve().

◆ m_rows

int Nektar::SolverUtils::Newmark_BetaSolver::m_rows

Definition at line 76 of file ForcingMovingReferenceFrame.h.

Referenced by SetNewmarkBeta(), and Solve().