hide long namesshow long names
hide short namesshow short names
Integer type:  int32  int64  nag_int  show int32  show int32  show int64  show int64  show nag_int  show nag_int

PDF version (NAG web site, 64-bit version, 64-bit version)
Chapter Contents
Chapter Introduction
NAG Toolbox

NAG Toolbox: nag_ode_dae_dassl_cont (d02mc)

Purpose

nag_ode_dae_dassl_cont (d02mc) is a setup function which must be called prior to a continuation call to nag_ode_dae_dassl_gen (d02ne).

Syntax

[icom] = d02mc(icom)
[icom] = nag_ode_dae_dassl_cont(icom)

Description

nag_ode_dae_dassl_cont (d02mc) is provided to permit you to signal that the next call to nag_ode_dae_dassl_gen (d02ne) is a continuation call. In particular, if nag_ode_dae_dassl_gen (d02ne) exits because the maximum number of integration steps has been exceeded, then a call to nag_ode_dae_dassl_cont (d02mc) resets the step counter allowing the integration to proceed.

References

See Section [Description] in (d02ne).

Parameters

Compulsory Input Parameters

1:     icom(1515) – int64int32nag_int array
This must be the same array icom as passed to the integration function nag_ode_dae_dassl_gen (d02ne); nag_ode_dae_dassl_cont (d02mc) does not require access to all of that array, hence the smaller dimension given here.
Contains details of the current state of integration as returned by nag_ode_dae_dassl_gen (d02ne).

Optional Input Parameters

None.

Input Parameters Omitted from the MATLAB Interface

None.

Output Parameters

1:     icom(1515) – int64int32nag_int array
This must be the same array icom as passed to the integration function nag_ode_dae_dassl_gen (d02ne); nag_ode_dae_dassl_cont (d02mc) does not require access to all of that array, hence the smaller dimension given here.
One or more of the values is changed to signal to the integrator that a continuation call is being made. This will reset the step counter to zero.

Error Indicators and Warnings

None.

Accuracy

Not applicable.

Further Comments

None.

Example

function nag_ode_dae_dassl_cont_example
neq = 3;
maxord = 5;
mu = 2;
ml = 1;
lcom = 40+(maxord+4)*neq+(2*ml+mu+1)*neq+2*(neq/(ml+mu+1)+1)
itol = int64(1);
rtol = [1e-3; 1e-3; 1e-3];
atol = [1e-6; 1e-6; 1e-6];
ydot = zeros(neq,1);
% Set initial values
y    = [1; 0; 0];
% Initialize the problem, specifying that the Jacobian is to be
% evaluated analytically using the provided routine jac.
jceval = 'Analytic';
hmax = 0;
ho = 0;
t = 0;
tout = 0.02;
[icom, com, ifail] = ...
    nag_ode_dae_dassl_setup(int64(neq), int64(maxord), jceval, hmax, ho, itol, int64(lcom));

% Specify that the Jacobian is banded
if ifail == 0
  [icom, ifail] = nag_ode_dae_dassl_linalg(int64(neq), int64(ml), int64(mu), icom);
end

% Use the user parameter to pass the band dimensions through to jac.
% An alternative would be to hard code values for ml and mu in jac.
user = {ml, mu};

fprintf('\n    t            y(1)        y(2)        y(3)   \n');
fprintf(' %8.4f   %12.6f %12.6f %12.6f\n', t, y);

itask = int64(0);
% Obtain the solution at 5 equally spaced values of T.
for j = 1:5
  if ifail == 0
    [t, y, ydot, rtol, atol, itask, icom, com, user, ifail] = ...
      nag_ode_dae_dassl_gen(t, tout, y, ydot, rtol, atol, itask, @res, @jac, ...
            icom, com, 'user', user);
    fprintf(' %8.4f   %12.6f %12.6f %12.6f\n', t, y);
    tout = tout + 0.02;
    icom = nag_ode_dae_dassl_cont(icom);
  end
end

fprintf('\nThe integrator completed task, ITASK = %d\n', itask);



function [pd, user] = jac(neq, t, y, ydot, pd, cj, user)
  ml = user{1};
  mu = user{2};

  stride = 2*ml+mu+1;
  % Main diagonal pdfull(i,i), i=1,neq
  md = mu + ml + 1;
  pd(md) = -0.04 - cj;
  pd(md+stride) = -1.0e4*y(3) - 6.0e7*y(2) - cj;
  pd(md+2*stride) = -cj;
  % 1 sub-diagonal pdfull(i+1:i), i=1,neq-1
  ms = md + 1;
  pd(ms) = 0.04;
  pd(ms+stride) = 6.0e7*y(2);
  % First super-diagonal pdfull(i-1,i), i=2, neq
  ms = md - 1;
  pd(ms+stride) = 1.0e4*y(3);
  pd(ms+2*stride) = -1.0e4*y(2);
  % Second super-diagonal pdfull(i-2,i), i=3, neq
  ms = md - 2;
  pd(ms+2*stride) = 1.0e4*y(2);

function [r, ires, user] = res(neq, t, y, ydot, ires, user)
  r = zeros(neq, 1);
  r(1) = -0.04*y(1) + 1.0e4*y(2)*y(3) - ydot(1);
  r(2) = 0.04*y(1) - 1.0e4*y(2)*y(3) - 3.0e7*y(2)*y(2) - ydot(2);
  r(3) = 3.0e7*y(2)*y(2) - ydot(3);
 

lcom =

   85.5000


    t            y(1)        y(2)        y(3)   
   0.0000       1.000000     0.000000     0.000000
   0.0200       0.999204     0.000036     0.000760
   0.0400       0.998415     0.000036     0.001549
   0.0600       0.997631     0.000036     0.002333
   0.0800       0.996852     0.000036     0.003112
   0.1000       0.996080     0.000036     0.003884

The integrator completed task, ITASK = 3

function d02mc_example
neq = 3;
maxord = 5;
mu = 2;
ml = 1;
lcom = 40+(maxord+4)*neq+(2*ml+mu+1)*neq+2*(neq/(ml+mu+1)+1)
itol = int64(1);
rtol = [1e-3; 1e-3; 1e-3];
atol = [1e-6; 1e-6; 1e-6];
ydot = zeros(neq,1);
% Set initial values
y    = [1; 0; 0];
% Initialize the problem, specifying that the Jacobian is to be
% evaluated analytically using the provided routine jac.
jceval = 'Analytic';
hmax = 0;
ho = 0;
t = 0;
tout = 0.02;
[icom, com, ifail] = d02mw(int64(neq), int64(maxord), jceval, hmax, ho, itol, int64(lcom));

% Specify that the Jacobian is banded
if ifail == 0
  [icom, ifail] = d02np(int64(neq), int64(ml), int64(mu), icom);
end

% Use the user parameter to pass the band dimensions through to jac.
% An alternative would be to hard code values for ml and mu in jac.
user = {ml, mu};

fprintf('\n    t            y(1)        y(2)        y(3)   \n');
fprintf(' %8.4f   %12.6f %12.6f %12.6f\n', t, y);

itask = int64(0);
% Obtain the solution at 5 equally spaced values of T.
for j = 1:5
  if ifail == 0
    [t, y, ydot, rtol, atol, itask, icom, com, user, ifail] = ...
      d02ne(t, tout, y, ydot, rtol, atol, itask, @res, @jac, ...
            icom, com, 'user', user);
    fprintf(' %8.4f   %12.6f %12.6f %12.6f\n', t, y);
    tout = tout + 0.02;
    icom = d02mc(icom);
  end
end

fprintf('\nThe integrator completed task, ITASK = %d\n', itask);



function [pd, user] = jac(neq, t, y, ydot, pd, cj, user)
  ml = user{1};
  mu = user{2};

  stride = 2*ml+mu+1;
  % Main diagonal pdfull(i,i), i=1,neq
  md = mu + ml + 1;
  pd(md) = -0.04 - cj;
  pd(md+stride) = -1.0e4*y(3) - 6.0e7*y(2) - cj;
  pd(md+2*stride) = -cj;
  % 1 sub-diagonal pdfull(i+1:i), i=1,neq-1
  ms = md + 1;
  pd(ms) = 0.04;
  pd(ms+stride) = 6.0e7*y(2);
  % First super-diagonal pdfull(i-1,i), i=2, neq
  ms = md - 1;
  pd(ms+stride) = 1.0e4*y(3);
  pd(ms+2*stride) = -1.0e4*y(2);
  % Second super-diagonal pdfull(i-2,i), i=3, neq
  ms = md - 2;
  pd(ms+2*stride) = 1.0e4*y(2);

function [r, ires, user] = res(neq, t, y, ydot, ires, user)
  r = zeros(neq, 1);
  r(1) = -0.04*y(1) + 1.0e4*y(2)*y(3) - ydot(1);
  r(2) = 0.04*y(1) - 1.0e4*y(2)*y(3) - 3.0e7*y(2)*y(2) - ydot(2);
  r(3) = 3.0e7*y(2)*y(2) - ydot(3);
 

lcom =

   85.5000


    t            y(1)        y(2)        y(3)   
   0.0000       1.000000     0.000000     0.000000
   0.0200       0.999204     0.000036     0.000760
   0.0400       0.998415     0.000036     0.001549
   0.0600       0.997631     0.000036     0.002333
   0.0800       0.996852     0.000036     0.003112
   0.1000       0.996080     0.000036     0.003884

The integrator completed task, ITASK = 3


PDF version (NAG web site, 64-bit version, 64-bit version)
Chapter Contents
Chapter Introduction
NAG Toolbox

© The Numerical Algorithms Group Ltd, Oxford, UK. 2009–2013