code 33301;
procedure FEM LAG(X, Y, N, R, F, ORDER, E);
value N, ORDER; integer N, ORDER;
real procedure R, F;
array X, Y, E;
begin integer L, L1;
real XL1, XL, H, A12, B1, B2, TAU1, TAU2, CH, TL, G, YL, PP,
E1, E2, E3, E4, E5, E6;
array T, SUB, CHI, GI[0: N-1];
procedure ELEMENT MAT VEC EVALUATION 1;
begin own real F2, R2; real R1, F1, H2;
if L=1 then
begin F2:= F(XL1); R2:= R(XL1) end;
A12:= - 1/H; H2:= H/2;
R1:= R2; R2:= R(XL); F1:= F2; F2:= F(XL);
B1:= H2*F1; B2:= H2*F2; TAU1:= H2*R1; TAU2:= H2*R2
end ELEMENT MAT VEC EVALUATION 1
procedure ELEMENT MAT VEC EVALUATION 2;
begin own real R3, F3;
real R1, R2, F1, F2, X2, H6, H15,
B3, TAU3, C12, A13, A22, A23;
if L=1 then
begin R3:= R(XL1); F3:= F(XL1) end;
X2:= (XL1 + XL)/2; H6:= H/6; H15:= H/1.5;
R1:= R3; R2:= R(X2); R3:= R(XL);
F1:= F3; F2:= F(X2); F3:= F(XL);
B1:= H6*F1; B2:= H15*F2; B3:= H6*F3;
TAU1:= H6*R1; TAU2:= H15*R2; TAU3:= R3*H6;
A12:= A23:= -8/H/3; A13:= - A12/8; A22:= -2*A12 + TAU2;
comment STATIC CONDENSATION;
C12:= - A12/A22; A12:= A13 + C12*A12;
B2:= C12*B2; B1:= B1 + B2; B2:= B3 + B2;
TAU2:= C12*TAU2; TAU1:= TAU1 + TAU2; TAU2:= TAU3 + TAU2
end ELEMENT MAT VEC EVALUATION2;
procedure ELEMENT MAT VEC EVALUATION 3;
begin own real R4, F4;
real R1, R2, R3, F1, F2, F3, X2, X3, H12, H24,
DET, C12, C13, C42, C43, A13, A14, A22, A23, A24,
A33, A34, B3, B4, TAU3, TAU4;
if L=1 then
begin R4:= R(XL1); F4:= F(XL1) end;
X2:= XL1 + 0.27639320225*H; X3:= XL - X2 + XL1;
R1:= R4; R2:= R(X2); R3:= R(X3); R4:= R(XL);
F1:= F4; F2:= F(X2); F3:= F(X3); F4:= F(XL);
H12:= H/12; H24:= H/2.4;
B1:= F1*H12; B2:= F2*H24; B3:= F3*H24; B4:= F4*H12;
TAU1:= R1*H12; TAU2:= R2*H24; TAU3:= R3*H24; TAU4:= R4*H12;
A12:= A34:= -4.8784183052078/H; A13:= A24:= 0.7117516385412/H;
A14:= -0.16666666666667/H; A23:= 25*A14;
A22:= -2*A23 + TAU2; A33:= -2*A23 + TAU3;
comment STATIC CONDENSATION;
DET:= A22*A33 - A23*A23;
C12:= (A13*A23 - A12*A33)/DET;
C13:= (A12*A23 - A13*A22)/DET;
C42:= (A23*A34 - A24*A33)/DET;
C43:= (A24*A23 - A34*A22)/DET;
TAU1:= TAU1 + C12*TAU2 + C13*TAU3;
TAU2:= TAU4 + C42*TAU2 + C43*TAU3;
A12:= A14 + C42*A12 + C43*A13;
B1:= B1 + C12*B2 + C13*B3;
B2:= B4 + C42*B2 + C43*B3
end ELEMENT MAT VEC EVALUATION3
procedure BOUNDARY CONDITIONS;
if L=1 and E2 = 0 then
begin TAU1:= 1; B1:= E3/E1; B2:= B2 - A12*B1;
TAU2:= TAU2 - A12; A12:= 0 end
else if L=1 and E2 ^= 0 then
begin TAU1:= TAU1 - E1/E2;
B1:= B1 - E3/E2
end else if L=N and E5 = 0 then
begin TAU2:= 1; B2:= E6/E4; B1:= B1 - A12*B2;
TAU1:= TAU1 - A12; A12:= 0
end else if L=N and E5 ^= 0 then
begin TAU2:= TAU2 + E4/E5;
B2:= B2 + E6/E5
end BOUNDARY CONDITIONS;
procedure FORWARD BABUSHKA;
if L=1 then
begin CHI[0]:= CH:= TL:= TAU1; T[0]:= TL;
GI[0]:= G:= YL:= B1; Y[0]:= YL;
SUB[0]:= A12; PP:= A12/(CH - A12); CH:= TAU2 - CH*PP;
G:= B2 - G*PP; TL:= TAU2; YL:= B2
end else
begin CHI[L1]:= CH:= CH + TAU1;
GI[L1]:= G:= G + B1; SUB[L1]:= A12; PP:= A12/(CH - A12);
CH:= TAU2 - CH*PP; G:= B2 - G*PP;
T[L1]:= TL + TAU1; TL:= TAU2;
Y[L1]:= YL + B1; YL:= B2
end FORWARD BABUSHKA 1;
procedure BACKWARD BABUSHKA;
begin PP:= YL; Y[N]:= G/CH;
G:= PP; CH:= TL; L:= N;
for L:= L - 1 while L >= 0 do
begin PP:= SUB[L]; PP:= PP/(CH - PP);
TL:= T[L]; CH:= TL - CH*PP;
YL:= Y[L]; G:= YL - G*PP;
Y[L]:=((GI[L] + G) - YL)/((CHI[L] + CH) - TL)
end
end BACKWARD BABUSHKA;
L:= 0; XL:= X[0];
E1:= E[1]; E2:= E[2]; E3:= E[3]; E4:= E[4]; E5:= E[5]; E6:= E[6];
for L:= L + 1 while L <= N do
begin L1:= L - 1; XL1:= XL; XL:= X[L]; H:= XL - XL1;
if ORDER = 2 then ELEMENT MAT VEC EVALUATION 1 else
if ORDER = 4 then ELEMENT MAT VEC EVALUATION 2 else
ELEMENT MAT VEC EVALUATION 3;
if L=1 or L=N then BOUNDARY CONDITIONS;
FORWARD BABUSHKA
end;
BACKWARD BABUSHKA;
end FEM LAGR
eop