CLS

        DEFINT I-N

        DEFSNG A-H, O-Z

        DIM JN(40, 5), NN(40), JB(20), INFLOW(40), LP(8, 20), JC(50)

        DIM D(50), L!(50), A(50, 51), QJ(20), E(50), KP!(50), V(2)

        DIM Q(50), EXPP(50), AR(50), ARL(50), VL(50), HL(50), F(50), G(50)

        DEF FNAL10 (X) = LOG(X) * .434295

        DIM IROW(50), JCOL(50), X(50)

        PRINT "***** PROGRAM FOR PIPENETWORK ANALYSES USING LINER THEORY METHOD *****"

        PRINT : PRINT

         PRINT "FOR EXCUTING THIS PROGRAM DATA LINES SHOULD BE CREATED FOLLOWING DATA LISTED AT THE END OF THIS PROGRAM"

 

        PRINT "       DATA NP, NJ,NL,MAX,NUNIT,ERS,VIS,DELQ1"

        PRINT "       DATA D(I),L!(I),E(I),....(I=2 TO NP)"

        PRINT "       DATA INFLOW(I),NNJ,JN(I,J)....,Q(II),...(I=1 TO NJ,J=1 TO NNJ)"

        PRINT "       DATA NNL,LP(J,I),....(I=1 TO NL,J=1 TO NNL)"

        PRINT "       DATA F(I),G(I),.....(I=1 TO NP)"

        PRINT

        PRINT " NP=NO.OF PIPES,NJ=NO. OF JUNCTIONS,NL=NO.OF LOOPS"

        PRINT "MAX=MAXIMUM NO OF ITTERATION, ERS=PERMISSIBLE ERROR"

        PRINT "D= INSIDE DIAMETER OF PIPE, L!=LENGTH OF PIPE,E=ABSOLUTE ROUGHNESS"

        PRINT " VIS=VISCOSITY (M^2/SEC IN SI SYSTEM OR FT^2/SEC IN ES  SYSTEM)"

300     PRINT : INPUT "PRESS (CR) TO CONTINUE"; A$

        READ NP, NJ, NL, MAX, NUNIT, ERS, VIS, DELQ1

        NPP = NP + 1

        NJ1 = NJ - 1

        FOR I = 1 TO NP: READ D(I), L!(I), E(I): NEXT I

        FOR I = 1 TO NP: E(I) = E(I) / D(I): NEXT I

        CLS

        ON NUNIT + 1 GOTO 380, 390, 410, 400

380     PRINT "D=PIPE DIAMETER,E=RELETIVE ROUGHNESS IN INCH,L=PIPE LENGTH IN FEET": GOTO 420

390     PRINT "D=PIPE DIAMETER,E=RELETIVE ROUGHNESS,L=PIPE LENGTH (IN FEET)": GOTO 420

400     FOR I = 1 TO NP: D(I) = .001 * D(I): NEXT I

410     PRINT "D=PIPE DIAMETER,E=RELETIVE ROUGHNESS IN INCH,L=PIPE LENGTH (IN METER)"

420     PRINT "                         I=NUMBER OF PIPE  ": PRINT

        PRINT "I     D      L      E      I      D      L      E      I      D      L      E"

        PRINT "-----------------------------------------------------------------------------"

        FOR I = 1 TO NP STEP 3

        IF I + 1 > NP THEN GOTO 490

        IF I + 2 > NP THEN GOTO 500

  PRINT USING "##   ##.##  ####  #.####  ##   ##.##  ####  #.####   ##   ##.##  ####  #.####"; I; D(I); L!(I); E(I); I + 1; D(I + 1); L!(I + 1); E(I + 1); I + 2; D(I + 2); L!(I + 2); E(I + 2): GOTO 510

490     PRINT USING "##   ##.##  ####  #.####"; I; D(I); L!(I); E(I): GOTO 510

500     PRINT USING "##   ##.##  ####  #.####  ##   ##.##  ####  #.####"; I; D(I); L!(I); E(I); I + 1; D(I + 1); L!(I + 1); E(I + 1)

510     NEXT I

        IF NUNIT > 0 THEN 560

        FOR I = 1 TO NP

        D(I) = D(I) / 12

        NEXT I

560     IF NUNIT = 0 OR NUNIT = 1 THEN G2 = 64.4

        IF NUNIT = 2 OR NUNIT = 3 THEN G2 = 19.62

        FOR I = 1 TO NP

        AR(I) = .78539392# * D(I) ^ 2

        ARL(I) = L!(I) / (G2 * D(I) * (AR(I)) ^ 2)

        NEXT I

        II = 1

        FOR I = 1 TO NJ: READ INFLOW(I): READ NNJ

        NN(I) = NNJ

        ON INFLOW + 1 GOTO 730, 700, 710, 720

700     FOR J = 1 TO NNJ: READ JN(I, J): NEXT J: READ QJ(II): QJ(II) = QJ(II) / 449: GOTO 740

710     FOR J = 1 TO NNJ: READ JN(I, J): NEXT J: READ QJ(II): GOTO 740

720     FOR J = 1 TO NNJ: READ JN(I, J): NEXT J: READ QJ(II): QJ(II) = QJ(II) / 1000: GOTO 740

730     FOR J = 1 TO NNJ: READ JN(I, J): NEXT J: GOTO 760

740     JB(II) = I

        II = II + 1

760     NEXT I

        FOR I = 1 TO NL: READ NNL: FOR J = 1 TO NNL: READ LP(J, I)

        NEXT J: LP(8, I) = NNL: NEXT I

        FOR I = 1 TO NP

        IF NUNIT > 1 GOTO 830

        KP!(I) = .0009517 * L!(I) / D(I) ^ 4.87

        GOTO 840

830     KP!(I) = .00212 * L!(I) / D(I) ^ 4.87

840     NEXT I

        ELOG = 18.7 * FNAL10(2.71828183#)

        SUM = 100!

        NCT = 0

880     II = 1

        FOR I = 1 TO NJ1

        FOR J = 1 TO NP: A(I, J) = 0!: NEXT

        NNJ = NN(I)

        FOR J = 1 TO NNJ

        IJ = JN(I, J)

        IF IJ > 0 THEN A(I, J) = 1! ELSE IIJ = ABS(IJ): A(I, IIJ) = -1!

        NEXT J

        IF INFLOW(I) = 0 THEN A(I, NPP) = 0! ELSE A(I, NPP) = QJ(II): II = II + 1

        NEXT I

        FOR I = NJ TO NP

        FOR J = 1 TO NP: A(I, J) = 0!: NEXT

        II = I - NJ1

        NNJ = LP(8, II)

        FOR J = 1 TO NNJ

        IJ = LP(J, II)

        IIJ = ABS(IJ)

        IF IJ < 0 THEN A(I, IIJ) = -KP!(IIJ) ELSE A(I, IIJ) = KP!(IIJ)

        NEXT J

        A(I, NPP) = 0!

        NEXT I

        GOSUB 2000

        PRINT ID

        IF ID = 2 THEN GOTO 1940

        IF NCT > 0 THEN SUM = 0!

        FOR I = 1 TO NP

        BB = A(I, NPP)

        IF NCT > 0 THEN QM = .5 * (Q(I) + BB): SUM = SUM + ABS(Q(I) - BB) ELSE QM = BB

        Q(I) = QM

        DELQ = QM * DELQ1

        QM = ABS(QM)

        V1 = (QM - DELQ) / AR(I)

        REM IF V1<.001 THEN V1=.001

        V2 = (QM + DELQ) / AR(I)

        VE = QM / AR(I)

        RE1 = V1 * D(I) / VIS

        RE2 = V2 * D(I) / VIS

        IF RE2 > 2100 THEN 1310

        F1 = 64! / RE1

        F2 = 64! / RE2

        EXPP(I) = 1!

        KP!(I) = (F1 + F2) / 2! * ARL(I) * QM

        GOTO 1560

1310    MM = 0

        F = 1! / (1.14 - 2! * FNAL10(E(I))) ^ 2

        PAR = VE * SQR(.125 * F) * D(I) * E(I) / VIS

        IF PAR > 100! THEN 1540

        RE = RE1

1360    MCT = 0

1370    FS = SQR(F)

        FZ = .5 / (F * FS)

        ARG = E(I) + 9.350001 / (RE * FS)

        FF = 1! / FS - 1.14 + 2! * FNAL10(ARG)

        DF = FZ + ELOG * FZ / (ARG * RE)

        DIF = FF / DF

        F = F + DIF

        MCT = MCT + 1

        IF ABS(DIF) > .00001 AND MCT < 15 THEN 1370

        IF MM <> 1 THEN MM = 1: RE = RE2: F1 = F: GOTO 1360

        F2 = F

        BE = (LOG(F1) - LOG(F2)) / (LOG(QM + DELQ) - LOG(QM - DELQ))

        AE = F1 * (QM - DELQ) ^ BE

        EP = 1! - BE

        EXPP(I) = EP + 1!

        KP!(I) = AE * ARL(I) * QM ^ EP

        GOTO 1560

1540    KP!(I) = F * ARL(I) * QM

        EXPP(I) = 2!

1560    NEXT I

        NCT = NCT + 1

        PRINT " Q       N         K        Q       N        K         Q       N        K"

        PRINT "------------------------------------------------------------------------"

        FOR I = 1 TO NP STEP 3

        IF I + 1 > NP THEN GOTO 1680

        IF I + 2 > NP THEN GOTO 1690

  PRINT USING "###.##  #.###   ###.####   ###.##  #.###  ###.####    ###.##  #.###  ###.####"; Q(I); EXPP(I); KP!(I); Q(I + 1); EXPP(I + 1); KP!(I + 1); Q(I + 2); EXPP(I + 2); KP!(I + 2)

        GOTO 1700

1680  PRINT USING "###.##  #.###   ###.####"; Q(I); EXPP(I); KP!(I): GOTO 1700

1690  PRINT USING "###.##  #.###   ###.####   ###.##  #.###  ###.####    "; Q(I); EXPP(I); KP!(I); Q(I + 1); EXPP(I + 1); KP!(I + 1)

1700    NEXT I

        INPUT "PRESS (CR) TO CONTINUE"; D$

        IF SUM > ERS AND NCT < MAX THEN 880

        IF NCT = MAX THEN PRINT "DID NOT CONVRGE IN"; : PRINT NCT; : PRINT "ITERATION , SUM OF DIFFRENCE="; : PRINT SUM

        FOR I = 1 TO NP: KP!(I) = KP!(I) * ABS(Q(I)): NEXT I

        FOR I = 1 TO NP: VL(I) = ABS(Q(I)) / AR(I): NEXT I

        CLS

        PRINT CHR$(15);

        WIDTH LPRINT 150

        FOR I = 1 TO NP

        READ F(I), G(I): NEXT I

        PRINT "--------------------------------------------------------------------------------"

        FOR I = 1 TO NP: HL(I) = KP!(I) * 1000 / L!(I): NEXT I

        PRINT "PIPE  BETWEEN NOEDS  DIAMETER  LENGTH  FLOW RATE  VELOCITY  HEAD LOSS  HEAD LOSS"

        IF NUNIT < 2 THEN GOTO 1870

        FOR I = 1 TO NP: D(I) = D(I) * 1000: Q(I) = Q(I) * 1000: NEXT I

        PRINT " NO.    I     J         MM        M        L/S       M/S       M        M/1000M ": GOTO 1890

1870    FOR I = 1 TO NP: D(I) = D(I) * 12: NEXT I

        PRINT " NO.    I     J        INCH      FEET      CFS      FEET/S     FT      FT/1000FT"

1890    PRINT "--------------------------------------------------------------------------------"

        FOR I = 1 TO NP

      PRINT USING " ##    ###   ###       ####    ####.#   ####.####   ##.###    ##.###    ###.####"; I; F(I); G(I); D(I); L!(I); Q(I); VL(I); KP!(I); HL(I)

        NEXT I

        GOTO 300

1940    PRINT "OVER FLOW OCCURED ,CHECK FOR REDUNDANT EQUATION"

        PRINT "RESULTING SINGULAR MATRIX"

        GOTO 300

        STOP

        END

2000    REM SOLVING SYSTEM (GAUSS JORDAN)

        ID = 1

        EPS = 1E-10

        FOR K3 = 1 TO NP

        KM1 = K3 - 1

        PIVOT = 0!

        REM SEARCH FOR PIVOT ELEMENT

        FOR K1 = 1 TO NP

        FOR K2 = 1 TO NP

        IF K3 = 1 THEN 2190

        FOR ISCAN = 1 TO KM1

        FOR JSCAN = 1 TO KM1

        IF K1 = IROW(ISCAN) THEN 2230

        IF K2 = JCOL(JSCAN) THEN 2230

        NEXT JSCAN

        NEXT ISCAN

        PRINT "A(", K1, ",", K2, ")=", A(K1, K2)

        INPUT A$

2190    IF ABS(A(K1, K2)) <= ABS(PIVOT) THEN 2230

        PIVOT = A(K1, K2)

        IROW(K3) = K1

        JCOL(K3) = K2

2230    NEXT K2

        NEXT K1

        IF ABS(PIVOT) > EPS THEN 2290

        ID = 2

        RETURN

        REM NORMALIZE THE PIVOT ROW

2290    IROWK = IROW(K3)

        JCOLK = JCOL(K3)

        FOR K2 = 0 TO NPP

        A(IROWK, K2) = A(IROWK, K2) / PIVOT

        NEXT K2

        REM CARRY UOT THE ELEMINATION

        FOR K1 = 1 TO NP

        IF K1 = IROWK THEN 2410

        AIJCK = A(K1, JCOLK)

        FOR K2 = 1 TO NPP

        IF K2 <> JCOLK THEN A(K1, K2) = A(K1, K2) - AIJCK * A(IROWK, K2)

        NEXT K2

2410    NEXT K1

        NEXT K3

        REM UNSCRAMBLE

        FOR K1 = 1 TO NP

        X(JCOL(K1)) = A(IROW(K1), NPP)

        NEXT K1

        FOR K1 = 1 TO NP

        A(K1, NPP) = X(K1)

        NEXT K1

        RETURN

        END

        DATA 7,6,2,10,0,.001,.00001217,.1

        DATA 8,1106,.0102,12,751,.0102,10,1000,.0102,12,500,.0102

        DATA 10,1200,.0102,6,600,.0102,8,800,.0102

        DATA 1,2,1,4,2000,0,3,-1,-2,5,1,3,-3,2,-7,-1500

        DATA 1,2,3,-4,-1000,1,2,-5,-6,-1500,1,2,6,7,2000

        DATA 4,1,-2,-3,-4,4,5,-6,7,2

        DATA 1,2,3,2,4,3,1,4,2,5,6,5,6,3