~njansson/dolfin/hpc

« back to all changes in this revision

Viewing changes to src/ode/TimeSlabSolver.cpp

  • Committer: Niclas Jansson
  • Date: 2010-10-17 10:21:52 UTC
  • Revision ID: njansson@csc.kth.se-20101017102152-e6u3c9uwxa4z19c8
Minor fixes in configure.ac

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// Copyright (C) 2005-2006 Anders Logg.
 
1
// Copyright (C) 2005-2008 Anders Logg.
2
2
// Licensed under the GNU LGPL Version 2.1.
3
3
//
4
4
// First added:  2005-01-05
5
 
// Last changed: 2006-04-20
 
5
// Last changed: 2008-06-11
 
6
 
 
7
#include <dolfin/config/dolfin_config.h>
 
8
 
 
9
#ifndef NO_UBLAS
6
10
 
7
11
#include <cmath>
 
12
#include <dolfin/common/constants.h>
8
13
#include <dolfin/parameter/parameters.h>
9
14
#include "TimeSlab.h"
10
15
#include "TimeSlabSolver.h"
15
20
TimeSlabSolver::TimeSlabSolver(TimeSlab& timeslab)
16
21
  : ode(timeslab.ode), method(*timeslab.method), tol(0.0), maxiter(0),
17
22
    monitor(ode.get("ODE monitor convergence")),
18
 
    num_timeslabs(0), num_global_iterations(0), num_local_iterations(0)
 
23
    num_timeslabs(0), num_global_iterations(0), num_local_iterations(0),
 
24
    xnorm(0.0)
19
25
{
20
26
  // Choose tolerance
21
27
  chooseTolerance();
67
73
  {
68
74
    // Do one iteration
69
75
    real d2 = iteration(tol, iter, d0, d1);
 
76
 
 
77
    // Use relative increment
 
78
    d2 /= xnorm + DOLFIN_EPS;
 
79
    
 
80
    // For debugging convergence
70
81
    if ( monitor )
71
82
      message("--- iter = %d: increment = %.3e", iter, d2);
72
83
    
77
88
      num_timeslabs += 1;
78
89
      num_global_iterations += iter + 1;
79
90
      if ( monitor )
80
 
        message("Time slab system of size %d converged in %d iterations.", size(), iter + 1);
 
91
        message("Time slab system of size %d converged in %d iterations.\n", size(), iter + 1);
81
92
      return true;
82
93
    }
83
94
 
84
95
    // Check divergence
85
 
    // FIXME: implement better check and make this a parameter
 
96
    // FIXME: implement better check and make this a parameter    
 
97
    // FIXME: remove ifdef checks for isnormal (needed on irix and solaris),
 
98
    //        broken for both gcc and mipspro compilers
 
99
#if (__sgi || sgi || sun || __sun) 
 
100
    if ( (iter > 0 && d2 > 1000.0 * d1) )
 
101
#else
86
102
    if ( (iter > 0 && d2 > 1000.0 * d1) || !std::isnormal(d2) )
 
103
#endif
87
104
    {
88
105
      warning("Time slab system seems to be diverging.");
89
106
      return false;
124
141
  cout << "Using discrete tolerance tol = " << tol << "." << endl;
125
142
}
126
143
//-----------------------------------------------------------------------------
 
144
 
 
145
#endif