BASIC NLR

10 REM Probleem van Labrujere
20 REM ======================
50 REM Mesh Generator
60 REM --------------
140 INPUT "Aantal rasterlijnen in radiale richting (7) : ",NDR
150 INPUT "Aantal rasterlijnen in omtreks-richting (5) : ",NPH
160 IF NDR<=0 THEN NDR=7
170 IF NPH<=0 THEN NPH=5
180 REM
190 REM ... Initialisatie ...
200 LIMC=NDR*NPH : REM aantal rasterpunten
205 LIMT=(NDR-1)*(NPH-1) : REM aantal elementen
210 LIMB=2*NDR+2*NPH : REM aantal randpunten
220 REM
230 PRINT "Algemene gegevens ..."
240 OPEN "R",#1,"NLRGENER.BIN",16
250 FIELD #1, 4 AS F1$, 4 AS F2$, 4 AS F3$, 4 AS F4$
260 LSET F1$=MKI$(LIMC) : LSET F2$=MKI$(LIMT)
270 LSET F3$=MKI$(LIMB) : LSET F4$=MKI$(NPH)
280 PUT #1,1 : CLOSE #1
290 REM
300 PRINT "Coordinaten ..."
310 OPEN "R",#1,"NLRCOORD.BIN",8
320 FIELD #1, 4 AS X$, 4 AS Y$
330 PI=4*ATN(1) : DPHI=.5*PI/(NPH-1)
340 R=10 : P=R^(1/(NDR-1))-1 : REM Buitengrens radiaal
350 FOR I=1 TO NDR
360 R=(1+P)^(I-1) : REM Geeft equivalente elementen
370 FOR J=1 TO NPH
380 PHI=(J-1)*DPHI : K=(I-1)*NPH+J
390 X=R*COS(PHI) : Y=R*SIN(PHI)
400 LSET X$=MKS$(X) : LSET Y$=MKS$(Y)
410 PUT #1,K : NEXT J : NEXT I
420 CLOSE #1
430 REM
440 PRINT "Topologie ..."
450 OPEN "R",#1,"NLRTOPOL.BIN",16
460 FIELD #1, 4 AS F1$, 4 AS F2Y$, 4 AS F3$, 4 AS F4$
470 FOR I=1 TO NDR-1 : FOR J=1 TO NPH-1
480 K=(I-1)*(NPH-1)+J
490 KON2=(I-1)*NPH+J : KON1=(I-1)*NPH+J+1
500 KON3=I*NPH+J : KON4=I*NPH+J+1
510 REM PRINT KON1,KON2,KON3,KON4
520 LSET F1$=MKI$(KON1) : LSET F2$=MKI$(KON2)
530 LSET F3$=MKI$(KON3) : LSET F4$=MKI$(KON4)
540 PUT #1,K : NEXT J : NEXT I
550 CLOSE #1
560 REM
570 PRINT "Randvoorwaarden ..."
580 OPEN "R",#1,"NLRBOUND.BIN",8
590 FIELD #1, 4 AS F1$, 4 AS F2$
600 FOR I=1 TO NDR : REM Instroming ...
610 NOB1=(I-1)*NPH+1 : NOB2=1
620 REM PRINT NOB1,NOB2
630 LSET F1$=MKI$(NOB1) : LSET F2$=MKI$(NOB2)
640 PUT #1,I : NEXT I : L=NDR
650 FOR I=1 TO NPH : REM Cylinder ...
660 NOB1=I : NOB2=2
670 REM PRINT NOB1,NOB2
680 LSET F1$=MKI$(NOB1) : LSET F2$=MKI$(NOB2)
690 PUT #1,I+L : NEXT I : L=L+NPH
700 FOR I=1 TO NDR : REM Symmetrie ...
710 NOB1=NPH*I : NOB2=1
720 REM PRINT NOB1,NOB2
730 LSET F1$=MKI$(NOB1) : LSET F2$=MKI$(NOB2)
740 PUT #1,I+L : NEXT I : L=L+NDR
750 FOR I=1 TO NPH : REM Uitstroming ...
760 NOB1=NPH*(NDR-1)+I : NOB2=3
770 REM PRINT NOB1,NOB2
780 LSET F1$=MKI$(NOB1) : LSET F2$=MKI$(NOB2)
790 PUT #1,I+L : NEXT I : CLOSE #1
800 END
10 REM Probleem van Labrujere:
20 REM ======================
30 REM Samenstellen en oplossen vergelijkingen
40 REM =======================================
50 REM Gegevens inlezen
60 REM ----------------
100 OPEN "R",#1,"NLRGENER.BIN",16
110 FIELD #1, 4 AS F1$, 4 AS F2$, 4 AS F3$, 4 AS F4$
120 GET #1,1 : LIMC=CVI(F1$) : LIMT=CVI(F2$) 
125 LIMB=CVI(F3$) : NPH=CVI(F4$)
130 CLOSE #1 : NN=2*LIMC : NB1=2*NPH+4
140 REM
150 DIM X(LIMC),Y(LIMC),S(NN,NB1),B(NN)
160 REM
170 REM Coordinaten:
180 OPEN "R",#1,"NLRCOORD.BIN",8
190 FIELD #1, 4 AS F1$, 4 AS F2$
200 FOR I=1 TO LIMC : GET #1,I
210 X(I)=CVS(F1$) : Y(I)=CVS(F2$)
220 NEXT I : CLOSE #1
230 REM
240 REM Grote matrix en vector schoonmaken:
250 FOR I=1 TO NN : FOR J=1 TO NB1 : S(I,J)=0 : NEXT J
255 B(I)=0 : NEXT I
260 REM
270 DIM NO(4),NR(8),E(8,8),R(2),A(6),NG(3,2)
280 REM
290 OPEN "R",#1,"NLRTOPOL.BIN",16
300 FIELD #1, 4 AS F1$, 4 AS F2$, 4 AS F3$, 4 AS F4$ 
305 GET #1,1
310 NO(1)=CVI(F1$) : NO(2)=CVI(F2$) 
315 NO(3)=CVI(F3$) : NO(4)=CVI(F4$)
320 PRINT "Repeteerbaar element ..." : GOSUB 830
330 REM
340 PRINT "Assemblage procedure voor";LIMT;"elementen ..."
360 FOR F=1 TO LIMT : GET #1,F : PRINT F;
370 NO(1)=CVI(F1$) : NO(2)=CVI(F2$)
375 NO(3)=CVI(F3$) : NO(4)=CVI(F4$)
380 REM Nummering snelheden:
390 FOR I=1 TO 4 : FOR J=1 TO 2 : K=2*(I-1)+J
400 NR(K)=2*(NO(I)-1)+J : NEXT J : NEXT I
410 REM
420 REM Bulk elementen intellen:
430 FOR I=1 TO 8 : IG=NR(I)
440 FOR J=I TO 8 : JG=NR(J)
450 II=IG : IF JG<IG THEN II=JG
460 JJ=ABS(IG-JG)+1
470 S(II,JJ)=S(II,JJ)+E(I,J)
480 NEXT J : NEXT I
490 NEXT F : CLOSE #1 : PRINT
500 REM
510 PRINT "Randvoorwaarden ..."
520 OPEN "R",#1,"NLRBOUND.BIN",8
530 FIELD #1, 4 AS F1$, 4 AS F2$
540 FOR F=1 TO LIMB : GET #1,F
550 MU=CVI(F1$) : KIND=CVI(F2$)
560 GOSUB 1780
570 REM Nummering snelheden:
580 NR(1)=2*MU-1 : NR(2)=2*MU
590 REM Elementen intellen:
600 FOR I=1 TO 2 : IG=NR(I)
610 FOR J=I TO 2 : JG=NR(J)
620 II=IG : IF JG<IG THEN II=JG
630 JJ=ABS(IG-JG)+1
640 S(II,JJ)=S(II,JJ)+E(I,J)
650 NEXT J
660 B(IG)=B(IG)+R(I)
670 NEXT I
680 NEXT F : CLOSE #1 : REM Einde assemblage
690 REM
700 GOSUB 1980 : REM Vergelijkingen oplossen
710 REM
720 OPEN "R",#1,"NLRVELOC.BIN",8
730 FIELD #1, 4 AS F1$, 4 AS F2$
740 FOR K=1 TO LIMC
750 LSET F1$=MKS$(B(2*K-1)) : LSET F2$=MKS$(B(2*K))
760 REM LPRINT B(2*K-1),B(2*K)
770 PUT #1,K : NEXT K : CLOSE #1
780 END
790 REM ==========================
800 REM Eindige elementen matrices
810 REM ==========================
820 REM Maak element schoon:
830 FOR I=1 TO 8 : FOR J=1 TO 8 : E(I,J)=0 : NEXT J : NEXT I
910 NG(1,1)=1 : NG(2,1)=2 : NG(3,1)=4
920 NG(1,2)=2 : NG(2,2)=3 : NG(3,2)=4
930 FOR IE=1 TO 2
940 REM ... Geometrie ...
950 NO1=NO(NG(1,IE)) : NO2=NO(NG(2,IE)) : NO3=NO(NG(3,IE))
960 X21=X(NO2)-X(NO1) : Y21=Y(NO2)-Y(NO1)
970 X32=X(NO3)-X(NO2) : Y32=Y(NO3)-Y(NO2)
980 X13=X(NO1)-X(NO3) : Y13=Y(NO1)-Y(NO3)
990 GOSUB 1230 : NEXT IE : RETURN
1190 REM ------------------------------
1200 REM Eindige Differentie benadering
1210 REM ------------------------------
1220 REM ... Onsamendrukbaar ...
1230 A(1)=-Y32 : A(2)=+X32 : A(3)=-Y13 
1235 A(4)=+X13 : A(5)=-Y21 : A(6)=+X21
1240 GOSUB 1580 : REM Voeg toe aan element ...
1250 REM ... Rotatievrij ...
1260 A(1)=+X32 : A(2)=+Y32 : A(3)=+X13 
1265 A(4)=+Y13 : A(5)=+X21 : A(6)=+Y21
1270 GOSUB 1580 : REM Voeg toe aan element ...
1280 RETURN
1560 REM --------------------------
1570 REM Kleinste Kwadraten element
1580 REM --------------------------
1590 REM SpoorWegen:
1600 SUM=0 : FOR I=1 TO 6 : SUM=SUM+A(I)*A(I)
1605 NEXT I : SUM=1/SUM
1610 REM Eindig element:
1620 FOR I=1 TO 3 : FOR K=1 TO 2
1630 IH=2*(I-1)+K : IG=2*(NG(I,IE)-1)+K
1640 FOR J=1 TO 3 : FOR L=1 TO 2
1650 JH=2*(J-1)+L : JG=2*(NG(J,IE)-1)+L
1660 E(IG,JG)=E(IG,JG)+A(IH)*A(JH)*SUM
1670 NEXT L : NEXT J : NEXT K : NEXT I
1680 RETURN
1760 REM ===============
1770 REM Randvoorwaarden
1780 REM ===============
1790 FOR I=1 TO 2 : R(I)=0 : FOR J=1 TO 2
1795 E(I,J)=0 : NEXT J : NEXT I
1800 REM
1810 ON KIND GOTO 1840,1870,1920
1820 REM
1830 REM ... V = 0 ...
1840 E(2,2)=1 : RETURN
1850 REM
1860 REM ... X.U + Y.V = 0 ...
1870 X1=X(MU) : Y1=Y(MU) : SUM=X1*X1+Y1*Y1
1880 E(1,1)=X1*X1/SUM : E(2,2)=Y1*Y1/SUM
1890 E(1,2)=X1*Y1/SUM : E(2,1)=X1*Y1/SUM
1900 RETURN
1910 REM ... U = 1 ...
1920 E(1,1)=1 : R(1)=1 : RETURN
1930 REM
1940 REM ==========================================
1950 REM Oplossen van linear stelsel vergelijkingen
1960 REM Positief definiete symmetrische bandmatrix
1970 REM ==========================================
1980 IF NN<2 THEN PRINT "GAUSS: NN=";NN : END
1990 IF NB1<2 THEN PRINT "GAUSS: NB1=";NB1 : END
2000 REM
2010 PRINT "Vegen voor";NN;"vergelijkingen ..."
2020 II=NN-1 : KK=NB1-1
2030 FOR I=1 TO II : DIAG=S(I,1) : PRINT I;
2040 IF DIAG=0 THEN PRINT "Nul op diagonaal" : END
2050 IF I>NN-NB1 THEN KK=NN-I
2060 FOR K=1 TO KK
2070 PIVOT=S(I,K+1)/DIAG : IF PIVOT=0 THEN GOTO 2100
2080 B(I+K)=B(I+K)-PIVOT*B(I) : JJ=KK-K+1
2090 FOR J=1 TO JJ : S(I+K,J)=S(I+K,J)-PIVOT*S(I,K+J) : NEXT J
2100 NEXT K : NEXT I
2110 PRINT "Terugsubstitutie ..."
2120 KK=NB1-1 : FOR N=2 TO NN : I=NN-N+2 : PRINT I;
2130 B(I)=B(I)/S(I,1) : IF I<NB1 THEN KK=I-1
2140 FOR K=1 TO KK : B(I-K)=B(I-K)-B(I)*S(I-K,K+1) : NEXT K
2150 NEXT N : B(1)=B(1)/S(1,1) : RETURN
2160 REM
10 REM Probleem van Labrujere
20 REM ======================
50 REM MESH PLOT
60 REM ---------
100 REM Algemeen ...
110 OPEN "R",#1,"NLRGENER.BIN",16
120 FIELD #1, 4 AS F1$, 4 AS F2$, 4 AS F3$, 4 AS F4$
130 GET #1,1 : LIMC=CVI(F1$) : LIMT=CVI(F2$)
140 CLOSE #1
150 DIM X(LIMC),Y(LIMC)
160 REM Coordinaten ...
170 OPEN "R",#1,"NLRCOORD.BIN",8
180 FIELD #1, 4 AS F1$, 4 AS F2$
190 FOR I=1 TO LIMC : GET #1,I
200 X(I)=CVS(F1$) : Y(I)=CVS(F2$)
210 REM PRINT X(I),Y(I)
220 NEXT I : CLOSE #1
230 REM
240 REM Plot mesh ...
250 SCREEN 2 : DIM NR(4)
260 OPEN "R",#1,"NLRTOPOL.BIN",16
270 FIELD #1, 4 AS F1$, 4 AS F2$, 4 AS F3$, 4 AS F4$
280 FOR I=1 TO LIMT : GET #1,I
290 NR(1)=CVI(F1$) : NR(2)=CVI(F2$)
295 NR(3)=CVI(F3$) : NR(4)=CVI(F4$)
300 FOR M=1 TO 4 : L=(M MOD 4)+1
310 X1=40*X(NR(M)) : Y1=190-20*Y(NR(M))
320 X2=40*X(NR(L)) : Y2=190-20*Y(NR(L))
330 LINE (X1,Y1)-(X2,Y2)
340 NEXT M : NEXT I : CLOSE #1
350 REM
360 REM Vectorplot snelheden ...
380 OPEN "R",#2,"NLRVELOC.BIN",8
400 FIELD #2, 4 AS FU$, 4 AS FV$
410 FOR I=1 TO LIMC : GET #2,I
420 UU=CVS(FU$) : VV=CVS(FV$)
430 X1=40*X(I) : Y1=190-20*Y(I)
440 X2=X1+40*UU : Y2=Y1-20*VV : LINE (X1,Y1)-(X2,Y2)
450 NEXT I
460 END
10 REM Probleem van Labrujere
20 REM ======================
50 REM CYLINDER SNELHEIDS PROFIEL
60 REM --------------------------
80 REM Algemeen ...
90 OPEN "R",#1,"NLRGENER.BIN",16
100 FIELD #1, 4 AS F1$, 4 AS F2$, 4 AS F3$, 4 AS F4$
110 GET #1,1 : NPH=CVI(F4$)
120 CLOSE #1
130 DIM X(NPH),Y(NPH),U(NPH),V(NPH)
140 REM Coordinaten ...
150 OPEN "R",#1,"NLRCOORD.BIN",8
160 FIELD #1, 4 AS F1$, 4 AS F2$
170 FOR I=1 TO NPH : GET #1,I
180 X(I)=CVS(F1$) : Y(I)=CVS(F2$)
190 NEXT I : CLOSE #1
200 REM
210 XO=10 : YO=150 : SX=200 : SY=50 : SCREEN 2
220 LINE (XO,YO-SY)-(XO+SX,YO-SY) : LINE (XO,YO)-(XO,YO-4*SY)
230 REM
240 REM Plot snelheden ...
250 OPEN "R",#1,"NLRVELOC.BIN",8
260 FIELD #1, 4 AS F1$, 4 AS F2$
270 FOR I=1 TO NPH : GET #1,I
280 U(I)=CVS(F1$) : V(I)=CVS(F2$)
290 NEXT I : CLOSE #1
300 REM
310 XN=XO+SX*X(1) : YN=YO-SY
320 REM Horizontale component ...
330 FOR I=2 TO NPH
340 XM=XN : XN=XO+SX*X(I)
350 YM=YN : YN=YO-SY*(1+U(I))
360 LINE(XM,YM)-(XN,YN) : NEXT I
390 REM Verticale component ...
400 XN=XO+SX*X(1) : YN=YO-SY
410 FOR I=2 TO NPH
420 XM=XN : XN=XO+SX*X(I)
430 YM=YN : YN=YO-SY*(1+V(I))
440 LINE(XM,YM)-(XN,YN) : NEXT I
460 REM
470 REM Analytische oplossing ...
480 LIMIT=25
490 XN=0 : YN=YO-SY
500 FOR I=1 TO LIMIT
510 PHI=2*ATN(1)/(LIMIT-1)*(I-1)
520 UU=1-COS(2*PHI)
530 XM=XN : XN=XO+COS(PHI)*SX
540 YM=YN : YN=YO-SY*(1+UU)
550 LINE(XM,YM)-(XN,YN) : NEXT I
560 XN=0 : YN=YO-SY
570 FOR I=1 TO LIMIT
580 PHI=2*ATN(1)/(LIMIT-1)*(I-1)
590 VV=-SIN(2*PHI)
600 XM=XN : XN=XO+COS(PHI)*SX
610 YM=YN : YN=YO-SY*(1+VV)
620 LINE(XM,YM)-(XN,YN) : NEXT I
630 END