elastic_problems.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-2025 Matthias Heil and Andrew Hazel
7// LIC//
8// LIC// This library is free software; you can redistribute it and/or
9// LIC// modify it under the terms of the GNU Lesser General Public
10// LIC// License as published by the Free Software Foundation; either
11// LIC// version 2.1 of the License, or (at your option) any later version.
12// LIC//
13// LIC// This library is distributed in the hope that it will be useful,
14// LIC// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// LIC// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16// LIC// Lesser General Public License for more details.
17// LIC//
18// LIC// You should have received a copy of the GNU Lesser General Public
19// LIC// License along with this library; if not, write to the Free Software
20// LIC// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21// LIC// 02110-1301 USA.
22// LIC//
23// LIC// The authors may be contacted at oomph-lib@maths.man.ac.uk.
24// LIC//
25// LIC//====================================================================
26#ifndef OOMPH_ELASTIC_PROBLEMS_HEADER
27#define OOMPH_ELASTIC_PROBLEMS_HEADER
28
29// Config header
30#ifdef HAVE_CONFIG_H
31#include <oomph-lib-config.h>
32#endif
33
34
35// oomph-lib headers
36#include "geom_objects.h"
37#include "timesteppers.h"
38#include "problem.h"
39#include "frontal_solver.h"
40#include "mesh.h"
41
42#ifdef OOMPH_HAS_MUMPS
43#include "mumps_solver.h"
44#endif
45
46
47namespace oomph
48{
49 ////////////////////////////////////////////////////////////////////////
50 ////////////////////////////////////////////////////////////////////////
51 ////////////////////////////////////////////////////////////////////////
52
53
54 //======================================================================
55 /// Dummy mesh that can be created and deleted in
56 /// SolidICProblem
57 //======================================================================
58 class DummyMesh : public Mesh
59 {
60 public:
61 // Empty constructor
63 };
64
65 ////////////////////////////////////////////////////////////////////////
66 ////////////////////////////////////////////////////////////////////////
67 ////////////////////////////////////////////////////////////////////////
68
69
70 //======================================================================
71 /// IC problem for an elastic body discretised on a given (sub)-mesh.
72 /// We switch the elements' residuals and Jacobians to the system of
73 /// equations that forces the wall shape to become that of
74 /// a specified "initial condition object".
75 ///
76 ///
77 /// Boundary conditions for all data items associated with the mesh's
78 /// elements' are temporarily overwritten so that all positional dofs (and
79 /// only those!) become free while all other data (nodal data and the
80 /// element's internal and external data) are either pinned (for nodal and
81 /// internal data) or completely removed (for pointers to external data). The
82 /// complete removal of the (pointers to the) external data is necessary
83 /// because in FSI problems, positional data of certain elements
84 /// can feature as external data of others. Hence pinning them
85 /// in their incarnation as external data would also pin them
86 /// in their incarnation as positional data.
87 ///
88 ///
89 /// All data and its pinned-status are restored at the end of the
90 /// call to setup_ic().
91 //======================================================================
92 class SolidICProblem : public Problem
93 {
94 public:
95 /// Constructor. Initialise pointer
96 /// to IC object to NULL. Create a dummy mesh that can be deleted
97 /// when static problem finally goes out of scope at end of
98 /// program execution.
100 {
101#if defined(OOMPH_HAS_MUMPS) && \
102 defined(OOMPH_ENABLE_MUMPS_AS_DEFAULT_LINEAR_SOLVER)
104#endif
106
107 // Create dummy mesh
108 mesh_pt() = new DummyMesh;
109
110 // Default value for checking of consistent assignment of Newmark IC
112 }
113
114 /// Destructor
116 {
117#if defined(OOMPH_HAS_MUMPS) && \
118 defined(OOMPH_ENABLE_MUMPS_AS_DEFAULT_LINEAR_SOLVER)
119 delete Mumps_solver_pt;
120#endif
121 delete SuperLU_solver_pt;
122 }
123
124
125 /// Broken copy constructor
127
128 /// Broken assignment operator
129 void operator=(const SolidICProblem&) = delete;
130
131 /// Update after solve (empty)
133
134 /// Update the problem specs before solve. (empty)
136
137 /// Force the elastic structure that is discretised on the specified
138 /// mesh to deform in the shape of the initial condition object
139 /// (evaluated at the time specified)
140 void set_static_initial_condition(Problem* problem_pt,
141 Mesh* mesh_pt,
143 const double& time);
144
145 /// Force the elastic structure that is discretised on the specified
146 /// mesh to deform in the shape of the initial condition object (wrapper)
148 Mesh* mesh_pt,
150 {
151 double time;
153 }
154
155 /// Setup initial condition for time-integration
156 /// with Newmark's method. History values are assigned to that
157 /// the velocity and accelerations determined by the Newmark
158 /// scheme are exact at the initial time.
159 template<class TIMESTEPPER>
161 Mesh* mesh_pt,
164 const double& dt);
165
166
167 /// Setup initial condition for time-integration
168 /// with Newmark's method. Past displacements and velocities are assigned
169 /// directly (consistent with the idea that a second order ODE
170 /// can take ICs up to 1st order, while the history value for
171 /// the previous acceleration is determined by the condition that
172 /// the weak equation is satisfied at the initial time.)
173 /// The multiplier function needs to specify the factor that
174 /// multiplies the inertia terms -- typically this is a
175 /// constant, given by the ratio \f$ \Lambda^2 \f$ of the
176 /// problem's intrinsic timescale to the time used to non-dimensionalise
177 /// the equations. If the function (pointer) is not specified
178 /// the multiplier is assumed to be equal to 1.0 -- appropriate
179 /// for a non-dimensionalisation based on the problem's intrinsic timescale.
180 template<class TIMESTEPPER>
182 Problem* problem_pt,
183 Mesh* mesh_pt,
186 const double& dt,
187 SolidFiniteElement::MultiplierFctPt multiplier_fct_pt = 0);
188
189
190 /// Max. tolerated residual after application of consistent
191 /// Newmark IC. Used to check if we have specified the correct
192 /// timescale ratio (non-dim density).
197
198
199 private:
200 /// Backup original state of all data associated with mesh
202
203 /// Reset original state of all data associated with mesh
205
206 /// Change pinned status of all data associated with mesh
207 /// so that the IC problem can be solved.
208 void setup_problem();
209
210 /// Pointer to initial condition object
212
213 /// Vector to store pinned status of all data
215
216 /// Vector of Vectors to store pointers to exernal data in the elements
218
219 /// Max. tolerated residual after application of consistent
220 /// Newmark IC. Used to check if we have specified the correct
221 /// timescale ratio (non-dim density).
223
224#if defined(OOMPH_HAS_MUMPS) && \
225 defined(OOMPH_ENABLE_MUMPS_AS_DEFAULT_LINEAR_SOLVER)
226 /// Pointer to mumps solver
228#endif
229
230 /// Pointer to mumps solver
232 };
233
234
235 //======================================================================
236 /// Setup initial condition for time-integration
237 /// with Newmark's method. History values are assigned to that
238 /// the velocity and accelerations determined by the Newmark
239 /// scheme are exact at the initial time.
240 //======================================================================
241 template<class TIMESTEPPER>
243 Problem* problem_pt,
247 const double& dt)
248 {
249#ifdef PARANOID
250 if (timestepper_pt->type() != "Newmark")
251 {
252 std::ostringstream error_message;
253 error_message
254 << "SolidICProblem::set_newmark_initial_condition_directly()\n"
255 << "can only be called for Newmark type timestepper whereas\n "
256 << "you've called it for " << timestepper_pt->type() << std::endl;
257
258 throw OomphLibError(
259 error_message.str(),
260 "SolidICProblem::set_newmark_initial_condition_directly()",
262 }
263#endif
264
265 // Set value of dt
266 timestepper_pt->time_pt()->dt() = dt;
267
268 // Set the weights
269 timestepper_pt->set_weights();
270
271 // Delete dummy mesh
272 delete mesh_pt();
273
274 // Set pointer to mesh
276
277 // Set pointer to initial condition object
278 IC_pt = ic_pt;
279
280 // Backup the pinned status of all dofs and remove external data
281 // of all elements
283
284 // Now alter the pinned status so that the IC problem for the
285 // positional variables can be solved; setup equation numbering
286 // scheme
288
289 // Choose the right linear solver
290#if defined(OOMPH_HAS_MUMPS) && \
291 defined(OOMPH_ENABLE_MUMPS_AS_DEFAULT_LINEAR_SOLVER)
293#else
295#endif
296
297 // Store times at which we need to assign ic:
298 double current_time = timestepper_pt->time_pt()->time();
299 double previous_time = timestepper_pt->time_pt()->time(1);
300
301 // Stage 1: Set values and time derivs at current time
302 //----------------------------------------------------
303
304 // [Note: this acts on time everywhere!]
307
308 // Loop over time-derivatives
309 for (unsigned t_deriv = 0; t_deriv <= 2; t_deriv++)
310 {
311 // Set flag to ensure that the t_deriv-th time derivative
312 // of the prescribed solution gets stored in displacements
314
315 // Solve the problem for initial shape
316 newton_solve();
317
318 // Loop over all the nodes
319 unsigned n_node = mesh_pt()->nnode();
320 for (unsigned n = 0; n < n_node; n++)
321 {
322 // Assign current time derivative in its temporary storage
323 // position
324 timestepper_pt->assign_initial_data_values_stage1(
325 t_deriv,
326 dynamic_cast<SolidNode*>(mesh_pt()->node_pt(n))
327 ->variable_position_pt());
328 }
329 }
330
331
332 // Stage 2: Now get position at previous time and adjust previous
333 //---------------------------------------------------------------
334 // values of veloc and accel in Newmark scheme so that current
335 //---------------------------------------------------------------
336 // veloc and accel (specified in step 1) are represented exactly.
337 //---------------------------------------------------------------
338
339 // [Note: this acts on time everywhere and needs to be reset!]
342
343 // Set flag to ensure that the t_deriv-th time derivative
344 // of the prescribed solution gets stored in displacements
345 IC_pt->ic_time_deriv() = 0;
346
347 // Solve the problem for initial shape
348 newton_solve();
349
350 // Loop over all the nodes and make the final adjustments
351 unsigned n_node = mesh_pt()->nnode();
352 for (unsigned n = 0; n < n_node; n++)
353 {
354 timestepper_pt->assign_initial_data_values_stage2(
355 dynamic_cast<SolidNode*>(mesh_pt()->node_pt(n))
356 ->variable_position_pt());
357 }
358
359 // Reset time
362
363 // Reset the pinned status and re-attach the external data to the elements
365
366 // Set pointer to dummy mesh so there's something that can be deleted
367 // when static problem finally goes out of scope.
368 mesh_pt() = new DummyMesh;
369
370 // We have temporarily over-written equation numbers -- need
371 // to reset them now
372 oomph_info << "Number of equations in big problem: "
373 << problem_pt->assign_eqn_numbers() << std::endl;
374 }
375
376
377 //======================================================================
378 /// Setup initial condition for time-integration
379 /// with Newmark's method. Past displacements and velocities are assigned
380 /// directly (consistent with the idea that a second order ODE
381 /// can take ICs up to 1st order, while the history value for
382 /// the previous acceleration is determined by the condition that
383 /// that the weak equation is satisfied at the initial time.
384 /// The multiplier function needs to specify the factor that
385 /// multiplies the inertia terms -- typically this is a
386 /// constant, given by the ratio \f$ \Lambda^2 \f$ of the
387 /// problem's intrinsic timescale to the time used to non-dimensionalise
388 /// the equations. If the function (pointer) is not specified,
389 /// the multiplier is assumed to be equal to 1.0 -- appropriate
390 /// for a non-dimensionalisation based on the problem's intrinsic timescale.
391 //======================================================================
392 template<class TIMESTEPPER>
394 Problem* problem_pt,
398 const double& dt,
399 SolidFiniteElement::MultiplierFctPt multiplier_fct_pt)
400 {
401#ifdef PARANOID
402 if (timestepper_pt->type() != "Newmark")
403 {
404 std::ostringstream error_message;
405 error_message
406 << "SolidICProblem::set_newmark_initial_condition_consistently()\n"
407 << "can only be called for Newmark type timestepper whereas\n "
408 << "you've called it for " << timestepper_pt->type() << std::endl;
409
410 throw OomphLibError(
411 error_message.str(),
412 "SolidICProblem::set_newmark_initial_condition_consistently()",
414 }
415#endif
416
417 // Set value of dt
418 timestepper_pt->time_pt()->dt() = dt;
419
420 // Set the weights
421 timestepper_pt->set_weights();
422
423 // Delete dummy mesh
424 delete mesh_pt();
425
426 // Set pointer to mesh
428
429 // Set pointer to initial condition object
430 IC_pt = ic_pt;
431
432 // Backup the pinned status of all dofs and remove external data
433 // of all elements
435
436 // Now alter the pinned status so that the IC problem for the
437 // positional variables can be solved; setup equation numbering
438 // scheme
440
441 // Choose the right linear solver
442#if defined(OOMPH_HAS_MUMPS) && \
443 defined(OOMPH_ENABLE_MUMPS_AS_DEFAULT_LINEAR_SOLVER)
445#else
447#endif
448
449 // Number of history values
450 unsigned ntstorage =
452
453 // Set values at previous time
454 //----------------------------
455
456 // Loop over number of previous times stored
457 unsigned nprevtime =
459
460 // Backup previous times:
462 for (unsigned i = 0; i <= nprevtime; i++)
463 {
464 prev_time[i] =
466 }
467
468 // Loop over previous times & set values themselves
469 //-------------------------------------------------
470 for (unsigned i = 1; i <= nprevtime; i++)
471 {
472 // Set time for geometric object that specifies initial condition
473 // [Note: this acts on time everywhere!]
475 prev_time[i];
476
477 // Set flag to ensure that the t_deriv-th time derivative
478 // of the prescribed solution gets stored in displacements
479 IC_pt->ic_time_deriv() = 0;
480
481 // Solve the problem for initial shape: After this solve
482 // The nodes's current positions represent the position at
483 // previous time level i.
484 newton_solve();
485
486 // Loop over all the nodes
487 unsigned n_node = mesh_pt()->nnode();
488 for (unsigned n = 0; n < n_node; n++)
489 {
490 // Get the variable position data
491 Data* position_data_pt = dynamic_cast<SolidNode*>(mesh_pt()->node_pt(n))
492 ->variable_position_pt();
493 // Get number of values
494 unsigned nval = position_data_pt->nvalue();
495
496 // Assign values at previous times into their corresponding
497 // slots
498 for (unsigned ival = 0; ival < nval; ival++)
499 {
500 position_data_pt->set_value(
501 i, ival, position_data_pt->value(0, ival));
502 }
503 }
504 }
505
506 // Set veloc (1st time deriv) at previous time and store in appropriate
507 //---------------------------------------------------------------------
508 // history value. Also assign zero value for 2nd time deriv. at
509 //-------------------------------------------------------------
510 // previous time
511 //--------------
512
513 // Set time for geometric object that specifies initial condition
514 // to previous time [Note: this acts on time everywhere!]
516 prev_time[1];
517
518 // Set flag to ensure that the t_deriv-th time derivative
519 // of the prescribed solution gets stored in displacements
520 IC_pt->ic_time_deriv() = 1;
521
522 // Solve the problem for initial shape: After this solve
523 // The nodes's current positions represent the time derivatives of at
524 // the positons at previous time level.
525 newton_solve();
526
527 // Loop over all the nodes
528 unsigned n_node = mesh_pt()->nnode();
529 for (unsigned n = 0; n < n_node; n++)
530 {
531 // Get the position data
533 dynamic_cast<SolidNode*>(mesh_pt()->node_pt(n))->variable_position_pt();
534
535 // Get number of values
536 unsigned nval = position_data_pt->nvalue();
537
538 // Assign values at previous times into their corresponding
539 // slots (last but one history value of Newmark scheme)
540 for (unsigned ival = 0; ival < nval; ival++)
541 {
542 position_data_pt->set_value(
543 ntstorage - 2, ival, position_data_pt->value(0, ival));
544 position_data_pt->set_value(ntstorage - 1, ival, 0.0);
545 }
546 }
547
548
549 // Set values at current time
550 //---------------------------
551
552 // Reset time to current value
553 // [Note: this acts on time everywhere!]
555 prev_time[0];
556
557 // Set flag to ensure that the t_deriv-th time derivative
558 // of the prescribed solution gets stored in displacements
559 IC_pt->ic_time_deriv() = 0;
560
561 // Solve the problem for initial shape
562 newton_solve();
563
564
565 // Now solve for the correction to the Newmark accelerations
566 //----------------------------------------------------------
567 // at previous time:
568 //------------------
569
570 // Loop over the elements
571 unsigned Nelement = mesh_pt()->nelement();
572 for (unsigned i = 0; i < Nelement; i++)
573 {
574 // Cast to proper element type
576 dynamic_cast<SolidFiniteElement*>(mesh_pt()->element_pt(i));
577
578 // Switch system to the one that determines the Newmark accelerations
579 // by setting the Jacobian to the mass matrix
580 elem_pt->enable_solve_for_consistent_newmark_accel();
581
582 // Set pointer to multiplier function
583 elem_pt->multiplier_fct_pt() = multiplier_fct_pt;
584
585 // Switch off pointer to initial condition object
586 elem_pt->solid_ic_pt() = 0;
587 }
588
589 // Correction vector
591
592 /// Pointer to member type solver
593 typedef void (LinearSolver::*SolverMemPtr)(Problem* const& problem,
596
597 // Now do the linear solve
599#if defined(OOMPH_HAS_MUMPS) && \
600 defined(OOMPH_ENABLE_MUMPS_AS_DEFAULT_LINEAR_SOLVER)
602#else
604#endif
605
607
608 // Update discrete 2nd deriv at previous time so that it's consistent
609 // with PDE at current time
610
611 // Loop over all the nodes
612 for (unsigned n = 0; n < n_node; n++)
613 {
614 // Get the pointer to the position data
616 dynamic_cast<SolidNode*>(mesh_pt()->node_pt(n))->variable_position_pt();
617
618 // Get number of values
619 unsigned nval = position_data_pt->nvalue();
620
621 // Assign values for the history value that corresponds to the
622 // previous accel in Newmark scheme so that the PDE is satsified
623 // at current time
624 for (unsigned ival = 0; ival < nval; ival++)
625 {
626 // Global equation number
628
629#ifdef PARANOID
630 if (ieqn < 0)
631 {
632 throw OomphLibError(
633 "No positional dofs should be pinned at this stage!",
636 }
637#endif
638
639 // Update the value
640 *(position_data_pt->value_pt(ntstorage - 1, ival)) -= correction[ieqn];
641 }
642 }
643
644
645#ifdef PARANOID
646 // Check the residual
649 double res_max = residuals.max();
651 << "Max. residual after assigning consistent initial conditions: "
652 << res_max << std::endl;
654 {
655 std::ostringstream error_message;
656 error_message << "Residual is bigger than allowed! [Current tolerance: "
658 error_message << "This is probably because you've not specified the "
659 << "correct multiplier \n(the product of growth factor "
660 << "and timescale ratio [the non-dim density]). \nPlease "
661 << "check the Solid Mechanics Theory Tutorial for "
662 << "details. \n\n"
663 << "If you're sure that the residual is OK, overwrite "
664 << "the default tolerance using\n";
665 error_message
666 << "SolidICProblem::max_residual_after_consistent_newton_ic()"
667 << std::endl
668 << "or recompile without the PARANOID flag." << std::endl;
669
670 throw OomphLibError(
672 }
673#endif
674
675 // Reset the pinned status and re-attach the external data to the elements
677
678 // Set pointer to dummy mesh so there's something that can be deleted
679 // when static problem finally goes out of scope.
680 mesh_pt() = new DummyMesh;
681
682 // We have temporarily over-written equation numbers -- need
683 // to reset them now
684 oomph_info << "Number of equations in big problem: "
685 << problem_pt->assign_eqn_numbers() << std::endl;
686 }
687
688} // namespace oomph
689
690#endif
cstr elem_len * i
Definition cfortran.h:603
A class that represents a collection of data; each Data object may contain many different individual ...
Definition nodes.h:86
A vector in the mathematical sense, initially developed for linear algebra type applications....
Dummy mesh that can be created and deleted in SolidICProblem.
unsigned long eqn_number(const unsigned &ieqn_local) const
Return the global equation number corresponding to the ieqn_local-th local equation number.
Definition elements.h:691
TimeStepper *& time_stepper_pt()
Access function for pointer to time stepper: Null if object is not time-dependent.
Base class for all linear solvers. This merely defines standard interfaces for linear solvers,...
virtual void solve(Problem *const &problem_pt, DoubleVector &result)=0
Solver: Takes pointer to problem and returns the results vector which contains the solution of the li...
A general mesh class.
Definition mesh.h:67
Node *& node_pt(const unsigned long &n)
Return pointer to global node n.
Definition mesh.h:440
unsigned long nnode() const
Return number of nodes in the mesh.
Definition mesh.h:604
GeneralisedElement *& element_pt(const unsigned long &e)
Return pointer to element e.
Definition mesh.h:452
unsigned long nelement() const
Return number of elements in the mesh.
Definition mesh.h:598
Wrapper to Mumps solver.
An OomphLibError object which should be thrown when an run-time error is encountered....
////////////////////////////////////////////////////////////////// //////////////////////////////////...
Definition problem.h:154
unsigned long assign_eqn_numbers(const bool &assign_local_eqn_numbers=true)
Assign all equation numbers for problem: Deals with global data (= data that isn't attached to any el...
Definition problem.cc:2085
void newton_solve()
Use Newton method to solve the problem.
Definition problem.cc:8816
virtual void get_residuals(DoubleVector &residuals)
Return the fully-assembled residuals Vector for the problem: Virtual so it can be overloaded in for m...
Definition problem.cc:3810
LinearSolver *& linear_solver_pt()
Return a pointer to the linear solver object.
Definition problem.h:1486
double & time()
Return the current value of continuous time.
Definition problem.cc:11607
Mesh *& mesh_pt()
Return a pointer to the global mesh.
Definition problem.h:1300
SolidFiniteElement class.
Definition elements.h:3565
double(* MultiplierFctPt)(const Vector< double > &xi)
Pointer to function that computes the "multiplier" for the inertia terms in the consistent determinat...
Definition elements.h:3586
IC problem for an elastic body discretised on a given (sub)-mesh. We switch the elements' residuals a...
void set_newmark_initial_condition_consistently(Problem *problem_pt, Mesh *mesh_pt, TIMESTEPPER *timestepper_pt, SolidInitialCondition *ic_pt, const double &dt, SolidFiniteElement::MultiplierFctPt multiplier_fct_pt=0)
Setup initial condition for time-integration with Newmark's method. Past displacements and velocities...
void backup_original_state()
Backup original state of all data associated with mesh.
Vector< Vector< Data * > > Backup_ext_data
Vector of Vectors to store pointers to exernal data in the elements.
void operator=(const SolidICProblem &)=delete
Broken assignment operator.
MumpsSolver * Mumps_solver_pt
Pointer to mumps solver.
void setup_problem()
Change pinned status of all data associated with mesh so that the IC problem can be solved.
void set_static_initial_condition(Problem *problem_pt, Mesh *mesh_pt, SolidInitialCondition *ic_pt, const double &time)
Force the elastic structure that is discretised on the specified mesh to deform in the shape of the i...
SolidICProblem(const SolidICProblem &)=delete
Broken copy constructor.
Vector< int > Backup_pinned
Vector to store pinned status of all data.
double Max_residual_after_consistent_newton_ic
Max. tolerated residual after application of consistent Newmark IC. Used to check if we have specifie...
SuperLUSolver * SuperLU_solver_pt
Pointer to mumps solver.
void reset_original_state()
Reset original state of all data associated with mesh.
double & max_residual_after_consistent_newton_ic()
Max. tolerated residual after application of consistent Newmark IC. Used to check if we have specifie...
SolidInitialCondition * IC_pt
Pointer to initial condition object.
void set_newmark_initial_condition_directly(Problem *problem_pt, Mesh *mesh_pt, TIMESTEPPER *timestepper_pt, SolidInitialCondition *ic_pt, const double &dt)
Setup initial condition for time-integration with Newmark's method. History values are assigned to th...
void actions_before_newton_solve()
Update the problem specs before solve. (empty)
SolidICProblem()
Constructor. Initialise pointer to IC object to NULL. Create a dummy mesh that can be deleted when st...
void set_static_initial_condition(Problem *problem_pt, Mesh *mesh_pt, SolidInitialCondition *ic_pt)
Force the elastic structure that is discretised on the specified mesh to deform in the shape of the i...
void actions_after_newton_solve()
Update after solve (empty)
A class to specify the initial conditions for a solid body. Solid bodies are often discretised with H...
Definition elements.h:3500
unsigned & ic_time_deriv()
Which time derivative are we currently assigning?
Definition elements.h:3521
GeomObject *& geom_object_pt()
(Reference to) pointer to geom object that specifies the initial condition
Definition elements.h:3515
A Class for nodes that deform elastically (i.e. position is an unknown in the problem)....
Definition nodes.h:1686
SuperLU Project Solver class. This is a combined wrapper for both SuperLU and SuperLU Dist....
TAdvectionDiffusionReactionElement<NREAGENT,DIM,NNODE_1D> elements are isoparametric triangular DIM-d...
virtual unsigned nprev_values() const =0
Number of previous values available: 0 for static, 1 for BDF<1>,...
unsigned ntstorage() const
Return the number of doubles required to represent history (one for steady)
Time *const & time_pt() const
Access function for the pointer to time (const version)
double & time()
Return the current value of the continuous time.
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
OomphInfo oomph_info
Single (global) instantiation of the OomphInfo object – this is used throughout the library as a "rep...