Nektar++
Public Member Functions | Static Public Member Functions | Static Public Attributes | List of all members
Nektar::Utilities::NodeOpti2D2D Class Reference

#include <NodeOpti.h>

Inheritance diagram for Nektar::Utilities::NodeOpti2D2D:
[legend]

Public Member Functions

 NodeOpti2D2D (NodeSharedPtr n, std::vector< ElUtilSharedPtr > e, ResidualSharedPtr r, std::map< LibUtilities::ShapeType, DerivUtilSharedPtr > d, optiType o)
 
 ~NodeOpti2D2D ()
 
void Optimise ()
 
- Public Member Functions inherited from Nektar::Utilities::NodeOpti
 NodeOpti (NodeSharedPtr n, std::vector< ElUtilSharedPtr > e, ResidualSharedPtr r, std::map< LibUtilities::ShapeType, DerivUtilSharedPtr > d, optiType o, int dim)
 
virtual ~NodeOpti ()
 
void CalcMinJac ()
 
NodeOptiJobGetJob ()
 
template<int DIM>
NekDouble GetFunctional (NekDouble &minJacNew, bool gradient=true)
 Evaluate functional for elements connected to a node. More...
 
template<int DIM>
void MinEigen (NekDouble &val)
 Calculates minimum eigenvalue of Hessian matrix. More...
 
template<>
void MinEigen (NekDouble &val)
 
template<>
void MinEigen (NekDouble &val)
 

Static Public Member Functions

static NodeOptiSharedPtr create (NodeSharedPtr n, std::vector< ElUtilSharedPtr > e, ResidualSharedPtr r, std::map< LibUtilities::ShapeType, DerivUtilSharedPtr > d, optiType o)
 

Static Public Attributes

static int m_type
 

Additional Inherited Members

- Protected Member Functions inherited from Nektar::Utilities::NodeOpti
template<int DIM>
int IsIndefinite ()
 Returns 1 if Hessian matrix is indefinite and 0 otherwise. More...
 
template<>
int IsIndefinite ()
 
template<>
int IsIndefinite ()
 
- Static Protected Member Functions inherited from Nektar::Utilities::NodeOpti
static NekDouble c1 ()
 
static NekDouble gradTol ()
 
static NekDouble alphaTol ()
 
- Protected Attributes inherited from Nektar::Utilities::NodeOpti
NodeSharedPtr m_node
 
std::mutex mtx
 
std::map< LibUtilities::ShapeType, std::vector< ElUtilSharedPtr > > m_data
 
std::vector< NekDoublem_grad
 
std::vector< NekDoublem_tmpStore
 
std::unordered_map< LibUtilities::ShapeType, DerivArray, EnumHashm_derivs
 
NekDouble m_minJac
 
ResidualSharedPtr m_res
 
std::map< LibUtilities::ShapeType, DerivUtilSharedPtrm_derivUtils
 
optiType m_opti
 

Detailed Description

Definition at line 170 of file NodeOpti.h.

Constructor & Destructor Documentation

◆ NodeOpti2D2D()

Nektar::Utilities::NodeOpti2D2D::NodeOpti2D2D ( NodeSharedPtr  n,
std::vector< ElUtilSharedPtr e,
ResidualSharedPtr  r,
std::map< LibUtilities::ShapeType, DerivUtilSharedPtr d,
optiType  o 
)
inline

Definition at line 173 of file NodeOpti.h.

177  : NodeOpti(n, e, r, d, o, 2)
178  {
179  }
NodeOpti(NodeSharedPtr n, std::vector< ElUtilSharedPtr > e, ResidualSharedPtr r, std::map< LibUtilities::ShapeType, DerivUtilSharedPtr > d, optiType o, int dim)
Definition: NodeOpti.h:60

◆ ~NodeOpti2D2D()

Nektar::Utilities::NodeOpti2D2D::~NodeOpti2D2D ( )
inline

Definition at line 181 of file NodeOpti.h.

References Nektar::Utilities::NodeOpti::Optimise().

181 {};

Member Function Documentation

◆ create()

static NodeOptiSharedPtr Nektar::Utilities::NodeOpti2D2D::create ( NodeSharedPtr  n,
std::vector< ElUtilSharedPtr e,
ResidualSharedPtr  r,
std::map< LibUtilities::ShapeType, DerivUtilSharedPtr d,
optiType  o 
)
inlinestatic

Definition at line 186 of file NodeOpti.h.

189  {
190  return NodeOptiSharedPtr(new NodeOpti2D2D(n, e, r, d, o));
191  }
std::shared_ptr< NodeOpti > NodeOptiSharedPtr
Definition: NodeOpti.h:135
NodeOpti2D2D(NodeSharedPtr n, std::vector< ElUtilSharedPtr > e, ResidualSharedPtr r, std::map< LibUtilities::ShapeType, DerivUtilSharedPtr > d, optiType o)
Definition: NodeOpti.h:173

◆ Optimise()

void Nektar::Utilities::NodeOpti2D2D::Optimise ( )
virtual

Implements Nektar::Utilities::NodeOpti.

Definition at line 72 of file NodeOpti.cpp.

References Nektar::Utilities::GetNodeOptiFactory(), Nektar::Utilities::mtx, and Nektar::LibUtilities::NekFactory< tKey, tBase, tParam >::RegisterCreatorFunction().

73 {
74  NekDouble minJacNew;
75  NekDouble currentW = GetFunctional<2>(minJacNew);
76  NekDouble newVal = currentW;
77 
78  // Gradient already zero
79  if (m_grad[0] * m_grad[0] + m_grad[1] * m_grad[1] > gradTol())
80  {
81  // needs to optimise
82  NekDouble xc = m_node->m_x;
83  NekDouble yc = m_node->m_y;
84 
85  vector<NekDouble> sk(2);
86  NekDouble val;
87 
88  // Calculate minimum eigenvalue
89  MinEigen<2>(val);
90 
91  if (val < 1e-6)
92  {
93  // Add constant identity to Hessian matrix.
94  m_grad[2] += 1e-6 - val;
95  m_grad[4] += 1e-6 - val;
96  }
97 
98  sk[0] = -1.0 / (m_grad[2] * m_grad[4] - m_grad[3] * m_grad[3]) *
99  (m_grad[4] * m_grad[0] - m_grad[3] * m_grad[1]);
100  sk[1] = -1.0 / (m_grad[2] * m_grad[4] - m_grad[3] * m_grad[3]) *
101  (m_grad[2] * m_grad[1] - m_grad[3] * m_grad[0]);
102 
103  bool found = false;
104  NekDouble pg = (m_grad[0] * sk[0] + m_grad[1] * sk[1]);
105  // normal gradient line Search
106  NekDouble alpha = 1.0;
107 
108  while (alpha > alphaTol())
109  {
110  // Update node
111  m_node->m_x = xc + alpha * sk[0];
112  m_node->m_y = yc + alpha * sk[1];
113 
114  newVal = GetFunctional<2>(minJacNew, false);
115 
116  // Wolfe conditions
117  if (newVal <= currentW + c1() * (alpha * pg))
118  {
119  found = true;
120  break;
121  }
122 
123  alpha /= 2.0;
124  }
125 
126  if (!found)
127  {
128  // reset the node
129  m_node->m_x = xc;
130  m_node->m_y = yc;
131 
132  mtx.lock();
133  m_res->nReset[2]++;
134  mtx.unlock();
135  }
136  else
137  {
138  m_minJac = minJacNew;
139 
140  mtx.lock();
141  if (alpha < 1.0)
142  {
143  m_res->alphaI++;
144  }
145  mtx.unlock();
146  }
147 
148  mtx.lock();
149  m_res->val = max(sqrt((m_node->m_x - xc) * (m_node->m_x - xc) +
150  (m_node->m_y - yc) * (m_node->m_y - yc)),
151  m_res->val);
152  mtx.unlock();
153  }
154 
155  mtx.lock();
156  m_res->func += newVal;
157  mtx.unlock();
158 }
static NekDouble alphaTol()
Definition: NodeOpti.h:129
static NekDouble c1()
Definition: NodeOpti.h:121
double NekDouble
ResidualSharedPtr m_res
Definition: NodeOpti.h:117
std::vector< NekDouble > m_grad
Definition: NodeOpti.h:109
static NekDouble gradTol()
Definition: NodeOpti.h:125

Member Data Documentation

◆ m_type

int Nektar::Utilities::NodeOpti2D2D::m_type
static
Initial value:

Definition at line 185 of file NodeOpti.h.