problem.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 generic problem class to keep MH happy
27 
28 // Include guards to prevent multiple inclusion of this header
29 #ifndef OOMPH_PROBLEM_CLASS_HEADER
30 #define OOMPH_PROBLEM_CLASS_HEADER
31 
32 
33 // Config header generated by autoconfig
34 #ifdef HAVE_CONFIG_H
35 #include <oomph-lib-config.h>
36 #endif
37 
38 #ifdef OOMPH_HAS_MPI
39 #include "mpi.h"
40 #endif
41 
42 // OOMPH-LIB headers
43 #include "Vector.h"
44 #include "matrices.h"
46 #include "explicit_timesteppers.h"
48 #include <complex>
49 #include <map>
50 
51 
52 namespace oomph
53 {
54  // Forward definition for Data class
55  class Data;
56 
57  // Forward definition for Time class
58  class Time;
59 
60  // Forward definition for TimeStepper class
61  class TimeStepper;
62 
63  // Forward definition for Mesh class
64  class Mesh;
65 
66  // Forward definition for RefineableElement class
67  class RefineableElement;
68 
69  // Forward definition for PRefineableElement class
70  class PRefineableElement;
71 
72  // Forward definition for FiniteElement class
73  class FiniteElement;
74 
75  // Forward definition for the GeneralisedElement class
76  class GeneralisedElement;
77 
78  // Forward definition for the Linearsolver class
79  class LinearSolver;
80 
81  // Forward definition for the Eigensolver class
82  class EigenSolver;
83 
84  // Forward definition for the assembly handler
85  class AssemblyHandler;
86 
87  // Forward definition for sum of matrices class
88  class SumOfMatrices;
89 
93 
94 
95  //=======================================================================
149  //=======================================================================
151  {
152  // The handler classes need to be friend
153  friend class FoldHandler;
154  friend class PitchForkHandler;
155  friend class HopfHandler;
156  template<unsigned NNODE_1D>
158  friend class BlockFoldLinearSolver;
162  friend class BlockHopfLinearSolver;
163 
164 
165  private:
168 
171 
174 
180 
183 
184  // Pointer to handler
186 
189 
192 
195 
198 
202 
205 
208 
212 
215 
219 
223 
227 
230 
231  protected:
235 
239  std::map<double*, bool> Calculate_dparameter_analytic;
240 
245 
246  public:
249  virtual void debug_hook_fct(const unsigned& i)
250  {
251  oomph_info << "Called empty hook fct with i=" << i << std::endl;
252  }
253 
256  inline void set_analytic_dparameter(double* const& parameter_pt)
257  {
258  Calculate_dparameter_analytic[parameter_pt] = true;
259  }
260 
263  inline void unset_analytic_dparameter(double* const& parameter_pt)
264  {
265  // Find the iterator to the parameter
266  std::map<double*, bool>::iterator it =
267  Calculate_dparameter_analytic.find(parameter_pt);
268  // If the parameter has been found, erase it
269  if (it != Calculate_dparameter_analytic.end())
270  {
272  }
273  }
274 
278  double* const& parameter_pt)
279  {
280  // If the entry is found then the iterator returned from the find
281  // command will NOT be equal to the end and the expression will
282  // return true, otherwise it will return false
283  return (Calculate_dparameter_analytic.find(parameter_pt) !=
285  }
286 
290  {
292  }
293 
297  {
299  }
300 
304  {
306  }
307 
313 
314 
318 
319 
320  private:
325  const double& dt,
326  const double& epsilon,
327  const unsigned& max_adapt,
328  const unsigned& suppress_resolve_after_spatial_adapt,
329  const bool& first,
330  const bool& shift = true);
331 
332 
338  void refine_uniformly_aux(const Vector<unsigned>& nrefine_for_mesh,
339  DocInfo& doc_info,
340  const bool& prune);
341 
347  void p_refine_uniformly_aux(const Vector<unsigned>& nrefine_for_mesh,
348  DocInfo& doc_info,
349  const bool& prune);
350 
354 
361  Vector<int*>& column_or_row_index,
362  Vector<int*>& row_or_column_start,
364  Vector<unsigned>& nnz,
365  Vector<double*>& residual,
366  bool compressed_row_flag);
367 
374  Vector<int*>& column_or_row_index,
375  Vector<int*>& row_or_column_start,
377  Vector<unsigned>& nnz,
378  Vector<double*>& residual,
379  bool compressed_row_flag);
380 
387  Vector<int*>& column_or_row_index,
388  Vector<int*>& row_or_column_start,
390  Vector<unsigned>& nnz,
391  Vector<double*>& residual,
392  bool compressed_row_flag);
393 
400  Vector<int*>& column_or_row_index,
401  Vector<int*>& row_or_column_start,
403  Vector<unsigned>& nnz,
404  Vector<double*>& residual,
405  bool compressed_row_flag);
406 
413  Vector<int*>& column_or_row_index,
414  Vector<int*>& row_or_column_start,
416  Vector<unsigned>& nnz,
417  Vector<double*>& residual,
418  bool compressed_row_flag);
419 
426 
430 
435  double* const& parameter_pt);
436 
442  void bifurcation_adapt_helper(unsigned& n_refined,
443  unsigned& n_unrefined,
444  const unsigned& bifurcation_type,
445  const bool& actually_adapt = true);
446 
449  void bifurcation_adapt_doc_errors(const unsigned& bifurcation_type);
450 
451  // ALH_TEMP_DEVELOPMENT
452  protected:
461 
462  private:
463 #ifdef OOMPH_HAS_MPI
464 
468  void get_my_eqns(AssemblyHandler* const& assembly_handler_pt,
469  const unsigned& el_lo,
470  const unsigned& el_hi,
471  Vector<unsigned>& my_eqns);
472 
475  void parallel_sparse_assemble(
476  const LinearAlgebraDistribution* const& dist_pt,
477  Vector<int*>& column_or_row_index,
478  Vector<int*>& row_or_column_start,
480  Vector<unsigned>& nnz,
481  Vector<double*>& residuals);
482 
488  void copy_haloed_eqn_numbers_helper(const bool& do_halos,
489  const bool& do_external_halos);
490 
495  void remove_duplicate_data(Mesh* const& mesh_pt,
496  bool& actually_removed_some_data);
497 
498 
501  void remove_null_pointers_from_external_halo_node_storage();
502 
506  void recompute_load_balanced_assembly();
507 
510  bool Doc_imbalance_in_parallel_assembly;
511 
514  bool Use_default_partition_in_load_balance;
515 
519  Vector<unsigned> First_el_for_assembly;
520 
524  Vector<unsigned> Last_el_plus_one_for_assembly;
525 
529  bool Must_recompute_load_balance_for_assembly;
530 
538  std::map<GeneralisedElement*, unsigned> Base_mesh_element_number_plus_one;
539 
540 
548  Vector<GeneralisedElement*> Base_mesh_element_pt;
549 
550 #endif
551 
552  protected:
555 
561 
567  unsigned setup_element_count_per_dof();
568 
569 
570 #ifdef OOMPH_HAS_MPI
571 
573  Vector<double> Elemental_assembly_time;
574 
577  DoubleVectorHaloScheme* Halo_scheme_pt;
578 
581  Vector<double*> Halo_dof_pt;
582 
584  void setup_dof_halo_scheme();
585 
586 #endif
587 
588  //--------------------- Newton solver parameters
589 
593 
597 
600 
604 
607 
611 
616 
619 
623 
629 
634 
638 
642 
645  {
651  };
652 
659 
664 
668 
672 
678  Vector<int*>& column_or_row_index,
679  Vector<int*>& row_or_column_start,
681  Vector<unsigned>& nnz,
682  Vector<double*>& residual,
683  bool compressed_row_flag);
684 
686 
687  //---------------------Explicit time-stepping parameters
688 
692 
696 
697  //---------------------Discontinuous control flags
701 
702 
703  //--------------------- Adaptive time-stepping parameters
704 
706  double Minimum_dt;
707 
709  double Maximum_dt;
710 
714 
719 
726 
727 
728  //--------------------- Arc-length continuation paramaters
729 
732 
735 
743 
746 
750 
753 
756 
759 
762 
767 
772 
775 
778 
780  double Ds_current;
781 
785 
787  double Minimum_ds;
788 
791 
794 
797 
800 
804 
805  public:
808  bool distributed() const
809  {
810 #ifdef OOMPH_HAS_MPI
811  return Problem_has_been_distributed;
812 #else
813  return false;
814 #endif
815  }
816 
817 #ifdef OOMPH_HAS_MPI
818 
819 
829  enum Distributed_problem_matrix_distribution{Default_matrix_distribution,
830  Problem_matrix_distribution,
831  Uniform_matrix_distribution};
832 
842  Distributed_problem_matrix_distribution& distributed_problem_matrix_distribution()
843  {
844  return Dist_problem_matrix_distribution;
845  }
846 
849  void enable_doc_imbalance_in_parallel_assembly()
850  {
851  Doc_imbalance_in_parallel_assembly = true;
852  }
853 
856  void disable_doc_imbalance_in_parallel_assembly()
857  {
858  Doc_imbalance_in_parallel_assembly = false;
859  }
860 
864  Vector<double> elemental_assembly_time()
865  {
866  return Elemental_assembly_time;
867  }
868 
872  void clear_elemental_assembly_time()
873  {
874  Must_recompute_load_balance_for_assembly = true;
875  Elemental_assembly_time.clear();
876  }
877 
878  private:
894  void get_data_to_be_sent_during_load_balancing(
895  const Vector<unsigned>& element_domain_on_this_proc,
896  Vector<int>& send_n,
897  Vector<double>& send_data,
898  Vector<int>& send_displacement,
899  Vector<unsigned>& old_domain_for_base_element,
900  Vector<unsigned>& new_domain_for_base_element,
901  unsigned& max_refinement_level_overall);
902 
920  void get_flat_packed_refinement_pattern_for_load_balancing(
921  const Vector<unsigned>& old_domain_for_base_element,
922  const Vector<unsigned>& new_domain_for_base_element,
923  const unsigned& max_refinement_level_overall,
924  std::map<unsigned, Vector<unsigned>>&
925  flat_packed_refinement_info_for_root);
926 
927 
934  void send_data_to_be_sent_during_load_balancing(
935  Vector<int>& send_n,
936  Vector<double>& send_data,
937  Vector<int>& send_displacement);
938 
940  void send_refinement_info_helper(
941  Vector<unsigned>& old_domain_for_base_element,
942  Vector<unsigned>& new_domain_for_base_element,
943  const unsigned& max_refinement_level_overall,
944  std::map<unsigned, Vector<unsigned>>& refinement_info_for_root_local,
945  Vector<Vector<Vector<unsigned>>>& refinement_info_for_root_elements);
946 
956  Distributed_problem_matrix_distribution Dist_problem_matrix_distribution;
957 
960  unsigned Parallel_sparse_assemble_previous_allocation;
961 
962  protected:
964  bool Problem_has_been_distributed;
965 
967  bool Bypass_increase_in_dof_check_during_pruning;
968 
969  public:
971  void enable_problem_distributed()
972  {
973  Problem_has_been_distributed = true;
974  }
975 
977  void disable_problem_distributed()
978  {
979  Problem_has_been_distributed = false;
980  }
981 
984  void set_default_first_and_last_element_for_assembly();
985 
988  void set_first_and_last_element_for_assembly(
989  Vector<unsigned>& first_el_for_assembly,
990  Vector<unsigned>& last_el_for_assembly)
991  {
992  First_el_for_assembly = first_el_for_assembly;
993  Last_el_plus_one_for_assembly = last_el_for_assembly;
994  unsigned n = last_el_for_assembly.size();
995  for (unsigned i = 0; i < n; i++)
996  {
997  Last_el_plus_one_for_assembly[i] += 1;
998  }
999  }
1000 
1001 
1004  void get_first_and_last_element_for_assembly(
1005  Vector<unsigned>& first_el_for_assembly,
1006  Vector<unsigned>& last_el_for_assembly) const
1007  {
1008  first_el_for_assembly = First_el_for_assembly;
1009  last_el_for_assembly = Last_el_plus_one_for_assembly;
1010  unsigned n = last_el_for_assembly.size();
1011  for (unsigned i = 0; i < n; i++)
1012  {
1013  last_el_for_assembly[i] -= 1;
1014  }
1015  }
1016 
1017 #endif
1018 
1022  virtual void actions_before_adapt() {}
1023 
1025  virtual void actions_after_adapt() {}
1026 
1027  protected:
1033 
1038  virtual void actions_after_newton_solve() {}
1039 
1049 
1053  virtual void actions_before_newton_step() {}
1054 
1058  virtual void actions_after_newton_step() {}
1059 
1065 
1071 
1076 
1079 
1082 
1096  {
1098  }
1099 
1110  {
1112  }
1113 
1114 #ifdef OOMPH_HAS_MPI
1116  virtual void actions_before_distribute() {}
1117 
1119  virtual void actions_after_distribute() {}
1120 
1121 #endif
1122 
1134  double* const& parameter_pt)
1135  {
1136  // Default action should cover all possibilities
1140  }
1141 
1152  {
1153  // Default action should cover all possibilities
1157  }
1158 
1161  virtual void actions_after_parameter_increase(double* const& parameter_pt)
1162  {
1163  }
1164 
1168  inline double& dof_derivative(const unsigned& i)
1169  {
1171  {
1172  return Dof_derivative[i];
1173  }
1174  else
1175  {
1176  return (*(Dof_pt[i] + Dof_derivative_offset));
1177  }
1178  }
1179 
1182  inline double& dof_current(const unsigned& i)
1183  {
1185  {
1186  return Dof_current[i];
1187  }
1188  else
1189  {
1190  return (*(Dof_pt[i] + Dof_current_offset));
1191  }
1192  }
1193 
1198  virtual void set_initial_condition()
1199  {
1200  std::ostringstream warn_message;
1201  warn_message
1202  << "Warning: We're using the default (empty) set_initial_condition().\n"
1203  << "If the initial conditions isn't re-assigned after a mesh adaption "
1204  "\n"
1205  << "the initial conditions will represent the interpolation of the \n"
1206  << "initial conditions that were assigned on the original coarse "
1207  "mesh.\n";
1208  OomphLibWarning(warn_message.str(),
1209  "Problem::set_initial_condition()",
1211 
1212  // Indicate that this function has been called. This flag is set so
1213  // that the unsteady_newton_solve routine can be instructed whether
1214  // or not to shift the history values. If set_initial_condition() has
1215  // been overloaded than this (default) function won't be called, and
1216  // so this flag will remain false (its default value). If
1217  // set_initial_condition() has not been overloaded then this function
1218  // will be called and the flag set to true.
1220  }
1221 
1231  {
1232  std::string error_message =
1233  "The global_temporal_error_norm function will be problem-specific:\n";
1234  error_message += "Please write your own in your Problem class";
1235 
1236  throw OomphLibError(
1238  return 0.0;
1239  }
1240 
1243 
1244  public:
1247  {
1248  return Communicator_pt;
1249  }
1250 
1253  {
1254  return Communicator_pt;
1255  }
1256 
1259  Vector<double>& elemental_error);
1260 
1263  Mesh*& mesh_pt, Vector<double>& elemental_error, DocInfo& doc_info);
1264 
1268  Problem();
1269 
1271  Problem(const Problem& dummy) = delete;
1272 
1274  void operator=(const Problem&) = delete;
1275 
1277  virtual ~Problem();
1278 
1281  {
1282  return Mesh_pt;
1283  }
1284 
1286  Mesh* const& mesh_pt() const
1287  {
1288  return Mesh_pt;
1289  }
1290 
1293  Mesh*& mesh_pt(const unsigned& imesh)
1294  {
1295  // If there are no submeshes then the zero-th submesh is the
1296  // mesh itself
1297  if ((Sub_mesh_pt.size() == 0) && (imesh == 0))
1298  {
1299  return Mesh_pt;
1300  }
1301  else
1302  {
1303  return Sub_mesh_pt[imesh];
1304  }
1305  }
1306 
1308  Mesh* const& mesh_pt(const unsigned& imesh) const
1309  {
1310  // If there are no submeshes then the zero-th submesh is the
1311  // mesh itself
1312  if ((Sub_mesh_pt.size() == 0) && (imesh == 0))
1313  {
1314  return Mesh_pt;
1315  }
1316  else
1317  {
1318  return Sub_mesh_pt[imesh];
1319  }
1320  }
1321 
1323  unsigned nsub_mesh() const
1324  {
1325  return Sub_mesh_pt.size();
1326  }
1327 
1330  unsigned add_sub_mesh(Mesh* const& mesh_pt)
1331  {
1332  Sub_mesh_pt.push_back(mesh_pt);
1333  return Sub_mesh_pt.size() - 1;
1334  }
1335 
1336 
1340  {
1341  Sub_mesh_pt.clear();
1342  }
1343 
1347  void build_global_mesh();
1348 
1353  void rebuild_global_mesh();
1354 
1355 #ifdef OOMPH_HAS_MPI
1356 
1365  virtual void build_mesh()
1366  {
1367  std::string error_message = "You are likely to have reached this error "
1368  "from Problem::load_balance()\n";
1369  error_message +=
1370  "The build_mesh() function is problem-specific and must be supplied:\n";
1371  error_message +=
1372  "Please write your own in your Problem class, ensuring that\n";
1373  error_message += "any (sub)meshes are built before calling "
1374  "Problem::build_global_mesh().\n";
1375  throw OomphLibError(
1377  }
1378 
1382  void load_balance()
1383  {
1384  // Dummy DocInfo
1385  DocInfo doc_info;
1386  doc_info.disable_doc();
1387 
1388  // Don't report stats
1389  bool report_stats = false;
1390 
1391  // Dummy imposed partioning vector
1392  Vector<unsigned> input_target_domain_for_local_non_halo_element;
1393 
1394  // Do it!
1395  load_balance(
1396  doc_info, report_stats, input_target_domain_for_local_non_halo_element);
1397  }
1398 
1403  void load_balance(const bool& report_stats)
1404  {
1405  // Dummy DocInfo
1406  DocInfo doc_info;
1407  doc_info.disable_doc();
1408 
1409  // Dummy imposed partioning vector
1410  Vector<unsigned> input_target_domain_for_local_non_halo_element;
1411 
1412  // Do it
1413  load_balance(
1414  doc_info, report_stats, input_target_domain_for_local_non_halo_element);
1415  }
1416 
1417 
1422  void load_balance(DocInfo& doc_info, const bool& report_stats)
1423  {
1424  // Dummy imposed partioning vector
1425  Vector<unsigned> input_target_domain_for_local_non_halo_element;
1426 
1427  // Do it
1428  load_balance(
1429  doc_info, report_stats, input_target_domain_for_local_non_halo_element);
1430  }
1431 
1439  void load_balance(
1440  DocInfo& doc_info,
1441  const bool& report_stats,
1442  const Vector<unsigned>& input_target_domain_for_local_non_halo_element);
1443 
1445  void set_default_partition_in_load_balance()
1446  {
1447  Use_default_partition_in_load_balance = true;
1448  }
1449 
1451  void unset_default_partition_in_load_balance()
1452  {
1453  Use_default_partition_in_load_balance = false;
1454  }
1455 
1459  void refine_distributed_base_mesh(
1460  Vector<Vector<Vector<unsigned>>>& to_be_refined_on_each_root,
1461  const unsigned& max_level_overall);
1462 
1463 #endif
1464 
1467  {
1468  return Linear_solver_pt;
1469  }
1470 
1473  {
1474  return Linear_solver_pt;
1475  }
1476 
1480  {
1482  }
1483 
1487  {
1489  }
1490 
1493  {
1494  return Eigen_solver_pt;
1495  }
1496 
1499  {
1500  return Eigen_solver_pt;
1501  }
1502 
1505  {
1506  return Time_pt;
1507  }
1508 
1510  Time* time_pt() const
1511  {
1512  return Time_pt;
1513  }
1514 
1516  double& time();
1517 
1519  double time() const;
1520 
1521 
1525  {
1526  if (Time_stepper_pt.size() == 0)
1527  {
1528  throw OomphLibError("No timestepper allocated yet\n",
1531  }
1532  return Time_stepper_pt[0];
1533  }
1534 
1538  {
1539  if (Time_stepper_pt.size() == 0)
1540  {
1541  throw OomphLibError("No timestepper allocated yet\n",
1544  }
1545  return Time_stepper_pt[0];
1546  }
1547 
1549  TimeStepper*& time_stepper_pt(const unsigned& i)
1550  {
1551  return Time_stepper_pt[i];
1552  }
1553 
1556  {
1557  return Explicit_time_stepper_pt;
1558  }
1559 
1562  unsigned long set_timestepper_for_all_data(
1563  TimeStepper* const& time_stepper_pt,
1564  const bool& preserve_existing_data = false);
1565 
1567  virtual void shift_time_values();
1568 
1571  {
1572  return Assembly_handler_pt;
1573  }
1574 
1577  {
1578  return Assembly_handler_pt;
1579  }
1580 
1582  double& minimum_dt()
1583  {
1584  return Minimum_dt;
1585  }
1586 
1588  double& maximum_dt()
1589  {
1590  return Maximum_dt;
1591  }
1592 
1595  {
1596  return Max_newton_iterations;
1597  }
1598 
1600  void problem_is_nonlinear(const bool& prob_lin)
1601  {
1602  Problem_is_nonlinear = prob_lin;
1603  }
1604 
1605 
1608  double& max_residuals()
1609  {
1610  return Max_residuals;
1611  }
1612 
1615  {
1617  }
1618 
1622  {
1623  return Newton_solver_tolerance;
1624  }
1625 
1630 
1636 
1637 
1640  void initialise_dt(const double& dt);
1641 
1644  void initialise_dt(const Vector<double>& dt);
1645 
1647  Data*& global_data_pt(const unsigned& i)
1648  {
1649  return Global_data_pt[i];
1650  }
1651 
1655  {
1656  Global_data_pt.push_back(global_data_pt);
1657  }
1658 
1659 
1663  {
1664  Global_data_pt.resize(0);
1665  }
1666 
1669  {
1670  return Dof_distribution_pt;
1671  }
1672 
1674  unsigned long ndof() const
1675  {
1676  return Dof_distribution_pt->nrow();
1677  }
1678 
1680  unsigned ntime_stepper() const
1681  {
1682  return Time_stepper_pt.size();
1683  }
1684 
1686  unsigned nglobal_data() const
1687  {
1688  return Global_data_pt.size();
1689  }
1690 
1692  unsigned self_test();
1693 
1697  {
1699  }
1700 
1704  {
1706  }
1707 
1714  unsigned long assign_eqn_numbers(
1715  const bool& assign_local_eqn_numbers = true);
1716 
1722  void describe_dofs(std::ostream& out = *(oomph_info.stream_pt())) const;
1723 
1728  {
1730  }
1731 
1737  {
1739  }
1740 
1743  void get_dofs(DoubleVector& dofs) const;
1744 
1746  void get_dofs(const unsigned& t, DoubleVector& dofs) const;
1747 
1749  void set_dofs(const DoubleVector& dofs);
1750 
1752  void set_dofs(const unsigned& t, DoubleVector& dofs);
1753 
1756  void set_dofs(const unsigned& t, Vector<double*>& dof_pt);
1757 
1759  void add_to_dofs(const double& lambda, const DoubleVector& increment_dofs);
1760 
1764  inline double* global_dof_pt(const unsigned& i)
1765  {
1766 #ifdef OOMPH_HAS_MPI
1767  // If the problem is distributed I have to do something different
1768  if (Problem_has_been_distributed)
1769  {
1770 #ifdef PARANOID
1771  if (Halo_scheme_pt == 0)
1772  {
1773  std::ostringstream error_stream;
1774  error_stream
1775  << "Direct access to global dofs in a distributed problem is only\n"
1776  << "possible if the function setup_dof_halo_scheme() has been "
1777  "called.\n"
1778  << "You can access local dofs via Problem::dof(i).\n";
1779  throw OomphLibError(error_stream.str(),
1782  }
1783 #endif
1784 
1785  // Work out the local coordinate of the dof
1786  // based on the original distribution stored in the Halo_scheme
1787  const unsigned first_row_local =
1788  Halo_scheme_pt->distribution_pt()->first_row();
1789  const unsigned n_row_local =
1790  Halo_scheme_pt->distribution_pt()->nrow_local();
1791 
1792  // If we are in range then just call the local value
1793  if ((i >= first_row_local) && (i < first_row_local + n_row_local))
1794  {
1795  return this->Dof_pt[i - first_row_local];
1796  }
1797  // Otherwise the entry is not stored in the local processor
1798  // and we must have haloed it
1799  else
1800  {
1801  return Halo_dof_pt[Halo_scheme_pt->local_index(i)];
1802  }
1803  }
1804  // Otherwise just return the dof
1805  else
1806 #endif
1807  {
1808  return this->Dof_pt[i];
1809  }
1810  }
1811 
1813  double& dof(const unsigned& i)
1814  {
1815  return *(Dof_pt[i]);
1816  }
1817 
1819  double dof(const unsigned& i) const
1820  {
1821  return *(Dof_pt[i]);
1822  }
1823 
1825  double*& dof_pt(const unsigned& i)
1826  {
1827  return Dof_pt[i];
1828  }
1829 
1831  double* dof_pt(const unsigned& i) const
1832  {
1833  return Dof_pt[i];
1834  }
1835 
1839 
1846  virtual void get_dvaluesdt(DoubleVector& f);
1847 
1850  virtual void get_residuals(DoubleVector& residuals);
1851 
1857  virtual void get_jacobian(DoubleVector& residuals,
1858  DenseDoubleMatrix& jacobian);
1859 
1865  virtual void get_jacobian(DoubleVector& residuals,
1866  CRDoubleMatrix& jacobian);
1867 
1874  virtual void get_jacobian(DoubleVector& residuals,
1875  CCDoubleMatrix& jacobian);
1876 
1879  virtual void get_jacobian(DoubleVector& residuals, SumOfMatrices& jacobian)
1880  {
1881  std::ostringstream error_stream;
1882  error_stream
1883  << "You must overload this function in your problem class to specify\n"
1884  << "which matrices should be summed to give the final Jacobian.";
1885  throw OomphLibError(
1886  error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
1887  }
1888 
1891  void get_fd_jacobian(DoubleVector& residuals,
1892  DenseMatrix<double>& jacobian);
1893 
1896  void get_derivative_wrt_global_parameter(double* const& parameter_pt,
1897  DoubleVector& result);
1898 
1911 
1912 
1915  // void get_derivative_wrt_global_parameter(double* const &parameter_pt,
1916  // GeneralisedElement* const
1917  // &elem_pt, Vector<double>
1918  // &result);
1919 
1927  void solve_eigenproblem(const unsigned& n_eval,
1928  Vector<std::complex<double>>& eigenvalue,
1929  Vector<DoubleVector>& eigenvector,
1930  const bool& steady = true);
1931 
1937  void solve_eigenproblem(const unsigned& n_eval,
1938  Vector<std::complex<double>>& eigenvalue,
1939  const bool& steady = true)
1940  {
1941  // Create temporary storage for the eigenvectors (potentially wasteful)
1942  Vector<DoubleVector> eigenvector;
1943  solve_eigenproblem(n_eval, eigenvalue, eigenvector, steady);
1944  }
1945 
1948  virtual void get_eigenproblem_matrices(CRDoubleMatrix& mass_matrix,
1949  CRDoubleMatrix& main_matrix,
1950  const double& shift = 0.0);
1951 
1955  void assign_eigenvector_to_dofs(DoubleVector& eigenvector);
1956 
1960  void add_eigenvector_to_dofs(const double& epsilon,
1961  const DoubleVector& eigenvector);
1962 
1963 
1965  void store_current_dof_values();
1966 
1968  void restore_dof_values();
1969 
1976  {
1979  }
1980 
1983  {
1984  Jacobian_reuse_is_enabled = false;
1986  }
1987 
1990  {
1992  }
1993 
1995  {
1997  }
1998 
2000  void newton_solve();
2001 
2004  {
2006  }
2007 
2010  {
2012  }
2013 
2014  private:
2017  const Vector<double>& x_old,
2018  const double& half_residual_squared_old,
2019  DoubleVector& gradient,
2020  DoubleVector& newton_dir,
2021  double& half_residual_squared,
2022  const double& stpmax);
2023 
2024  public:
2028  void newton_solve(unsigned const& max_adapt);
2029 
2038  void steady_newton_solve(unsigned const& max_adapt = 0);
2039 
2049  void copy(Problem* orig_problem_pt);
2050 
2055  virtual Problem* make_copy();
2056 
2061  virtual void read(std::ifstream& restart_file, bool& unsteady_restart);
2062 
2066  virtual void read(std::ifstream& restart_file)
2067  {
2068  bool unsteady_restart;
2069  read(restart_file, unsteady_restart);
2070  }
2071 
2074  virtual void dump(std::ofstream& dump_file) const;
2075 
2078  void dump(const std::string& dump_file_name) const
2079  {
2080  std::ofstream dump_stream(dump_file_name.c_str());
2081 #ifdef PARANOID
2082  if (!dump_stream.is_open())
2083  {
2084  std::string err = "Couldn't open file " + dump_file_name;
2085  throw OomphLibError(
2087  }
2088 #endif
2089  dump(dump_stream);
2090  }
2091 
2092 #ifdef OOMPH_HAS_MPI
2093 
2096  void get_all_halo_data(std::map<unsigned, double*>& map_of_halo_data);
2097 
2101  long synchronise_eqn_numbers(const bool& assign_local_eqn_numbers = true);
2102 
2107  void synchronise_dofs(const bool& do_halos, const bool& do_external_halos);
2108 
2110  void synchronise_all_dofs();
2111 
2113  void check_halo_schemes(DocInfo& doc_info);
2114 
2116  void check_halo_schemes()
2117  {
2118  DocInfo tmp_doc_info;
2119  tmp_doc_info.disable_doc();
2120  check_halo_schemes(tmp_doc_info);
2121  }
2122 
2125  Vector<unsigned> distribute(const Vector<unsigned>& element_partition,
2126  DocInfo& doc_info,
2127  const bool& report_stats = false);
2128 
2131  Vector<unsigned> distribute(DocInfo& doc_info,
2132  const bool& report_stats = false);
2133 
2136  Vector<unsigned> distribute(const Vector<unsigned>& element_partition,
2137  const bool& report_stats = false);
2138 
2141  Vector<unsigned> distribute(const bool& report_stats = false);
2142 
2147  virtual void partition_global_mesh(Mesh*& global_mesh_pt,
2148  DocInfo& doc_info,
2149  Vector<unsigned>& element_domain,
2150  const bool& report_stats = false);
2151 
2158  void prune_halo_elements_and_nodes(DocInfo& doc_info,
2159  const bool& report_stats);
2160 
2167  void prune_halo_elements_and_nodes(const bool& report_stats = false)
2168  {
2169  DocInfo doc_info;
2170  doc_info.disable_doc();
2171  prune_halo_elements_and_nodes(doc_info, report_stats);
2172  }
2173 
2175  double Max_permitted_error_for_halo_check;
2176 
2178  bool problem_has_been_distributed()
2179  {
2180  return Problem_has_been_distributed;
2181  }
2182 
2183 #endif
2184 
2188 
2192 
2193 
2194  protected:
2198 
2203 
2204 
2210 
2213  unsigned newton_solve_continuation(double* const& parameter_pt);
2214 
2221  unsigned newton_solve_continuation(double* const& parameter_pt,
2222  DoubleVector& z);
2223 
2234  void calculate_continuation_derivatives(double* const& parameter_pt);
2235 
2243 
2248  void calculate_continuation_derivatives_fd(double* const& parameter_pt);
2249 
2253  bool does_pointer_correspond_to_problem_data(double* const& parameter_pt);
2254 
2255  public:
2264 
2268  double* bifurcation_parameter_pt() const;
2269 
2270 
2275 
2276 
2286  void activate_fold_tracking(double* const& parameter_pt,
2287  const bool& block_solve = true);
2288 
2291  void activate_bifurcation_tracking(double* const& parameter_pt,
2292  const DoubleVector& eigenvector,
2293  const bool& block_solve = true);
2294 
2298  void activate_bifurcation_tracking(double* const& parameter_pt,
2299  const DoubleVector& eigenvector,
2300  const DoubleVector& normalisation,
2301  const bool& block_solve = true);
2302 
2303 
2320  void activate_pitchfork_tracking(double* const& parameter_pt,
2321  const DoubleVector& symmetry_vector,
2322  const bool& block_solve = true);
2323 
2332  void activate_hopf_tracking(double* const& parameter_pt,
2333  const bool& block_solve = true);
2334 
2345  void activate_hopf_tracking(double* const& parameter_pt,
2346  const double& omega,
2347  const DoubleVector& null_real,
2348  const DoubleVector& null_imag,
2349  const bool& block_solve = true);
2350 
2354  {
2356  }
2357 
2360 
2361  private:
2368  double arc_length_step_solve_helper(double* const& parameter_pt,
2369  const double& ds,
2370  const unsigned& max_adapt);
2371 
2372 
2373  // ALH_DEVELOP
2374  protected:
2378 
2379  public:
2386  double arc_length_step_solve(double* const& parameter_pt,
2387  const double& ds,
2388  const unsigned& max_adapt = 0);
2389 
2399  double arc_length_step_solve(Data* const& data_pt,
2400  const unsigned& data_index,
2401  const double& ds,
2402  const unsigned& max_adapt = 0);
2403 
2404 
2410  {
2411  Theta_squared = 1.0;
2412  Sign_of_jacobian = 0;
2413  Continuation_direction = 1.0;
2414  Parameter_derivative = 1.0;
2416  Arc_length_step_taken = false;
2417  Dof_derivative.resize(0);
2418  }
2419 
2425  {
2426  return Sign_of_jacobian;
2427  }
2428 
2431  void explicit_timestep(const double& dt, const bool& shift_values = true);
2432 
2435  void unsteady_newton_solve(const double& dt);
2436 
2443  void unsteady_newton_solve(const double& dt, const bool& shift_values);
2444 
2453  void unsteady_newton_solve(const double& dt,
2454  const unsigned& max_adapt,
2455  const bool& first,
2456  const bool& shift = true);
2457 
2458 
2471  double doubly_adaptive_unsteady_newton_solve(const double& dt,
2472  const double& epsilon,
2473  const unsigned& max_adapt,
2474  const bool& first,
2475  const bool& shift = true)
2476  {
2477  // Call helper function with default setting (do re-solve after
2478  // spatial adaptation)
2479  unsigned suppress_resolve_after_spatial_adapt_flag = 0;
2481  dt,
2482  epsilon,
2483  max_adapt,
2484  suppress_resolve_after_spatial_adapt_flag,
2485  first,
2486  shift);
2487  }
2488 
2489 
2505  const double& dt,
2506  const double& epsilon,
2507  const unsigned& max_adapt,
2508  const unsigned& suppress_resolve_after_spatial_adapt_flag,
2509  const bool& first,
2510  const bool& shift = true)
2511  {
2512  // Call helper function
2514  dt,
2515  epsilon,
2516  max_adapt,
2517  suppress_resolve_after_spatial_adapt_flag,
2518  first,
2519  shift);
2520  }
2521 
2522 
2531  double adaptive_unsteady_newton_solve(const double& dt_desired,
2532  const double& epsilon);
2533 
2543  double adaptive_unsteady_newton_solve(const double& dt_desired,
2544  const double& epsilon,
2545  const bool& shift_values);
2546 
2550 
2553  void assign_initial_values_impulsive(const double& dt);
2554 
2556  void calculate_predictions();
2557 
2561  void enable_mass_matrix_reuse();
2562 
2566 
2569  {
2571  }
2572 
2575  void refine_uniformly(const Vector<unsigned>& nrefine_for_mesh)
2576  {
2577  DocInfo doc_info;
2578  doc_info.disable_doc();
2579  bool prune = false;
2580  refine_uniformly_aux(nrefine_for_mesh, doc_info, prune);
2581  }
2582 
2585  void refine_uniformly(const Vector<unsigned>& nrefine_for_mesh,
2586  DocInfo& doc_info)
2587  {
2588  bool prune = false;
2589  refine_uniformly_aux(nrefine_for_mesh, doc_info, prune);
2590  }
2591 
2595  void refine_uniformly_and_prune(const Vector<unsigned>& nrefine_for_mesh)
2596  {
2597  DocInfo doc_info;
2598  doc_info.disable_doc();
2599  bool prune = true;
2600  refine_uniformly_aux(nrefine_for_mesh, doc_info, prune);
2601  }
2602 
2605  void refine_uniformly_and_prune(const Vector<unsigned>& nrefine_for_mesh,
2606  DocInfo& doc_info)
2607  {
2608  bool prune = true;
2609  refine_uniformly_aux(nrefine_for_mesh, doc_info, prune);
2610  }
2611 
2614  void refine_uniformly(DocInfo& doc_info)
2615  {
2616  // Number of (sub)meshes
2617  unsigned nmesh = std::max(unsigned(1), nsub_mesh());
2618 
2619  // Refine each mesh once
2620  Vector<unsigned> nrefine_for_mesh(nmesh, 1);
2621  refine_uniformly(nrefine_for_mesh);
2622  }
2623 
2624 
2628  {
2629  // Number of (sub)meshes
2630  unsigned nmesh = std::max(unsigned(1), nsub_mesh());
2631 
2632  // Refine each mesh once
2633  Vector<unsigned> nrefine_for_mesh(nmesh, 1);
2634  refine_uniformly_and_prune(nrefine_for_mesh);
2635  }
2636 
2637 
2641  {
2642  DocInfo doc_info;
2643  doc_info.disable_doc();
2644  refine_uniformly(doc_info);
2645  }
2646 
2648  void refine_uniformly(const unsigned& i_mesh, DocInfo& doc_info);
2649 
2651  void refine_uniformly(const unsigned& i_mesh)
2652  {
2653  DocInfo doc_info;
2654  doc_info.disable_doc();
2655  refine_uniformly(i_mesh, doc_info);
2656  }
2657 
2660  void p_refine_uniformly(const Vector<unsigned>& nrefine_for_mesh)
2661  {
2662  DocInfo doc_info;
2663  doc_info.disable_doc();
2664  bool prune = false;
2665  p_refine_uniformly_aux(nrefine_for_mesh, doc_info, prune);
2666  }
2667 
2670  void p_refine_uniformly(const Vector<unsigned>& nrefine_for_mesh,
2671  DocInfo& doc_info)
2672  {
2673  bool prune = false;
2674  p_refine_uniformly_aux(nrefine_for_mesh, doc_info, prune);
2675  }
2676 
2680  void p_refine_uniformly_and_prune(const Vector<unsigned>& nrefine_for_mesh)
2681  {
2682  // Not tested:
2683  throw OomphLibWarning("This functionality has not yet been tested.",
2684  "Problem::p_refine_uniformly_and_prune()",
2686  DocInfo doc_info;
2687  doc_info.disable_doc();
2688  bool prune = true;
2689  p_refine_uniformly_aux(nrefine_for_mesh, doc_info, prune);
2690  }
2691 
2694  void p_refine_uniformly_and_prune(const Vector<unsigned>& nrefine_for_mesh,
2695  DocInfo& doc_info)
2696  {
2697  // Not tested:
2698  throw OomphLibWarning("This functionality has not yet been tested.",
2699  "Problem::p_refine_uniformly_and_prune()",
2701  bool prune = true;
2702  p_refine_uniformly_aux(nrefine_for_mesh, doc_info, prune);
2703  }
2704 
2707  void p_refine_uniformly(DocInfo& doc_info)
2708  {
2709  // Number of (sub)meshes
2710  unsigned nmesh = std::max(unsigned(1), nsub_mesh());
2711 
2712  // Refine each mesh once
2713  Vector<unsigned> nrefine_for_mesh(nmesh, 1);
2714  p_refine_uniformly(nrefine_for_mesh);
2715  }
2716 
2717 
2721  {
2722  // Not tested:
2723  throw OomphLibWarning("This functionality has not yet been tested.",
2724  "Problem::p_refine_uniformly_and_prune()",
2726  // Number of (sub)meshes
2727  unsigned nmesh = std::max(unsigned(1), nsub_mesh());
2728 
2729  // Refine each mesh once
2730  Vector<unsigned> nrefine_for_mesh(nmesh, 1);
2731  p_refine_uniformly_and_prune(nrefine_for_mesh);
2732  }
2733 
2734 
2738  {
2739  DocInfo doc_info;
2740  doc_info.disable_doc();
2741  p_refine_uniformly(doc_info);
2742  }
2743 
2745  void p_refine_uniformly(const unsigned& i_mesh, DocInfo& doc_info);
2746 
2748  void p_refine_uniformly(const unsigned& i_mesh)
2749  {
2750  DocInfo doc_info;
2751  doc_info.disable_doc();
2752  p_refine_uniformly(i_mesh, doc_info);
2753  }
2754 
2759  const Vector<unsigned>& elements_to_be_refined);
2760 
2761 
2765  const Vector<RefineableElement*>& elements_to_be_refined_pt);
2766 
2770  const unsigned& i_mesh, const Vector<unsigned>& elements_to_be_refined);
2771 
2775  const unsigned& i_mesh,
2776  const Vector<RefineableElement*>& elements_to_be_refined_pt);
2777 
2782  const Vector<Vector<unsigned>>& elements_to_be_refined);
2783 
2788  const Vector<Vector<RefineableElement*>>& elements_to_be_refined_pt);
2789 
2794  const Vector<unsigned>& elements_to_be_refined);
2795 
2796 
2800  const Vector<PRefineableElement*>& elements_to_be_refined_pt);
2801 
2805  const unsigned& i_mesh, const Vector<unsigned>& elements_to_be_refined);
2806 
2810  const unsigned& i_mesh,
2811  const Vector<PRefineableElement*>& elements_to_be_refined_pt);
2812 
2817  const Vector<Vector<unsigned>>& elements_to_be_refined);
2818 
2823  const Vector<Vector<PRefineableElement*>>& elements_to_be_refined_pt);
2824 
2829  unsigned unrefine_uniformly();
2830 
2834  unsigned unrefine_uniformly(const unsigned& i_mesh);
2835 
2838  void p_unrefine_uniformly(DocInfo& doc_info);
2839 
2841  void p_unrefine_uniformly(const unsigned& i_mesh, DocInfo& doc_info);
2842 
2850  void adapt(unsigned& n_refined, unsigned& n_unrefined);
2851 
2859  void adapt()
2860  {
2861  unsigned n_refined, n_unrefined;
2862  adapt(n_refined, n_unrefined);
2863  }
2864 
2872  void p_adapt(unsigned& n_refined, unsigned& n_unrefined);
2873 
2881  void p_adapt()
2882  {
2883  unsigned n_refined, n_unrefined;
2884  p_adapt(n_refined, n_unrefined);
2885  }
2886 
2887 
2897  unsigned& n_refined,
2898  unsigned& n_unrefined,
2899  Vector<Vector<double>>& elemental_error);
2900 
2911  {
2912  unsigned n_refined, n_unrefined;
2913  adapt_based_on_error_estimates(n_refined, n_unrefined, elemental_error);
2914  }
2915 
2916 
2920  void get_all_error_estimates(Vector<Vector<double>>& elemental_error);
2921 
2923  void doc_errors(DocInfo& doc_info);
2924 
2926  void doc_errors()
2927  {
2928  DocInfo tmp_doc_info;
2929  tmp_doc_info.disable_doc();
2930  doc_errors(tmp_doc_info);
2931  }
2932 
2936  {
2937  Shut_up_in_newton_solve = false;
2938  }
2939 
2942  {
2943  Shut_up_in_newton_solve = true;
2944  }
2945  };
2946 
2947 
2948  //=======================================================================
2950  //=======================================================================
2952  {
2953  public:
2956 
2958  unsigned iterations;
2959 
2961  double maxres;
2962 
2965  {
2966  }
2967 
2969  NewtonSolverError(const bool& Passed_linear_failure)
2970  : linear_solver_error(Passed_linear_failure), iterations(0), maxres(0.0)
2971  {
2972  }
2973 
2975  NewtonSolverError(unsigned Passed_iterations, double Passed_maxres)
2976  : linear_solver_error(false),
2977  iterations(Passed_iterations),
2978  maxres(Passed_maxres)
2979  {
2980  }
2981 
2982  /* /// Broken copy constructor */
2983  /* NewtonSolverError(const NewtonSolverError& dummy) = delete; */
2984 
2985  /* /// Broken assignment operator */
2986  /* void operator=(const NewtonSolverError&) = delete; */
2987  };
2988 
2989 
2990 } // namespace oomph
2991 
2992 
2993 #endif
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
cout<< "The eigenvalues of A are:"<< endl<< ces.eigenvalues()<< endl;cout<< "The matrix of eigenvectors, V, is:"<< endl<< ces.eigenvectors()<< endl<< endl;complex< float > lambda
Definition: ComplexEigenSolver_compute.cpp:9
Allows for timing the algorithms; accurate up to 0.01 sec.
Definition: MercuryTime.h:25
Definition: assembly_handler.h:63
Definition: assembly_handler.h:397
Definition: assembly_handler.h:688
Definition: assembly_handler.h:955
Definition: assembly_handler.h:609
A class for compressed column matrices that store doubles.
Definition: matrices.h:2791
Definition: matrices.h:888
Definition: generalised_timesteppers.h:101
Definition: nodes.h:86
Definition: matrices.h:1271
Definition: oomph_utilities.h:499
void disable_doc()
Disable documentation.
Definition: oomph_utilities.h:542
Definition: double_vector_with_halo.h:52
LinearAlgebraDistribution *& distribution_pt()
Definition: double_vector_with_halo.h:106
unsigned local_index(const unsigned &global_eqn)
Return the local index associated with the global equation.
Definition: double_vector_with_halo.h:118
Definition: double_vector_with_halo.h:150
Definition: double_vector.h:58
Definition: eigen_solver.h:61
Definition: explicit_timesteppers.h:65
A Base class for explicit timesteppers.
Definition: explicit_timesteppers.h:132
Definition: assembly_handler.h:473
Definition: assembly_handler.h:1050
Definition: linear_algebra_distribution.h:64
unsigned first_row() const
Definition: linear_algebra_distribution.h:261
unsigned nrow() const
access function to the number of global rows.
Definition: linear_algebra_distribution.h:186
unsigned nrow_local() const
Definition: linear_algebra_distribution.h:193
Definition: linear_solver.h:68
Definition: matrices.h:74
Definition: mesh.h:67
A class to handle errors in the Newton solver.
Definition: problem.h:2952
NewtonSolverError(unsigned Passed_iterations, double Passed_maxres)
Constructor that passes number of iterations and residuals.
Definition: problem.h:2975
bool linear_solver_error
Error in the linear solver.
Definition: problem.h:2955
NewtonSolverError()
Default constructor, does nothing.
Definition: problem.h:2964
unsigned iterations
Max. # of iterations performed when the Newton solver died.
Definition: problem.h:2958
NewtonSolverError(const bool &Passed_linear_failure)
Constructor that passes a failure of the linear solver.
Definition: problem.h:2969
double maxres
Max. residual when Newton solver died.
Definition: problem.h:2961
Definition: communicator.h:54
std::ostream *& stream_pt()
Access function for the stream pointer.
Definition: oomph_definitions.h:464
Definition: oomph_definitions.h:222
Definition: oomph_definitions.h:267
Definition: periodic_orbit_handler.h:691
Definition: assembly_handler.h:773
Definition: problem.h:151
EigenSolver *& eigen_solver_pt()
Return a pointer to the eigen solver object.
Definition: problem.h:1492
virtual void get_residuals(DoubleVector &residuals)
Get the total residuals Vector for the problem.
Definition: problem.cc:3714
virtual void actions_after_implicit_timestep()
Definition: problem.h:1070
bool Always_take_one_newton_step
Definition: problem.h:2197
bool Jacobian_reuse_is_enabled
Is re-use of Jacobian in Newton iteration enabled? Default: false.
Definition: problem.h:618
double *& dof_pt(const unsigned &i)
Pointer to i-th dof in the problem.
Definition: problem.h:1825
virtual void actions_after_newton_solve()
Definition: problem.h:1038
void add_time_stepper_pt(TimeStepper *const &time_stepper_pt)
Definition: problem.cc:1545
void solve_eigenproblem(const unsigned &n_eval, Vector< std::complex< double >> &eigenvalue, Vector< DoubleVector > &eigenvector, const bool &steady=true)
Solve the eigenproblem.
Definition: problem.cc:8313
bool Store_local_dof_pt_in_elements
Definition: problem.h:226
void set_dofs(const DoubleVector &dofs)
Set the values of the dofs.
Definition: problem.cc:3411
unsigned newton_solve_continuation(double *const &parameter_pt)
Definition: problem.cc:9376
virtual void actions_before_newton_step()
Definition: problem.h:1053
bool Bifurcation_detection
Boolean to control bifurcation detection via determinant of Jacobian.
Definition: problem.h:790
void p_refine_uniformly(const Vector< unsigned > &nrefine_for_mesh, DocInfo &doc_info)
Definition: problem.h:2670
void bifurcation_adapt_doc_errors(const unsigned &bifurcation_type)
Definition: problem.cc:13648
void reset_assembly_handler_to_default()
Reset the system to the standard non-augemented state.
Definition: problem.cc:10275
void adapt()
Definition: problem.h:2859
virtual void actions_before_newton_solve()
Definition: problem.h:1032
unsigned add_sub_mesh(Mesh *const &mesh_pt)
Definition: problem.h:1330
virtual void get_dvaluesdt(DoubleVector &f)
Definition: problem.cc:3684
virtual void get_jacobian(DoubleVector &residuals, SumOfMatrices &jacobian)
Definition: problem.h:1879
virtual void symmetrise_eigenfunction_for_adaptive_pitchfork_tracking()
Definition: problem.cc:10059
double & dof_current(const unsigned &i)
Definition: problem.h:1182
LinearSolver * mass_matrix_solver_for_explicit_timestepper_pt() const
Definition: problem.h:1486
void get_dofs(DoubleVector &dofs) const
Definition: problem.cc:2479
double Theta_squared
Definition: problem.h:742
void refine_uniformly(const Vector< unsigned > &nrefine_for_mesh, DocInfo &doc_info)
Definition: problem.h:2585
EigenSolver *const & eigen_solver_pt() const
Return a pointer to the eigen solver object (const version)
Definition: problem.h:1498
virtual void dump(std::ofstream &dump_file) const
Definition: problem.cc:12029
LinearAlgebraDistribution *const & dof_distribution_pt() const
Return the pointer to the dof distribution (read-only)
Definition: problem.h:1668
void refine_uniformly(const Vector< unsigned > &nrefine_for_mesh)
Definition: problem.h:2575
Vector< double > Dof_derivative
Storage for the derivative of the problem variables wrt arc-length.
Definition: problem.h:774
virtual Problem * make_copy()
Definition: problem.cc:12011
virtual void actions_after_change_in_global_parameter(double *const &parameter_pt)
Definition: problem.h:1133
double dof(const unsigned &i) const
i-th dof in the problem (const version)
Definition: problem.h:1819
unsigned long ndof() const
Return the number of dofs.
Definition: problem.h:1674
void(* SpatialErrorEstimatorWithDocFctPt)(Mesh *&mesh_pt, Vector< double > &elemental_error, DocInfo &doc_info)
Function pointer for spatial error estimator with doc.
Definition: problem.h:1262
virtual void sparse_assemble_row_or_column_compressed_with_two_arrays(Vector< int * > &column_or_row_index, Vector< int * > &row_or_column_start, Vector< double * > &value, Vector< unsigned > &nnz, Vector< double * > &residual, bool compressed_row_flag)
Definition: problem.cc:6061
void rebuild_global_mesh()
Definition: problem.cc:1533
double & max_residuals()
Definition: problem.h:1608
void get_all_error_estimates(Vector< Vector< double >> &elemental_error)
Definition: problem.cc:14627
bool Jacobian_has_been_computed
Definition: problem.h:622
void explicit_timestep(const double &dt, const bool &shift_values=true)
Take an explicit timestep of size dt.
Definition: problem.cc:10918
void adapt_based_on_error_estimates(unsigned &n_refined, unsigned &n_unrefined, Vector< Vector< double >> &elemental_error)
Definition: problem.cc:14528
void enable_store_local_dof_pt_in_elements()
Definition: problem.h:1696
void enable_info_in_newton_solve()
Definition: problem.h:2935
friend class BlockFoldLinearSolver
Definition: problem.h:158
Problem(const Problem &dummy)=delete
Broken copy constructor.
void p_refine_uniformly(const unsigned &i_mesh)
Do uniform p-refinement for submesh i_mesh without documentation.
Definition: problem.h:2748
void p_refine_uniformly(DocInfo &doc_info)
Definition: problem.h:2707
double Timestep_reduction_factor_after_nonconvergence
Definition: problem.h:2202
Mesh *const & mesh_pt(const unsigned &imesh) const
Return a pointer to the i-th submesh (const version)
Definition: problem.h:1308
Vector< double > Dof_current
Storage for the present values of the variables.
Definition: problem.h:777
void disable_mass_matrix_reuse()
Definition: problem.cc:11832
static bool Suppress_warning_about_actions_before_read_unstructured_meshes
Definition: problem.h:317
virtual void debug_hook_fct(const unsigned &i)
Definition: problem.h:249
double Desired_proportion_of_arc_length
Proportion of the arc-length to taken by the parameter.
Definition: problem.h:734
void adapt_based_on_error_estimates(Vector< Vector< double >> &elemental_error)
Definition: problem.h:2910
AssemblyHandler *& assembly_handler_pt()
Return a pointer to the assembly handler object.
Definition: problem.h:1570
virtual void actions_after_implicit_timestep_and_error_estimation()
Definition: problem.h:1075
void refine_uniformly_and_prune(const Vector< unsigned > &nrefine_for_mesh)
Definition: problem.h:2595
EigenSolver * Default_eigen_solver_pt
Pointer to the default eigensolver.
Definition: problem.h:191
Mesh *const & mesh_pt() const
Return a pointer to the global mesh (const version)
Definition: problem.h:1286
void p_refine_uniformly(const Vector< unsigned > &nrefine_for_mesh)
Definition: problem.h:2660
unsigned Nnewton_iter_taken
Definition: problem.h:603
void restore_dof_values()
Restore the stored values of the degrees of freedom.
Definition: problem.cc:8653
virtual void shift_time_values()
Shift all values along to prepare for next timestep.
Definition: problem.cc:11634
void refine_selected_elements(const Vector< unsigned > &elements_to_be_refined)
Definition: problem.cc:14898
bool Time_adaptive_newton_crash_on_solve_fail
Definition: problem.h:615
const TimeStepper * time_stepper_pt() const
Definition: problem.h:1537
bool is_dparameter_calculated_analytically(double *const &parameter_pt)
Definition: problem.h:277
void calculate_continuation_derivatives_helper(const DoubleVector &z)
Definition: problem.cc:9912
void flush_sub_meshes()
Definition: problem.h:1339
bool & use_predictor_values_as_initial_guess()
Definition: problem.h:1994
unsigned Sparse_assembly_method
Definition: problem.h:641
void set_analytic_hessian_products()
Definition: problem.h:289
void globally_convergent_line_search(const Vector< double > &x_old, const double &half_residual_squared_old, DoubleVector &gradient, DoubleVector &newton_dir, double &half_residual_squared, const double &stpmax)
Line search helper for globally convergent Newton method.
Definition: problem.cc:9146
Time *& time_pt()
Return a pointer to the global time object.
Definition: problem.h:1504
AssemblyHandler *const & assembly_handler_pt() const
Return a pointer to the assembly handler object (const version)
Definition: problem.h:1576
double * global_dof_pt(const unsigned &i)
Definition: problem.h:1764
void get_hessian_vector_products(DoubleVectorWithHaloEntries const &Y, Vector< DoubleVectorWithHaloEntries > const &C, Vector< DoubleVectorWithHaloEntries > &product)
Definition: problem.cc:7985
virtual void actions_after_read_unstructured_meshes()
Definition: problem.h:1109
static ContinuationStorageScheme Continuation_time_stepper
Storage for the single static continuation timestorage object.
Definition: problem.h:761
virtual void get_eigenproblem_matrices(CRDoubleMatrix &mass_matrix, CRDoubleMatrix &main_matrix, const double &shift=0.0)
Definition: problem.cc:8368
virtual void actions_before_implicit_timestep()
Definition: problem.h:1064
virtual void read(std::ifstream &restart_file, bool &unsteady_restart)
Definition: problem.cc:12251
LinearSolver *const & linear_solver_pt() const
Return a pointer to the linear solver object (const version)
Definition: problem.h:1472
unsigned long set_timestepper_for_all_data(TimeStepper *const &time_stepper_pt, const bool &preserve_existing_data=false)
Definition: problem.cc:11572
void p_refine_uniformly_and_prune(const Vector< unsigned > &nrefine_for_mesh)
Definition: problem.h:2680
LinearSolver * Linear_solver_pt
Pointer to the linear solver for the problem.
Definition: problem.h:173
virtual void actions_after_explicit_timestep()
Actions that should be performed after each explicit time step.
Definition: problem.h:1081
void activate_hopf_tracking(double *const &parameter_pt, const bool &block_solve=true)
Definition: problem.cc:10218
void disable_jacobian_reuse()
Disable recycling of Jacobian in Newton iteration.
Definition: problem.h:1982
bool Doc_time_in_distribute
Definition: problem.h:637
unsigned Max_newton_iterations
Maximum number of Newton iterations.
Definition: problem.h:599
Vector< Vector< unsigned > > Sparse_assemble_with_arrays_previous_allocation
Definition: problem.h:667
virtual void actions_after_parameter_increase(double *const &parameter_pt)
Definition: problem.h:1161
virtual void read(std::ifstream &restart_file)
Definition: problem.h:2066
unsigned unrefine_uniformly()
Definition: problem.cc:15831
unsigned Dof_current_offset
Definition: problem.h:771
virtual void sparse_assemble_row_or_column_compressed_with_two_vectors(Vector< int * > &column_or_row_index, Vector< int * > &row_or_column_start, Vector< double * > &value, Vector< unsigned > &nnz, Vector< double * > &residual, bool compressed_row_flag)
Definition: problem.cc:5698
bool jacobian_reuse_is_enabled()
Is recycling of Jacobian in Newton iteration enabled?
Definition: problem.h:1989
virtual void get_inverse_mass_matrix_times_residuals(DoubleVector &Mres)
Definition: problem.cc:3579
virtual void actions_after_change_in_bifurcation_parameter()
Definition: problem.h:1151
bool Empty_actions_before_read_unstructured_meshes_has_been_called
Definition: problem.h:218
void initialise_dt(const double &dt)
Definition: problem.cc:13231
OomphCommunicator * communicator_pt()
access function to the oomph-lib communicator
Definition: problem.h:1246
bool Mass_matrix_has_been_computed
Definition: problem.h:695
unsigned nglobal_data() const
Return the number of global data values.
Definition: problem.h:1686
virtual void actions_before_adapt()
Definition: problem.h:1022
void(* SpatialErrorEstimatorFctPt)(Mesh *&mesh_pt, Vector< double > &elemental_error)
Function pointer for spatial error estimator.
Definition: problem.h:1258
bool First_jacobian_sign_change
Boolean to indicate whether a sign change has occured in the Jacobian.
Definition: problem.h:796
void reset_arc_length_parameters()
Definition: problem.h:2409
void steady_newton_solve(unsigned const &max_adapt=0)
Definition: problem.cc:9292
void activate_pitchfork_tracking(double *const &parameter_pt, const DoubleVector &symmetry_vector, const bool &block_solve=true)
Definition: problem.cc:10188
LinearSolver *& linear_solver_pt()
Return a pointer to the linear solver object.
Definition: problem.h:1466
double Continuation_direction
Definition: problem.h:749
void set_pinned_values_to_zero()
Definition: problem.cc:4304
virtual void actions_before_explicit_timestep()
Actions that should be performed before each explicit time step.
Definition: problem.h:1078
void add_global_data(Data *const &global_data_pt)
Definition: problem.h:1654
bool Scale_arc_length
Boolean to control whether arc-length should be scaled.
Definition: problem.h:731
bool Empty_actions_after_read_unstructured_meshes_has_been_called
Definition: problem.h:222
void p_refine_uniformly_aux(const Vector< unsigned > &nrefine_for_mesh, DocInfo &doc_info, const bool &prune)
Definition: problem.cc:15592
void describe_dofs(std::ostream &out= *(oomph_info.stream_pt())) const
Definition: problem.cc:2359
double & dof(const unsigned &i)
i-th dof in the problem
Definition: problem.h:1813
double doubly_adaptive_unsteady_newton_solve(const double &dt, const double &epsilon, const unsigned &max_adapt, const bool &first, const bool &shift=true)
Definition: problem.h:2471
bool does_pointer_correspond_to_problem_data(double *const &parameter_pt)
Definition: problem.cc:9846
TimeStepper *& time_stepper_pt(const unsigned &i)
Return a pointer to the i-th timestepper.
Definition: problem.h:1549
int & sign_of_jacobian()
Definition: problem.h:2424
bool & time_adaptive_newton_crash_on_solve_fail()
Access function for Time_adaptive_newton_crash_on_solve_fail.
Definition: problem.h:1614
void calculate_continuation_derivatives_fd_helper(double *const &parameter_pt)
Definition: problem.cc:10004
double Maximum_dt
Maximum desired dt.
Definition: problem.h:709
unsigned self_test()
Self-test: Check meshes and global data. Return 0 for OK.
Definition: problem.cc:13276
virtual void sparse_assemble_row_or_column_compressed_with_maps(Vector< int * > &column_or_row_index, Vector< int * > &row_or_column_start, Vector< double * > &value, Vector< unsigned > &nnz, Vector< double * > &residual, bool compressed_row_flag)
Definition: problem.cc:4584
double doubly_adaptive_unsteady_newton_solve_helper(const double &dt, const double &epsilon, const unsigned &max_adapt, const unsigned &suppress_resolve_after_spatial_adapt, const bool &first, const bool &shift=true)
Definition: problem.cc:11379
void assign_initial_values_impulsive()
Definition: problem.cc:11499
void set_explicit_time_stepper_pt(ExplicitTimeStepper *const &explicit_time_stepper_pt)
Definition: problem.cc:1586
virtual void sparse_assemble_row_or_column_compressed_with_vectors_of_pairs(Vector< int * > &column_or_row_index, Vector< int * > &row_or_column_start, Vector< double * > &value, Vector< unsigned > &nnz, Vector< double * > &residual, bool compressed_row_flag)
Definition: problem.cc:5345
bool Use_finite_differences_for_continuation_derivatives
Definition: problem.h:803
void p_refine_uniformly_and_prune(DocInfo &doc_info)
Definition: problem.h:2720
bool Arc_length_step_taken
Boolean to indicate whether an arc-length step has been taken.
Definition: problem.h:799
void get_bifurcation_eigenfunction(Vector< DoubleVector > &eigenfunction)
Definition: problem.cc:10091
void calculate_continuation_derivatives(double *const &parameter_pt)
Definition: problem.cc:9715
virtual ~Problem()
Virtual destructor to clean up memory.
Definition: problem.cc:181
bool Default_set_initial_condition_called
Definition: problem.h:211
double Relaxation_factor
Definition: problem.h:592
void calculate_continuation_derivatives_fd(double *const &parameter_pt)
Definition: problem.cc:9818
double Parameter_current
Storage for the present value of the global parameter.
Definition: problem.h:755
void enable_jacobian_reuse()
Definition: problem.h:1975
void disable_globally_convergent_newton_method()
disable globally convergent Newton method
Definition: problem.h:2009
void problem_is_nonlinear(const bool &prob_lin)
Access function to Problem_is_nonlinear.
Definition: problem.h:1600
LinearSolver *& mass_matrix_solver_for_explicit_timestepper_pt()
Definition: problem.h:1479
double * bifurcation_parameter_pt() const
Definition: problem.cc:10081
OomphCommunicator * Communicator_pt
The communicator for this problem.
Definition: problem.h:1242
double Newton_solver_tolerance
Definition: problem.h:596
bool Discontinuous_element_formulation
Definition: problem.h:700
double adaptive_unsteady_newton_solve(const double &dt_desired, const double &epsilon)
Definition: problem.cc:11056
void activate_bifurcation_tracking(double *const &parameter_pt, const DoubleVector &eigenvector, const bool &block_solve=true)
Definition: problem.cc:10129
void get_fd_jacobian(DoubleVector &residuals, DenseMatrix< double > &jacobian)
Get the full Jacobian by finite differencing.
Definition: problem.cc:7823
void bifurcation_adapt_helper(unsigned &n_refined, unsigned &n_unrefined, const unsigned &bifurcation_type, const bool &actually_adapt=true)
Definition: problem.cc:13354
void build_global_mesh()
Definition: problem.cc:1493
Vector< Problem * > Copy_of_problem_pt
Definition: problem.h:234
unsigned & max_newton_iterations()
Access function to max Newton iterations before giving up.
Definition: problem.h:1594
void add_eigenvector_to_dofs(const double &epsilon, const DoubleVector &eigenvector)
Definition: problem.cc:8747
double & newton_solver_tolerance()
Definition: problem.h:1621
Mesh * Mesh_pt
The mesh pointer.
Definition: problem.h:167
void activate_fold_tracking(double *const &parameter_pt, const bool &block_solve=true)
Definition: problem.cc:10103
double Parameter_derivative
Storage for the derivative of the global parameter wrt arc-length.
Definition: problem.h:752
Time * time_pt() const
Return a pointer to the global time object (const version).
Definition: problem.h:1510
void flush_global_data()
Definition: problem.h:1662
virtual void sparse_assemble_row_or_column_compressed_with_lists(Vector< int * > &column_or_row_index, Vector< int * > &row_or_column_start, Vector< double * > &value, Vector< unsigned > &nnz, Vector< double * > &residual, bool compressed_row_flag)
Definition: problem.cc:4930
Vector< Data * > Global_data_pt
Definition: problem.h:425
Vector< double * > Dof_pt
Vector of pointers to dofs.
Definition: problem.h:554
void p_adapt()
Definition: problem.h:2881
double DTSF_max_increase
Definition: problem.h:713
void p_refine_uniformly_and_prune(const Vector< unsigned > &nrefine_for_mesh, DocInfo &doc_info)
Definition: problem.h:2694
Mesh *& mesh_pt()
Return a pointer to the global mesh.
Definition: problem.h:1280
void p_refine_selected_elements(const Vector< unsigned > &elements_to_be_refined)
Definition: problem.cc:15159
unsigned setup_element_count_per_dof()
Definition: problem.cc:230
void newton_solve()
Use Newton method to solve the problem.
Definition: problem.cc:8783
bool Keep_temporal_error_below_tolerance
Definition: problem.h:2209
bool Shut_up_in_newton_solve
Definition: problem.h:2191
void setup_base_mesh_info_after_pruning()
Vector< Mesh * > Sub_mesh_pt
Vector of pointers to submeshes.
Definition: problem.h:170
Vector< double > Max_res
Maximum residuals at start and after each newton iteration.
Definition: problem.h:606
EigenSolver * Eigen_solver_pt
Pointer to the eigen solver for the problem.
Definition: problem.h:182
bool Bisect_to_find_bifurcation
Boolean to control wheter bisection is used to located bifurcation.
Definition: problem.h:793
void copy(Problem *orig_problem_pt)
Definition: problem.cc:11865
virtual void sparse_assemble_row_or_column_compressed(Vector< int * > &column_or_row_index, Vector< int * > &row_or_column_start, Vector< double * > &value, Vector< unsigned > &nnz, Vector< double * > &residual, bool compressed_row_flag)
Definition: problem.cc:4484
void add_to_dofs(const double &lambda, const DoubleVector &increment_dofs)
Add lambda x incremenet_dofs[l] to the l-th dof.
Definition: problem.cc:3564
double DTSF_min_decrease
Definition: problem.h:718
double Minimum_dt_but_still_proceed
Definition: problem.h:725
unsigned Desired_newton_iterations_ds
Definition: problem.h:784
void refine_uniformly_and_prune(DocInfo &doc_info)
Definition: problem.h:2627
void disable_store_local_dof_pt_in_elements()
Definition: problem.h:1703
ExplicitTimeStepper *& explicit_time_stepper_pt()
Return a pointer to the explicit timestepper.
Definition: problem.h:1555
bool Calculate_hessian_products_analytic
Definition: problem.h:244
void store_current_dof_values()
Store the current values of the degrees of freedom.
Definition: problem.cc:8607
double & maximum_dt()
Access function to max timestep in adaptive timestepping.
Definition: problem.h:1588
void deactivate_bifurcation_tracking()
Definition: problem.h:2353
virtual double global_temporal_error_norm()
Definition: problem.h:1230
Assembly_method
Enumerated flags to determine which sparse assembly method is used.
Definition: problem.h:645
@ Perform_assembly_using_two_arrays
Definition: problem.h:650
@ Perform_assembly_using_maps
Definition: problem.h:648
@ Perform_assembly_using_two_vectors
Definition: problem.h:647
@ Perform_assembly_using_vectors_of_pairs
Definition: problem.h:646
@ Perform_assembly_using_lists
Definition: problem.h:649
void enable_globally_convergent_newton_method()
enable globally convergent Newton method
Definition: problem.h:2003
Mesh *& mesh_pt(const unsigned &imesh)
Definition: problem.h:1293
int Sign_of_jacobian
Storage for the sign of the global Jacobian.
Definition: problem.h:745
void calculate_predictions()
Calculate predictions.
Definition: problem.cc:11656
double arc_length_step_solve_helper(double *const &parameter_pt, const double &ds, const unsigned &max_adapt)
Definition: problem.cc:10515
double Max_residuals
Definition: problem.h:610
unsigned nsub_mesh() const
Return number of submeshes.
Definition: problem.h:1323
void unset_analytic_hessian_products()
Definition: problem.h:296
unsigned ntime_stepper() const
Return the number of time steppers.
Definition: problem.h:1680
double * dof_pt(const unsigned &i) const
Pointer to i-th dof in the problem (const version)
Definition: problem.h:1831
bool Use_globally_convergent_newton_method
Use the globally convergent newton method.
Definition: problem.h:214
LinearSolver * Default_linear_solver_pt
Pointer to the default linear solver.
Definition: problem.h:188
double Minimum_ds
Minimum desired value of arc-length.
Definition: problem.h:787
double Numerical_zero_for_sparse_assembly
Definition: problem.h:671
void solve_eigenproblem(const unsigned &n_eval, Vector< std::complex< double >> &eigenvalue, const bool &steady=true)
Definition: problem.h:1937
double FD_step_used_in_get_hessian_vector_products
Definition: problem.h:685
unsigned Sparse_assemble_with_arrays_initial_allocation
Definition: problem.h:658
double Ds_current
Storage for the current step value.
Definition: problem.h:780
virtual void set_initial_condition()
Definition: problem.h:1198
LinearSolver * Mass_matrix_solver_for_explicit_timestepper_pt
Definition: problem.h:179
unsigned long assign_eqn_numbers(const bool &assign_local_eqn_numbers=true)
Definition: problem.cc:1989
double & dof_derivative(const unsigned &i)
Definition: problem.h:1168
double Minimum_dt
Minimum desired dt: if dt falls below this value, exit.
Definition: problem.h:706
TimeStepper *& time_stepper_pt()
Definition: problem.h:1524
Problem()
Definition: problem.cc:69
virtual void actions_after_adapt()
Actions that are to be performed after a mesh adaptation.
Definition: problem.h:1025
void p_refine_uniformly()
Definition: problem.h:2737
void assign_eigenvector_to_dofs(DoubleVector &eigenvector)
Assign the eigenvector passed to the function to the dofs.
Definition: problem.cc:8716
void unsteady_newton_solve(const double &dt)
Definition: problem.cc:10953
bool Use_continuation_timestepper
Boolean to control original or new storage of dof stuff.
Definition: problem.h:758
void get_derivative_wrt_global_parameter(double *const &parameter_pt, DoubleVector &result)
Definition: problem.cc:7887
void enable_mass_matrix_reuse()
Definition: problem.cc:11807
LinearAlgebraDistribution * Dof_distribution_pt
Definition: problem.h:460
void refine_uniformly()
Definition: problem.h:2640
bool Problem_is_nonlinear
Definition: problem.h:628
void refine_uniformly_and_prune(const Vector< unsigned > &nrefine_for_mesh, DocInfo &doc_info)
Definition: problem.h:2605
double & minimum_dt()
Access function to min timestep in adaptive timestepping.
Definition: problem.h:1582
void operator=(const Problem &)=delete
Broken assignment operator.
AssemblyHandler * Default_assembly_handler_pt
Pointer to the default assembly handler.
Definition: problem.h:194
std::map< double *, bool > Calculate_dparameter_analytic
Definition: problem.h:239
Time * Time_pt
Pointer to global time for the problem.
Definition: problem.h:197
DoubleVectorWithHaloEntries Element_count_per_dof
Definition: problem.h:560
void refine_uniformly(DocInfo &doc_info)
Definition: problem.h:2614
Data *& global_data_pt(const unsigned &i)
Return a pointer to the the i-th global data object.
Definition: problem.h:1647
virtual void actions_before_newton_convergence_check()
Definition: problem.h:1048
double doubly_adaptive_unsteady_newton_solve(const double &dt, const double &epsilon, const unsigned &max_adapt, const unsigned &suppress_resolve_after_spatial_adapt_flag, const bool &first, const bool &shift=true)
Definition: problem.h:2504
void set_consistent_pinned_values_for_continuation()
Definition: problem.cc:10466
void delete_all_external_storage()
Definition: problem.cc:16355
unsigned Sparse_assemble_with_arrays_allocation_increment
Definition: problem.h:663
void set_analytic_dparameter(double *const &parameter_pt)
Definition: problem.h:256
virtual void actions_after_newton_step()
Definition: problem.h:1058
bool Pause_at_end_of_sparse_assembly
Definition: problem.h:633
double arc_length_step_solve(double *const &parameter_pt, const double &ds, const unsigned &max_adapt=0)
Definition: problem.cc:10294
Vector< double > * Saved_dof_pt
Pointer to vector for backup of dofs.
Definition: problem.h:207
AssemblyHandler * Assembly_handler_pt
Definition: problem.h:185
void disable_info_in_newton_solve()
Disable the output of information when in the newton solver.
Definition: problem.h:2941
unsigned Dof_derivative_offset
Definition: problem.h:766
virtual void actions_before_read_unstructured_meshes()
Definition: problem.h:1095
const OomphCommunicator * communicator_pt() const
access function to the oomph-lib communicator, const version
Definition: problem.h:1252
Vector< TimeStepper * > Time_stepper_pt
Definition: problem.h:201
void doc_errors()
Get max and min error for all elements in submeshes.
Definition: problem.h:2926
bool Mass_matrix_reuse_is_enabled
Definition: problem.h:691
void enable_discontinuous_formulation()
Definition: problem.h:1727
bool distributed() const
Definition: problem.h:808
bool are_hessian_products_calculated_analytically()
Definition: problem.h:303
virtual void get_jacobian(DoubleVector &residuals, DenseDoubleMatrix &jacobian)
Definition: problem.cc:3890
ExplicitTimeStepper * Explicit_time_stepper_pt
Pointer to a single explicit timestepper.
Definition: problem.h:204
void dump(const std::string &dump_file_name) const
Definition: problem.h:2078
void p_unrefine_uniformly(DocInfo &doc_info)
Definition: problem.cc:15960
bool mass_matrix_reuse_is_enabled()
Return whether the mass matrix is being reused.
Definition: problem.h:2568
void disable_discontinuous_formulation()
Definition: problem.h:1736
void refine_uniformly(const unsigned &i_mesh)
Do uniform refinement for submesh i_mesh without documentation.
Definition: problem.h:2651
bool Use_predictor_values_as_initial_guess
Use values from the time stepper predictor as an initial guess.
Definition: problem.h:229
void unset_analytic_dparameter(double *const &parameter_pt)
Definition: problem.h:263
void refine_uniformly_aux(const Vector< unsigned > &nrefine_for_mesh, DocInfo &doc_info, const bool &prune)
Definition: problem.cc:15445
double & time()
Return the current value of continuous time.
Definition: problem.cc:11531
Definition: sum_of_matrices.h:262
Definition: timesteppers.h:231
Definition: timesteppers.h:63
static int f(const TensorMap< Tensor< int, 3 > > &tensor)
Definition: cxx11_tensor_map.cpp:237
#define max(a, b)
Definition: datatypes.h:23
Matrix< Type, Size, 1 > Vector
\cpp11 SizeƗ1 vector of type Type.
Definition: Eigen/Eigen/src/Core/Matrix.h:515
Vector::Scalar omega(const Vector &t, const Vector &s, RealScalar angle)
Definition: IDRS.h:36
squared absolute value
Definition: GlobalFunctions.h:87
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
double epsilon
Definition: osc_ring_sarah_asymptotics.h:43
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
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
std::ofstream out("Result.txt")
const char Y
Definition: test/EulerAngles.cpp:32