axisym_fvk_elements.cc
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$
7 //LIC//
8 //LIC// $LastChangedDate$
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 //Non-inline functions for axisym FoepplvonKarman elements
31 
32 #include "axisym_fvk_elements.h"
33 
34 namespace oomph
35 {
36 
37 //======================================================================
38 /// Set the data for the number of Variables at each node: 6
39 //======================================================================
40  template<unsigned NNODE_1D>
42 
43 
44 //======================================================================
45 /// Default value physical constants
46 //======================================================================
48 
49 
50 
51 //======================================================================
52 /// Compute contribution to element residual Vector
53 ///
54 /// Pure version without hanging nodes
55 //======================================================================
57  fill_in_contribution_to_residuals(Vector<double> &residuals)
58  {
59  //Find out how many nodes there are
60  const unsigned n_node = nnode();
61 
62  //Set up memory for the shape and test functions
63  Shape psi(n_node), test(n_node);
64  DShape dpsidr(n_node,1), dtestdr(n_node,1);
65 
66  //Indices at which the unknowns are stored
67  const unsigned w_nodal_index = nodal_index_fvk(0);
68  const unsigned laplacian_w_nodal_index = nodal_index_fvk(1);
69  const unsigned phi_nodal_index = nodal_index_fvk(2);
70  const unsigned laplacian_phi_nodal_index = nodal_index_fvk(3);
71  const unsigned smooth_dwdr_nodal_index = nodal_index_fvk(4);
72  const unsigned smooth_dphidr_nodal_index = nodal_index_fvk(5);
73 
74  //Set the value of n_intpt
75  const unsigned n_intpt = integral_pt()->nweight();
76 
77  //Integers to store the local equation numbers
78  int local_eqn=0;
79 
80  //Loop over the integration points
81  for(unsigned ipt=0;ipt<n_intpt;ipt++)
82  {
83  //Get the integral weight
84  double w = integral_pt()->weight(ipt);
85 
86  //Call the derivatives of the shape and test functions
87  double J = dshape_and_dtest_eulerian_at_knot_axisym_fvk(ipt,psi,dpsidr,
88  test,dtestdr);
89 
90  //Allocate and initialise to zero storage for the interpolated values
91  double interpolated_r = 0;
92 
93  double interpolated_w = 0;
94  double interpolated_laplacian_w = 0;
95  double interpolated_phi = 0;
96  double interpolated_laplacian_phi = 0;
97 
98  double interpolated_dwdr = 0;
99  double interpolated_dlaplacian_wdr = 0;
100  double interpolated_dphidr = 0;
101  double interpolated_dlaplacian_phidr = 0;
102 
103  double interpolated_smooth_dwdr = 0;
104  double interpolated_smooth_dphidr = 0;
105  double interpolated_continuous_d2wdr2 = 0;
106  double interpolated_continuous_d2phidr2 = 0;
107 
108  //Calculate function values and derivatives:
109  //-----------------------------------------
110  Vector<double> nodal_value(6,0.0);
111  // Loop over nodes
112  for(unsigned l=0;l<n_node;l++)
113  {
114  //Get the nodal values
115  nodal_value[0] = raw_nodal_value(l,w_nodal_index);
116  nodal_value[1] = raw_nodal_value(l,laplacian_w_nodal_index);
117 
119  {
120  nodal_value[2] = raw_nodal_value(l,phi_nodal_index);
121  nodal_value[3] = raw_nodal_value(l,laplacian_phi_nodal_index);
122  nodal_value[4] = raw_nodal_value(l,smooth_dwdr_nodal_index);
123  nodal_value[5] = raw_nodal_value(l,smooth_dphidr_nodal_index);
124  }
125 
126  //Add contributions from current node/shape function
127  interpolated_w += nodal_value[0]*psi(l);
128  interpolated_laplacian_w += nodal_value[1]*psi(l);
129 
131  {
132  interpolated_phi += nodal_value[2]*psi(l);
133  interpolated_laplacian_phi += nodal_value[3]*psi(l);
134  interpolated_smooth_dwdr += nodal_value[4]*psi(l);
135  interpolated_smooth_dphidr += nodal_value[5]*psi(l);
136 
137  interpolated_continuous_d2wdr2 += nodal_value[4]*dpsidr(l,0);
138  interpolated_continuous_d2phidr2 += nodal_value[5]*dpsidr(l,0);
139  }
140 
141  interpolated_r += raw_nodal_position(l,0)*psi(l);
142  interpolated_dwdr += nodal_value[0]*dpsidr(l,0);
143  interpolated_dlaplacian_wdr += nodal_value[1]*dpsidr(l,0);
144 
146  {
147  interpolated_dphidr += nodal_value[2]*dpsidr(l,0);
148  interpolated_dlaplacian_phidr += nodal_value[3]*dpsidr(l,0);
149  }
150  }// End of loop over the nodes
151 
152 
153  //Premultiply the weights and the Jacobian
154  double W = w*interpolated_r*J;
155 
156  //Get pressure function
157  //-------------------
158  double pressure;
159  get_pressure_fvk(ipt,interpolated_r,pressure);
160 
161  double airy_forcing;
162  get_airy_forcing_fvk(ipt,interpolated_r,airy_forcing);
163 
164 
165  // Assemble residuals and Jacobian
166  //--------------------------------
167 
168  // Loop over the test functions
169  for(unsigned l=0;l<n_node;l++)
170  {
171  //Get the local equation
172  local_eqn = nodal_local_eqn(l,w_nodal_index);
173 
174  // IF it's not a boundary condition
175  if(local_eqn >= 0)
176  {
177  residuals[local_eqn] += pressure*test(l)*W;
178 
179  // Reduced order biharmonic operator
180  residuals[local_eqn] += interpolated_dlaplacian_wdr*dtestdr(l,0)*W;
181 
183  {
184  // Monge-Ampere part
185  residuals[local_eqn] +=
186  eta()*
187  (interpolated_continuous_d2wdr2*interpolated_dphidr
188  + interpolated_dwdr*interpolated_continuous_d2phidr2)
189  /interpolated_r * test(l) * W;
190  }
191  }
192 
193  //Get the local equation
194  local_eqn = nodal_local_eqn(l,laplacian_w_nodal_index);
195 
196  // IF it's not a boundary condition
197  if(local_eqn >= 0)
198  {
199  // The coupled Poisson equations for the biharmonic operator
200  residuals[local_eqn] += interpolated_laplacian_w*test(l)*W;
201  residuals[local_eqn] += interpolated_dwdr*dtestdr(l,0)*W;
202  }
203 
204  //Get the local equation
205  local_eqn = nodal_local_eqn(l,phi_nodal_index);
206 
207  // IF it's not a boundary condition
208  if(local_eqn >= 0)
209  {
210  residuals[local_eqn] += airy_forcing*test(l)*W;
211 
212  // Reduced order biharmonic operator
213  residuals[local_eqn] +=
214  interpolated_dlaplacian_phidr*dtestdr(l,0)*W;
215 
216  // Monge-Ampere part
217  residuals[local_eqn] -=
218  interpolated_continuous_d2wdr2*interpolated_dwdr
219  /interpolated_r * test(l) * W;
220  }
221 
222  //Get the local equation
223  local_eqn = nodal_local_eqn(l,laplacian_phi_nodal_index);
224 
225  // IF it's not a boundary condition
226  if(local_eqn >= 0)
227  {
228  // The coupled Poisson equations for the biharmonic operator
229  residuals[local_eqn] += interpolated_laplacian_phi*test(l)*W;
230  residuals[local_eqn] += interpolated_dphidr*dtestdr(l,0)*W;
231  }
232 
233  //Residuals for the smooth derivatives
234  local_eqn = nodal_local_eqn(l,smooth_dwdr_nodal_index);
235  if(local_eqn >= 0)
236  {
237  residuals[local_eqn] +=
238  (interpolated_dwdr - interpolated_smooth_dwdr)*test(l)*W;
239  }
240 
241  local_eqn = nodal_local_eqn(l,smooth_dphidr_nodal_index);
242  if(local_eqn >= 0)
243  {
244  residuals[local_eqn] +=
245  (interpolated_dphidr - interpolated_smooth_dphidr)*test(l)*W;
246  }
247 
248  } // End of loop over test functions
249  } // End of loop over integration points
250 
251  }
252 
253 
254 
255 //======================================================================
256 /// Self-test: Return 0 for OK
257 //======================================================================
259  {
260 
261  bool passed=true;
262 
263  // Check lower-level stuff
264  if (FiniteElement::self_test()!=0)
265  {
266  passed=false;
267  }
268 
269  // Return verdict
270  if (passed)
271  {
272  return 0;
273  }
274  else
275  {
276  return 1;
277  }
278 
279  }
280 
281 
282 //======================================================================
283 /// Compute in-plane stresses. Return boolean to indicate success
284 /// (false if attempt to evaluate stresses at zero radius)
285 //======================================================================
287  (const Vector<double> &s, double& sigma_r_r, double& sigma_phi_phi)
288 
289  {
290 
291  // No in plane stresses if linear bending
293  {
294  sigma_r_r=0.0;
295  sigma_phi_phi=0.0;
296 
297  // Success!
298  return true;
299  }
300  else
301  {
302  // Get shape fcts and derivs
303  unsigned n_dim=this->dim();
304  unsigned n_node=this->nnode();
305  Shape psi(n_node);
306  DShape dpsi_dr(n_node,n_dim);
307 
308  // Check if we're dividing by zero
309  Vector<double> r(1);
310  this->interpolated_x(s,r);
311  if (r[0]==0.0)
312  {
313  sigma_r_r=0.0;
314  sigma_phi_phi=0.0;
315  return false;
316  }
317 
318  // Get shape fcts and derivs
319  dshape_eulerian(s,psi,dpsi_dr);
320 
321  //Indices at which the unknowns are stored
322  const unsigned smooth_dphi_dr_nodal_index = nodal_index_fvk(5);
323 
324  //Allocate and initialise to zero storage for the interpolated values
325  double interpolated_r = 0;
326  double interpolated_dphi_dr = 0;
327  double interpolated_continuous_d2phi_dr2 = 0;
328 
329 
330  //Calculate function values and derivatives:
331  //-----------------------------------------
332  // Loop over nodes
333  for(unsigned l=0;l<n_node;l++)
334  {
335  //Add contributions from current node/shape function
336  interpolated_r += raw_nodal_position(l,0)*psi(l);
337  interpolated_dphi_dr +=
338  this->nodal_value(l,smooth_dphi_dr_nodal_index)*psi(l);
339  interpolated_continuous_d2phi_dr2 +=
340  this->nodal_value(l,smooth_dphi_dr_nodal_index)*dpsi_dr(l,0);
341  } // End of loop over nodes
342 
343  // Compute stresses
344  sigma_r_r = interpolated_dphi_dr / interpolated_r;
345  sigma_phi_phi = interpolated_continuous_d2phi_dr2;
346 
347  // Success!
348  return true;
349 
350  }// End if
351 
352  } // End of interpolated_stress function
353 
354 
355 //======================================================================
356 /// Output function:
357 /// r, w, sigma_r_r, sigma_phi_phi
358 /// nplot points
359 //======================================================================
360  void AxisymFoepplvonKarmanEquations::output(std::ostream &outfile,
361  const unsigned &nplot)
362  {
363 
364  //Vector of local coordinates
365  Vector<double> s(1);
366 
367  // Tecplot header info
368  outfile << "ZONE\n";
369 
370  // Loop over plot points
371  unsigned num_plot_points=nplot_points(nplot);
372  for (unsigned iplot=0;iplot<num_plot_points;iplot++)
373  {
374  // Get local coordinates of plot point
375  get_s_plot(iplot,nplot,s);
376 
377  // Get stress
378  double sigma_r_r=0.0;
379  double sigma_phi_phi=0.0;
380  bool success=interpolated_stress(s,sigma_r_r,sigma_phi_phi);
381  if (success)
382  {
383  outfile << interpolated_x(s,0) << " "
384  << interpolated_w_fvk(s) << " "
385  << sigma_r_r << " "
386  << sigma_phi_phi << std::endl;
387  }
388  }
389 
390  }
391 
392 
393 //======================================================================
394 /// C-style output function:
395 /// r,w
396 /// nplot points
397 //======================================================================
398  void AxisymFoepplvonKarmanEquations::output(FILE* file_pt,
399  const unsigned &nplot)
400  {
401  //Vector of local coordinates
402  Vector<double> s(1);
403 
404  // Tecplot header info
405  fprintf(file_pt,"%s",tecplot_zone_string(nplot).c_str());
406 
407  // Loop over plot points
408  unsigned num_plot_points=nplot_points(nplot);
409  for (unsigned iplot=0;iplot<num_plot_points;iplot++)
410  {
411  // Get local coordinates of plot point
412  get_s_plot(iplot,nplot,s);
413 
414  fprintf(file_pt,"%g ",interpolated_x(s,0));
415  fprintf(file_pt,"%g \n",interpolated_w_fvk(s));
416  }
417 
418  // Write tecplot footer (e.g. FE connectivity lists)
419  write_tecplot_zone_footer(file_pt,nplot);
420  }
421 
422 
423 //======================================================================
424  /// Output exact solution
425  ///
426  /// Solution is provided via function pointer.
427  /// Plot at a given number of plot points.
428  ///
429  /// r,w_exact
430 //======================================================================
432  (std::ostream &outfile,
433  const unsigned &nplot,
435  {
436  //Vector of local coordinates
437  Vector<double> s(1);
438 
439  // Vector for coordinates
440  Vector<double> r(1);
441 
442  // Tecplot header info
443  outfile << tecplot_zone_string(nplot);
444 
445  // Exact solution Vector (here a scalar)
446  //Vector<double> exact_soln(1);
447  Vector<double> exact_soln(1);
448 
449  // Loop over plot points
450  unsigned num_plot_points=nplot_points(nplot);
451  for (unsigned iplot=0;iplot<num_plot_points;iplot++)
452  {
453  // Get local coordinates of plot point
454  get_s_plot(iplot,nplot,s);
455 
456  // Get r position as Vector
457  interpolated_x(s,r);
458 
459  // Get exact solution at this point
460  (*exact_soln_pt)(r,exact_soln);
461 
462  //Output r,w_exact
463  outfile << r[0] << " ";
464  outfile << exact_soln[0] << std::endl;
465  }
466 
467  // Write tecplot footer (e.g. FE connectivity lists)
468  write_tecplot_zone_footer(outfile,nplot);
469  }
470 
471 
472 //======================================================================
473  /// Validate against exact solution
474  ///
475  /// Solution is provided via function pointer.
476  /// Plot error at a given number of plot points.
477  ///
478 //======================================================================
480  (std::ostream &outfile,
482  double& error, double& norm)
483  {
484  // Initialise
485  error=0.0;
486  norm=0.0;
487 
488  //Vector of local coordinates
489  Vector<double> s(1);
490 
491  // Vector for coordintes
492  Vector<double> r(1);
493 
494  //Find out how many nodes there are in the element
495  unsigned n_node = nnode();
496 
497  Shape psi(n_node);
498 
499  //Set the value of n_intpt
500  unsigned n_intpt = integral_pt()->nweight();
501 
502  // Tecplot
503  outfile << "ZONE" << std::endl;
504 
505  // Exact solution Vector (here a scalar)
506  //Vector<double> exact_soln(1);
507  Vector<double> exact_soln(1);
508 
509  //Loop over the integration points
510  for(unsigned ipt=0;ipt<n_intpt;ipt++)
511  {
512  //Assign values of s
513  s[0] = integral_pt()->knot(ipt,0);
514 
515  //Get the integral weight
516  double w = integral_pt()->weight(ipt);
517 
518  // Get jacobian of mapping
519  double J=J_eulerian(s);
520 
521  //Premultiply the weights and the Jacobian
522  double W = w*J;
523 
524  // Get r position as Vector
525  interpolated_x(s,r);
526 
527  // Get FE function value
528  double w_fe=interpolated_w_fvk(s);
529 
530  // Get exact solution at this point
531  (*exact_soln_pt)(r,exact_soln);
532 
533  //Output r,error
534  outfile << r[0] << " ";
535  outfile << exact_soln[0] << " " << exact_soln[0]-w_fe << std::endl;
536 
537  // Add to error and norm
538  norm+=exact_soln[0]*exact_soln[0]*W;
539  error+=(exact_soln[0]-w_fe)*(exact_soln[0]-w_fe)*W;
540  }
541 
542  {
543  // Initialise
544  error=0.0;
545  norm=0.0;
546 
547  //Vector of local coordinates
548  Vector<double> s(1);
549 
550  // Vector for coordintes
551  Vector<double> r(1);
552 
553  //Find out how many nodes there are in the element
554  unsigned n_node = nnode();
555 
556  Shape psi(n_node);
557 
558  //Set the value of n_intpt
559  unsigned n_intpt = integral_pt()->nweight();
560 
561  // Tecplot
562  outfile << "ZONE" << std::endl;
563 
564  // Exact solution Vector (here a scalar)
565  //Vector<double> exact_soln(1);
566  Vector<double> exact_soln(1);
567 
568  //Loop over the integration points
569  for(unsigned ipt=0;ipt<n_intpt;ipt++)
570  {
571  //Assign values of s
572  s[0] = integral_pt()->knot(ipt,0);
573 
574  //Get the integral weight
575  double w = integral_pt()->weight(ipt);
576 
577  // Get jacobian of mapping
578  double J=J_eulerian(s);
579 
580  //Premultiply the weights and the Jacobian
581  double W = w*J;
582 
583  // Get r position as Vector
584  interpolated_x(s,r);
585 
586  // Get FE function value
587  double w_fe=interpolated_w_fvk(s);
588 
589  // Get exact solution at this point
590  (*exact_soln_pt)(r,exact_soln);
591 
592  //Output r error
593  outfile << r[0] << " ";
594  outfile << exact_soln[0] << " " << exact_soln[0]-w_fe << std::endl;
595 
596  // Add to error and norm
597  norm+=exact_soln[0]*exact_soln[0]*W;
598  error+=(exact_soln[0]-w_fe)*(exact_soln[0]-w_fe)*W;
599  }
600  }
601  }
602 
603 
604 //====================================================================
605 // Force build of templates
606 //====================================================================
607  template class AxisymFoepplvonKarmanElement<2>;
608  template class AxisymFoepplvonKarmanElement<3>;
609  template class AxisymFoepplvonKarmanElement<4>;
610 
611 }
612 
virtual std::string tecplot_zone_string(const unsigned &nplot) const
Return string for tecplot zone header (when plotting nplot points in each "coordinate direction") ...
Definition: elements.h:2990
double raw_nodal_value(const unsigned &n, const unsigned &i) const
Return the i-th value stored at local node n but do NOT take hanging nodes into account.
Definition: elements.h:2458
bool interpolated_stress(const Vector< double > &s, double &sigma_r_r, double &sigma_phi_phi) const
Compute in-plane stresses. Return boolean to indicate success (false if attempt to evaluate stresses ...
virtual void get_s_plot(const unsigned &i, const unsigned &nplot, Vector< double > &s, const bool &shifted_to_interior=false) const
Get cector of local coordinates of plot point i (when plotting nplot points in each "coordinate direc...
Definition: elements.h:2978
virtual void get_pressure_fvk(const unsigned &ipt, const double &r, double &pressure) const
Get pressure term at (Eulerian) position r. This function is virtual to allow overloading in multi-ph...
virtual unsigned self_test()
Self-test: Check inversion of element & do self-test for GeneralisedElement. Return 0 if OK...
Definition: elements.cc:4333
virtual double weight(const unsigned &i) const =0
Return weight of i-th integration point.
static const unsigned Initial_Nvalue
Static int that holds the number of variables at nodes: always the same.
virtual unsigned nplot_points(const unsigned &nplot) const
Return total number of plot points (when plotting nplot points in each "coordinate direction") ...
Definition: elements.h:3017
void output(std::ostream &outfile)
Output with default number of plot points.
unsigned self_test()
Self-test: Return 0 for OK.
void(* SteadyExactSolutionFctPt)(const Vector< double > &, Vector< double > &)
Function pointer for function that computes vector-valued steady "exact solution" as ...
Definition: elements.h:1723
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:3881
virtual unsigned nodal_index_fvk(const unsigned &i=0) const
Return the index at which the i-th unknown value is stored. The default value, i, is appropriate for ...
double dshape_eulerian(const Vector< double > &s, Shape &psi, DShape &dpsidx) const
Compute the geometric shape functions and also first derivatives w.r.t. global coordinates at local c...
Definition: elements.cc:3227
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
Definition: elements.h:1908
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.
virtual void write_tecplot_zone_footer(std::ostream &outfile, const unsigned &nplot) const
Add tecplot zone "footer" to output stream (when plotting nplot points in each "coordinate direction"...
Definition: elements.h:3003
virtual double dshape_and_dtest_eulerian_at_knot_axisym_fvk(const unsigned &ipt, Shape &psi, DShape &dpsidr, Shape &test, DShape &dtestdr) const =0
Shape/test functions and derivs w.r.t. to global coords at integration point ipt; return Jacobian of ...
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:2470
double raw_nodal_position(const unsigned &n, const unsigned &i) const
Return the i-th coordinate at local node n. Do not use the hanging node representation. NOTE: Moved to cc file because of a possible compiler bug in gcc (yes, really!). The move to the cc file avoids inlining which appears to cause problems (only) when compiled with gcc and -O3; offensive "illegal read" is in optimised-out section of code and data that is allegedly illegal is readily readable (by other means) just before this function is called so I can&#39;t really see how we could possibly be responsible for this...
Definition: elements.cc:1659
unsigned dim() const
Return the spatial dimension of the element, i.e. the number of local coordinates required to paramet...
Definition: elements.h:2482
virtual unsigned nweight() const =0
Return the number of integration points of the scheme.
static double Default_Physical_Constant_Value
Default value for physical constants.
void compute_error(std::ostream &outfile, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt, double &error, double &norm)
Get error against and norm of exact solution.
bool Linear_bending_model
Flag which stores whether we are using a linear, pure bending model instead of the full non-linear Fo...
double interpolated_w_fvk(const Vector< double > &s) const
Return FE representation of transverse displacement.
unsigned nnode() const
Return the number of nodes.
Definition: elements.h:2146
virtual void get_airy_forcing_fvk(const unsigned &ipt, const double &r, double &airy_forcing) const
Get Airy forcing term at (Eulerian) position r. This function is virtual to allow overloading in mult...
virtual double J_eulerian(const Vector< double > &s) const
Return the Jacobian of mapping from local to global coordinates at local position s...
Definition: elements.cc:4022
void output_fct(std::ostream &outfile, const unsigned &n_plot, FiniteElement::SteadyExactSolutionFctPt exact_soln_pt)
Output exact soln: r,w_exact at n_plot plot points.
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Fill in the residuals with this element&#39;s contribution.
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:1386
const double & eta() const
FvK parameter.