Hello all,
In my previous post, I have asked for decoding the PL1 program into C++ language (in order to understand the PL1 program). I couldnt able to decode into C++ language.
So, I thought of compiling PL1 program directly by its own compiler. I found a PL/1 compiler for a Linux here :
iron-spring.com/download.html
I have installed the PL1 compiler there and while running sample case files, I found that three sample makefiles for one program that can be used to compile.
I don't know how to fix and compile the program, which I m looking for...
I'll copy the program here. Kindly someone guide me to compile or convert into C++ (so that its easy to compile in C++)
//*******************************************************//
PL1 PROGRAM
ANTHLOG: PROC OPTIONS (MAIN);
/* INPUT DATA */;
REPEAT: ON ENDFILE (SYSIN) STOP;
DECLARE ISTRING CHAR(80),NAME CHAR(20);
DT=120;
NSEG#=5;
FINTIM=30;
TSOAK=3;
AHEAT=130;
KHEAT=100;
XRAD=.01;
GET EDIT(ISTRING)(A(80));
IF INDEX(ISTRING,'=')>0 THEN DO;
IF INDEX(ISTRING,';')=0 THEN
SUBSTR(ISTRING,80,1)=';';
GET STRING(ISTRING) DATA;
GET EDIT(NAME) (A(80));
END;
ELSE NAME=SUBSTR(ISTRING,1,20);
DECLARE (MASS,NIT,MOISTO,NPVOL,KHEAT) DECIMAL FLOAT;
GET LIST(PC,PH,PX,PN,PS);
PY=PC+PH+PX+PN+PS;
CAR=PC/PY;
HY=PH/PY;
OX=PX/PY;
NIT=PN/PY;
SUL=PS/PY;
GET LIST(PMOISTO,PASHDRY,RHODRY,TO);
MOISTO=PMOISTO/100;
ASH=PASHDRY* (1-MOISTO) /100;
DAFO=1-MOISTO-ASH;
RHOWET=RHOORY/(1-MOISTO) ;
RHOO=RHOWET/(0.875+.137E-3*RHODRY);
GET LIST (WIDTH,WALL,WCOND,WSPHT,WRHO);
HWIDTH=WIDTH/2;
NSEG=NSEG#*4+1 ;
DX=HWIDTH/NSEG;
DO=DX*DX/DT;
VO=DX/DT;
M=1.5+WALL/DX;
N=M+NSEG-1;
WDIFF=WCOND/(WRHO*WSPHT);
*********************************************
GET LIST(NF);
(NOUFL): BEGIN;
DECLARE(TIMES,TIMESHR,TEMPS)(NF);
GET LIST(TIMESHR);
TIMES=TIMESHR*3600;
GET LIST(TEMPS);
/* INITIAL CONDITIONS */;
DECLARE(TRN1,TRN2,TRN3,TRN4,TRN5,H2,CH4,CO)(N);
YINF=1.573-16*HY-0.14*OX-NIT-SUL;
CINF=YINF-0.02;
PVOL=16.3*HY-.21*OX+NIT+SUL-0.667;
CPVOL=(15*HY-1.01*OX-0.598)/PVOL;
HPVOL=(1.3*HY-0.051)/PVOL;
XPVOL=(0.8*OX-.002)/PVOL;
NPVOL=(NIT-.01)/PVOL;
SPVOL=(SUL-0.006)/PVOL;
TRN1=0.015;
TRN2=MIN(0.05,PVOL-0.015);
TRN3=MIN(0.05,MAX(0,PVOL-0.065));
TRN4=MIN(0.1,MAX(0,PVOL-0.115));
TRN5=MAX(0,PVOL-0.215);
QH2=0.034-0.3*HY;
QCH4=0.06;
QCO=0.35*OX;
H2=QH2;
CH4=QCH4;
CO=QCO;
DECLARE(MOIST,DAF,ATMASS)(N)DECIMAL FLOAT;
DAF=DAFO;
MOIST=MOISTO;
ATMASS=1/(CAR/12+HY+OX/16+NIT/14+SUL/32);
DECLARE(Q,H,K,CVOL,ESHR)(N) DECIMAL FLOAT;
DECLARE(KPART,KCOKE,KMOIST,KGAS,KO,KRAD,KL,KU,LBOIL,TIME)
DECIMAL FLOAT;
H=0;
EO=1-RHOO*(0.000668*DAFO+ASH/3000);
DO I=1 TO M-1;
Q(I)=0;
K(I)=WCOND;
CVOL(I)=WRHO*WSPHT;
END;
*********************************************
DECLARE(T,L,G,U,Z)(N)DECIMAL FLOAT;
DO I=1 TO M-1;
T(I)=TEMPS(1);
END;
DO I=M TO N;
T(I)=TO;
END;
IF=1;
XB=0;
CSTEAM=2000;
LBOIL=2.257E6;
QINPUT=0;
DECLARE INDX(5),OUT(26,5);
CTIME=20;
INDX=TO/50+1;
DO I=1 TO 26;
IF TO>50*I THEN OUT(I,*)=0;
ELSE OUT(I,*)=100;
END;
CTIME=OUT(18,5);
TIME=0;
TLOOP: DO TIME=0 BY DT WHILE(TIME<MIN(FINTIM,CTIME+TSOAK)*3600);
XLOOP: DO I=M TO N;
TK=T(I)+273;
/* VOLATILE EVOLUTION MODEL */
IF T(I)>350 THEN DO;
TRN1(I)=TRN1(I)*EXP(-.13E14*EXP(-29486/TK)*DT);
TRN2(I)=TRN2(I)*EXP(-.13E14*EXP(-28042/TK)*DT);
TRN3(I)=TRN3(I)*EXP(-.13E14*EXP(-26838/TK)*DT);
TRN4(I)=TRN4(I)*EXP(-.13E14*EXP(-26116/TK)*DT);
TRN5(I)=TRN5(I)*EXP(-.13E14*EXP(-25755/TK)*DT);
PVOL=TRN1(I)+TRN2(I)+TRN3(I)+TRN4(I)+TRN5(I);
H2(I)=MIN(H2(I),QH2*EXP(-((T(I)-350)/455)**2.5));
CH4(I)=MIN(CH4(I),QCH4*EXP(-((T(I)-350)/324)**2.38));
CO(I)=MIN(CO(I),QCO*EXP(-((T(I)-350)/420)**2.63));
Y=PVOL+H2(I)+CH4(I)+CO(I)+YINF;
CAR=(CPVOL*PVOL+.75*CH4(I)+.4286*CO(I)+CINF)/Y;
HY=(HPVOL*PVOL+.25*CH4(I)+H2(I)+.002)/Y;
OX=(XPVOL*PVOL+.5714*CO(I)+.002)/Y.;
NIT=(NPVOL*PVOL+.01)/Y;
SUL=(SPVOL*PVOL+.006)/Y;
DAF(I)=Y*DAFO;
ATMASS(I)=1/(CAR/12+HY+OX/16+NIT/14+SUL/32);
END;
****************
/* PHYSICAL PROPERTIES /MODEL */;
MASS=DAF(I)+ASH+MOIST(I);
RHO=RHOO*MASS;
DENSDAF=1/(0.001388-7.69E-5*ATMASS(I));
DENS=MASS/(DAF(I)/DENSDAF+ASH/3000+MOIST(I)/1000);
E=1-RHO/DENS;
ESHR(I)=MAX(0,1-(1-E)/(1-EO));
F1=EXP(380/TK);
E1=F1*(380/TK/(F1-1))**2;
F2=EXP(1800/TK);
E2=F2*(1800/TK/(F2-1))**2;
CDAF=8314.4*(E1+2*E2)/ATMASS(I);
CASH=754+.586*T(I);
C=(DAF(I)*CDAF+ASH*CASH+4186.8*MOIST(I))/MASS;
CVOL(I)=C*RHO;
HOCH4=6234000*(QCH4-CH4(I));
HOCO=-4243000*(QCO-CO(I));
HOH2=966000*(QH2-H2(I));
HO=HOCH4+HOCO+HOH2;
QDAF=KHEAT*EXP(-AHEAT*1E6/(8314.4*TK))*(HO-H(I));
Q(I)=QDAF*DAFO*RHOO;
H(I)=H(I)+QDAF*DT;
IF TK<700 THEN KGAS=7.83E-5*TK;
ELSE IF TK<1100 THEN KGAS=1.095E-3*TK-0.712;
ELSE KGAS=4.48E-4*TK;
KO=(0.016*ATMASS(I)-0.105)*SQRT(TK);
IF E<EO THEN DO;
EPART=1-(1-E)**0.333333;
KPART=1/(EPART/KGAS+(1-EPART)/KO);
EMOIST=RHOO*MOIST(I)*0.001;
KMOIST=(0.6-KPART)*EMOIST;
K(I)=KPART+KMOIST;
END;
ELSE DO;
ECOKE=E/(1-E**.6666667+E);
KCOKE=ECOKE*KGAS+(1-ECOKE)*KO;
ERAD=1-(1-ESHR(I))**.666667;
KRAD=1.822E-7*ERAD*XRAD*TK**3;
K(I)=KCOKE+KRAD;
END;
END XLOOP;
****************************
/* TEMPERATURE HISTORY MODEL */;
IF TIME<TIMES(1) THEN
TF=TEMPS(1);
ELSE IF TIME<TIMES(NF) THEN DO;
IF TIME>TIMES(IF+1) THEN
IF=IF+1;
TF=(TEMPS(IF)*(TIMES(IF+1)-TIME)+TEMPS(IF+1)*(TIME-TIMES(IF)))
/(TIMES(IF+1)-TIMES(IF));
END;ELSE
TF=TEMPS(NF);
G(1)=1;
U(1)=0;
Z(1)=TF;
DO I=2 TO N-1;
KL=2/(1/K(I)+1/K(I-1));
KU=2/(1/K(I+1)+1/K(I));
DIFFL=KL/CVOL(I);
DIFFU=KU/CVOL(I);
@DIFFL=DIFFL/DO;
@DIFFU=DIFFU/DO;
REACT=Q(I)/CVOL(I);
@REACT=REACT*DT;
L(I)=-@DIFFL;
G(I)=1+@DIFFL+@DIFFU;
U(I)=-@DIFFU;
Z(I)=T(I)+@REACT;
END;
L(N)=-@DIFFU;
G(N)=1+@DIFFU;
U(N)=0;
Z(N)=T(N)+Q(N)*DT/CVOL(N);
IB,IC=N+1;
DO I=N BY -1 TO M;
IF T(I)=100 & MOIST(I)>0 THEN IB=I;
END;
DO I=N BY -1 TO IB+1;
IF T(I)<100 THEN IC=I;
END;
DO I=IB TO IC-1;
L(I)=0;
G(I)=1;
U(I)=0;
Z(I)=100;
END;
************************************
DO I=2 TO N;
FACTOR=L(I)/G(I-1);
G(I)=G(I)-FACTOR*U(I-1);
Z(I)=Z(I)-FACTOR*Z(I-1);
END;
DO I=N-1 BY -1 TO 1;
Z(I)=Z(I)-Z(I+1)*U(I)/G(I+1);
END;
DO I=1 TO N;
T(I)=Z(I)/G(I);
END;
DO I=M TO N;
IF T(I)>100 & MOIST(I)>0 THEN T(I)=100;
END;
IF IB<N+1 THEN DO;
QB=K(IB-1)*(T(IB-1)-100)/DX;
QBMAX=LBOIL*(DX-XB)*RHOO*MOIST(IB)/DT;
IF QB>QBMAX THEN DO;
QB=QBMAX;
XB=0;
MOIST(IB)=0;
END;
ELSE XB=XB+QB*DT/(RHOO*MOIST(IB)*LBOIL);
IF IC<N+1 THEN DO;
QC=K(IC)*(100-T(IC))/DX;
QERR=QB-QC;
DO I=IC TO N HHILE(QERR>O);
QSENS=CVOL(I)*(100-T(I))*VO;
IF QSENS>QERR THEN DO;
T(I)=T(I)+QERR/(CVOL(I)*VO);
MOIST(I)=MOIST(I)+QERR/(LBOIL*RHOO*VO);
QERR=0;
END;
ELSE DO;
T(I)=100;
MOIST(I)=MOIST(I)+QSENS/(LBOIL*RHOO*VO);
QERR=QERR-QSENS;
END;END;END;
ELSE DO;
V=CSTEAM*QB/LBOIL;
DO I=IB-1 BY -1 TO M WHILE(ESHR(I)=0);
VEL=V/CVOL(I);
@VEL=VEL/VO;
T(I)=T(I)-@VEL*(T(I-1)-T(I+1))/2;
END;END;END;
IF M>2 THEN
QINPUT=QINPUT+MAX(O, WCOND*(T(1)-T(M-1))/((M-2)*VO));
***********************
/* OUTPUT */;
DO I=1 TO 5;
IF INDX(I)<27 THEN
IF T(NSEG#*(I-1)+M)>=50*INDX(I) THEN DO;
OUT(INDX(I),I)=TIME/3600;
INDX(I)=INDX(I)+1;
END;END;
CTIME=OUT(18,5);
END TLOOP;
PUT EDIT(NAME)(PAGE,X(35),A(20));
PUI EDIT('INPUT DATA')(SKIP(2),X(5),A);
IF INDEX(ISTRING, '=')>0 THEN DO;
PUT EDIT('PROGRAMME CONTROL DATA')(SKIP(2),X(5),A);
PUT EDIT(ISTRING)(SKIP,X(5),A);
END;
PUT EDIT('COAL SPECIFICATION')(SKIP(2),X(5),A);
PUI EDIT('C','H','O','N','S')
(SKIP,X(7),(5) A(6));
PUT EDIT(PC,PH,PX,PN,PS)
(SKIP,X(4),(5) F(6,2));
PUT EDIT('% (DAFB)')(X(2),A(8));
PUT EDIT('CHARGE PREPARATION') (SKIP(2),X(5),A);
PUT EDIT('MOISTURE','ASH','BULK DENSITY','TEMPERATURE')
(SKIP,X(5),A(15),A(12),A(17),A);
PUT EDIT(PMOISTO,PASHDRY,RHODRY,TO)
(SKIP,F(10,1),F(13,1),F(17),F(15));
PUT EDIT('%','% (DRY BASIS)','KG/M3 (DRY BASIS)',' DEG C')
(SKIP,X(8),A(7),A(15),A(21),A);
PUT EDIT ('OVEN SPECIFICATION' )(SKIP(2) ,X(5)) ,A);
PUT EDIT ('WIDTH','WALL:THICKNESS CONDUCTIVITY SPECIFIC '
II'HEAT DENSITY')(SKIP,X(5),A(10),A);
PUT EDIT (WIDTH,WALL,WCOND,WSPHT,WRHO)
(SKIP,F(10,3),F(17,3),F(13,1),F(13),F(10));
PUT EDIT ('M','M','W/M K','J/KG K','KG/M3')
(SKIP,X(7),A(17),A(12),A(12),A(10),A);
PUT EDIT('FLUE TEMPERATURE READINGS')(SKIP(2),X(5),A);
PUT EDIT('NUMBER',NF,'TIMES',TlMESHR,' H','TEMPS',
TEMPS,' DEG C')(SKIP,X(5),A,F(5),SKIP,X(5),A,(NF) F(6,1),A,
SKIP,X(5),A,(NF) F(6),A);
PUT EDIT('PREDICTED TEMPERATURE HISTORY')(SKIP (2) ,X(5) ,A);
PUT EDIT('TEMPERATURE','TIME (H)')(SKIP(2),X(5),A(31),A);
PUT EDIT('(DEG C)','WALL','1/8','1/4','3/8','CENTRE',' ')
(SKIP(2),X(5) ,(4) A(10),A(9),A,SKIP,A);
PUT EDIT((50*I,(OUT(I,J) DO J=1 TO 5) DO I=1 TO 26))
(SKIP,F(9),(5) (X(6),F(4,1)));
PUT EDIT ('COKING TIME',CTIME+3,'H')
(SKIP(2),X(5),A(11),F(8,2),X(3),A);
PUT EDIT('HEAT REQUIREMENTS',QINPUT*1E-6/(RHOO*HWIDTH),
'MJ/KG (DAF INITIAL COAL BASIS)')
(SKIP,X(5),A(17),F(6,3),X(3),A);
END;
GO TO REPEAT;
END ANTHLOG;
//*******************************************************//
Thank you