algebraic_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 #ifndef OOMPH_ALGEBRAIC_ELEMENTS_HEADER
27 #define OOMPH_ALGEBRAIC_ELEMENTS_HEADER
28 
29 #include "geom_objects.h"
30 #include "mesh.h"
31 #include "elements.h"
32 #include "domain.h"
34 
35 namespace oomph
36 {
37  // forward references
38  class AlgebraicMesh;
39  class AlgebraicElementBase;
40  class DummyAlgebraicMesh;
41 
42 
45  // Algebraic nodes
48 
49 
50  //========================================================================
53  //========================================================================
54  class AlgebraicNode : public Node
55  {
56  public:
59 
63  AlgebraicNode(const unsigned& n_dim,
64  const unsigned& n_position_type,
65  const unsigned& initial_nvalue)
66  : Node(n_dim, n_position_type, initial_nvalue)
67  {
68 #ifdef LEAK_CHECK
69  LeakCheckNames::AlgebraicNode_build += 1;
70 #endif
71 
72  // Add default node update info
73  add_node_update_info(Dummy_node_update_fct_id, // dummy remesh fct ID
74  Dummy_mesh_pt, // dummy mesh
75  Dummy_geom_object_pt, // dummy geom object vector
76  Dummy_ref_value, // dummy ref vector
77  true); // flag indicating call from
78  // constructor
79  }
80 
81 
86  const unsigned& n_dim,
87  const unsigned& n_position_type,
88  const unsigned& initial_nvalue)
89  : Node(time_stepper_pt, n_dim, n_position_type, initial_nvalue)
90  {
91 #ifdef LEAK_CHECK
92  LeakCheckNames::AlgebraicNode_build += 1;
93 #endif
94 
95  // Add default node update info
96  add_node_update_info(Dummy_node_update_fct_id, // dummy remesh fct ID
97  Dummy_mesh_pt, // dummy mesh
98  Dummy_geom_object_pt, // dummy geom object vector
99  Dummy_ref_value, // dummy ref vector
100  true); // flag indicating call from
101  // constructor
102  }
103 
105  virtual ~AlgebraicNode()
106  {
107 #ifdef LEAK_CHECK
108  LeakCheckNames::AlgebraicNode_build -= 1;
109 #endif
110  }
111 
113  AlgebraicNode(const AlgebraicNode&) = delete;
114 
116  // Commented out broken assignment operator because this can lead to a
117  // conflict warning when used in the virtual inheritence hierarchy.
118  // Essentially the compiler doesn't realise that two separate
119  // implementations of the broken function are the same and so, quite
120  // rightly, it shouts.
121  /*void operator=(const AlgebraicNode&) = delete;*/
122 
123 
132  void node_update(const bool& update_all_time_levels_for_new_node = false);
133 
134 
136  unsigned nnode_update_fcts()
137  {
138  // Note: We could read this information out from any one of
139  // various maps that that store the information for the
140  // different node update functions...
141  return Mesh_pt.size();
142  }
143 
144 
147  {
149  }
150 
155  {
156  // Resize vector
157  id.resize(0);
158 
159  // Loop over all entries and copy them across (again, we could
160  // get this information from any of the maps...)
161  typedef std::map<int, AlgebraicMesh*>::iterator IT;
162  for (IT it = Mesh_pt.begin(); it != Mesh_pt.end(); it++)
163  {
164  id.push_back(it->first);
165  }
166  }
167 
168 
171  {
172  return Default_it_mesh_pt->second;
173  }
174 
175 
177  AlgebraicMesh* mesh_pt(const int& id)
178  {
179  return Mesh_pt[id];
180  }
181 
182 
184  unsigned ngeom_object(const int& id)
185  {
186  return Geom_object_pt[id].size();
187  }
188 
189 
192  unsigned ngeom_object() const
193  {
194  return Default_it_geom_object_pt->second.size();
195  }
196 
197 
201  {
202  return Geom_object_pt[id];
203  }
204 
205 
209  {
210  return Default_it_geom_object_pt->second;
211  }
212 
213 
216  {
217  if (this->ngeom_object() == 0)
218  {
219  return 0;
220  }
221  else
222  {
223  return &(Default_it_geom_object_pt->second[0]);
224  }
225  }
226 
229  GeomObject* geom_object_pt(const unsigned& i)
230  {
231  return Default_it_geom_object_pt->second[i];
232  }
233 
235  unsigned nref_value(const int& id)
236  {
237  return Ref_value[id].size();
238  }
239 
240 
243  unsigned nref_value()
244  {
245  return Default_it_ref_value->second.size();
246  }
247 
248 
252  {
253  return Default_it_ref_value->second;
254  }
255 
256 
260  {
261  return Ref_value[id];
262  }
263 
264 
267  double ref_value(const unsigned& i)
268  {
269  return Default_it_ref_value->second[i];
270  }
271 
280  void add_node_update_info(const int& id,
283  const Vector<double>& ref_value,
284  const bool& called_from_constructor = false)
285  {
286  // Sanity check
287  if (id < 0)
288  {
289  if (!called_from_constructor)
290  {
291  std::ostringstream error_message;
292  error_message << "\nNegative ID, " << id
293  << ", only allowed if called from constructor and\n"
294  << "indicated as such by optional boolean flag."
295  << std::endl;
296  throw OomphLibError(error_message.str(),
299  }
300  }
301 
302  // If there's just one entry -- check if it's the default dummy one
303  if (Mesh_pt.size() == 1)
304  {
305  if (Mesh_pt.begin()->second == Dummy_mesh_pt)
306  {
307  if (Default_it_mesh_pt->second == Dummy_mesh_pt)
308  {
310  }
311  }
312  }
313 
314  // Now insert the actual info
315  Mesh_pt.insert(std::make_pair(id, mesh_pt));
316  Geom_object_pt.insert(std::make_pair(id, geom_object_pt));
317  Ref_value.insert(std::make_pair(id, ref_value));
318 
319  // Always use the "first" update fct as default -- can be overwritten
320  // outside (usually only done for self test)
321  set_default_node_update(Mesh_pt.begin()->first);
322  }
323 
324 
333  const Vector<double>& ref_value)
334  {
335  // No update fct id supplied: Use a default assignment of 0.
336  unsigned id = 0;
337 
338  // If there's just one entry -- check if it's the default dummy one
339  if (Mesh_pt.size() == 1)
340  {
341  // Do we still have dummy default assignment stored as the one
342  // and only entry?
343  if (Mesh_pt.begin()->second == Dummy_mesh_pt)
344  {
345  if (Default_it_mesh_pt->second == Dummy_mesh_pt)
346  {
348  }
349  }
350  }
351 
352  // Now insert the actual info
353  Mesh_pt.insert(std::make_pair(id, mesh_pt));
354  Geom_object_pt.insert(std::make_pair(id, geom_object_pt));
355  Ref_value.insert(std::make_pair(id, ref_value));
356 
357  // Always use the "first" update fct as default -- can be overwritten
358  // outside (usually only done for self test)
359  set_default_node_update(Mesh_pt.begin()->first);
360  }
361 
362 
365  void kill_node_update_info(const int& id = 0)
366  {
367  Mesh_pt.erase(Mesh_pt.find(id));
368  Geom_object_pt.erase(Geom_object_pt.find(id));
369  Ref_value.erase(Ref_value.find(id));
370  }
371 
372 
379  unsigned self_test();
380 
381 
382  private:
384  void set_default_node_update(const int& id)
385  {
386  // Set default node update fct id
388 
389 
390  // Set iterators for default entry
391 
392  // Iterator to default mesh:
393  Default_it_mesh_pt = Mesh_pt.find(id);
394 #ifdef PARANOID
395  if (Default_it_mesh_pt == Mesh_pt.end())
396  {
397  std::ostringstream error_message;
398  error_message << "There is no reference mesh for node update fct id"
399  << id << std::endl;
400  throw OomphLibError(error_message.str(),
403  }
404 #endif
405 
406  // Iterator to default GeomObject vector
408 #ifdef PARANOID
410  {
411  std::ostringstream error_message;
412  error_message << "There is no Geom_object_pt for node update fct id"
413  << id << std::endl;
414  throw OomphLibError(error_message.str(),
417  }
418 #endif
419 
420  // Iterator to default values vector
421  Default_it_ref_value = Ref_value.find(id);
422 #ifdef PARANOID
423  if (Default_it_ref_value == Ref_value.end())
424  {
425  std::ostringstream error_message;
426  error_message << "There is no Ref_value for node update fct id" << id
427  << std::endl;
428  throw OomphLibError(error_message.str(),
431  }
432 #endif
433  }
434 
439  std::map<int, AlgebraicMesh*> Mesh_pt;
440 
446  std::map<int, Vector<GeomObject*>> Geom_object_pt;
447 
453  std::map<int, Vector<double>> Ref_value;
454 
456  std::map<int, AlgebraicMesh*>::iterator Default_it_mesh_pt;
457 
460  std::map<int, Vector<GeomObject*>>::iterator Default_it_geom_object_pt;
461 
464  std::map<int, Vector<double>>::iterator Default_it_ref_value;
465 
468 
472 
476 
480 
483 
487 
491  };
492 
493 
496  // Algebraic elements
499 
500 
501  //========================================================================
504  //========================================================================
506  {
507  public:
510 
513 
515  void operator=(const AlgebraicElementBase&) = delete;
516 
521  void setup_algebraic_node_update(Node*& node_pt,
522  const Vector<double>& s_father,
523  FiniteElement* father_el_pt) const;
524  };
525 
526 
527  //========================================================================
535  //========================================================================
536  template<class ELEMENT>
538  : public ElementWithSpecificMovingNodes<ELEMENT, AlgebraicNode>,
539  public AlgebraicElementBase
540  {
541  public:
547  {
548  }
549 
551  AlgebraicElement(FiniteElement* const& element_pt, const int& face_index)
552  : ElementWithSpecificMovingNodes<ELEMENT, AlgebraicNode>(element_pt,
553  face_index),
555  {
556  }
557 
560 
562  /*void operator=(const AlgebraicElement&) = delete;*/
563 
564 
567  };
568 
569 
570  //=======================================================================
573  //=======================================================================
574  template<class ELEMENT>
576  : public virtual FaceGeometry<ELEMENT>
577  {
578  public:
580  FaceGeometry() : FaceGeometry<ELEMENT>() {}
581 
582  protected:
583  };
584 
585 
588  // Algebraic meshes
591 
592 
593  //========================================================================
597  //========================================================================
598  class AlgebraicMesh : public virtual Mesh
599  {
600  public:
605  {
607  }
608 
610  AlgebraicMesh(const AlgebraicMesh&) = delete;
611 
613  /*void operator=(const AlgebraicMesh&) = delete;*/
614 
617 
619  // Can safely cast the nodes to AlgebraicNodes
620  AlgebraicNode* node_pt(const unsigned long& n)
621  {
622 #ifdef PARANOID
623  if (!dynamic_cast<AlgebraicNode*>(Node_pt[n]))
624  {
625  std::ostringstream error_stream;
626  error_stream << "Error: Node " << n << "is a "
627  << typeid(Node_pt[n]).name() << ", not an AlgebraicNode"
628  << std::endl;
629  throw OomphLibError(
630  error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
631  }
632 #endif
633  // Return a cast to the Node_pt
634  return (dynamic_cast<AlgebraicNode*>(Node_pt[n]));
635  }
636 
637 
640  virtual void algebraic_node_update(const unsigned& t,
641  AlgebraicNode*& node_pt) = 0;
642 
647 
648 
653  void node_update(const bool& update_all_solid_nodes = false)
654  {
655 #ifdef PARANOID
656  if (update_all_solid_nodes)
657  {
658  std::string error_message =
659  "Doesn't make sense to use an AlgebraicMesh with\n";
660  error_message +=
661  "SolidElements so specifying update_all_solid_nodes=true\n";
662  error_message += "doesn't make sense either\n";
663 
664  throw OomphLibError(
666  }
667 #endif
668  // Initial loop over ALL nodes to setup (need to place at least
669  // all master nodes before we can update the position of the
670  // hanging ones)
671  AlgebraicNode* alg_nod_pt = 0;
672  unsigned n_node = nnode();
673 
674  // In parallel there may be no nodes on a particular process
675  if (n_node > 0)
676  {
677  for (unsigned n = 0; n < n_node; n++)
678  {
679  alg_nod_pt = static_cast<AlgebraicNode*>(node_pt(n));
680  alg_nod_pt->node_update();
681  }
682 
683  // Figure out spatial dimension of node
684  unsigned n_dim = alg_nod_pt->ndim();
685 
686  // Now loop over hanging nodes and adjust their nodal positions
687  // to reflect the hanging node constraints
688  for (unsigned n = 0; n < n_node; n++)
689  {
690  Node* nod_pt = node_pt(n);
691  if (nod_pt->is_hanging())
692  {
693  // Initialise
694  Vector<double> x(n_dim);
695  for (unsigned i = 0; i < n_dim; i++)
696  {
697  x[i] = 0.0;
698  }
699 
700  // Loop over master nodes
701  unsigned nmaster = nod_pt->hanging_pt()->nmaster();
702  for (unsigned imaster = 0; imaster < nmaster; imaster++)
703  {
704  // Loop over directions
705  for (unsigned i = 0; i < n_dim; i++)
706  {
707  x[i] += nod_pt->hanging_pt()->master_node_pt(imaster)->x(i) *
708  nod_pt->hanging_pt()->master_weight(imaster);
709  }
710  }
711 
712  // Copy across
713  for (unsigned i = 0; i < n_dim; i++)
714  {
715  nod_pt->x(i) = x[i];
716  }
718  }
719  }
720  } // end if (n_node>0)
721 
722 #ifdef OOMPH_HAS_MPI
723  // Update positions for external halo nodes attached to this mesh
724  // Loop over processors
725  for (std::map<unsigned, Vector<Node*>>::iterator it =
726  External_halo_node_pt.begin();
727  it != External_halo_node_pt.end();
728  it++)
729  {
730  int iproc = (*it).first;
731  AlgebraicNode* alg_nod_pt = 0;
732  unsigned n_ext_halo_node = nexternal_halo_node(iproc);
733  // Only act if there are any external halo nodes
734  if (n_ext_halo_node > 0)
735  {
736  for (unsigned n = 0; n < n_ext_halo_node; n++)
737  {
738  alg_nod_pt =
739  static_cast<AlgebraicNode*>(external_halo_node_pt(iproc, n));
740  alg_nod_pt->node_update();
741  }
742 
743  // Figure out spatial dimension of node
744  unsigned n_dim = alg_nod_pt->ndim();
745 
746  // Now loop over hanging nodes and adjust their nodal positions
747  // to reflect the hanging node constraints
748  for (unsigned n = 0; n < n_ext_halo_node; n++)
749  {
750  Node* nod_pt = external_halo_node_pt(iproc, n);
751  if (nod_pt->is_hanging())
752  {
753  // Initialise
754  Vector<double> x(n_dim);
755  for (unsigned i = 0; i < n_dim; i++)
756  {
757  x[i] = 0.0;
758  }
759 
760  // Loop over master nodes
761  unsigned nmaster = nod_pt->hanging_pt()->nmaster();
762  for (unsigned imaster = 0; imaster < nmaster; imaster++)
763  {
764  // Loop over directions
765  for (unsigned i = 0; i < n_dim; i++)
766  {
767  x[i] += nod_pt->hanging_pt()->master_node_pt(imaster)->x(i) *
768  nod_pt->hanging_pt()->master_weight(imaster);
769  }
770  }
771 
772  // Copy across
773  for (unsigned i = 0; i < n_dim; i++)
774  {
775  nod_pt->x(i) = x[i];
776  }
777  }
778  }
779  }
780 
781  } // end loop over processors
782 #endif
783  }
784 
786  unsigned self_test()
787  {
788  // Initialise
789  bool passed = true;
790 
791  unsigned test = Mesh::self_test();
792  if (test != 0)
793  {
794  passed = false;
795  }
796 
797  // Loop over nodes
798  unsigned n_node = nnode();
799  for (unsigned n = 0; n < n_node; n++)
800  {
801  if (static_cast<AlgebraicNode*>(node_pt(n))->self_test() != 0)
802  {
803  passed = false;
804  }
805  }
806 
807  oomph_info << "Done algnode selftest in mesh" << std::endl;
808 
809  // Return verdict
810  if (passed)
811  {
812  return 0;
813  }
814  else
815  {
816  return 1;
817  }
818  }
819 
823  void add_geom_object_list_pt(GeomObject* geom_object_pt)
824  {
825  Geom_object_list_pt.push_back(geom_object_pt);
826  }
827 
830  {
831  return Geom_object_list_pt.size();
832  }
833 
835  GeomObject* geom_object_list_pt(const unsigned& i)
836  {
837  // Probably should be a range check in here...
838  return Geom_object_list_pt[i];
839  }
840 
841  private:
845  };
846 
847 
850  // Dummy algebraic mesh
853 
854 
855  //========================================================================
857  //========================================================================
858  class DummyAlgebraicMesh : public virtual AlgebraicMesh
859  {
860  public:
863 
866 
868  /*void operator=(const DummyAlgebraicMesh&) = delete;*/
869 
872  virtual void algebraic_node_update(const unsigned& t,
874  {
875  }
876 
877 
883 
886  virtual void setup_algebraic_node_update(AlgebraicNode*& nod_pt) {}
887  };
888 
889 
890 } // namespace oomph
891 
892 #endif
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Definition: algebraic_elements.h:506
AlgebraicElementBase(const AlgebraicElementBase &)=delete
Broken copy constructor.
void operator=(const AlgebraicElementBase &)=delete
Broken assignment operator.
void setup_algebraic_node_update(Node *&node_pt, const Vector< double > &s_father, FiniteElement *father_el_pt) const
Definition: algebraic_elements.cc:48
AlgebraicElementBase()
Empty constructor.
Definition: algebraic_elements.h:509
Definition: algebraic_elements.h:540
~AlgebraicElement()
Broken assignment operator.
Definition: algebraic_elements.h:566
AlgebraicElement(const AlgebraicElement &)=delete
Broken copy constructor.
AlgebraicElement()
Definition: algebraic_elements.h:544
AlgebraicElement(FiniteElement *const &element_pt, const int &face_index)
Constructor for face elements.
Definition: algebraic_elements.h:551
Definition: algebraic_elements.h:599
~AlgebraicMesh()
Broken assignment operator.
Definition: algebraic_elements.h:616
AlgebraicMesh()
Definition: algebraic_elements.h:604
virtual void update_node_update(AlgebraicNode *&node_pt)=0
AlgebraicMesh(const AlgebraicMesh &)=delete
Broken copy constructor.
GeomObject * geom_object_list_pt(const unsigned &i)
Access function to the ith GeomObject.
Definition: algebraic_elements.h:835
virtual void algebraic_node_update(const unsigned &t, AlgebraicNode *&node_pt)=0
unsigned ngeom_object_list_pt()
Return number of geometric objects associated with AlgebraicMesh.
Definition: algebraic_elements.h:829
Vector< GeomObject * > Geom_object_list_pt
Definition: algebraic_elements.h:844
void node_update(const bool &update_all_solid_nodes=false)
Definition: algebraic_elements.h:653
unsigned self_test()
Self test: check consistentency of multiple node updates.
Definition: algebraic_elements.h:786
void add_geom_object_list_pt(GeomObject *geom_object_pt)
Definition: algebraic_elements.h:823
AlgebraicNode * node_pt(const unsigned long &n)
Return a pointer to the n-th global AlgebraicNode.
Definition: algebraic_elements.h:620
Definition: algebraic_elements.h:55
std::map< int, Vector< GeomObject * > >::iterator Default_it_geom_object_pt
Definition: algebraic_elements.h:460
unsigned ngeom_object(const int &id)
Number of geometric objects involved in id-th update function.
Definition: algebraic_elements.h:184
unsigned ngeom_object() const
Definition: algebraic_elements.h:192
std::map< int, AlgebraicMesh * > Mesh_pt
Definition: algebraic_elements.h:439
unsigned nref_value(const int &id)
Number of reference values involved in id-th update function.
Definition: algebraic_elements.h:235
unsigned nref_value()
Definition: algebraic_elements.h:243
static AlgebraicMesh * Dummy_mesh_pt
Definition: algebraic_elements.h:479
std::map< int, AlgebraicMesh * >::iterator Default_it_mesh_pt
Default iterator for mesh: This mesh performs the default update.
Definition: algebraic_elements.h:456
static double Max_allowed_difference_between_node_update_fcts
Definition: algebraic_elements.h:471
void set_default_node_update(const int &id)
Make id-th node update function the default.
Definition: algebraic_elements.h:384
unsigned self_test()
Definition: algebraic_elements.cc:297
AlgebraicNode(const AlgebraicNode &)=delete
Broken copy constructor.
void node_update_fct_id(Vector< int > &id)
Definition: algebraic_elements.h:154
GeomObject * geom_object_pt(const unsigned &i)
Definition: algebraic_elements.h:229
static Vector< GeomObject * > Dummy_geom_object_pt
Definition: algebraic_elements.h:486
void node_update(const bool &update_all_time_levels_for_new_node=false)
Broken assignment operator.
Definition: algebraic_elements.cc:231
AlgebraicNode()
Default Constructor.
Definition: algebraic_elements.h:58
int node_update_fct_id()
Default (usually first if there are multiple ones) node update fct id.
Definition: algebraic_elements.h:146
AlgebraicNode(const unsigned &n_dim, const unsigned &n_position_type, const unsigned &initial_nvalue)
Definition: algebraic_elements.h:63
unsigned nnode_update_fcts()
Number of node update fcts.
Definition: algebraic_elements.h:136
AlgebraicMesh * mesh_pt()
Default (usually first) mesh that implements update function.
Definition: algebraic_elements.h:170
Vector< double > & vector_ref_value(const int &id)
Definition: algebraic_elements.h:259
double ref_value(const unsigned &i)
Definition: algebraic_elements.h:267
void kill_node_update_info(const int &id=0)
Definition: algebraic_elements.h:365
Vector< GeomObject * > & vector_geom_object_pt()
Definition: algebraic_elements.h:208
Vector< GeomObject * > & vector_geom_object_pt(const int &id)
Definition: algebraic_elements.h:200
static DummyAlgebraicMesh Dummy_mesh
Static Dummy mesh to which the pointer is addressed.
Definition: algebraic_elements.h:482
GeomObject ** all_geom_object_pt()
Return the vector of all geometric objects.
Definition: algebraic_elements.h:215
AlgebraicNode(TimeStepper *time_stepper_pt, const unsigned &n_dim, const unsigned &n_position_type, const unsigned &initial_nvalue)
Definition: algebraic_elements.h:85
std::map< int, Vector< double > >::iterator Default_it_ref_value
Definition: algebraic_elements.h:464
void add_node_update_info(const int &id, AlgebraicMesh *mesh_pt, const Vector< GeomObject * > &geom_object_pt, const Vector< double > &ref_value, const bool &called_from_constructor=false)
Definition: algebraic_elements.h:280
std::map< int, Vector< GeomObject * > > Geom_object_pt
Definition: algebraic_elements.h:446
Vector< double > & vector_ref_value()
Definition: algebraic_elements.h:251
int Default_node_update_fct_id
Default node update function ID.
Definition: algebraic_elements.h:467
AlgebraicMesh * mesh_pt(const int &id)
Mesh that implements the id-th node update function.
Definition: algebraic_elements.h:177
void add_node_update_info(AlgebraicMesh *mesh_pt, const Vector< GeomObject * > &geom_object_pt, const Vector< double > &ref_value)
Definition: algebraic_elements.h:331
virtual ~AlgebraicNode()
Destructor (empty)
Definition: algebraic_elements.h:105
std::map< int, Vector< double > > Ref_value
Definition: algebraic_elements.h:453
static int Dummy_node_update_fct_id
Definition: algebraic_elements.h:475
static Vector< double > Dummy_ref_value
Definition: algebraic_elements.h:490
TimeStepper *& time_stepper_pt()
Return the pointer to the timestepper.
Definition: nodes.h:238
Dummy algebraic mesh – used for default assignements.
Definition: algebraic_elements.h:859
DummyAlgebraicMesh()
Empty constructor.
Definition: algebraic_elements.h:862
virtual void setup_algebraic_node_update(AlgebraicNode *&nod_pt)
Definition: algebraic_elements.h:886
virtual void update_node_update(AlgebraicNode *&node_pt)
Definition: algebraic_elements.h:882
virtual void algebraic_node_update(const unsigned &t, AlgebraicNode *&node_pt)
Broken assignment operator.
Definition: algebraic_elements.h:872
DummyAlgebraicMesh(const DummyAlgebraicMesh &)=delete
Broken copy constructor.
Definition: element_with_moving_nodes.h:382
FaceGeometry()
Constructor.
Definition: algebraic_elements.h:580
Definition: elements.h:4998
Definition: elements.h:1313
Definition: geom_objects.h:101
double const & master_weight(const unsigned &i) const
Return weight for dofs on i-th master node.
Definition: nodes.h:808
Node *const & master_node_pt(const unsigned &i) const
Return a pointer to the i-th master node.
Definition: nodes.h:791
unsigned nmaster() const
Return the number of master nodes.
Definition: nodes.h:785
Definition: mesh.h:67
Vector< Node * > Node_pt
Vector of pointers to nodes.
Definition: mesh.h:183
unsigned long nnode() const
Return number of nodes in the mesh.
Definition: mesh.h:596
unsigned self_test()
Self-test: Check elements and nodes. Return 0 for OK.
Definition: mesh.cc:778
Definition: nodes.h:906
double & x(const unsigned &i)
Return the i-th nodal coordinate.
Definition: nodes.h:1060
HangInfo *const & hanging_pt() const
Definition: nodes.h:1228
void perform_auxiliary_node_update_fct()
Definition: nodes.h:1615
unsigned ndim() const
Return (Eulerian) spatial dimension of the node.
Definition: nodes.h:1054
bool is_hanging() const
Test whether the node is geometrically hanging.
Definition: nodes.h:1285
Definition: oomph_definitions.h:222
Definition: timesteppers.h:231
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
list x
Definition: plotDoE.py:28
string name
Definition: plotDoE.py:33
t
Definition: plotPSD.py:36
Definition: indexed_view.cpp:20
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86