> restart:
> # Finite Element Algorithm 12.5
> #
> # To approximate the solution to an elliptic partial-differential
> # equation subject to Dirichlet, mixed, or Neumann boundary
> # conditions:
> #
> # Input:   see STEP 0
> #
> # Output:  description of triangles, nodes, line integrals, basis
> #          functions, linear system to be solved, and the
> #          coefficients of the basis functions
> #
> #
> # Step 0
> # General outline
> #
> #    1. Triangles numbered: 1 to K for triangles with no edges on
> #       Script-S-1 or Script-S-2, K+1 to N for triangles with
> #       edges on script-S-2, N+1 to M for remaining triangles.
> #       Note: K=0 implies that no triangle is interior to D.
> #       Note: M=N implies that all triangles have edges on
> #       script-S-2.
> #
> #    2. Nodes numbered: 1 to LN for interior nodes and nodes on
> #       script-S-2, LN+1 to LM for nodes on script-S-1.
> #       Note: LM and LN represent lower case m and n resp.
> #       Note: LN=LM implies that script-S-1 contains no nodes.
> #       Note: If a node is on both script-S-1 and script-S-2, 
> #       it should be treated as if it were only on script-S-1.
> #
> #    3. NL=number of line segments on script-S-2
> #       line(I,J) is an NL by 2 array where
> #       line(I,1)= first node on line I and
> #       line(I,2)= second node on line I taken
> #       in positive direction along line I
> #
> #    4. For the node labelled KK,KK=1,...,LM we have:
> #       A) coordinates XX(KK),YY(KK)
> #       B) number of triangles in which KK is a vertex= LL(KK)
> #       C) II(KK,J) labels the triangles KK is in and
> #       NV(KK,J) labels which vertex node KK is for
> #       each J=1,...,LL(KK)
> #
> #    5. NTR is an M by 3 array where
> #       NTR(I,1)=node number of vertex 1 in triangle I
> #       NTR(I,2)=node number of vertex 2 in triangle I
> #       NTR(I,3)=node number of vertex 3 in triangle I
> #
> #    6. Function subprograms:
> #       A) P,Q,R,F,G,G1,G2 are the functions specified by
> #          the particular differential equation
> #       B) RR is the integrand
> #          R*N(J)*N(K) on triangle I in step 4
> #       C) FFF is the integrand F*N(J) on triangle I in step 4
> #       D) GG1=G1*N(J)*N(K)
> #          GG2=G2*N(J)
> #          GG3=G2*N(K)
> #          GG4=G1*N(J)*N(J)
> #          GG5=G1*N(K)*N(K)
> #          integrands in step 5
> #       E) QQ(FF) computes the double integral of any
> #          integrand FF over a triangle with vertices given by
> #          nodes J1,J2,J3 - the method is an O(H**2) approximation
> #          for triangles
> #       F) SQ(PP) computes the line integral of any integrand PP
> #          along the line from (XX(J1),YY(J1)) to (XX(J2),YY(J2))
> #          by using a parameterization given by:
> #          X=XX(J1)+(XX(J2)-XX(J1))*T
> #          Y=YY(J1)+(YY(J2)-YY(J1))*T
> #          for 0 <= t <= 1
> #          and applying Simpson's composite method with H=.01
> #
> #    7. Arrays:
> #       A) A,B,C are M by 3 arrays where the basis function N
> #          for the Ith triangle, Jth vertex is
> #          N(X,Y)=A(I,J)+B(I,J)*X+C(I,J)*Y
> #          for J=1,2,3 and I=1,2,...,M
> #       B) XX,YY are LM by 1 arrays to hold coordinates of nodes
> #       C) line,LL,II,NV,NTR have been explained above
> #       D) GAMMA1 and Alpha are clear
> #
> #    8. Note that A,B,C,XX,YY,I,I1,I2,J1,J2,J3,Delta are reserved
> #       storage so that in any subprogram we know that
> #       triangle I has vertices (XX(J1),YY(J1)),(XX(J2),YY(J2)),
> #       (XX(J3),YY(J3)). That is, vertex 1 is node J1, vertex 2 
> #       is node J2, vertex 3 is node J3 unless a line integral is
> #       involved in which case the line integral goes from node J1
> #       to node J2 in triangle I or unless vertex I1 is node J1
> #       and vertex I2 is node J2 - the basis functions involve
> #       A(I,I1)+B(I,I1)*X+C(I,I1)*Y for vertex I1 in triangle I
> #       and A(I,I2)+B(I,I2)*X+C(I,I2)*Y for vertex I2 in triangle
> #       I delta is 1/2 the area of triangle I
> #
> #  To change problems:
> #    1) change function subprograms P,Q,R,F,G,G1,G2
> #    2) change data input for K,N,M,LN,LM,NL.
> #    3) change data input for XX,YY,LLL,II,NV.
> #    4) change data input for line.
> global P,Q,R,F,G,G1,G2,G3,G4,G5,RR,FFF,GG1,GG2,GG3,GG4,GG5,QQ,SQ,S:
> # The following code is commented out.  It could be used to include
> # the functions P, Q, R, F, G, G1 as part of the code.
> #P := proc(X,Y) local p:
> #p := 1:
> #RETURN(p):
> #Q := proc(X,Y) local q:
> #q := 1:
> #RETURN(q):
> #R := proc(X,Y) local r:
> #r := 0:
> #RETURN(r):
> #F := proc(X,Y) local f:
> #f := 0:
> #RETURN(f):
> #G := proc(X,Y) local g:
> #g :=  4:
> #RETURN(g):
> #end:
> #G1 := proc(X,Y) local g1:
> #g1 :=  0:
> #RETURN(g1):
> #end:
> # Function G2 is defined in code for this example instead of input
> G2 := proc(X,Y) local T, Z1, g2:
> T := 1.0E-05:
> Z1 := 0:
> if 0.2-T <= X and X <= 0.4+T and abs(Y-0.2) <= T then
> Z1 := X:
> fi:
> if 0.5-T <= X and X <= (0.6+T) and abs(Y-0.1) <= T then
> Z1 := X:
> fi:
> if -T <= Y and Y <= 0.1+T and abs(X-0.6) <= T then
> Z1 := Y:
> fi:
> if -T <= X and X <= 0.2+T and abs(Y+X-0.4) <= T then
> Z1 := (X+Y)/sqrt(2):
> fi:
> if 0.4 -T <= X and X <= 0.5+T and abs(Y+X-0.6) <= T then
> Z1 := (X+Y)/sqrt(2):
> fi:
> g2 := Z1:
> RETURN(g2):
> end:
> RR := proc(X,Y,A,B,C,I3,I1,I2) local rr:
> rr := R(X,Y)*(A[I3-1,I1-1]+B[I3-1,I1-1]*X+C[I3-1,I1-1]*Y)*(A[I3-1,I2-1]+B[I3-1,I2-1]*X+C[I3-1,I2-1]*Y):
> RETURN(rr):
> end:
> FFF := proc(X,Y,A,B,C,I3,I1) local fff:
> fff := F(X,Y)*(A[I3-1,I1-1]+B[I3-1,I1-1]*X+C[I3-1,I1-1]*Y):
> RETURN(fff):
> end:
> GG1 := proc(X,Y,A,B,C,I3,I1,I2) local gg1:
> gg1 := G1(X,Y)*(A[I3-1,I1-1]+B[I3-1,I1-1]*X+C[I3-1,I1-1]*Y)*(A[I3-1,I2-1]+B[I3-1,I2-1]*X+C[I3-1,I2-1]*Y):
> RETURN(gg1):
> end:
> GG2 := proc(X,Y,A,B,C,I3,I1) local gg2:
> gg2 := G2(X,Y)*(A[I3-1,I1-1]+B[I3-1,I1-1]*X+C[I3-1,I1-1]*Y):
> RETURN(gg2):
> end:
> GG3 := proc(X,Y,A,B,C,I3,I2) local gg3:
> gg3 := G2(X,Y)*(A[I3-1,I2-1]+B[I3-1,I2-1]*X+C[I3-1,I2-1]*Y):
> RETURN(gg3):
> end:
> GG4 := proc(X,Y,A,B,C,I3,I1) local gg4:
> gg4 := G1(X,Y)*(A[I3-1,I1-1]+B[I3-1,I1-1]*X+C[I3-1,I1-1]*Y)*(A[I3-1,I1-1]+B[I3-1,I1-1]*X+C[I3-1,I1-1]*Y):
> RETURN(gg4):
> end:
> GG5 := proc(X,Y,A,B,C,I3,I2) local gg5:
> gg5 := G1(X,Y)*(A[I3-1,I2-1]+B[I3-1,I2-1]*X+C[I3-1,I2-1]*Y)*(A[I3-1,I2-1]+B[I3-1,I2-1]*X+C[I3-1,I2-1]*Y):
> RETURN(gg5):
> end:
> QQ := proc(L,XX,YY,DELTA,J1,J2,J3,I1,I2,A,B,C)  local X, Y, I3, T1, T2, T3, QQQ, qq: global S:
> X[0] := XX[J1-1]:
> Y[0] := YY[J1-1]:
> X[1] := XX[J2-1]:
> Y[1] := YY[J2-1]:
> X[2] := XX[J3-1]:
> Y[2] := YY[J3-1]:
> X[3] := 0.5*(X[0]+X[1]):
> Y[3] := 0.5*(Y[0]+Y[1]):
> X[4] := 0.5*(X[0]+X[2]):
> Y[4] := 0.5*(Y[0]+Y[2]):
> X[5] := 0.5*(X[1]+X[2]):
> Y[5] := 0.5*(Y[1]+Y[2]):
> X[6] := (X[0]+X[1]+X[2])/3.0:
> Y[6] := (Y[0]+Y[1]+Y[2])/3.0:
> if L = 1 then
> for I3 from 1 to 7 do
> S[I3-1] := P(X[I3-1],Y[I3-1]):
> od:    
> fi:
> if L = 2 then
> for I3 from 1 to 7 do
> S[I3-1] := Q(X[I3-1],Y[I3-1]):
> od:    
> fi:
> if L = 3 then
> for I3 from 1 to 7 do
> S[I3-1] := RR(X[I3-1],Y[I3-1],A,B,C,I3,I1,I2):
> od:    
> fi:
> if L = 4 then
> for I3 from 1 to 7 do
> S[I3-1] := FFF(X[I3-1],Y[I3-1],A,B,C,I3,I1):
> od:    
> fi:
> T1 := 0:
> for I3 from 1 to 3 do
> T1 := T1+S[I3-1]:
> od:
> T2 := 0:
> for I3 from 4 to 6 do
> T2 := T2+S[I3-1]:
> od:
> T3 := S[6]:
> QQQ := 0.5*(T1/20+2*T2/15+9*T3/20)*abs(DELTA):
> qq := QQQ:
> RETURN(qq):
> end:
> SQ := proc(L,XX,YY,J1,J2,I3,I1,I2,A,B,C)  local X1, Y1, X2, Y2, H, T1, T2, T3, K, X, Q3, Q1, Q2, SSQ, sq: global S:
> X1 := XX[J1-1]:
> Y1 := YY[J1-1]:
> X2 := XX[J2-1]:
> Y2 := YY[J2-1]:
> H := 0.01:
> T1 := X2-X1:
> T2 := Y2-Y1:
> T3 := sqrt(T1*T1+T2*T2):
> for K from 1 to 101 do
> X := (K-1)*H:
> if L = 1 then
> S[K-1] := T3*GG1(T1*X+X1,T2*X+Y1,A,B,C,I3,I1,I2):
> fi:
> if L = 2 then
> S[K-1] := T3*GG2(T1*X+X1,T2*X+Y1,A,B,C,I3,I1):
> fi:
> if L = 3 then
> S[K-1] := T3*GG3(T1*X+X1,T2*X+Y1,A,B,C,I3,I2):
> fi:
> if L = 4 then
> S[K-1] := T3*GG4(T1*X+X1,T2*X+Y1,A,B,C,I3,I1):
> fi:
> if L = 5 then
> S[K-1] := T3*GG5(T1*X+X1,T2*X+Y1,A,B,C,I3,I2):
> fi:
> od:
> Q3 := S[0]+S[100]:
> Q1 := 0:
> Q2 := S[99]:
> for K from 1 to 49 do
> Q1 := Q1+S[2*K]:
> Q2 := Q2+S[2*K-1]:
> od:
> SSQ := (Q3+2*Q1+4*Q2)*H/3:
> sq := SSQ:
> RETURN(sq):
> end:
> print(`This is the Finite Element Method.`):
> OK := FALSE:
> print(`The input will be from a text file in the following form:`):
> print(`K  N  M  n  m  nl`):
> print(`Each of the above is an integer -`):
> print(`separate with at least one blank.`):
> print(`Follow with the input for each node in the form:`):
> print(`x-coord., y-coord., number of triangles in which the`):
> print(` node is a vertex.`):
> print(`Continue with the triangle number and vertex number for`):
> print(`each triangle in which the node is a vertex.`):
> print(`Separate each entry with at least one blank.`):
> print(`After all nodes have been entered follow with information`):
> print(`on the lines over which line integrals must be computed.`):
> print(`The format of this data will be the node number of the`):
> print(`starting node, followed by the node number of the ending`):
> print(`node for each line, taken in the positive direction.`):
> print(`There should be 2 * nl such entries, each an integer`):
> print(`separated by a blank.`):
> print(`Functions can be input or coded as procedures.`):
> print(`The example has G2 as a procedure and the rest`):
> print(`as input.`):
> print(`Are the functions P,Q,R,F,G,G1,G2 ready for input or`):
> print(`have they been included in code and has the input `):
> print(`file been created?  Answer 1 for yes or 2 for no.`):
> AA := scanf(`%d`)[1]:  print(`Input is `): print(AA):
> if AA = 1 then
> print(`Input function P(X,Y) in terms of x and y`):
> P := scanf(`%a`)[1]: print(`P(x,y) = `): print(P):
> P := unapply(P,x,y):
> print(`Input function Q(X,Y) in terms of x and y`):
> Q := scanf(`%a`)[1]: print(`Q(x,y) = `): print(Q):
> Q := unapply(Q,x,y):
> print(`Input function R(X,Y) in terms of x and y`):
> R := scanf(`%a`)[1]: print(`R(x,y) = `): print(R):
> R := unapply(R,x,y):
> print(`Input function F(X,Y) in terms of x and y`):
> F := scanf(`%a`)[1]: print(`F(x,y) = `): print(F):
> F := unapply(F,x,y):
> print(`Input function G(X,Y) in terms of x and y`):
> G := scanf(`%a`)[1]: print(`G(x,y) = `): print(G):
> G := unapply(G,x):
> print(`Input function G1(X,Y) in terms of x and y`):
> G1 := scanf(`%a`)[1]: print(`G1(x,y) = `): print(G1):
> G1 := unapply(G1,x):
> #print(`Input function G2(X) in terms of x`):
> #G2 := scanf(`%a`)[1]: print(`G2(x,y) = `): print(G2):
> #G2 := unapply(G2,x):
> print(`Input the file name in the form - drive:\\name.ext`):
> print(`for example:  A:\\DATA.DTA`):
> NAME := scanf(`%s`)[1]:  print(`Input file is `): print(NAME):
> INP := fopen(NAME,READ,TEXT):
> OK := TRUE:
> K := fscanf(INP, `%d`)[1]:
> N := fscanf(INP, `%d`)[1]:
> M := fscanf(INP, `%d`)[1]:
> LN1 := fscanf(INP, `%d`)[1]:
> LM := fscanf(INP, `%d`)[1]:
> NL := fscanf(INP, `%d`)[1]:
> for KK from 1 to LM do
> XX[KK-1] := fscanf(INP, `%f`)[1]:
> YY[KK-1] := fscanf(INP, `%f`)[1]:
> LLL := fscanf(INP, `%d`)[1]:
> for J from 1 to LLL do
> II[KK-1,J-1] := fscanf(INP, `%d`)[1]:
> NV[KK-1,J-1] := fscanf(INP, `%d`)[1]:
> od:
> LL[KK-1] := LLL:
> for J from 1 to LLL do
> N1 := II[KK-1,J-1]:
> N2 := NV[KK-1,J-1]:
> NTR[N1-1,N2-1] := KK:
> od:
> od:
> if NL > 0 then
> for I3 from 1 to NL do
> for J from 1 to 2 do
> LINE1[I3-1,J-1] := fscanf(INP, `%d`)[1]:
> od:
> od:
> fi:
> fclose(INP):
> else
> print(`The program will end so that the input file `):
> print(`can be created and the functions defined.`):
> fi:
> if OK = TRUE then
> print(`Choice of output method:`):
> print(`1. Output to screen`):
> print(`2. Output to text file`):
> print(`Please enter 1 or 2.`):
> FLAG := scanf(`%d`)[1]: print(`Input is `): print(FLAG):
> if FLAG = 2 then
> print(`Input the file name in the form - drive:\\name.ext`):
> print(`for example:  A:\\OUTPUT.DTA`):
> NAME := scanf(`%s`)[1]: print(`Output file is `): print(NAME):
> OUP := fopen(NAME,WRITE,TEXT):
> else
> OUP := default:
> fi:
> fprintf(OUP, `FINITE ELEMENT METHOD\n\n\n`):
> K1 := K+1:
> N1 := LN1+1:
> fprintf(OUP, `Vertices and Nodes of Triangles\n`):
> fprintf(OUP, `Triangle-node number for vertex 1 to 3\n`):
> for I3 from 1 to M do
> fprintf(OUP, ` %5d`, I3):
> for J from 1 to 3 do
> fprintf(OUP, ` %4d`, NTR[I3-1,J-1]):
> od:
> fprintf(OUP, `\n`):
> od:
> fprintf(OUP, `x and y coordinates of nodes\n`):
> for KK from 1 to LM do
> fprintf(OUP, `%5d %11.8f %11.8f\n`, KK, XX[KK-1], YY[KK-1]):
> od:
> fprintf(OUP, `Lines of the Domain\n`):
> for KK from 1 to NL do
> fprintf(OUP, `%5d %4d %4d\n`, KK, LINE1[KK-1,0], LINE1[KK-1,1]):
> od:
> # Step 1
> if LM <> LN1 then
> for L from N1 to LM do
> GAMMA1[L-1] := G(XX[L-1],YY[L-1]):
> od:
> fi:
> # Step 2 - initialization of ALPHA
> # Note that ALHPA[I,LN1+1] = BETA[I]
> for I3 from 1 to LN1 do
> for J from 1 to N1 do
> ALPHA[I3-1,J-1] := 0:
> od:
> # Steps 3, 4 and 6 - 12 are within the next loop
> # For each triangle I let node J1 be vertex 1, node J2 be vertex 2,
> # and node J3 be vertex 3
> # Step 3
> od:
> for I3 from 1 to M do
> J1 := NTR[I3-1,0]:
> J2 := NTR[I3-1,1]:
> J3 := NTR[I3-1,2]:
> DELTA := 
> XX[J2-1]*YY[J3-1]-XX[J3-1]*YY[J2-1]-XX[J1-1]*(YY[J3-1]-YY[J2-1])+YY[J1-1]*
> (XX[J3-1]-XX[J2-1]):
> A[I3-1,0] := (XX[J2-1]*YY[J3-1]-YY[J2-1]*XX[J3-1])/DELTA:
> B[I3-1,0] := (YY[J2-1]-YY[J3-1])/DELTA:
> C[I3-1,0] := (XX[J3-1]-XX[J2-1])/DELTA:
> A[I3-1,1] := (XX[J3-1]*YY[J1-1]-YY[J3-1]*XX[J1-1])/DELTA:
> B[I3-1,1] := (YY[J3-1]-YY[J1-1])/DELTA:
> C[I3-1,1] := (XX[J1-1]-XX[J3-1])/DELTA:
> A[I3-1,2] := (XX[J1-1]*YY[J2-1]-YY[J1-1]*XX[J2-1])/DELTA:
> B[I3-1,2] := (YY[J1-1]-YY[J2-1])/DELTA:
> C[I3-1,2] := (XX[J2-1]-XX[J1-1])/DELTA:
> # Step 4
> # I1 = J for Step 4 and I1 = K for Step 7
> for I1 from 1 to 3 do
> # Step 8
> JJ1 := NTR[I3-1,I1-1]:
> # I2 = K for Step 4 and I2 = J for Step 9
> for I2 from 1 to I1 do
> # Steps 4 and 10
> JJ2 := NTR[I3-1,I2-1]:
> ZZ := B[I3-1,I1-1]*B[I3-1,I2-1]*QQ(1,XX,YY,DELTA,J1,J2,J3,I1,I2,A,B,C)+C[I3-1,I1-1]*C[I3-1,I2-1]*QQ(2,XX,YY,DELTA,J1,J2,J3,I1,I2,A,B,C)-QQ(3,XX,YY,DELTA,J1,J2,J3,I1,I2,A,B,C):
> # Steps 11 and 12
> if JJ1 <= LN1 then
> if JJ2 <= LN1 then
> ALPHA[JJ1-1,JJ2-1] := ALPHA[JJ1-1,JJ2-1]+ZZ:
> if JJ1 <> JJ2 then
> ALPHA[JJ2-1,JJ1-1] := ALPHA[JJ2-1,JJ1-1]+ZZ:
> fi:
> else
> ALPHA[JJ1-1,N1-1] := ALPHA[JJ1-1,N1-1]-ZZ*GAMMA1[JJ2-1]:
> fi:
> else
> if JJ2 <= LN1 then
> ALPHA[JJ2-1,N1-1] := ALPHA[JJ2-1,N1-1]-ZZ*GAMMA1[JJ1-1]:
> fi:
> fi:
> od:
> HH := -QQ(4,XX,YY,DELTA,J1,J2,J3,I1,I2,A,B,C):
> if JJ1 <= LN1 then
> ALPHA[JJ1-1,N1-1] := ALPHA[JJ1-1,N1-1]+HH:
> fi:
> od:
> od:
> # Output the basis functions
> fprintf(OUP, `Basis Functions\n`):
> fprintf(OUP, `Triangle - Vertex - Node - Function\n`):
> for I3 from 1 to M do
> for J from 1 to 3 do
> fprintf(OUP, `%4d %3d %3d %13.8f %13.8f %13.8f\n`, I3, J, NTR[I3-1,J-1], 
> A[I3-1,J-1],B[I3-1,J-1], C[I3-1,J-1]):
> od:
> od:
> # Step 5
> # For each line segment JI = 1, ..., NL and for each triangle I,
> # I = K1, ..., N which may contain line JI search all 3
> # vertices for possible correspondences.
> # Step 5 and Steps 13 - 19
> if NL <> 0 and N <> K then
> for JI from 1 to NL do
> for I3 from K1 to N do
> for I1 from 1 to 3 do
> # I1 = J in Step 5 and I1 = K in Step 14
> # Step 15
> J1 := NTR[I3-1,I1-1]:
> if LINE1[JI-1,0] = J1 then
> for I2 from 1 to 3 do
> # I2 = K in Step 5 and I2 = J in Step 16
> # Step 17
> J2 := NTR[I3-1,I2-1]:
> if LINE1[JI-1,1] = J2 then
> # There is a correspondence of vertix I1 in triangle I with node J1
> # as the start of line JI and vertex I2 with node J2 as the
> # end of line JI
> # Step 5
> XJ := SQ(1,XX,YY,J1,J2,I3,I1,I2,A,B,C):
> XJ1 := SQ(4,XX,YY,J1,J2,I3,I1,I2,A,B,C):
> XJ2 := SQ(5,XX,YY,J1,J2,I3,I1,I2,A,B,C):
> XI1 := SQ(2,XX,YY,J1,J2,I3,I1,I2,A,B,C):
> XI2 := SQ(3,XX,YY,J1,J2,I3,I1,I2,A,B,C):
> # Steps 8 and 19
> if J1 <= LN1 then
> if J2 <= LN1 then
> ALPHA[J1-1,J1-1] := ALPHA[J1-1,J1-1]+XJ1:
> ALPHA[J1-1,J2-1] := ALPHA[J1-1,J2-1]+XJ:
> ALPHA[J2-1,J2-1] := ALPHA[J2-1,J2-1]+XJ2:
> ALPHA[J2-1,J1-1] := ALPHA[J2-1,J1-1]+XJ:
> ALPHA[J1-1,N1-1] := ALPHA[J1-1,N1-1]+XI1:
> ALPHA[J2-1,N1-1] := ALPHA[J2-1,N1-1]+XI2:
> else
> ALPHA[J1-1,N1-1] := ALPHA[J1-1,N1-1]-XJ*GAMMA1[J2-1]+XI1:
> ALPHA[J1-1,J1-1] := ALPHA[J1-1,J1-1]+XJ1:
> fi:
> else
> if J2 <= LN1 then
> ALPHA[J2-1,N1-1] := ALPHA[J2-1,N1-1]-XJ*GAMMA1[J1-1]+XI2:
> ALPHA[J2-1,J2-1] := ALPHA[J2-1,J2-1]+XJ2:
> fi:
> fi:
> fi:
> od:
> fi:
> od:
> od:
> od:
> fi:
> # Output ALPHA
> fprintf(OUP, `Matrix ALPHA follows:\n`):
> for I3 from 1 to LN1 do
> fprintf(OUP, `Row %4d\n`, I3):
> for J from 1 to N1 do
> fprintf(OUP, ` %13.10e\n `, evalf(ALPHA[I3-1,J-1])):
> od:
> od:
> fprintf(OUP, `\n`):
> # Step 20
> if LN1 > 1 then
> INN := LN1-1:
> for I3 from 1 to INN do
> I1 := I3+1:
> for J from I1 to LN1 do
> CCC := ALPHA[J-1,I3-1]/ALPHA[I3-1,I3-1]:
> for J1 from I1 to N1 do
> ALPHA[J-1,J1-1] := ALPHA[J-1,J1-1]-CCC*ALPHA[I3-1,J1-1]:
> od:
> ALPHA[J-1,I3-1] := 0:
> od:
> od:
> fi:
> GAMMA1[LN1-1] := ALPHA[LN1-1,N1-1]/ALPHA[LN1-1,LN1-1]:
> if LN1 > 1 then
> for I3 from 1 to INN do
> J := LN1-I3:
> CCC := ALPHA[J-1,N1-1]:
> J1 := J+1:
> for KK from J1 to LN1 do
> CCC := CCC-ALPHA[J-1,KK-1]*GAMMA1[KK-1]:
> od:
> GAMMA1[J-1] := CCC/ALPHA[J-1,J-1]:
> od:
> fi:
> # Step 21
> # Output GAMMA1
> fprintf(OUP, `Coefficients of Basis Functions:\n`):
> for I3 from 1 to LM do
> LLL := LL[I3-1]:
> fprintf(OUP, `%3d %13.8f %d`, I3, evalf(GAMMA1[I3-1]), I3):
> for J from 1 to LLL do
> fprintf(OUP, ` %4d`, II[I3-1,J-1]):
> od:
> fprintf(OUP, `\n`):
> od:
> if OUP <> default then
> fclose(OUP):
> print(`Output file `,NAME,` created successfully`):
> fi:
> # Step 23
> fi:
