assembly_handler.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 // A class that is used to assemble the linear systems solved
27 // by oomph-lib.
28 
29 // Include guards to prevent multiple inclusion of this header
30 #ifndef OOMPH_ASSEMBLY_HANDLER_CLASS_HEADER
31 #define OOMPH_ASSEMBLY_HANDLER_CLASS_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 "matrices.h"
40 #include "linear_solver.h"
42 
43 namespace oomph
44 {
45  // Forward class definition of the element
46  class GeneralisedElement;
47 
48  // Forward class definition of the problem
49  class Problem;
50 
51  //=============================================================
61  //===============================================================
63  {
64  public:
67 
69  virtual unsigned ndof(GeneralisedElement* const& elem_pt);
70 
72  virtual void dof_vector(GeneralisedElement* const& elem_pt,
73  const unsigned& t,
74  Vector<double>& dof);
75 
77  virtual void dof_pt_vector(GeneralisedElement* const& elem_pt,
78  Vector<double*>& dof_pt);
79 
82  virtual double& local_problem_dof(Problem* const& problem_pt,
83  const unsigned& t,
84  const unsigned& i);
85 
88  virtual unsigned long eqn_number(GeneralisedElement* const& elem_pt,
89  const unsigned& ieqn_local);
90 
92  virtual void get_residuals(GeneralisedElement* const& elem_pt,
93  Vector<double>& residuals);
94 
97  virtual void get_jacobian(GeneralisedElement* const& elem_pt,
98  Vector<double>& residuals,
99  DenseMatrix<double>& jacobian);
100 
103  virtual void get_all_vectors_and_matrices(
104  GeneralisedElement* const& elem_pt,
105  Vector<Vector<double>>& vec,
107 
110  virtual void get_dresiduals_dparameter(GeneralisedElement* const& elem_pt,
111  double* const& parameter_pt,
112  Vector<double>& dres_dparam);
113 
116  virtual void get_djacobian_dparameter(GeneralisedElement* const& elem_pt,
117  double* const& parameter_pt,
118  Vector<double>& dres_dparam,
119  DenseMatrix<double>& djac_dparam);
120 
125  virtual void get_hessian_vector_products(GeneralisedElement* const& elem_pt,
126  Vector<double> const& Y,
127  DenseMatrix<double> const& C,
129 
130 
134  virtual int bifurcation_type() const
135  {
136  return 0;
137  }
138 
141  virtual double* bifurcation_parameter_pt() const;
142 
145  virtual void get_eigenfunction(Vector<DoubleVector>& eigenfunction);
146 
149  virtual void get_inner_products(
150  GeneralisedElement* const& elem_pt,
151  Vector<std::pair<unsigned, unsigned>> const& history_index,
152  Vector<double>& inner_product);
153 
156  virtual void get_inner_product_vectors(
157  GeneralisedElement* const& elem_pt,
158  Vector<unsigned> const& history_index,
159  Vector<Vector<double>>& inner_product_vector);
160 
161 #ifdef OOMPH_HAS_MPI
162 
165  virtual void synchronise() {}
166 #endif
167 
169  virtual ~AssemblyHandler() {}
170  };
171 
172 
173  //=============================================================
179  //===============================================================
181  {
182  public:
185 
187  unsigned ndof(GeneralisedElement* const& elem_pt);
188 
191  unsigned long eqn_number(GeneralisedElement* const& elem_pt,
192  const unsigned& ieqn_local);
193 
196  void get_residuals(GeneralisedElement* const& elem_pt,
197  Vector<double>& residuals);
198 
201  void get_jacobian(GeneralisedElement* const& elem_pt,
202  Vector<double>& residuals,
203  DenseMatrix<double>& jacobian);
204 
208  Vector<Vector<double>>& vec,
210 
213  };
214 
215 
216  //=============================================================
221  //===============================================================
223  {
225  double Sigma_real;
226 
227  public:
229  EigenProblemHandler(const double& sigma_real) : Sigma_real(sigma_real) {}
230 
232  unsigned ndof(GeneralisedElement* const& elem_pt);
233 
236  unsigned long eqn_number(GeneralisedElement* const& elem_pt,
237  const unsigned& ieqn_local);
238 
241  void get_residuals(GeneralisedElement* const& elem_pt,
242  Vector<double>& residuals);
243 
246  void get_jacobian(GeneralisedElement* const& elem_pt,
247  Vector<double>& residuals,
248  DenseMatrix<double>& jacobian);
249 
253  Vector<Vector<double>>& vec,
255 
258  };
259 
260 
261  //=============================================================
267  //===============================================================
269  {
272 
273  public:
275  ParallelResidualsHandler(AssemblyHandler* const& assembly_handler_pt)
276  : Assembly_handler_pt(assembly_handler_pt)
277  {
278  }
279 
282  unsigned ndof(GeneralisedElement* const& elem_pt)
283  {
284  return Assembly_handler_pt->ndof(elem_pt);
285  }
286 
289  unsigned long eqn_number(GeneralisedElement* const& elem_pt,
290  const unsigned& ieqn_local)
291  {
292  return Assembly_handler_pt->eqn_number(elem_pt, ieqn_local);
293  }
294 
297  void get_residuals(GeneralisedElement* const& elem_pt,
298  Vector<double>& residuals)
299  {
300  Assembly_handler_pt->get_residuals(elem_pt, residuals);
301  }
302 
303 
307  void get_jacobian(GeneralisedElement* const& elem_pt,
308  Vector<double>& residuals,
309  DenseMatrix<double>& jacobian)
310  {
311  Assembly_handler_pt->get_jacobian(elem_pt, residuals, jacobian);
312  }
313 
314 
320  Vector<Vector<double>>& vec,
322  {
323  Assembly_handler_pt->get_residuals(elem_pt, vec[0]);
324  }
325 
328  };
329 
330 
331  //==========================================================================
337  //==========================================================================
339  {
341  double* Parameter_pt;
342 
345 
346  public:
348  ParameterDerivativeHandler(AssemblyHandler* const& assembly_handler_pt,
349  double* const& parameter_pt)
350  : Parameter_pt(parameter_pt), Assembly_handler_pt(assembly_handler_pt)
351  {
352  }
353 
356  unsigned ndof(GeneralisedElement* const& elem_pt)
357  {
358  return Assembly_handler_pt->ndof(elem_pt);
359  }
360 
363  unsigned long eqn_number(GeneralisedElement* const& elem_pt,
364  const unsigned& ieqn_local)
365  {
366  return Assembly_handler_pt->eqn_number(elem_pt, ieqn_local);
367  }
368 
371  void get_residuals(GeneralisedElement* const& elem_pt,
372  Vector<double>& residuals)
373  {
375  elem_pt, Parameter_pt, residuals);
376  }
377 
378 
382  void get_jacobian(GeneralisedElement* const& elem_pt,
383  Vector<double>& residuals,
384  DenseMatrix<double>& jacobian)
385  {
387  elem_pt, Parameter_pt, residuals, jacobian);
388  }
389  };
390 
391 
392  //========================================================================
395  //========================================================================
397  {
400 
401  // Pointer to the problem, used in the resolve
403 
406 
409 
410  public:
414  {
415  }
416 
419 
421  void solve(Problem* const& problem_pt, DoubleVector& result);
422 
425  void solve(DoubleMatrixBase* const& matrix_pt,
426  const DoubleVector& rhs,
427  DoubleVector& result)
428  {
429  throw OomphLibError(
430  "Linear-algebra interface does not make sense for this linear solver\n",
433  }
434 
437  void solve(DoubleMatrixBase* const& matrix_pt,
438  const Vector<double>& rhs,
439  Vector<double>& result)
440  {
441  throw OomphLibError(
442  "Linear-algebra interface does not make sense for this linear solver\n",
445  }
446 
448  void resolve(const DoubleVector& rhs, DoubleVector& result);
449 
452  {
453  return Linear_solver_pt;
454  }
455  };
456 
457 
458  //===================================================================
471  //======================================================================
473  {
475 
478  enum
479  {
483  };
484 
491 
494 
497  unsigned Ndof;
498 
502 
505 
510 
512  double* Parameter_pt;
513 
514  public:
519  FoldHandler(Problem* const& problem_pt, double* const& parameter_pt);
520 
521 
523  FoldHandler(Problem* const& problem_pt,
524  double* const& parameter_pt,
525  const DoubleVector& eigenvector);
526 
529  FoldHandler(Problem* const& problem_pt,
530  double* const& parameter_pt,
531  const DoubleVector& eigenvector,
532  const DoubleVector& normalisation);
533 
534 
537  ~FoldHandler();
538 
540  unsigned ndof(GeneralisedElement* const& elem_pt);
541 
543  unsigned long eqn_number(GeneralisedElement* const& elem_pt,
544  const unsigned& ieqn_local);
545 
547  void get_residuals(GeneralisedElement* const& elem_pt,
548  Vector<double>& residuals);
549 
552  void get_jacobian(GeneralisedElement* const& elem_pt,
553  Vector<double>& residuals,
554  DenseMatrix<double>& jacobian);
555 
558  void get_dresiduals_dparameter(GeneralisedElement* const& elem_pt,
559  double* const& parameter_pt,
560  Vector<double>& dres_dparam);
561 
564  void get_djacobian_dparameter(GeneralisedElement* const& elem_pt,
565  double* const& parameter_pt,
566  Vector<double>& dres_dparam,
567  DenseMatrix<double>& djac_dparam);
568 
571  void get_hessian_vector_products(GeneralisedElement* const& elem_pt,
572  Vector<double> const& Y,
573  DenseMatrix<double> const& C,
575 
577  int bifurcation_type() const
578  {
579  return 1;
580  }
581 
584  double* bifurcation_parameter_pt() const
585  {
586  return Parameter_pt;
587  }
588 
591  void get_eigenfunction(Vector<DoubleVector>& eigenfunction);
592 
595 
597  void solve_block_system();
598 
600  void solve_full_system();
601  };
602 
603 
604  //========================================================================
607  //========================================================================
609  {
612 
615 
618 
621 
624 
628 
629  public:
633  Problem_pt(0),
634  B_pt(0),
635  C_pt(0),
636  D_pt(0),
637  dJy_dparam_pt(0)
638  {
639  }
640 
643 
645  void solve(Problem* const& problem_pt, DoubleVector& result);
646 
649  void solve(DoubleMatrixBase* const& matrix_pt,
650  const DoubleVector& rhs,
651  DoubleVector& result)
652  {
653  throw OomphLibError(
654  "Linear-algebra interface does not make sense for this linear solver\n",
657  }
658 
661  void solve(DoubleMatrixBase* const& matrix_pt,
662  const Vector<double>& rhs,
663  Vector<double>& result)
664  {
665  throw OomphLibError(
666  "Linear-algebra interface does not make sense for this linear solver\n",
669  }
670 
671 
673  void resolve(const DoubleVector& rhs, DoubleVector& result);
674 
677  {
678  return Linear_solver_pt;
679  }
680  };
681 
682 
683  //========================================================================
686  //========================================================================
688  {
691 
694 
697 
700 
701  public:
705  {
706  }
707 
710 
712  void solve(Problem* const& problem_pt, DoubleVector& result);
713 
716  void solve(DoubleMatrixBase* const& matrix_pt,
717  const DoubleVector& rhs,
718  DoubleVector& result)
719  {
720  throw OomphLibError(
721  "Linear-algebra interface does not make sense for this linear solver\n",
724  }
725 
728  void solve(DoubleMatrixBase* const& matrix_pt,
729  const Vector<double>& rhs,
730  Vector<double>& result)
731  {
732  throw OomphLibError(
733  "Linear-algebra interface does not make sense for this linear solver\n",
736  }
737 
738 
740  void resolve(const DoubleVector& rhs, DoubleVector& result);
741 
744  {
745  return Linear_solver_pt;
746  }
747  };
748 
749  //========================================================================
771  //========================================================================
773  {
776 
779  enum
780  {
784  };
785 
792 
795 
798 
801  unsigned Ndof;
802 
805 
808 
811  double Sigma;
812 
815 
818 
822 
829 
833 
835  double* Parameter_pt;
836 
837  // The total number of elements in the problem
838  unsigned Nelement;
839 
840 #ifdef OOMPH_HAS_MPI
842  bool Distributed;
843 #endif
844 
848  inline unsigned global_eqn_number(const unsigned& i)
849  {
850 #ifdef OOMPH_HAS_MPI
851  // If the problem is distributed I have to do something
852  if (Distributed)
853  {
854  return Global_eqn_number[i];
855  }
856  // Otherwise it's just i
857  else
858 #endif
859  {
860  return i;
861  }
862  }
863 
864  public:
866  PitchForkHandler(Problem* const& problem_pt,
867  AssemblyHandler* const& assembly_handler_pt,
868  double* const& parameter_pt,
869  const DoubleVector& symmetry_vector);
870 
874 
875  // Has this been called
876 
878  unsigned ndof(GeneralisedElement* const& elem_pt);
879 
881  unsigned long eqn_number(GeneralisedElement* const& elem_pt,
882  const unsigned& ieqn_local);
883 
885  void get_residuals(GeneralisedElement* const& elem_pt,
886  Vector<double>& residuals);
887 
890  void get_jacobian(GeneralisedElement* const& elem_pt,
891  Vector<double>& residuals,
892  DenseMatrix<double>& jacobian);
893 
896  void get_dresiduals_dparameter(GeneralisedElement* const& elem_pt,
897  double* const& parameter_pt,
898  Vector<double>& dres_dparam);
899 
902  void get_djacobian_dparameter(GeneralisedElement* const& elem_pt,
903  double* const& parameter_pt,
904  Vector<double>& dres_dparam,
905  DenseMatrix<double>& djac_dparam);
906 
909  void get_hessian_vector_products(GeneralisedElement* const& elem_pt,
910  Vector<double> const& Y,
911  DenseMatrix<double> const& C,
913 
914 
917  int bifurcation_type() const
918  {
919  return 2;
920  }
921 
924  double* bifurcation_parameter_pt() const
925  {
926  return Parameter_pt;
927  }
928 
931  void get_eigenfunction(Vector<DoubleVector>& eigenfunction);
932 
933 #ifdef OOMPH_HAS_MPI
936  void synchronise();
937 #endif
938 
939 
942 
944  void solve_block_system();
945 
947  void solve_full_system();
948  };
949 
950  //========================================================================
953  //========================================================================
955  {
958 
961 
964 
967 
970 
971  public:
975  Problem_pt(0),
976  A_pt(0),
977  E_pt(0),
978  G_pt(0)
979  {
980  }
981 
984 
986  void solve_for_two_rhs(Problem* const& problem_pt,
987  DoubleVector& result,
988  const DoubleVector& rhs2,
989  DoubleVector& result2);
990 
992  void solve(Problem* const& problem_pt, DoubleVector& result);
993 
996  void solve(DoubleMatrixBase* const& matrix_pt,
997  const DoubleVector& rhs,
998  DoubleVector& result)
999  {
1000  throw OomphLibError(
1001  "Linear-algebra interface does not make sense for this linear solver\n",
1004  }
1005 
1008  void solve(DoubleMatrixBase* const& matrix_pt,
1009  const Vector<double>& rhs,
1010  Vector<double>& result)
1011  {
1012  throw OomphLibError(
1013  "Linear-algebra interface does not make sense for this linear solver\n",
1016  }
1017 
1018 
1020  void resolve(const DoubleVector& rhs, DoubleVector& result);
1021 
1024  {
1025  return Linear_solver_pt;
1026  }
1027  };
1028 
1029 
1030  //===============================================================
1048  //===========================================================================
1050  {
1052 
1059 
1062 
1064  double* Parameter_pt;
1065 
1068  unsigned Ndof;
1069 
1071  double Omega;
1072 
1075 
1078 
1082 
1087 
1088  public:
1090  HopfHandler(Problem* const& problem_pt, double* const& parameter_pt);
1091 
1094  HopfHandler(Problem* const& problem_pt,
1095  double* const& paramter_pt,
1096  const double& omega,
1097  const DoubleVector& phi,
1098  const DoubleVector& psi);
1099 
1102  ~HopfHandler();
1103 
1105  unsigned ndof(GeneralisedElement* const& elem_pt);
1106 
1108  unsigned long eqn_number(GeneralisedElement* const& elem_pt,
1109  const unsigned& ieqn_local);
1110 
1112  void get_residuals(GeneralisedElement* const& elem_pt,
1113  Vector<double>& residuals);
1114 
1117  void get_jacobian(GeneralisedElement* const& elem_pt,
1118  Vector<double>& residuals,
1119  DenseMatrix<double>& jacobian);
1120 
1123  void get_dresiduals_dparameter(GeneralisedElement* const& elem_pt,
1124  double* const& parameter_pt,
1125  Vector<double>& dres_dparam);
1126 
1129  void get_djacobian_dparameter(GeneralisedElement* const& elem_pt,
1130  double* const& parameter_pt,
1131  Vector<double>& dres_dparam,
1132  DenseMatrix<double>& djac_dparam);
1133 
1136  void get_hessian_vector_products(GeneralisedElement* const& elem_pt,
1137  Vector<double> const& Y,
1138  DenseMatrix<double> const& C,
1140 
1143  int bifurcation_type() const
1144  {
1145  return 3;
1146  }
1147 
1151  {
1152  return Parameter_pt;
1153  }
1154 
1157  void get_eigenfunction(Vector<DoubleVector>& eigenfunction);
1158 
1160  const double& omega() const
1161  {
1162  return Omega;
1163  }
1164 
1166  void solve_standard_system();
1167 
1169  void solve_complex_system();
1170 
1172  void solve_full_system();
1173  };
1174 
1175 
1176 } // namespace oomph
1177 #endif
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Definition: assembly_handler.h:63
virtual unsigned ndof(GeneralisedElement *const &elem_pt)
Return the number of degrees of freedom in the element elem_pt.
Definition: assembly_handler.cc:42
virtual int bifurcation_type() const
Definition: assembly_handler.h:134
virtual void get_hessian_vector_products(GeneralisedElement *const &elem_pt, Vector< double > const &Y, DenseMatrix< double > const &C, DenseMatrix< double > &product)
Definition: assembly_handler.cc:153
virtual void get_dresiduals_dparameter(GeneralisedElement *const &elem_pt, double *const &parameter_pt, Vector< double > &dres_dparam)
Definition: assembly_handler.cc:125
virtual double * bifurcation_parameter_pt() const
Definition: assembly_handler.cc:168
virtual void get_all_vectors_and_matrices(GeneralisedElement *const &elem_pt, Vector< Vector< double >> &vec, Vector< DenseMatrix< double >> &matrix)
Definition: assembly_handler.cc:113
virtual void get_eigenfunction(Vector< DoubleVector > &eigenfunction)
Definition: assembly_handler.cc:188
virtual void get_residuals(GeneralisedElement *const &elem_pt, Vector< double > &residuals)
Return the contribution to the residuals of the element elem_pt.
Definition: assembly_handler.cc:92
virtual unsigned long eqn_number(GeneralisedElement *const &elem_pt, const unsigned &ieqn_local)
Definition: assembly_handler.cc:82
virtual ~AssemblyHandler()
Empty virtual destructor.
Definition: assembly_handler.h:169
virtual double & local_problem_dof(Problem *const &problem_pt, const unsigned &t, const unsigned &i)
Definition: assembly_handler.cc:70
virtual void get_inner_products(GeneralisedElement *const &elem_pt, Vector< std::pair< unsigned, unsigned >> const &history_index, Vector< double > &inner_product)
Definition: assembly_handler.cc:206
virtual void dof_vector(GeneralisedElement *const &elem_pt, const unsigned &t, Vector< double > &dof)
Return vector of dofs at time level t in the element elem_pt.
Definition: assembly_handler.cc:51
virtual void get_jacobian(GeneralisedElement *const &elem_pt, Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: assembly_handler.cc:102
virtual void get_djacobian_dparameter(GeneralisedElement *const &elem_pt, double *const &parameter_pt, Vector< double > &dres_dparam, DenseMatrix< double > &djac_dparam)
Definition: assembly_handler.cc:138
AssemblyHandler()
Empty constructor.
Definition: assembly_handler.h:66
virtual void get_inner_product_vectors(GeneralisedElement *const &elem_pt, Vector< unsigned > const &history_index, Vector< Vector< double >> &inner_product_vector)
Definition: assembly_handler.cc:221
virtual void dof_pt_vector(GeneralisedElement *const &elem_pt, Vector< double * > &dof_pt)
Return vector of pointers to dofs in the element elem_pt.
Definition: assembly_handler.cc:62
Definition: assembly_handler.h:397
void solve(Problem *const &problem_pt, DoubleVector &result)
The solve function uses the block factorisation.
Definition: assembly_handler.cc:405
LinearSolver * Linear_solver_pt
Pointer to the original linear solver.
Definition: assembly_handler.h:399
AugmentedBlockFoldLinearSolver(LinearSolver *const linear_solver_pt)
Constructor, inherits the original linear solver.
Definition: assembly_handler.h:412
LinearSolver * linear_solver_pt() const
Access function to the original linear solver.
Definition: assembly_handler.h:451
Problem * Problem_pt
Definition: assembly_handler.h:402
DoubleVector * E_pt
Pointer to the storage for the vector e.
Definition: assembly_handler.h:408
void resolve(const DoubleVector &rhs, DoubleVector &result)
The resolve function also uses the block factorisation.
Definition: assembly_handler.cc:677
~AugmentedBlockFoldLinearSolver()
Destructor: clean up the allocated memory.
Definition: assembly_handler.cc:389
DoubleVector * Alpha_pt
Pointer to the storage for the vector alpha.
Definition: assembly_handler.h:405
void solve(DoubleMatrixBase *const &matrix_pt, const Vector< double > &rhs, Vector< double > &result)
Definition: assembly_handler.h:437
void solve(DoubleMatrixBase *const &matrix_pt, const DoubleVector &rhs, DoubleVector &result)
Definition: assembly_handler.h:425
Definition: assembly_handler.h:688
void solve(Problem *const &problem_pt, DoubleVector &result)
The solve function uses the block factorisation.
Definition: assembly_handler.cc:2275
LinearSolver * Linear_solver_pt
Pointer to the original linear solver.
Definition: assembly_handler.h:690
void resolve(const DoubleVector &rhs, DoubleVector &result)
The resolve function also uses the block factorisation.
Definition: assembly_handler.cc:2510
DoubleVector * Alpha_pt
Pointer to the storage for the vector alpha.
Definition: assembly_handler.h:696
DoubleVector * E_pt
Pointer to the storage for the vector e.
Definition: assembly_handler.h:699
void solve(DoubleMatrixBase *const &matrix_pt, const DoubleVector &rhs, DoubleVector &result)
Definition: assembly_handler.h:716
AugmentedBlockPitchForkLinearSolver(LinearSolver *const linear_solver_pt)
Constructor, inherits the original linear solver.
Definition: assembly_handler.h:703
void solve(DoubleMatrixBase *const &matrix_pt, const Vector< double > &rhs, Vector< double > &result)
Definition: assembly_handler.h:728
LinearSolver * linear_solver_pt() const
Access function to the original linear solver.
Definition: assembly_handler.h:743
~AugmentedBlockPitchForkLinearSolver()
Destructor: clean up the allocated memory.
Definition: assembly_handler.cc:2259
Problem * Problem_pt
Pointer to the problem, used in the resolve.
Definition: assembly_handler.h:693
Definition: assembly_handler.h:955
LinearSolver * Linear_solver_pt
Pointer to the original linear solver.
Definition: assembly_handler.h:957
void resolve(const DoubleVector &rhs, DoubleVector &result)
The resolve function also uses the block factorisation.
Definition: assembly_handler.cc:4417
DoubleVector * A_pt
Pointer to the storage for the vector a.
Definition: assembly_handler.h:963
void solve(DoubleMatrixBase *const &matrix_pt, const Vector< double > &rhs, Vector< double > &result)
Definition: assembly_handler.h:1008
void solve(Problem *const &problem_pt, DoubleVector &result)
The solve function uses the block factorisation.
Definition: assembly_handler.cc:3621
Problem * Problem_pt
Pointer to the problem, used in the resolve.
Definition: assembly_handler.h:960
~BlockHopfLinearSolver()
Destructor: clean up the allocated memory.
Definition: assembly_handler.cc:3601
void solve_for_two_rhs(Problem *const &problem_pt, DoubleVector &result, const DoubleVector &rhs2, DoubleVector &result2)
Solve for two right hand sides.
Definition: assembly_handler.cc:3966
DoubleVector * E_pt
Pointer to the storage for the vector e (0 to n-1)
Definition: assembly_handler.h:966
BlockHopfLinearSolver(LinearSolver *const linear_solver_pt)
Constructor, inherits the original linear solver.
Definition: assembly_handler.h:973
void solve(DoubleMatrixBase *const &matrix_pt, const DoubleVector &rhs, DoubleVector &result)
Definition: assembly_handler.h:996
DoubleVector * G_pt
Pointer to the storage for the vector g (0 to n-1)
Definition: assembly_handler.h:969
LinearSolver * linear_solver_pt() const
Access function to the original linear solver.
Definition: assembly_handler.h:1023
Definition: assembly_handler.h:609
DoubleVector * D_pt
Pointer to the storage for the vector d.
Definition: assembly_handler.h:623
LinearSolver * linear_solver_pt() const
Access function to the original linear solver.
Definition: assembly_handler.h:676
DoubleVector * dJy_dparam_pt
Definition: assembly_handler.h:627
~BlockPitchForkLinearSolver()
Destructor: clean up the allocated memory.
Definition: assembly_handler.cc:1681
void solve(DoubleMatrixBase *const &matrix_pt, const Vector< double > &rhs, Vector< double > &result)
Definition: assembly_handler.h:661
DoubleVector * B_pt
Pointer to the storage for the vector b.
Definition: assembly_handler.h:617
Problem * Problem_pt
Pointer to the problem, used in the resolve.
Definition: assembly_handler.h:614
BlockPitchForkLinearSolver(LinearSolver *const linear_solver_pt)
Constructor, inherits the original linear solver.
Definition: assembly_handler.h:631
void resolve(const DoubleVector &rhs, DoubleVector &result)
The resolve function also uses the block factorisation.
Definition: assembly_handler.cc:2007
void solve(DoubleMatrixBase *const &matrix_pt, const DoubleVector &rhs, DoubleVector &result)
Definition: assembly_handler.h:649
DoubleVector * C_pt
Pointer to the storage for the vector c.
Definition: assembly_handler.h:620
void solve(Problem *const &problem_pt, DoubleVector &result)
The solve function uses the block factorisation.
Definition: assembly_handler.cc:1705
LinearSolver * Linear_solver_pt
Pointer to the original linear solver.
Definition: assembly_handler.h:611
Definition: matrices.h:261
Definition: double_vector_with_halo.h:150
Definition: double_vector.h:58
Definition: assembly_handler.h:223
void get_residuals(GeneralisedElement *const &elem_pt, Vector< double > &residuals)
Cannot call get_residuals for an eigenproblem, so throw an error.
Definition: assembly_handler.cc:324
double Sigma_real
Storage for the real shift.
Definition: assembly_handler.h:225
void get_all_vectors_and_matrices(GeneralisedElement *const &elem_pt, Vector< Vector< double >> &vec, Vector< DenseMatrix< double >> &matrix)
Definition: assembly_handler.cc:350
~EigenProblemHandler()
Empty virtual destructor.
Definition: assembly_handler.h:257
void get_jacobian(GeneralisedElement *const &elem_pt, Vector< double > &residuals, DenseMatrix< double > &jacobian)
Cannot call get_jacobian for an eigenproblem, so throw an error.
Definition: assembly_handler.cc:336
EigenProblemHandler(const double &sigma_real)
Constructor, sets the value of the real shift.
Definition: assembly_handler.h:229
unsigned long eqn_number(GeneralisedElement *const &elem_pt, const unsigned &ieqn_local)
Definition: assembly_handler.cc:315
unsigned ndof(GeneralisedElement *const &elem_pt)
Return the number of degrees of freedom in the element elem_pt.
Definition: assembly_handler.cc:306
Definition: assembly_handler.h:181
~ExplicitTimeStepHandler()
Empty virtual destructor.
Definition: assembly_handler.h:212
unsigned long eqn_number(GeneralisedElement *const &elem_pt, const unsigned &ieqn_local)
Definition: assembly_handler.cc:248
unsigned ndof(GeneralisedElement *const &elem_pt)
Return the number of degrees of freedom in the element elem_pt.
Definition: assembly_handler.cc:239
ExplicitTimeStepHandler()
Empty Constructor.
Definition: assembly_handler.h:184
void get_all_vectors_and_matrices(GeneralisedElement *const &elem_pt, Vector< Vector< double >> &vec, Vector< DenseMatrix< double >> &matrix)
Definition: assembly_handler.cc:278
void get_jacobian(GeneralisedElement *const &elem_pt, Vector< double > &residuals, DenseMatrix< double > &jacobian)
Replace get jacobian with the call to get the mass matrix.
Definition: assembly_handler.cc:266
void get_residuals(GeneralisedElement *const &elem_pt, Vector< double > &residuals)
Call the element's residuals.
Definition: assembly_handler.cc:257
Definition: assembly_handler.h:473
double * bifurcation_parameter_pt() const
Definition: assembly_handler.h:584
Problem * Problem_pt
Pointer to the problem.
Definition: assembly_handler.h:493
Vector< int > Count
Definition: assembly_handler.h:509
unsigned long eqn_number(GeneralisedElement *const &elem_pt, const unsigned &ieqn_local)
Get the global equation number of the local unknown.
Definition: assembly_handler.cc:1138
void solve_full_system()
Solve non-block system.
Definition: assembly_handler.cc:1649
void get_djacobian_dparameter(GeneralisedElement *const &elem_pt, double *const &parameter_pt, Vector< double > &dres_dparam, DenseMatrix< double > &djac_dparam)
Definition: assembly_handler.cc:1512
unsigned Solve_which_system
Definition: assembly_handler.h:490
void solve_augmented_block_system()
Set to solve the augmented block system.
Definition: assembly_handler.cc:1600
Vector< double > Phi
Definition: assembly_handler.h:501
unsigned Ndof
Definition: assembly_handler.h:497
void get_hessian_vector_products(GeneralisedElement *const &elem_pt, Vector< double > const &Y, DenseMatrix< double > const &C, DenseMatrix< double > &product)
Definition: assembly_handler.cc:1533
~FoldHandler()
Destructor return the problem to its original (non-augmented) state.
Definition: assembly_handler.cc:1573
void solve_block_system()
Set to solve the block system.
Definition: assembly_handler.cc:1629
void get_residuals(GeneralisedElement *const &elem_pt, Vector< double > &residuals)
Get the residuals.
Definition: assembly_handler.cc:1171
Vector< double > Y
Storage for the null vector.
Definition: assembly_handler.h:504
void get_eigenfunction(Vector< DoubleVector > &eigenfunction)
Definition: assembly_handler.cc:1555
void get_jacobian(GeneralisedElement *const &elem_pt, Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: assembly_handler.cc:1244
void get_dresiduals_dparameter(GeneralisedElement *const &elem_pt, double *const &parameter_pt, Vector< double > &dres_dparam)
Definition: assembly_handler.cc:1442
int bifurcation_type() const
Indicate that we are tracking a fold bifurcation by returning 1.
Definition: assembly_handler.h:577
FoldHandler(Problem *const &problem_pt, double *const &parameter_pt)
Definition: assembly_handler.cc:864
double * Parameter_pt
Storage for the pointer to the parameter.
Definition: assembly_handler.h:512
@ Block_J
Definition: assembly_handler.h:481
@ Full_augmented
Definition: assembly_handler.h:480
@ Block_augmented_J
Definition: assembly_handler.h:482
unsigned ndof(GeneralisedElement *const &elem_pt)
Get the number of elemental degrees of freedom.
Definition: assembly_handler.cc:1105
Definition: elements.h:73
Definition: assembly_handler.h:1050
Vector< double > Phi
The real part of the null vector.
Definition: assembly_handler.h:1074
Vector< int > Count
Definition: assembly_handler.h:1086
double Omega
The critical frequency of the bifurcation.
Definition: assembly_handler.h:1071
void get_dresiduals_dparameter(GeneralisedElement *const &elem_pt, double *const &parameter_pt, Vector< double > &dres_dparam)
Definition: assembly_handler.cc:4937
~HopfHandler()
Destructor return the problem to its original (non-augmented) state.
Definition: assembly_handler.cc:4640
double * bifurcation_parameter_pt() const
Definition: assembly_handler.h:1150
void solve_full_system()
Solve non-block system.
Definition: assembly_handler.cc:5097
void get_djacobian_dparameter(GeneralisedElement *const &elem_pt, double *const &parameter_pt, Vector< double > &dres_dparam, DenseMatrix< double > &djac_dparam)
Definition: assembly_handler.cc:4991
void get_residuals(GeneralisedElement *const &elem_pt, Vector< double > &residuals)
Get the residuals.
Definition: assembly_handler.cc:4725
void get_hessian_vector_products(GeneralisedElement *const &elem_pt, Vector< double > const &Y, DenseMatrix< double > const &C, DenseMatrix< double > &product)
Definition: assembly_handler.cc:5012
const double & omega() const
Return the frequency of the bifurcation.
Definition: assembly_handler.h:1160
int bifurcation_type() const
Definition: assembly_handler.h:1143
unsigned ndof(GeneralisedElement *const &elem_pt)
Get the number of elemental degrees of freedom.
Definition: assembly_handler.cc:4665
Vector< double > C
Definition: assembly_handler.h:1081
void get_eigenfunction(Vector< DoubleVector > &eigenfunction)
Definition: assembly_handler.cc:5034
Vector< double > Psi
The imaginary part of the null vector.
Definition: assembly_handler.h:1077
unsigned long eqn_number(GeneralisedElement *const &elem_pt, const unsigned &ieqn_local)
Get the global equation number of the local unknown.
Definition: assembly_handler.cc:4693
unsigned Solve_which_system
Definition: assembly_handler.h:1058
Problem * Problem_pt
Pointer to the problem.
Definition: assembly_handler.h:1061
void get_jacobian(GeneralisedElement *const &elem_pt, Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: assembly_handler.cc:4782
HopfHandler(Problem *const &problem_pt, double *const &parameter_pt)
Constructor.
Definition: assembly_handler.cc:4435
unsigned Ndof
Definition: assembly_handler.h:1068
void solve_complex_system()
Set to solve the complex system.
Definition: assembly_handler.cc:5071
void solve_standard_system()
Set to solve the standard system.
Definition: assembly_handler.cc:5054
double * Parameter_pt
Pointer to the parameter.
Definition: assembly_handler.h:1064
Definition: linear_algebra_distribution.h:64
Definition: linear_solver.h:68
Definition: matrices.h:74
Definition: oomph_definitions.h:222
Definition: assembly_handler.h:269
unsigned long eqn_number(GeneralisedElement *const &elem_pt, const unsigned &ieqn_local)
Definition: assembly_handler.h:289
unsigned ndof(GeneralisedElement *const &elem_pt)
Definition: assembly_handler.h:282
void get_jacobian(GeneralisedElement *const &elem_pt, Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: assembly_handler.h:307
AssemblyHandler * Assembly_handler_pt
The original assembly handler.
Definition: assembly_handler.h:271
ParallelResidualsHandler(AssemblyHandler *const &assembly_handler_pt)
Constructor, set the original assembly handler.
Definition: assembly_handler.h:275
void get_residuals(GeneralisedElement *const &elem_pt, Vector< double > &residuals)
Definition: assembly_handler.h:297
~ParallelResidualsHandler()
Empty virtual destructor.
Definition: assembly_handler.h:327
void get_all_vectors_and_matrices(GeneralisedElement *const &elem_pt, Vector< Vector< double >> &vec, Vector< DenseMatrix< double >> &matrix)
Definition: assembly_handler.h:319
Definition: assembly_handler.h:339
void get_jacobian(GeneralisedElement *const &elem_pt, Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: assembly_handler.h:382
unsigned ndof(GeneralisedElement *const &elem_pt)
Definition: assembly_handler.h:356
unsigned long eqn_number(GeneralisedElement *const &elem_pt, const unsigned &ieqn_local)
Definition: assembly_handler.h:363
double * Parameter_pt
The value of the parameter.
Definition: assembly_handler.h:341
void get_residuals(GeneralisedElement *const &elem_pt, Vector< double > &residuals)
Definition: assembly_handler.h:371
AssemblyHandler * Assembly_handler_pt
The original assembly handler.
Definition: assembly_handler.h:344
ParameterDerivativeHandler(AssemblyHandler *const &assembly_handler_pt, double *const &parameter_pt)
Store the original assembly handler and parameter.
Definition: assembly_handler.h:348
Definition: assembly_handler.h:773
LinearAlgebraDistribution * Dof_distribution_pt
Store the original dof distribution.
Definition: assembly_handler.h:804
Problem * Problem_pt
Pointer to the problem.
Definition: assembly_handler.h:794
void solve_full_system()
Solve non-block system.
Definition: assembly_handler.cc:3535
DoubleVectorWithHaloEntries Y
Storage for the null vector.
Definition: assembly_handler.h:814
AssemblyHandler * Assembly_handler_pt
Pointer to the underlying (original) assembly handler.
Definition: assembly_handler.h:797
void get_residuals(GeneralisedElement *const &elem_pt, Vector< double > &residuals)
Get the residuals.
Definition: assembly_handler.cc:3034
@ Full_augmented
Definition: assembly_handler.h:781
@ Block_augmented_J
Definition: assembly_handler.h:783
@ Block_J
Definition: assembly_handler.h:782
double Sigma
Definition: assembly_handler.h:811
unsigned Solve_which_system
Definition: assembly_handler.h:791
void get_dresiduals_dparameter(GeneralisedElement *const &elem_pt, double *const &parameter_pt, Vector< double > &dres_dparam)
Get the derivatives of the residuals with respect to a parameter.
Definition: assembly_handler.cc:3316
~PitchForkHandler()
Destructor return the problem to its original (non-augmented) state.
Definition: assembly_handler.cc:2897
double * bifurcation_parameter_pt() const
Definition: assembly_handler.h:924
void get_hessian_vector_products(GeneralisedElement *const &elem_pt, Vector< double > const &Y, DenseMatrix< double > const &C, DenseMatrix< double > &product)
Definition: assembly_handler.cc:3416
DoubleVectorWithHaloEntries C
Definition: assembly_handler.h:821
unsigned Ndof
Definition: assembly_handler.h:801
PitchForkHandler(Problem *const &problem_pt, AssemblyHandler *const &assembly_handler_pt, double *const &parameter_pt, const DoubleVector &symmetry_vector)
Constructor, initialise the systems.
Definition: assembly_handler.cc:2677
void get_eigenfunction(Vector< DoubleVector > &eigenfunction)
Definition: assembly_handler.cc:3430
DoubleVectorWithHaloEntries Psi
A constant vector that is specifies the symmetry being broken.
Definition: assembly_handler.h:817
double * Parameter_pt
Storage for the pointer to the parameter.
Definition: assembly_handler.h:835
void get_djacobian_dparameter(GeneralisedElement *const &elem_pt, double *const &parameter_pt, Vector< double > &dres_dparam, DenseMatrix< double > &djac_dparam)
Definition: assembly_handler.cc:3394
void get_jacobian(GeneralisedElement *const &elem_pt, Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: assembly_handler.cc:3137
int bifurcation_type() const
Definition: assembly_handler.h:917
unsigned long eqn_number(GeneralisedElement *const &elem_pt, const unsigned &ieqn_local)
Get the global equation number of the local unknown.
Definition: assembly_handler.cc:2974
unsigned global_eqn_number(const unsigned &i)
Definition: assembly_handler.h:848
Vector< unsigned > Global_eqn_number
Definition: assembly_handler.h:832
unsigned Nelement
Definition: assembly_handler.h:838
void solve_augmented_block_system()
Set to solve the augmented block system.
Definition: assembly_handler.cc:3476
void solve_block_system()
Set to solve the block system.
Definition: assembly_handler.cc:3512
DoubleVectorWithHaloEntries Count
Definition: assembly_handler.h:828
unsigned ndof(GeneralisedElement *const &elem_pt)
Get the number of elemental degrees of freedom.
Definition: assembly_handler.cc:2944
LinearAlgebraDistribution * Augmented_dof_distribution_pt
The augmented distribution.
Definition: assembly_handler.h:807
Definition: problem.h:151
Eigen::Map< Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor >, 0, Eigen::OuterStride<> > matrix(T *data, int rows, int cols, int stride)
Definition: common.h:85
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
t
Definition: plotPSD.py:36
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86
void product(const MatrixType &m)
Definition: product.h:42
const char Y
Definition: test/EulerAngles.cpp:32