code 33308;
procedure FEM LAG SPHER(X, Y, N, NC, R, F, ORDER, E);
value N, NC, ORDER; integer N, NC, 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,
TAU3, B3, A13, A22, A23, C32, C12,
E1, E2, E3, E4, E5, E6;
array T, SUB, CHI, GI[0:N-1];
procedure ELEMENT MAT VEC EVALUATION 1;
begin real XM, VL, VR,WL, WR, PR, RM, FM, XL2, XLXR, XR2;
if NC = 0 then VL:= VR:= 0.5 else if NC = 1 then
begin VL:= (XL1*2 + XL)/6; VR:= (XL1 + XL*2)/6 end else
begin XL2:= XL1*XL1/12; XLXR:=XL1*XL/6; XR2:=XL*XL/12;
VL:= 3*XL2 + XLXR + XR2;
VR:= 3*XR2 + XLXR + XL2
end;
WL:= H*VL; WR:=H*VR; PR:= VR/(VL +VR);
XM:= XL1 + H*PR; FM:= F(XM); RM:=R(XM);
TAU1:= WL*RM; TAU2:=WR*RM;
B1:= WL*FM; B2:= WR*FM; A12:= - (VL + VR)/H + H*(1 - PR)*PR*RM
end ELEM. M.V. EV.;
procedure ELEMENT MAT VEC EVALUATION 2;
begin real XLM, XRM, VLM, VRM, WLM, WRM, FLM, FRM,
RLM, RRM, PL1, PL2, PL3, PR1, PR2, PR3, QL1, QL2, QL3,
RLMPL1, RLMPL2, RLMPL3, RRMPR1, RRMPR2, RRMPR3,
VLMQL1, VLMQL2, VLMQL3, VRMQR1, VRMQR2, VRMQR3,
QR1, QR2,QR3;
if NC = 0 then
begin XLM:=XL1 + H*0.2113248654052; XRM:= XL1 + XL - XLM;
VLM:= VRM:= 0.5;
PL1:= PR3:= 0.45534180126148; PL3:= PR1:= -0.12200846792815;
PL2:= PR2:= 1 - PL1 - PL3;
QL1:= - 2.15470053837925; QL3:= -0.15470053837925;
QL2:= - QL1 - QL3; QR1:= - QL3; QR3:= - QL1; QR2:= - QL2;
end else if NC = 1 then
begin real A, A2, A3, A4, B, B2, B3, B4, P4H,
P2, P3, P4, AUX1, AUX2;
A:= XL1; A2:= A*A; A3:= A*A2; A4:= A*A3;
B:= XL; B2:= B*B; B3:= B*B2; B4:= B*B3;
P2:= 10*(A2 + 4*A*B + B2); P3:= 6*(A3 + 4*(A2*B + A*B2) + B3);
P4:= SQRT(6*(A4 + 10*(A*B3 + A3*B) + 28*A2*B2 + B4));
P4H:= P4*H; XLM:= (P3 - P4H)/P2; XRM:= (P3 + P4H)/P2;
AUX1:= (A + B)/4; AUX2:= H*(A2 + 7*A*B + B2)/6/P4;
VLM:= AUX1 - AUX2; VRM:= AUX1 + AUX2;
end else
begin real A, A2, A3, A4, A5, A6, A7, A8,
B, B2, B3, B4, B5, B6, B7, B8, AB4, A2B3, A3B2, A4B,
P4, P5, P8, P8H, AUX1, AUX2;
A:= XL1; A2:= A*A; A3:= A*A2; A4:= A*A3; A5:= A*A4; A6:= A*A5;
A7:= A*A6; A8:= A*A7;
B:= XL; B2:= B*B; B3:= B*B2; B4:= B*B3; B5:= B*B4; B6:= B*B5;
B7:= B*B6; B8:= B*B7;
AB4:= A*B4; A2B3:= A2*B3; A3B2:= A3*B2; A4B:=A4*B;
P4:= 15*(A4 + 4*(A3*B + A*B3) + 10*A2*B2 + B4);
P5:= 10*(A5 + 4*(A4B + AB4) + 10*(A3B2 + A2B3) + B5);
P8:= SQRT(10*(A8 + 10*(A7*B + A*B7) + 55*(A2*B6 + A6*B2)
+ 164*(A5*B3 +A3*B5) + 290*A4*B4 + B8));
AUX1:= (A2 +A*B + B2)/6; P8H:= P8*H;
AUX2:= (H*(A5 + 7*(A4B + AB4) + 28*(A3B2 + A2B3) + B5))/4.8/P8;
XLM:= (P5 - P8H)/P4; XRM:= (P5 + P8H)/P4;
VLM:= AUX1 - AUX2; VRM:= AUX1 + AUX2
end;
if NC > 0 then
begin real AUX, PLM, PRM;
PLM:= (XLM - XL1)/H; PRM:= (XRM - XL1)/H;
AUX:= 2*PLM - 1; PL1:= AUX*(PLM - 1); PL3:= AUX*PLM;
PL2:= 1 - PL1 - PL3;
AUX:= 2*PRM - 1; PR1:= AUX*(PRM - 1); PR3:= AUX*PRM;
PR2:= 1 - PR1 - PR3;
AUX:= 4*PLM; QL1:= AUX - 3; QL3:= AUX - 1; QL2:= - QL1 - QL3;
AUX:= 4*PRM; QR1:= AUX - 3; QR3:= AUX - 1; QR2:= - QR1 - QR3;
end;
WLM:= H*VLM; WRM:= H*VRM; VLM:= VLM/H; VRM:= VRM/H;
FLM:= F(XLM)*WLM; FRM:= WRM*F(XRM);
RLM:= R(XLM)*WLM; RRM:= WRM*R(XRM);
TAU1:= PL1*RLM + PR1*RRM;
TAU2:= PL2*RLM + PR2*RRM;
TAU3:= PL3*RLM + PR3*RRM;
B1:= PL1*FLM + PR1*FRM;
B2:= PL2*FLM + PR2*FRM;
B3:= PL3*FLM + PR3*FRM;
VLMQL1:= QL1*VLM; VRMQR1:= QR1*VRM;
VLMQL2:= QL2*VLM; VRMQR2:= QR2*VRM;
VLMQL3:= QL3*VLM; VRMQR3:= QR3*VRM;
RLMPL1:= RLM*PL1; RRMPR1:= RRM*PR1;
RLMPL2:= RLM*PL2; RRMPR2:= RRM*PR2;
RLMPL3:= RLM*PL3; RRMPR3:= RRM*PR3;
A12:= VLMQL1*QL2 + VRMQR1*QR2 + RLMPL1*PL2 + RRMPR1*PR2;
A13:= VLMQL1*QL3 + VRMQR1*QR3 + RLMPL1*PL3 + RRMPR1*PR3;
A22:= VLMQL2*QL2 + VRMQR2*QR2 + RLMPL2*PL2 + RRMPR2*PR2;
A23:= VLMQL2*QL3 + VRMQR2*QR3 + RLMPL2*PL3 + RRMPR2*PR3;
comment STATIC CONDENSATION;
C12:= - A12/A22; C32:= - A23/A22; A12:= A13 + C32*A12;
B1:= B1 + C12*B2; B2:= B3 + C32*B2;
TAU1:= TAU1 + C12*TAU2; TAU2:= TAU3 + C32*TAU2
end ELEMENT MAT VEC EVALUATION 2;
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 real AUX;
AUX:= (if NC = 0 then 1 else X[0]**NC)/E2;
B1:= B1 - E3*AUX; TAU1:= TAU1 - E1*AUX
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 real AUX;
AUX:= (if NC = 0 then 1 else X[N]**NC)/E5;
TAU2:= TAU2 + AUX*E4; B2:= B2 + AUX*E6
end B.C.1;
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
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
ELEMENT MAT VEC EVALUATION 2;
if L=1 or L=N then BOUNDARY CONDITIONS;
FORWARD BABUSHKA
end;
BACKWARD BABUSHKA;
end FEM LAG SPHER;
eop