Tporoelasticity_elements.h
Go to the documentation of this file.
1 //LIC// ====================================================================
2 //LIC// This file forms part of oomph-lib, the object-oriented,
3 //LIC// multi-physics finite-element library, available
4 //LIC// at http://www.oomph-lib.org.
5 //LIC//
6 //LIC// Version 1.0; svn revision $LastChangedRevision: 1097 $
7 //LIC//
8 //LIC// $LastChangedDate: 2015-12-17 11:53:17 +0000 (Thu, 17 Dec 2015) $
9 //LIC//
10 //LIC// Copyright (C) 2006-2016 Matthias Heil and Andrew Hazel
11 //LIC//
12 //LIC// This library is free software; you can redistribute it and/or
13 //LIC// modify it under the terms of the GNU Lesser General Public
14 //LIC// License as published by the Free Software Foundation; either
15 //LIC// version 2.1 of the License, or (at your option) any later version.
16 //LIC//
17 //LIC// This library is distributed in the hope that it will be useful,
18 //LIC// but WITHOUT ANY WARRANTY; without even the implied warranty of
19 //LIC// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 //LIC// Lesser General Public License for more details.
21 //LIC//
22 //LIC// You should have received a copy of the GNU Lesser General Public
23 //LIC// License along with this library; if not, write to the Free Software
24 //LIC// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 //LIC// 02110-1301 USA.
26 //LIC//
27 //LIC// The authors may be contacted at oomph-lib@maths.man.ac.uk.
28 //LIC//
29 //LIC//====================================================================
30 #ifndef OOMPH_TPOROELASTICITY_ELEMENTS_HEADER
31 #define OOMPH_TPOROELASTICITY_ELEMENTS_HEADER
32 
33 // Config header generated by autoconfig
34 #ifdef HAVE_CONFIG_H
35  #include <oomph-lib-config.h>
36 #endif
37 
39 #include "../generic/Telements.h"
40 
41 namespace oomph
42 {
43 
44  /// Element which solves the Darcy equations using TElements
45  template<unsigned ORDER>
46  class TPoroelasticityElement : public TElement<2,3>,
47  public PoroelasticityEquations<2>
48  {
49  private:
50  /// The number of values stored at each node
51  static const unsigned Initial_Nvalue[];
52 
53  /// Conversion scheme from an edge degree of freedom to the node it's stored at
54  static const unsigned Q_edge_conv[];
55 
56  /// The points along each edge where the fluxes are taken to be
57  static const double Gauss_point[];
58 
59  /// The internal data index where the internal q degrees of freedom are stored
61 
62  /// The internal data index where the p degrees of freedom are stored
64 
65  /// \short Unit normal signs associated with each edge to ensure inter-element
66  /// continuity of the flux
67  std::vector<short> Sign_edge;
68 
69  public:
70  /// Constructor
72 
73  /// Destructor
75 
76  /// Number of values required at node n
77  unsigned required_nvalue(const unsigned &n) const
78  {
79  return Initial_Nvalue[n];
80  }
81 
82  unsigned u_index(const unsigned &n) const
83  {
84 #ifdef RANGE_CHECKING
85  if(n >= 2)
86  {
87  std::ostringstream error_message;
88  error_message << "Range Error: n " << n
89  << " is not in the range (0,1)";
90  throw OomphLibError(error_message.str(),
91  OOMPH_CURRENT_FUNCTION,
92  OOMPH_EXCEPTION_LOCATION);
93  }
94 #endif
95 
96  return n;
97  }
98 
99  /// Return the equation number of the n-th edge (flux) degree of freedom
100  int q_edge_local_eqn(const unsigned &n) const
101  {
102 #ifdef RANGE_CHECKING
103  if(n >= nq_basis_edge())
104  {
105  std::ostringstream error_message;
106  error_message << "Range Error: n " << n
107  << " is not in the range (0,"
108  << nq_basis_edge()-1 <<")";
109  throw OomphLibError(error_message.str(),
110  OOMPH_CURRENT_FUNCTION,
111  OOMPH_EXCEPTION_LOCATION);
112  }
113 #endif
114  return this->nodal_local_eqn(q_edge_node_number(n),q_edge_index(n));
115  }
116 
117  /// Return the equation number of the n-th internal (moment) degree of freedom
118  int q_internal_local_eqn(const unsigned &n) const
119  {
120 #ifdef RANGE_CHECKING
121  if(n >= (nq_basis()-nq_basis_edge()))
122  {
123  std::ostringstream error_message;
124  error_message << "Range Error: n " << n
125  << " is not in the range (0,"
126  << (nq_basis()-nq_basis_edge())-1 <<")";
127  throw OomphLibError(error_message.str(),
128  OOMPH_CURRENT_FUNCTION,
129  OOMPH_EXCEPTION_LOCATION);
130  }
131 #endif
133  }
134 
135  /// \short Return the index of the internal data where the q_internal degrees
136  /// of freedom are stored
137  unsigned q_internal_index() const
138  {
139  return Q_internal_data_index;
140  }
141 
142  /// Return the nodal index at which the nth edge unknown is stored
143  unsigned q_edge_index(const unsigned &n) const
144  {
145 #ifdef RANGE_CHECKING
146  if(n >= (nq_basis_edge()))
147  {
148  std::ostringstream error_message;
149  error_message << "Range Error: n " << n
150  << " is not in the range (0,"
151  << nq_basis_edge()-1 <<")";
152  throw OomphLibError(error_message.str(),
153  OOMPH_CURRENT_FUNCTION,
154  OOMPH_EXCEPTION_LOCATION);
155  }
156 #endif
157  return n%(ORDER+1)+2;
158  }
159 
160  /// Return the number of the node where the nth edge unknown is stored
161  unsigned q_edge_node_number(const unsigned &n) const
162  {
163 #ifdef RANGE_CHECKING
164  if(n >= (nq_basis_edge()))
165  {
166  std::ostringstream error_message;
167  error_message << "Range Error: n " << n
168  << " is not in the range (0,"
169  << nq_basis_edge()-1 <<")";
170  throw OomphLibError(error_message.str(),
171  OOMPH_CURRENT_FUNCTION,
172  OOMPH_EXCEPTION_LOCATION);
173  }
174 #endif
175  return Q_edge_conv[n/(ORDER+1)];
176  }
177 
178  /// Return the values of the edge (flux) degrees of freedom
179  double q_edge(const unsigned &n) const
180  {
181 #ifdef RANGE_CHECKING
182  if(n >= (nq_basis_edge()))
183  {
184  std::ostringstream error_message;
185  error_message << "Range Error: n " << n
186  << " is not in the range (0,"
187  << nq_basis_edge()-1 <<")";
188  throw OomphLibError(error_message.str(),
189  OOMPH_CURRENT_FUNCTION,
190  OOMPH_EXCEPTION_LOCATION);
191  }
192 #endif
194  }
195 
196  /// \short Return the values of the edge (flux) degrees of freedom at time
197  /// history level t
198  double q_edge(const unsigned &t,const unsigned &n) const
199  {
200 #ifdef RANGE_CHECKING
201  if(n >= (nq_basis_edge()))
202  {
203  std::ostringstream error_message;
204  error_message << "Range Error: n " << n
205  << " is not in the range (0,"
206  << nq_basis_edge()-1 <<")";
207  throw OomphLibError(error_message.str(),
208  OOMPH_CURRENT_FUNCTION,
209  OOMPH_EXCEPTION_LOCATION);
210  }
211 #endif
213  }
214 
215  /// Return the values of the internal (moment) degrees of freedom
216  double q_internal(const unsigned &n) const
217  {
218 #ifdef RANGE_CHECKING
219  if(n >= (nq_basis()-nq_basis_edge()))
220  {
221  std::ostringstream error_message;
222  error_message << "Range Error: n " << n
223  << " is not in the range (0,"
224  << (nq_basis()-nq_basis_edge())-1 <<")";
225  throw OomphLibError(error_message.str(),
226  OOMPH_CURRENT_FUNCTION,
227  OOMPH_EXCEPTION_LOCATION);
228  }
229 #endif
230  return this->internal_data_pt(q_internal_index())->value(n);
231  }
232 
233  /// \short Return the values of the internal (moment) degrees of freedom at
234  /// time history level t
235  double q_internal(const unsigned &t,const unsigned &n) const
236  {
237 #ifdef RANGE_CHECKING
238  //mjr TODO add time history level range checking
239  if(n >= (nq_basis()-nq_basis_edge()))
240  {
241  std::ostringstream error_message;
242  error_message << "Range Error: n " << n
243  << " is not in the range (0,"
244  << (nq_basis()-nq_basis_edge())-1 <<")";
245  throw OomphLibError(error_message.str(),
246  OOMPH_CURRENT_FUNCTION,
247  OOMPH_EXCEPTION_LOCATION);
248  }
249 #endif
250  return this->internal_data_pt(q_internal_index())->value(t,n);
251  }
252 
253  /// Return the total number of computational basis functions for u
254  unsigned nq_basis() const;
255 
256  /// Return the number of edge basis functions for u
257  unsigned nq_basis_edge() const;
258 
259  /// Returns the local form of the q basis at local coordinate s
260  void get_q_basis_local(const Vector<double> &s,
261  Shape &q_basis) const;
262 
263  /// Returns the local form of the q basis and dbasis/ds at local coordinate s
265  Shape &div_q_basis_ds) const;
266 
267  /// Returns the number of gauss points along each edge of the element
268  unsigned nedge_gauss_point() const;
269 
270  /// Returns the nth gauss point along an edge: if sign_edge(edge)==1, returns
271  /// regular gauss point; if sign_edge(edge)==-1, returns 1-(gauss point)
272  double edge_gauss_point(const unsigned &edge,
273  const unsigned &n) const
274  {
275 #ifdef RANGE_CHECKING
276  if(edge >= 3)
277  {
278  std::ostringstream error_message;
279  error_message << "Range Error: edge " << edge
280  << " is not in the range (0,2)";
281  throw OomphLibError(error_message.str(),
282  OOMPH_CURRENT_FUNCTION,
283  OOMPH_EXCEPTION_LOCATION);
284  }
285  if(n >= nedge_gauss_point())
286  {
287  std::ostringstream error_message;
288  error_message << "Range Error: n " << n
289  << " is not in the range (0,"
290  << nedge_gauss_point()-1 <<")";
291  throw OomphLibError(error_message.str(),
292  OOMPH_CURRENT_FUNCTION,
293  OOMPH_EXCEPTION_LOCATION);
294  }
295 #endif
296  return (1-sign_edge(edge))/2.0+sign_edge(edge)*Gauss_point[n];
297  }
298 
299  /// Returns the global coordinates of the nth gauss point along an edge
300  void edge_gauss_point_global(const unsigned &edge,
301  const unsigned &n,
302  Vector<double> &x) const
303  {
304 #ifdef RANGE_CHECKING
305  if(edge >= 3)
306  {
307  std::ostringstream error_message;
308  error_message << "Range Error: edge " << edge
309  << " is not in the range (0,2)";
310  throw OomphLibError(error_message.str(),
311  OOMPH_CURRENT_FUNCTION,
312  OOMPH_EXCEPTION_LOCATION);
313  }
314  if(n >= nedge_gauss_point())
315  {
316  std::ostringstream error_message;
317  error_message << "Range Error: n " << n
318  << " is not in the range (0,"
319  << nedge_gauss_point()-1 <<")";
320  throw OomphLibError(error_message.str(),
321  OOMPH_CURRENT_FUNCTION,
322  OOMPH_EXCEPTION_LOCATION);
323  }
324 #endif
325 
326  // Get the location of the n-th gauss point along the edge in terms of the
327  // distance along the edge itself
328  double gauss_point=edge_gauss_point(edge,n);
329 
330  // Convert the edge number to the number of the mid-edge node along that
331  // edge
332  unsigned node_number=Q_edge_conv[edge];
333 
334  // Storage for the local coords of the gauss point
335  Vector<double> s_gauss(2,0);
336 
337  // The edge basis functions are defined in a clockwise manner, so we have
338  // to effectively "flip" the coordinates along edges 0 and 1 to match this
339  switch(node_number)
340  {
341  case 3:
342  s_gauss[0]=1-gauss_point;
343  s_gauss[1]=gauss_point;
344  break;
345  case 4:
346  s_gauss[0]=0;
347  s_gauss[1]=1-gauss_point;
348  break;
349  case 5:
350  s_gauss[0]=gauss_point;
351  s_gauss[1]=0;
352  break;
353  }
354 
355  // Calculate the global coordinates from the local ones
356  interpolated_x(s_gauss,x);
357  }
358 
359  /// Pin the nth internal q value
360  void pin_q_internal_value(const unsigned &n)
361  {
362 #ifdef RANGE_CHECKING
363  if(n >= (nq_basis()-nq_basis_edge()))
364  {
365  std::ostringstream error_message;
366  error_message << "Range Error: n " << n
367  << " is not in the range (0,"
368  << (nq_basis()-nq_basis_edge())-1 <<")";
369  throw OomphLibError(error_message.str(),
370  OOMPH_CURRENT_FUNCTION,
371  OOMPH_EXCEPTION_LOCATION);
372  }
373 #endif
375  }
376 
377  /// Return the equation number of the n-th pressure degree of freedom
378  int p_local_eqn(const unsigned &n) const
379  {
380 #ifdef RANGE_CHECKING
381  if(n >= np_basis())
382  {
383  std::ostringstream error_message;
384  error_message << "Range Error: n " << n
385  << " is not in the range (0,"
386  << np_basis()-1 <<")";
387  throw OomphLibError(error_message.str(),
388  OOMPH_CURRENT_FUNCTION,
389  OOMPH_EXCEPTION_LOCATION);
390  }
391 #endif
393  }
394 
395  /// Return the nth pressure value
396  double p_value(unsigned &n) const
397  {
398 #ifdef RANGE_CHECKING
399  if(n >= np_basis())
400  {
401  std::ostringstream error_message;
402  error_message << "Range Error: n " << n
403  << " is not in the range (0,"
404  << np_basis()-1 <<")";
405  throw OomphLibError(error_message.str(),
406  OOMPH_CURRENT_FUNCTION,
407  OOMPH_EXCEPTION_LOCATION);
408  }
409 #endif
410  return this->internal_data_pt(P_internal_data_index)->value(n);
411  }
412 
413  /// Return the total number of pressure basis functions
414  unsigned np_basis() const;
415 
416  /// Return the pressure basis
417  void get_p_basis(const Vector<double> &s,
418  Shape &p_basis) const;
419 
420  /// Pin the nth pressure value
421  void pin_p_value(const unsigned &n, const double &p)
422  {
423 #ifdef RANGE_CHECKING
424  if(n >= np_basis())
425  {
426  std::ostringstream error_message;
427  error_message << "Range Error: n " << n
428  << " is not in the range (0,"
429  << np_basis()-1 <<")";
430  throw OomphLibError(error_message.str(),
431  OOMPH_CURRENT_FUNCTION,
432  OOMPH_EXCEPTION_LOCATION);
433  }
434 #endif
437  }
438 
439  /// Scale the edge basis to allow arbitrary edge mappings
440  void scale_basis(Shape& basis) const
441  {
442  // Storage for the lengths of the edges of the element
443  Vector<double> length(3,0.0);
444 
445  // Temporary storage for the vertex positions
446  double x0,y0,x1,y1;
447 
448  // loop over the edges of the element and calculate their lengths (in x-y
449  // space)
450  for(unsigned i=0;i<3;i++)
451  {
452  x0=this->node_pt(i)->x(0);
453  y0=this->node_pt(i)->x(1);
454  x1=this->node_pt((i+1)%3)->x(0);
455  y1=this->node_pt((i+1)%3)->x(1);
456 
457  length[i]=std::sqrt(std::pow(y1-y0,2)+std::pow(x1-x0,2));
458  }
459 
460  // lengths of the sides of the reference element (in the same order as the
461  // basis functions)
462  const double ref_length[3]={std::sqrt(2.0),1,1};
463 
464  // get the number of basis functions associated with the edges
465  unsigned n_q_basis_edge=nq_basis_edge();
466 
467  // rescale the edge basis functions to allow arbitrary edge mappings from
468  // element to ref. element
469  const unsigned n_index2 = basis.nindex2();
470  for(unsigned i=0;i<n_index2;i++)
471  {
472  for(unsigned l=0;l<n_q_basis_edge;l++)
473  {
474  basis(l,i)*=(length[l/(ORDER+1)]/ref_length[l/(ORDER+1)]);
475  }
476  }
477  }
478 
479  /// Accessor for the unit normal sign of edge n (const version)
480  const short &sign_edge(const unsigned &n) const
481  {
482  return Sign_edge[n];
483  }
484 
485  /// Accessor for the unit normal sign of edge n
486  short &sign_edge(const unsigned &n)
487  {
488  return Sign_edge[n];
489  }
490 
491  /// Output with default number of plot points
492  void output(std::ostream &outfile)
493  {
495  }
496 
497  /// \short Output FE representation of soln: x,y,u1,u2,div_q,p at
498  /// Nplot^DIM plot points
499  void output(std::ostream &outfile, const unsigned &Nplot)
500  {
501  PoroelasticityEquations<2>::output(outfile,Nplot);
502  }
503 
504  protected:
505 
506  /// \short Returns the geometric basis, and the u, p and divergence basis
507  /// functions and test functions at local coordinate s
509  Shape &psi,
510  DShape &dpsi,
511  Shape &u_basis,
512  Shape &u_test,
513  DShape &du_basis_dx,
514  DShape &du_test_dx,
515  Shape &q_basis,
516  Shape &q_test,
517  Shape &p_basis,
518  Shape &p_test,
519  Shape &div_q_basis_ds,
520  Shape &div_q_test_ds) const
521  {
522  const unsigned n_q_basis = this->nq_basis();
523 
524  Shape q_basis_local(n_q_basis,2);
525  this->get_q_basis_local(s,q_basis_local);
526  this->get_p_basis(s,p_basis);
527  this->get_div_q_basis_local(s,div_q_basis_ds);
528 
529  double J = this->transform_basis(s,q_basis_local,psi,dpsi,q_basis);
530 
531  // u_basis consists of the normal Lagrangian shape functions
532  u_basis=psi;
533  du_basis_dx=dpsi;
534 
535  u_test=psi;
536  du_test_dx=dpsi;
537 
538  q_test=q_basis;
539  p_test=p_basis;
540  div_q_test_ds=div_q_basis_ds;
541 
542  return J;
543  }
544 
545  /// \short Returns the geometric basis, and the u, p and divergence basis
546  /// functions and test functions at integration point ipt
547  double shape_basis_test_local_at_knot(const unsigned &ipt,
548  Shape &psi,
549  DShape &dpsi,
550  Shape &u_basis,
551  Shape &u_test,
552  DShape &du_basis_dx,
553  DShape &du_test_dx,
554  Shape &q_basis,
555  Shape &q_test,
556  Shape &p_basis,
557  Shape &p_test,
558  Shape &div_q_basis_ds,
559  Shape &div_q_test_ds) const
560  {
561  Vector<double> s(2);
562  for(unsigned i=0;i<2;i++) { s[i] = this->integral_pt()->knot(ipt,i); }
563 
564  return shape_basis_test_local(
565  s,psi,dpsi,
566  u_basis,u_test,
567  du_basis_dx,du_test_dx,
568  q_basis,q_test,
569  p_basis,p_test,
570  div_q_basis_ds,div_q_test_ds);
571  }
572  };
573 
574  /// Face geometry for TPoroelasticityElement<0>
575  template<>
577  public virtual TElement<1,3>
578  {
579  public:
580 
581  /// Constructor: Call constructor of base
582  FaceGeometry() : TElement<1,3>() {}
583  };
584 
585  /// Face geometry for TPoroelasticityElement<1>
586  template<>
588  public virtual TElement<1,3>
589  {
590  public:
591 
592  /// Constructor: Call constructor of base class
593  FaceGeometry() : TElement<1,3>() {}
594  };
595 
596 } // End of oomph namespace
597 
598 #endif
599 
unsigned u_index(const unsigned &n) const
Return the nodal index of the n-th solid displacement unknown.
int internal_local_eqn(const unsigned &i, const unsigned &j) const
Return the local equation number corresponding to the j-th value stored at the i-th internal data...
Definition: elements.h:268
unsigned q_edge_node_number(const unsigned &n) const
Return the number of the node where the nth edge unknown is stored.
void edge_gauss_point_global(const unsigned &edge, const unsigned &n, Vector< double > &x) const
Returns the global coordinates of the nth gauss point along an edge.
unsigned q_internal_index() const
Return the index of the internal data where the q_internal degrees of freedom are stored...
const short & sign_edge(const unsigned &n) const
Accessor for the unit normal sign of edge n (const version)
double transform_basis(const Vector< double > &s, const Shape &q_basis_local, Shape &psi, DShape &dpsi, Shape &q_basis) const
Performs a div-conserving transformation of the vector basis functions from the reference element to ...
unsigned required_nvalue(const unsigned &n) const
Number of values required at node n.
void output(std::ostream &outfile)
Output with default number of plot points.
cstr elem_len * i
Definition: cfortran.h:607
short & sign_edge(const unsigned &n)
Accessor for the unit normal sign of edge n.
void scale_basis(Shape &basis) const
Scale the edge basis to allow arbitrary edge mappings.
void output(std::ostream &outfile)
Output with default number of plot points.
unsigned nq_basis_edge() const
Return the number of edge basis functions for u.
unsigned q_edge_index(const unsigned &n) const
Return the nodal index at which the nth edge unknown is stored.
double nodal_value(const unsigned &n, const unsigned &i) const
Return the i-th value stored at local node n. Produces suitably interpolated values for hanging nodes...
Definition: elements.h:2458
void pin_q_internal_value(const unsigned &n)
Pin the nth internal q value.
void output(std::ostream &outfile, const unsigned &Nplot)
Output FE representation of soln: x,y,u1,u2,div_q,p at Nplot^DIM plot points.
char t
Definition: cfortran.h:572
unsigned nq_basis() const
Return the total number of computational basis functions for u.
~TPoroelasticityElement()
Destructor.
void pin(const unsigned &i)
Pin the i-th stored variable.
Definition: nodes.h:383
FaceGeometry()
Constructor: Call constructor of base.
TPoroelasticityElement()
Constructor.
double q_internal(const unsigned &n) const
Return the values of the internal (moment) degrees of freedom.
double edge_gauss_point(const unsigned &edge, const unsigned &n) const
double q_edge(const unsigned &n) const
Return the values of the edge (flux) degrees of freedom.
void pin_p_value(const unsigned &n, const double &p)
Pin the nth pressure value.
unsigned nedge_gauss_point() const
Returns the number of gauss points along each edge of the element.
double & x(const unsigned &i)
Return the i-th nodal coordinate.
Definition: nodes.h:995
virtual double interpolated_x(const Vector< double > &s, const unsigned &i) const
Return FE interpolated coordinate x[i] at local coordinate s.
Definition: elements.cc:3841
double p_value(unsigned &n) const
Return the nth pressure value.
double shape_basis_test_local_at_knot(const unsigned &ipt, Shape &psi, DShape &dpsi, Shape &u_basis, Shape &u_test, DShape &du_basis_dx, DShape &du_test_dx, Shape &q_basis, Shape &q_test, Shape &p_basis, Shape &p_test, Shape &div_q_basis_ds, Shape &div_q_test_ds) const
Returns the geometric basis, and the u, p and divergence basis functions and test functions at integr...
int q_internal_local_eqn(const unsigned &n) const
Return the equation number of the n-th internal (moment) degree of freedom.
Element which solves the Darcy equations using TElements.
static char t char * s
Definition: cfortran.h:572
virtual double knot(const unsigned &i, const unsigned &j) const =0
Return local coordinate s[j] of i-th integration point.
void set_value(const unsigned &i, const double &value_)
Set the i-th stored data value to specified value. The only reason that we require an explicit set fu...
Definition: nodes.h:267
unsigned np_basis() const
Return the total number of pressure basis functions.
Data *& internal_data_pt(const unsigned &i)
Return a pointer to i-th internal data object.
Definition: elements.h:623
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
Definition: elements.h:1900
FaceGeometry()
Constructor: Call constructor of base class.
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
Definition: elements.h:2097
Class implementing the generic maths of the poroelasticity equations: linear elasticity coupled with ...
int nodal_local_eqn(const unsigned &n, const unsigned &i) const
Return the local equation number corresponding to the i-th value at the n-th local node...
Definition: elements.h:1383
int q_edge_local_eqn(const unsigned &n) const
Return the equation number of the n-th edge (flux) degree of freedom.
void get_p_basis(const Vector< double > &s, Shape &p_basis) const
Return the pressure basis.
std::vector< short > Sign_edge
Unit normal signs associated with each edge to ensure inter-element continuity of the flux...
void get_div_q_basis_local(const Vector< double > &s, Shape &div_q_basis_ds) const
Returns the local form of the q basis and dbasis/ds at local coordinate s.
unsigned P_internal_data_index
The internal data index where the p degrees of freedom are stored.
double shape_basis_test_local(const Vector< double > &s, Shape &psi, DShape &dpsi, Shape &u_basis, Shape &u_test, DShape &du_basis_dx, DShape &du_test_dx, Shape &q_basis, Shape &q_test, Shape &p_basis, Shape &p_test, Shape &div_q_basis_ds, Shape &div_q_test_ds) const
Returns the geometric basis, and the u, p and divergence basis functions and test functions at local ...
unsigned Q_internal_data_index
The internal data index where the internal q degrees of freedom are stored.
int p_local_eqn(const unsigned &n) const
Return the equation number of the n-th pressure degree of freedom.
double value(const unsigned &i) const
Return i-th stored value. This function is not virtual so that it can be inlined. This means that if ...
Definition: nodes.h:291
double q_edge(const unsigned &t, const unsigned &n) const
Return the values of the edge (flux) degrees of freedom at time history level t.
double q_internal(const unsigned &t, const unsigned &n) const
Return the values of the internal (moment) degrees of freedom at time history level t...
unsigned nindex2() const
Return the range of index 2 of the shape function object.
Definition: shape.h:265
void get_q_basis_local(const Vector< double > &s, Shape &q_basis) const
Returns the local form of the q basis at local coordinate s.