/usr/include/libmesh/adaptive_time_solver.h is in libmesh-dev 0.7.1-2ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 | // $Id: adaptive_time_solver.h 3933 2010-08-24 23:16:20Z roystgnr $
// The libMesh Finite Element Library.
// Copyright (C) 2002-2008 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#ifndef __adaptive_time_solver_h__
#define __adaptive_time_solver_h__
// C++ includes
// Local includes
#include "system_norm.h"
#include "unsteady_solver.h"
namespace libMesh
{
// Forward declarations
class System;
/**
* This class wraps another UnsteadySolver derived class, and compares
* the results of timestepping with deltat and timestepping with
* 2*deltat to adjust future timestep lengths.
*
* Currently this class only works on fully coupled Systems
*
* This class is part of the new DifferentiableSystem framework,
* which is still experimental. Users of this framework should
* beware of bugs and future API changes.
*
* @author Roy H. Stogner 2007
*/
// ------------------------------------------------------------
// Solver class definition
class AdaptiveTimeSolver : public UnsteadySolver
{
public:
/**
* The parent class
*/
typedef UnsteadySolver Parent;
/**
* Constructor. Requires a reference to the system
* to be solved.
*/
AdaptiveTimeSolver (sys_type& s);
/**
* Destructor.
*/
virtual ~AdaptiveTimeSolver ();
virtual void init();
virtual void reinit();
virtual void solve() = 0;
virtual void advance_timestep();
/**
* This method is passed on to the core_time_solver
*/
virtual Real error_order () const;
/**
* This method is passed on to the core_time_solver
*/
virtual bool element_residual (bool get_jacobian,
DiffContext&);
/**
* This method is passed on to the core_time_solver
*/
virtual bool side_residual (bool get_jacobian,
DiffContext&);
/**
* An implicit linear or nonlinear solver to use at each timestep.
*/
virtual AutoPtr<DiffSolver> &diff_solver();
/**
* This object is used to take timesteps
*/
AutoPtr<UnsteadySolver> core_time_solver;
/**
* Error calculations are done in this norm, DISCRETE_L2 by default.
*/
SystemNorm component_norm;
/**
* If component_norms is non-empty, each variable's contribution to the error
* of a system will also be scaled by component_scale[var], unless
* component_scale is empty in which case all variables will be weighted
* equally.
*/
std::vector<float> component_scale;
/**
* This tolerance is the target relative error between double-deltat
* and single-deltat timesteps, scaled by deltat. If this error tolerance
* is exceeded or not met, future timesteps will be run with deltat shrunk
* or grown to compensate.
*
* The default value is 1.0e-2; obviously users should select their
* own tolerance.
*/
Real target_tolerance;
/**
* This tolerance is the maximum relative error between double-deltat and
* single-deltat timesteps, scaled by deltat. If this error tolerance is
* exceeded, the current timestep will be repeated with a smaller deltat.
*
* If you use the default upper_tolerance=0.0,
*/
Real upper_tolerance;
/**
* Do not allow the adaptive time solver to select deltat > max_deltat.
* If you use the default max_deltat=0.0, then deltat is unlimited.
*/
Real max_deltat;
/**
* Do not allow the adaptive time solver to select deltat < min_deltat.
* The default value is 0.0.
*/
Real min_deltat;
/**
* Do not allow the adaptive time solver to select
* a new deltat greater than max_growth times the old deltat.
* If you use the default max_growth=0.0, then the deltat growth is
* unlimited.
*/
Real max_growth;
/**
* This flag, which is true by default, grows (shrinks) the timestep
* based on the expected global accuracy of the timestepping scheme.
* Global in this sense means the cumulative final-time accuracy of
* the scheme. For example, the backward Euler scheme's truncation
* error is locally of order 2, so that after N timesteps of size
* deltat, the result is first-order accurate. If you set this to
* false, you can grow (shrink) your timestep based on the local
* accuracy rather than the global accuracy of the core TimeSolver.
* Note that by setting this value to false you may fail to achieve
* the predicted convergence in time of the underlying method, however
* it may be possible to get more fine-grained control over step sizes
* as well.
*/
bool global_tolerance;
protected:
/**
* We need to store the value of the last deltat used, so
* that advance_timestep() will increment the system time
* correctly.
*/
Real last_deltat;
/**
* A helper function to calculate error norms
*/
virtual Real calculate_norm(System &, NumericVector<Number> &);
};
} // namespace libMesh
#endif // #define __adaptive_time_solver_
|