90 D2FrcW=0: IF FrcW>0 THEN D2FrcW=2/FrcW*DFrcW^2-FrcW^2*Visw/Viso*PrmrO/PrmrW*((PrmrOp-2*PrmrO+PrmrOm)/PrmrO-(PrmrWp-2*PrmrW+PrmrWm)/PrmrW+2*(PrmrWp-PrmrWm)/PrmrW*((PrmrWp-PrmrWm)/PrmrW-(PrmrOp-PrmrOm)/PrmrO)/4)/DelSatW^2
30 DEFINT I-N: DEFDBL A-H,O-Z: NStDat=20: DIM Strm(5*NStDat+1): Pi=4*ATN(1)
40 DATA .035907,.071925,.108167,.144751,.181799,.219443,.257826,.297108,.337467,.379109,.422276,.467255,.514403,.564170,.617150,.674168,.736455,.806073,.887306,1: '5-SPOT PATTERN
50 DATA .037201,.074505,.112014,.149838,.188092,.226888,.266366,.306667,.347955,.390417,.434271,.479778,.527259,.577119,.629897,.686317,.747499,.815288,.893521,1: '7-SPOT PATTERN
60 DATA .025839,.051862,.078262,.105246,.133048,.161943,.192265,.224440,.259037,.296864,.339169,.388145,.448794,.551506,.649352,.729621,.802082,.870117,.935637,1: '9-SPOT PATTERN
70 DATA .052422,.105216,.158763,.213493,.269853,.328375,.389686,.454549,.523927,.599070,.681657,.774034,.879623,1.003700,1.154983,1.349288,1.619447,2.050128,2.976872,4.251752:'ISOLATED 5-SPOT
80 DATA .045382,.090990,.137056,.183827,.231575,.280606,.331274,.384005,.439323,.497889,.560576,.628570,.703556,.788064,.886149,1.004921,1.158573,1.381894,1.802689,2.305500: 'ISOLATED 7-SPOT
90 FOR I=1 TO 5*NStDat: READ S$: Strm(I)=VAL(S$): NEXT I
100 IF NStr<2 THEN NStr=1: Ara(1)=1: StrmFn(1)=1: GOTO 270
110 '... first setup streamline to proper flood pattern
120 IF ITyp= 5 THEN J= 0: GOTO 180
130 IF ITyp= 7 THEN J= NStDat: GOTO 180
140 IF ITyp= 9 THEN J=2*NStDat: GOTO 180
150 IF ITyp=-5 THEN J=3*NStDat: GOTO 180
160 IF ITyp=-7 THEN J=4*NStDat: GOTO 180
170 NStr=1: Ara(1)=1: GOTO 270: '... no pattern effect considered
180 FOR I=1 TO NStDat: K=I+J: Strm(I)=Strm(K): NEXT I: IF ITyp>0 GOTO 190
190 FOR I=1 TO NStr: U=I/NStr*NStDat: J=INT(U): IF J>=NStDat THEN J=NStDat-1
200 IF I=NStr AND ITyp<0 THEN U=(I-0.5)/NStr*NStDat: J=INT(U): IF J>=NStDat THEN J=NStDat-1: 'for unconfined patterns, adjust largest streamline
210 Ara(I)=Strm(J)+(Strm(J+1)-Strm(J))*(U-J)
220 IF J=NStDat-1 AND ITyp<0 THEN Ara(I)=(Strm(J)+Strm(1))*(SIN(Pi/NStDat)/SIN(Pi*(1-U/NStDat)))^(-2/(ITyp+1))-Strm(1)*(1-U/NStDat)
230 NEXT I
240 IF ITyp<0 THEN Ara(NStr)=Ara(NStr)^2/Ara(NStr-1)
250 FOR I=1 TO NStr-1: J=NStr-I: Ara(J+1)=Ara(J+1)-Ara(J): NEXT I
170 '.....relative pressure drop is the pressure drop relative to that at residual oil saturation
180 '.....water-oil ratio is the instantaneous producing water-oil ratio
190 Out$=" ": FOR I=1 TO 6:Out$=Out$+" "+STRING$(10,45): NEXT I: OutPut(Out$,IDevice)
200 Out$=CR$+" ":PRINT TO Out$ USING "#######.### ";Tim;CumInj;Prs;OilP;WtrP;FacWO: OutPut(Out$,IDevice)
210 '.....now get time step and injection rate data
220 ITim=ITim+1: IF ITim>10 OR InjW(ITim)<=0 THEN ERASE Rte0j(),Rte1j(),Rte2j(),Rte3j(): EXIT
230 '.....this section adds the time step and increments the calculation.....
240 '.....a fourth-order Runge-Kutta method is used
250 '..... the injection in each tube at the start of the step is known
260 '..... it is incremented and the injectivity in each tube is recalculated
270 '..... using the injectivity, the injection is reallocated between streamtubes
280 Tim=Tim+DelTim(ITim): ICount=ICount+1: Rte1=0
290 FOR L=1 TO NMax: WtrIEnd=WtrI(L)+Rte0j(L)/2*DelTim(ITim)/Vol(L)/Rte0*InjW(ITim)*FvfW: Displace(WtrIEnd,OilPQj,WtrPQj,Rte,FrcW,FrcO): Rte1j(L)=Rte*RteCon(L): Rte1=Rte1+Rte1j(L): NEXT L
310 Rte2=0: FOR L=1 TO NMax: WtrIEnd=WtrI(L)+Rte1j(L)/2*DelTim(ITim)/Vol(L)/Rte1*InjW(ITim)*FvfW: Displace(WtrIEnd,OilPQj,WtrPQj,Rte,FrcW,FrcO): Rte2j(L)=Rte*RteCon(L): Rte2=Rte2+Rte2j(L): NEXT L
320 Rte3=0: FOR L=1 TO NMax: WtrIEnd=WtrI(L)+Rte2j(L)*DelTim(ITim)/Vol(L)/Rte2*InjW(ITim)*FvfW: Displace(WtrIEnd,OilPQj,WtrPQj,Rte,FrcW,FrcO): Rte3j(L)=Rte*RteCon(L): Rte3=Rte3+Rte3j(L): NEXT L
330 FOR L=1 TO NMax: RteAv=(Rte0j(L)/Rte0+2*Rte1j(L)/Rte1+2*Rte2j(L)/Rte2+Rte3j(L)/Rte3)/6*InjW(ITim): WtrPQi=RteAv*DelTim(ITim)/Vol(L): WtrI(L)=WtrI(L)+WtrPQi*FvfW
40 OUT$=CR$+" .......................... INPUT DATA ............................."+CR$: OutPut (OUT$,IDevice)
50 OUT$=" ": PRINT TO OUT$ USING "######.### Pore Volume";VolP: OutPut(OUT$,IDevice)
60 OUT$=CR$+" ": PRINT TO OUT$ USING "###### Number of Saturation Increments";NBuc: OutPut(OUT$,IDevice)
70 OUT$=" ": PRINT TO OUT$ USING "###### Number of Layers (0=pseudo rel perms)";NLay: OutPut(OUT$,IDevice)
80 OUT$=" ": PRINT TO OUT$ USING "###### Number of Streamlines";NStr: OutPut(OUT$,IDevice)
90 OUT$=" ": PRINT TO OUT$ USING "######.### Coefficient of Permeability Variation";V: OutPut(OUT$,IDevice)
100 OUT$=CR$+" ": IF NStr<2 GOTO 120 ELSE IF ITyp>0 THEN PRINT TO OUT$ USING "###### spot Pattern Type (5, 7, or 9 spot or other)";ITyp: OutPut(OUT$,IDevice): GOTO 130
110 IF ITyp<0 THEN PRINT TO OUT$ USING "###### spot isolated Pattern Type (5, 7, or 9 spot or other)";-ITyp: OutPut(OUT$,IDevice): GOTO 130
120 PRINT TO OUT$ " --- No Pattern Effects Included": OutPut(OUT$,IDevice)
130 OUT$="": OutPut(OUT$,IDevice)
140 OUT$=" ": PRINT TO OUT$ USING "######.### ######.### ";SatOi;SatWi;:OUT$=OUT$+"Initial Oil & Water Saturations": OutPut(OUT$,IDevice)
150 OUT$=CR$+" ": PRINT TO OUT$ USING "######.### ######.### ";SatOr;SatIW;:OUT$=OUT$+"Residual Oil & Irreducible Water Saturations": OutPut(OUT$,IDevice)
160 OUT$=CR$+" ": PRINT TO OUT$ USING "######.### ######.### ";Viso;Visw;:OUT$=OUT$+"Oil & Water Viscosities": OutPut(OUT$,IDevice)
170 OUT$=CR$+" ": PRINT TO OUT$ USING "######.### ######.### ";PrmrOi;PrmrWr;:OUT$=OUT$+"Oil & Water Endpoint Relative Permeabilities": OutPut(OUT$,IDevice)
180 OUT$=CR$+" ": PRINT TO OUT$ USING "######.### ######.### ";PrmXpO;PrmXpW;:OUT$=OUT$+"Oil & Water Relative Permeability Exponents": OutPut(OUT$,IDevice)
190 OUT$=CR$+" ": PRINT TO OUT$ USING "######.### ######.### ";FvfO;FvfW;:OUT$=OUT$+"Oil & Water Formation Volume Factors": OutPut(OUT$,IDevice)