code 33066;
procedure ARKMAT( T, TE, M, N, U, DER, TYPE, ORDER, SPR, OUT);
value M,N,TYPE,ORDER;
integer M,N,TYPE,ORDER;
real T,TE,SPR;
array U;
procedure DER,OUT;

begin integer SIG,L;
    real TAU;
    array LAMBDA[1:9],UH,DU[1:N,1:M];
    boolean LAST;

    procedure ELMMAT(A,B,X); value X; array A,B; real X;
    for L:=1 step 1 until M do ELMCOL(1,N,L,L,A,B,X);

    procedure INITIALIZE;
    begin integer I;real LBD;
    switch TYPEODE:=NOTSPECIFIED2,PARABOLIC1,PARABOLIC2,HYPERBOLIC2;

    if TYPE^=2 and TYPE^=3 then TYPE:=1;
    if TYPE^=2 then ORDER:=2 else if ORDER^=2 then ORDER:=1;
    I:=1;
    goto TYPEODE[if TYPE=1 then 1 else TYPE+ORDER-1];

    NOTSPECIFIED2: for LBD:=1/9,1/8,1/7,1/6,1/5,1/4,1/3,1/2,4.3 do 
                   begin LAMBDA[I]:=LBD; I:=I+1 end;
                   goto EXIT;

    PARABOLIC1:    for LBD:=.1418519249"-2,.3404154076"-2,.0063118569
                              ,.01082794375,.01842733851,.03278507942,
                              .0653627415,.1691078577,156 do 
                   begin LAMBDA[I]:=LBD; I:=I+1 end;
                   goto EXIT;

    PARABOLIC2:    for LBD:=.3534355908"-2,.8532600867"-2,.015956206
                              ,.02772229155,.04812587964,.08848689452,
                              .1863578961,.5,64 do 
                   begin LAMBDA[I]:=LBD; I:=I+1 end;
                   goto EXIT;

    HYPERBOLIC2:   for LBD:=1/8,1/20,5/32,2/17,17/80,5/22,11/32,1/2,
                              8 do 
                   begin LAMBDA[I]:=LBD; I:=I+1 end;
                   goto EXIT;
    EXIT: SIG:=SIGN(TE-T)

    end INITIALIZE;

   procedure DIFFERENCE SCHEME;
   begin integer I;real MLT;

       DER(T,U,DU);
       for I:=1 step 1 until 8 do 
       begin MLT:=LAMBDA[I]*TAU;
          DUPMAT(1,N,1,M,UH,U);
          ELMMAT(UH,DU,MLT);
          DER(T+MLT,UH,DU)
       end;
       ELMMAT(U,DU,TAU);
       T:=if LAST then TE else T+TAU;
    end DIFFERENCE SCHEME;

    INITIALIZE; LAST:=false;

    STEP:
    TAU:=(if SPR=0 then ABS(TE-T) else ABS(LAMBDA[9]/SPR))*SIG;
    if T+TAU >= TE eqv TAU>=0 then 
    begin TAU:=TE-T;LAST:=true end;
    DIFFERENCE SCHEME ; OUT;
    if not LAST then goto STEP

end ARKMAT;
        eop