⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adaptive_time_solver.h

📁 一个用来实现偏微分方程中网格的计算库
💻 H
字号:
// $Id: adaptive_time_solver.h 2637 2008-02-05 20:31:33Z roystgnr $// The libMesh Finite Element Library.// Copyright (C) 2002-2007  Benjamin S. Kirk, John W. Peterson  // 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 "unsteady_solver.h"// Forward declarationsclass 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 definitionclass 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();  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);  /**   * This method is passed on to the core_time_solver   */  virtual bool side_residual (bool get_jacobian);  /**   * 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   */  Real calculate_norm(System &, NumericVector<Number> &);};#endif // #define __adaptive_time_solver_h__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -