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

📄 monoadaptivefixedpointsolver.cpp

📁 利用C
💻 CPP
字号:
// Copyright (C) 2005-2008 Anders Logg.// Licensed under the GNU LGPL Version 2.1.//// First added:  2005-01-28// Last changed: 2008-02-11#include <dolfin/log/dolfin_log.h>#include <dolfin/parameter/parameters.h>#include "Alloc.h"#include "Method.h"#include "MonoAdaptiveTimeSlab.h"#include "MonoAdaptiveFixedPointSolver.h"using namespace dolfin;//-----------------------------------------------------------------------------MonoAdaptiveFixedPointSolver::MonoAdaptiveFixedPointSolver(MonoAdaptiveTimeSlab& timeslab)  : TimeSlabSolver(timeslab), ts(timeslab), xold(0),    alpha(ode.get("ODE fixed-point damping")),    stabilize(ode.get("ODE fixed-point stabilize")), mi(0), li(0), ramp(1.0),    rampfactor(ode.get("ODE fixed-point stabilization ramp")){  // Initialize old values at right end-point  xold = new real[ts.N];  for (uint i = 0; i < ts.N; i++)    xold[i] = 0.0;}//-----------------------------------------------------------------------------MonoAdaptiveFixedPointSolver::~MonoAdaptiveFixedPointSolver(){  // Do nothing}//-----------------------------------------------------------------------------real MonoAdaptiveFixedPointSolver::iteration(real tol, uint iter,					     real d0, real d1){//   real K = ts.endtime() - ts.starttime();  real alpha_orig = alpha;  if(stabilize)  {    if(iter == 0)    {      ramp = 1.0;      mi = 0;      li = 0;    }        if(iter == 0 || (d1 > d0 && li == 0))    {      // stabilize            ramp = 1.0;      mi = ode.get("ODE fixed-point stabilization m");      //mi = (int)ceil(log10(K * 1.0e4));      //cout << "stabilize: " << mi << endl;    }          if(mi == 0 && li == 0)    {      // Choose number of ramping iterations      li = ode.get("ODE fixed-point stabilization l");      //cout << "ramp: " << li << endl;    }        if(mi == 0)    {      // ramping            ramp = ramp * rampfactor;    }        alpha *= ramp;  }  // Compute size of time step  const real k = ts.length();  // Save old values  const uint xoffset = (method.nsize() - 1) * ts.N;  ts.copy(ts.x, xoffset, xold, 0, ts.N);  // Save norm of old solution  xnorm = 0.0;  for (uint j = 0; j < ts.nj; j++)    xnorm = std::max(xnorm, std::abs(ts.x[j]));  // Evaluate right-hand side at all quadrature points  for (uint m = 0; m < method.qsize(); m++)    ts.feval(m);  // Update the values at each stage  for (uint n = 0; n < method.nsize(); n++)  {    const uint noffset = n * ts.N;    // Reset values to initial data    for (uint i = 0; i < ts.N; i++)      ts.x[noffset + i] += alpha*(ts.u0[i] - ts.x[noffset+i]);    // Add weights of right-hand side    for (uint m = 0; m < method.qsize(); m++)    {      const real tmp = k * method.nweight(n, m);      const uint moffset = m * ts.N;      for (uint i = 0; i < ts.N; i++)	ts.x[noffset + i] += alpha*tmp*ts.fq[moffset + i];    }  }    // Compute size of increment  real max_increment = 0.0;  for (uint i = 0; i < ts.N; i++)  {    const real increment = fabs(ts.x[xoffset + i] - xold[i]);    if ( increment > max_increment )      max_increment = increment;  }  if(stabilize)  {    alpha = alpha_orig;    if(mi > 0)      mi -= 1;    if(li > 0)      li -= 1;  }  return max_increment;}//-----------------------------------------------------------------------------dolfin::uint MonoAdaptiveFixedPointSolver::size() const{  return ts.nj;}//-----------------------------------------------------------------------------

⌨️ 快捷键说明

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