constrained_volume_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// Copyright (C) 2006-2022 Matthias Heil and Andrew Hazel
7 // LIC//
8 // LIC// This library is free software; you can redistribute it and/or
9 // LIC// modify it under the terms of the GNU Lesser General Public
10 // LIC// License as published by the Free Software Foundation; either
11 // LIC// version 2.1 of the License, or (at your option) any later version.
12 // LIC//
13 // LIC// This library is distributed in the hope that it will be useful,
14 // LIC// but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // LIC// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // LIC// Lesser General Public License for more details.
17 // LIC//
18 // LIC// You should have received a copy of the GNU Lesser General Public
19 // LIC// License along with this library; if not, write to the Free Software
20 // LIC// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 // LIC// 02110-1301 USA.
22 // LIC//
23 // LIC// The authors may be contacted at oomph-lib@maths.man.ac.uk.
24 // LIC//
25 // LIC//====================================================================
26 // Header file for elements that allow the imposition of a "constant volume"
27 // constraint in free surface problems.
28 
29 // Include guards, to prevent multiple includes
30 #ifndef CONSTRAINED_FLUID_VOLUME_ELEMENTS_HEADER
31 #define CONSTRAINED_FLUID_VOLUME_ELEMENTS_HEADER
32 
33 // Config header generated by autoconfig
34 #ifdef HAVE_CONFIG_H
35 #include <oomph-lib-config.h>
36 #endif
37 
38 // OOMPH-LIB headers
39 #include "../generic/Qelements.h"
40 #include "../generic/spines.h"
41 #include "../axisym_navier_stokes/axisym_navier_stokes_elements.h"
42 
43 //-------------------------------------------
44 // NOTE: This is still work
45 // in progress. Need to create versions
46 // for axisymmetric and cartesian 3D
47 // bulk equations, as well as spine
48 // version for all of these (resulting
49 // in six elements in total). These
50 // will gradually replace the very hacky
51 // fix_*.h files that currently live in
52 // various demo driver codes.
53 //-------------------------------------------
54 
55 namespace oomph
56 {
57  //==========================================================================
64  //=========================================================================
66  {
67  private:
70 
75 
79 
83 
85  inline int ptraded_local_eqn()
86  {
88  {
89  return this->internal_local_eqn(
90  External_or_internal_data_index_of_traded_pressure,
92  }
93  else
94  {
95  return this->external_local_eqn(
96  External_or_internal_data_index_of_traded_pressure,
98  }
99  }
100 
101 
104  Vector<double>& residuals);
105 
106  public:
110  VolumeConstraintElement(double* prescribed_volume_pt);
111 
116  VolumeConstraintElement(double* prescribed_volume_pt,
118  const unsigned& index_of_traded_pressure);
119 
122 
125  {
127  {
128  return internal_data_pt(
130  }
131  else
132  {
133  return external_data_pt(
135  }
136  }
137 
139  inline double p_traded()
140  {
142  }
143 
145  inline unsigned index_of_traded_pressure()
146  {
148  }
149 
150 
153  {
155  residuals);
156  }
157 
160  DenseMatrix<double>& jacobian)
161  {
162  // No contribution to jacobian; see comment in that function
164  residuals);
165  }
166 
170  Vector<double>& residuals,
171  DenseMatrix<double>& jacobian,
172  DenseMatrix<double>& mass_matrix)
173  {
174  // No contribution to jacobian or mass matrix; see comment in that
175  // function
177  residuals);
178  }
179  };
180 
184 
185 
186  //=======================================================================
194  //=======================================================================
196  {
197  protected:
202 
206 
211 
213  inline int ptraded_local_eqn()
214  {
215  // Return the appropriate nodal value if required
217  {
218  return this->nodal_local_eqn(Data_number_of_traded_pressure,
220  }
221  else
222  {
223  return this->external_local_eqn(Data_number_of_traded_pressure,
225  }
226  }
227 
234  Vector<double>& residuals) = 0;
235 
236  public:
240 
243 
246  {
247  // Call the generic routine
249  }
250 
262  VolumeConstraintElement* const& vol_constraint_el_pt,
263  const bool& check_nodal_data = true)
264  {
265  // In order to buffer the case of nodal data, we (tediously) check that
266  // the traded pressure is not already nodal data of this element
267  if (check_nodal_data)
268  {
269  // Get memory address of the equation indexed by the
270  // traded pressure datum
271  long* global_eqn_number =
272  vol_constraint_el_pt->p_traded_data_pt()->eqn_number_pt(
273  vol_constraint_el_pt->index_of_traded_pressure());
274 
275  // Put in a check if the datum already corresponds to any other
276  //(nodal) data in the element by checking the memory addresses of
277  // their global equation numbers
278  const unsigned n_node = this->nnode();
279  for (unsigned n = 0; n < n_node; n++)
280  {
281  // Cache the node pointer
282  Node* const nod_pt = this->node_pt(n);
283  // Find all nodal data values
284  unsigned n_value = nod_pt->nvalue();
285  // If we already have the data, set the
286  // lookup schemes accordingly and return from the function
287  for (unsigned i = 0; i < n_value; i++)
288  {
289  if (nod_pt->eqn_number_pt(i) == global_eqn_number)
290  {
294  // Finished so exit the function
295  return;
296  }
297  }
298  }
299  }
300 
301  // Should only get here if the data is not nodal
302 
303  // Add "traded" pressure data as external data to this element
305  this->add_external_data(vol_constraint_el_pt->p_traded_data_pt());
306 
307  // Which value corresponds to the traded pressure
309  vol_constraint_el_pt->index_of_traded_pressure();
310  }
311  };
312 
316 
317 
318  //=======================================================================
329  //=======================================================================
332  {
333  protected:
339  Vector<double>& residuals);
340 
341  public:
344 
347 
350  };
351 
352 
356 
357 
358  //=======================================================================
367  //=======================================================================
368  template<class ELEMENT>
371  public virtual FaceGeometry<ELEMENT>
372  {
373  public:
377  const int& face_index)
379  {
380  // Attach the geometrical information to the element, by
381  // making the face element from the bulk element
382  element_pt->build_face_element(face_index, this);
383  }
384 
389  DenseMatrix<double>& jacobian)
390  {
391  // Call the generic routine
393 
394  // Shape derivatives
395  // Call the generic finite difference routine for the solid variables
396  this->fill_in_jacobian_from_solid_position_by_fd(jacobian);
397  }
398 
402  double zeta_nodal(const unsigned& n,
403  const unsigned& k,
404  const unsigned& i) const
405  {
406  return FaceElement::zeta_nodal(n, k, i);
407  }
408  };
409 
410  //=======================================================================
419  //=======================================================================
420  template<class ELEMENT>
423  public virtual SpineElement<FaceGeometry<ELEMENT>>
424  {
425  public:
429  const int& face_index)
430  : SpineElement<FaceGeometry<ELEMENT>>(),
432  {
433  // Attach the geometrical information to the element, by
434  // making the face element from the bulk element
435  element_pt->build_face_element(face_index, this);
436  }
437 
438 
443  DenseMatrix<double>& jacobian)
444  {
445  // Call the generic routine
447 
448  // Call the generic routine to evaluate shape derivatives
449  this->fill_in_jacobian_from_geometric_data(jacobian);
450  }
451 
455  double zeta_nodal(const unsigned& n,
456  const unsigned& k,
457  const unsigned& i) const
458  {
459  return FaceElement::zeta_nodal(n, k, i);
460  }
461  };
462 
466 
467 
468  //=======================================================================
480  //=======================================================================
483  {
484  protected:
490  Vector<double>& residuals);
491 
492  public:
496  {
497  }
498 
501 
504 
508  {
509  // Initialise
510  double vol = 0.0;
511 
512  // Find out how many nodes there are
513  const unsigned n_node = this->nnode();
514 
515  // Set up memeory for the shape functions
516  Shape psif(n_node);
517  DShape dpsifds(n_node, 1);
518 
519  // Set the value of n_intpt
520  const unsigned n_intpt = this->integral_pt()->nweight();
521 
522  // Storage for the local cooridinate
523  Vector<double> s(1);
524 
525  // Loop over the integration points
526  for (unsigned ipt = 0; ipt < n_intpt; ipt++)
527  {
528  // Get the local coordinate at the integration point
529  s[0] = this->integral_pt()->knot(ipt, 0);
530 
531  // Get the integral weight
532  double W = this->integral_pt()->weight(ipt);
533 
534  // Call the derivatives of the shape function at the knot point
535  this->dshape_local_at_knot(ipt, psif, dpsifds);
536 
537  // Get position, tangent vector and velocity vector (r and z
538  // components only)
539  Vector<double> interpolated_u(2, 0.0);
540  Vector<double> interpolated_t1(2, 0.0);
542  for (unsigned l = 0; l < n_node; l++)
543  {
544  // Loop over directional components
545  for (unsigned i = 0; i < 2; i++)
546  {
547  interpolated_x[i] += this->nodal_position(l, i) * psif(l);
548  interpolated_u[i] +=
549  this->node_pt(l)->value(
550  dynamic_cast<AxisymmetricNavierStokesEquations*>(
551  bulk_element_pt())
552  ->u_index_axi_nst(i)) *
553  psif(l);
554  interpolated_t1[i] += this->nodal_position(l, i) * dpsifds(l, 0);
555  }
556  }
557 
558  // Calculate the length of the tangent Vector
559  double tlength = interpolated_t1[0] * interpolated_t1[0] +
560  interpolated_t1[1] * interpolated_t1[1];
561 
562  // Set the Jacobian of the line element
563  double J = sqrt(tlength) * interpolated_x[0];
564 
565  // Now calculate the normal Vector
566  Vector<double> interpolated_n(2);
567  this->outer_unit_normal(ipt, interpolated_n);
568 
569  // Assemble dot product
570  double dot = 0.0;
571  for (unsigned k = 0; k < 2; k++)
572  {
573  dot += interpolated_u[k] * interpolated_n[k];
574  }
575 
576  // Add to volume with sign chosen so that the volume is
577  // positive when the elements bound the fluid
578  vol += dot * W * J;
579  }
580 
581  return vol;
582  }
583  };
584 
588 
589 
590  //=======================================================================
600  //=======================================================================
601  template<class ELEMENT>
604  public virtual FaceGeometry<ELEMENT>
605  {
606  public:
610  FiniteElement* const& element_pt, const int& face_index)
612  {
613  // Attach the geometrical information to the element, by
614  // making the face element from the bulk element
615  element_pt->build_face_element(face_index, this);
616  }
617 
622  DenseMatrix<double>& jacobian)
623  {
624  // Call the generic routine
626 
627  // Shape derivatives
628  // Call the generic finite difference routine for the solid variables
629  this->fill_in_jacobian_from_solid_position_by_fd(jacobian);
630  }
631 
635  double zeta_nodal(const unsigned& n,
636  const unsigned& k,
637  const unsigned& i) const
638  {
639  return FaceElement::zeta_nodal(n, k, i);
640  }
641  };
642 
643  //=======================================================================
653  //=======================================================================
654  template<class ELEMENT>
657  public virtual SpineElement<FaceGeometry<ELEMENT>>
658  {
659  public:
663  FiniteElement* const& element_pt, const int& face_index)
664  : SpineElement<FaceGeometry<ELEMENT>>(),
666  {
667  // Attach the geometrical information to the element, by
668  // making the face element from the bulk element
669  element_pt->build_face_element(face_index, this);
670  }
671 
672 
677  DenseMatrix<double>& jacobian)
678  {
679  // Call the generic routine
681 
682  // Call the generic routine to evaluate shape derivatives
683  this->fill_in_jacobian_from_geometric_data(jacobian);
684  }
685 
689  double zeta_nodal(const unsigned& n,
690  const unsigned& k,
691  const unsigned& i) const
692  {
693  return FaceElement::zeta_nodal(n, k, i);
694  }
695  };
696 
697 
701 
702 
703  //=======================================================================
714  //=======================================================================
717  {
718  protected:
724  Vector<double>& residuals);
725 
726  public:
729  {
730  }
731 
734  };
735 
736 
740 
741 
742  //=======================================================================
751  //=======================================================================
752  template<class ELEMENT>
755  public virtual FaceGeometry<ELEMENT>
756  {
757  public:
761  FiniteElement* const& element_pt, const int& face_index)
763  {
764  // Attach the geometrical information to the element, by
765  // making the face element from the bulk element
766  element_pt->build_face_element(face_index, this);
767  }
768 
769 
774  DenseMatrix<double>& jacobian)
775  {
776  // Call the generic routine
778 
779  // Shape derivatives
780  // Call the generic finite difference routine for the solid variables
781  this->fill_in_jacobian_from_solid_position_by_fd(jacobian);
782  }
783 
784 
788  double zeta_nodal(const unsigned& n,
789  const unsigned& k,
790  const unsigned& i) const
791  {
792  return FaceElement::zeta_nodal(n, k, i);
793  }
794  };
795 
796 
800 
801 
802  //=======================================================================
811  //=======================================================================
812  template<class ELEMENT>
815  public virtual SpineElement<FaceGeometry<ELEMENT>>
816  {
817  public:
821  FiniteElement* const& element_pt, const int& face_index)
822  : SpineElement<FaceGeometry<ELEMENT>>(),
824  {
825  // Attach the geometrical information to the element, by
826  // making the face element from the bulk element
827  element_pt->build_face_element(face_index, this);
828  }
829 
830 
835  DenseMatrix<double>& jacobian)
836  {
837  // Call the generic routine
839 
840  // Call the generic routine to evaluate shape derivatives
841  this->fill_in_jacobian_from_geometric_data(jacobian);
842  }
843 
844 
848  double zeta_nodal(const unsigned& n,
849  const unsigned& k,
850  const unsigned& i) const
851  {
852  return FaceElement::zeta_nodal(n, k, i);
853  }
854  };
855 
856 
857 } // namespace oomph
858 #endif
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
JacobiRotation< float > J
Definition: Jacobi_makeJacobi.cpp:3
Definition: axisym_navier_stokes_elements.h:115
Definition: constrained_volume_elements.h:483
void fill_in_generic_residual_contribution_volume_constraint(Vector< double > &residuals)
Definition: constrained_volume_elements.cc:352
double contribution_to_enclosed_volume()
Return this element's contribution to the total volume enclosed.
Definition: constrained_volume_elements.cc:267
AxisymmetricVolumeConstraintBoundingElement()
Empty Contructor.
Definition: constrained_volume_elements.h:494
double contribution_to_volume_flux()
Definition: constrained_volume_elements.h:507
~AxisymmetricVolumeConstraintBoundingElement()
Empty Destructor.
Definition: constrained_volume_elements.h:500
Definition: shape.h:278
Definition: nodes.h:86
long * eqn_number_pt(const unsigned &i)
Return the pointer to the equation number of the i-th stored variable.
Definition: nodes.h:358
unsigned nvalue() const
Return number of values stored in data object (incl pinned ones).
Definition: nodes.h:483
double value(const unsigned &i) const
Definition: nodes.h:293
Definition: constrained_volume_elements.h:605
ElasticAxisymmetricVolumeConstraintBoundingElement(FiniteElement *const &element_pt, const int &face_index)
Definition: constrained_volume_elements.h:609
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: constrained_volume_elements.h:635
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: constrained_volume_elements.h:621
Definition: constrained_volume_elements.h:372
ElasticLineVolumeConstraintBoundingElement(FiniteElement *const &element_pt, const int &face_index)
Definition: constrained_volume_elements.h:376
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: constrained_volume_elements.h:388
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: constrained_volume_elements.h:402
Definition: constrained_volume_elements.h:756
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: constrained_volume_elements.h:773
ElasticSurfaceVolumeConstraintBoundingElement(FiniteElement *const &element_pt, const int &face_index)
Definition: constrained_volume_elements.h:760
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: constrained_volume_elements.h:788
void fill_in_jacobian_from_geometric_data(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: element_with_moving_nodes.cc:323
Definition: elements.h:4338
int & face_index()
Definition: elements.h:4626
void outer_unit_normal(const Vector< double > &s, Vector< double > &unit_normal) const
Compute outer unit normal at the specified local coordinate.
Definition: elements.cc:6006
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: elements.h:4497
FiniteElement *& bulk_element_pt()
Pointer to higher-dimensional "bulk" element.
Definition: elements.h:4735
double interpolated_x(const Vector< double > &s, const unsigned &i) const
Definition: elements.h:4528
Definition: elements.h:4998
Definition: elements.h:1313
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
Definition: elements.h:2175
virtual void build_face_element(const int &face_index, FaceElement *face_element_pt)
Definition: elements.cc:5132
virtual void dshape_local_at_knot(const unsigned &ipt, Shape &psi, DShape &dpsids) const
Definition: elements.cc:3239
int nodal_local_eqn(const unsigned &n, const unsigned &i) const
Definition: elements.h:1432
unsigned nnode() const
Return the number of nodes.
Definition: elements.h:2210
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
Definition: elements.h:1963
double nodal_position(const unsigned &n, const unsigned &i) const
Definition: elements.h:2317
Definition: elements.h:73
Data *& external_data_pt(const unsigned &i)
Return a pointer to i-th external data object.
Definition: elements.h:659
Data *& internal_data_pt(const unsigned &i)
Return a pointer to i-th internal data object.
Definition: elements.h:622
unsigned add_external_data(Data *const &data_pt, const bool &fd=true)
Definition: elements.cc:307
int internal_local_eqn(const unsigned &i, const unsigned &j) const
Definition: elements.h:267
int external_local_eqn(const unsigned &i, const unsigned &j)
Definition: elements.h:311
virtual double knot(const unsigned &i, const unsigned &j) const =0
Return local coordinate s[j] of i-th integration point.
virtual unsigned nweight() const =0
Return the number of integration points of the scheme.
virtual double weight(const unsigned &i) const =0
Return weight of i-th integration point.
Definition: constrained_volume_elements.h:332
void fill_in_generic_residual_contribution_volume_constraint(Vector< double > &residuals)
Definition: constrained_volume_elements.cc:115
double contribution_to_enclosed_volume()
Return this element's contribution to the total volume enclosed.
Definition: constrained_volume_elements.cc:189
LineVolumeConstraintBoundingElement()
Empty Contructor.
Definition: constrained_volume_elements.h:343
~LineVolumeConstraintBoundingElement()
Empty Destructor.
Definition: constrained_volume_elements.h:346
Definition: nodes.h:906
double value(const unsigned &i) const
Definition: nodes.cc:2408
Definition: shape.h:76
Definition: constrained_volume_elements.h:658
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: constrained_volume_elements.h:676
SpineAxisymmetricVolumeConstraintBoundingElement(FiniteElement *const &element_pt, const int &face_index)
Definition: constrained_volume_elements.h:662
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: constrained_volume_elements.h:689
Definition: spines.h:477
Definition: constrained_volume_elements.h:424
SpineLineVolumeConstraintBoundingElement(FiniteElement *const &element_pt, const int &face_index)
Definition: constrained_volume_elements.h:428
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: constrained_volume_elements.h:442
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: constrained_volume_elements.h:455
Definition: constrained_volume_elements.h:816
SpineSurfaceVolumeConstraintBoundingElement(FiniteElement *const &element_pt, const int &face_index)
Definition: constrained_volume_elements.h:820
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: constrained_volume_elements.h:834
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: constrained_volume_elements.h:848
Definition: constrained_volume_elements.h:717
SurfaceVolumeConstraintBoundingElement()
Empty Contructor.
Definition: constrained_volume_elements.h:728
void fill_in_generic_residual_contribution_volume_constraint(Vector< double > &residuals)
Definition: constrained_volume_elements.cc:435
~SurfaceVolumeConstraintBoundingElement()
Empty Desctructor.
Definition: constrained_volume_elements.h:733
Definition: constrained_volume_elements.h:196
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Fill in contribution to residuals and Jacobian.
Definition: constrained_volume_elements.h:245
void set_volume_constraint_element(VolumeConstraintElement *const &vol_constraint_el_pt, const bool &check_nodal_data=true)
Definition: constrained_volume_elements.h:261
unsigned Index_of_traded_pressure_value
Definition: constrained_volume_elements.h:205
VolumeConstraintBoundingElement()
Definition: constrained_volume_elements.h:239
~VolumeConstraintBoundingElement()
Empty Destructor.
Definition: constrained_volume_elements.h:242
virtual void fill_in_generic_residual_contribution_volume_constraint(Vector< double > &residuals)=0
bool Traded_pressure_stored_at_node
Definition: constrained_volume_elements.h:210
int ptraded_local_eqn()
The local eqn number for the traded pressure.
Definition: constrained_volume_elements.h:213
unsigned Data_number_of_traded_pressure
Definition: constrained_volume_elements.h:201
Definition: constrained_volume_elements.h:66
void fill_in_generic_contribution_to_residuals_volume_constraint(Vector< double > &residuals)
Fill in the residuals for the volume constraint.
Definition: constrained_volume_elements.cc:38
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Fill in the residuals for the volume constraint.
Definition: constrained_volume_elements.h:152
~VolumeConstraintElement()
Empty destructor.
Definition: constrained_volume_elements.h:121
unsigned Index_of_traded_pressure_value
Definition: constrained_volume_elements.h:82
unsigned External_or_internal_data_index_of_traded_pressure
Definition: constrained_volume_elements.h:74
Data * p_traded_data_pt()
Access to Data that contains the traded pressure.
Definition: constrained_volume_elements.h:124
VolumeConstraintElement(double *prescribed_volume_pt)
Definition: constrained_volume_elements.cc:60
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Fill in the residuals and jacobian for the volume constraint.
Definition: constrained_volume_elements.h:159
double p_traded()
Return the traded pressure value.
Definition: constrained_volume_elements.h:139
bool Traded_pressure_stored_as_internal_data
Definition: constrained_volume_elements.h:78
int ptraded_local_eqn()
The local eqn number for the traded pressure.
Definition: constrained_volume_elements.h:85
unsigned index_of_traded_pressure()
Return the index of Data object at which the traded pressure is stored.
Definition: constrained_volume_elements.h:145
double * Prescribed_volume_pt
Pointer to the desired value of the volume.
Definition: constrained_volume_elements.h:69
void fill_in_contribution_to_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
Definition: constrained_volume_elements.h:169
RealScalar s
Definition: level1_cplx_impl.h:130
Scalar EIGEN_BLAS_FUNC_NAME() dot(int *n, Scalar *px, int *incx, Scalar *py, int *incy)
Definition: level1_real_impl.h:52
char char char int int * k
Definition: level2_impl.h:374
@ W
Definition: quadtree.h:63
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10