Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define nSpecies 160
#define numForwardRxn 1540
void fetchRxn(void);
void processRxn(void);
void thermoData(void);
char *replace_str(char *str, char *orig); //credit to itsme86 from linuxquestions.org "http://goo.gl/F3YpH"//
char speciesName[nSpecies][25];
double ArrhFac[numForwardRxn];
double tempN[numForwardRxn];
double energyAct[numForwardRxn];
double thermo[nSpecies][15];
int numRxnThisSpc[nSpecies];
int rxnID_SpcN[nSpecies][numForwardRxn];
int stoichioNum[nSpecies][numForwardRxn];
int numReactSpc[numForwardRxn];
int numProdtSpc[numForwardRxn];
int reactSpcIDNum[numForwardRxn][5];
int prodtSpcIDNum[numForwardRxn][5];
double cpCoeff4EqmConst[nSpecies][15];
int numPressuDpdRxn=0;
int rxnID_PrDpdRxn[numForwardRxn];
double koa[numForwardRxn];
double kotn[numForwardRxn];
double koe[numForwardRxn];
double alfa[numForwardRxn];
double tts[numForwardRxn];
double ts[numForwardRxn];
double tss[numForwardRxn];
int nn[numForwardRxn];
char speciesTBSR[numForwardRxn][nSpecies][30];
double lpl[numForwardRxn][3];
double troe[numForwardRxn][4];
char rxnFormula[numForwardRxn][110];
char buff[256];
FILE *fp;
int main()
{
fetchRxn();
puts("past here?");
processRxn();
thermoData();
return 0;
}
void fetchRxn(void)
{
int i=0,j[numForwardRxn],k=0, TBSRcount[numForwardRxn], LPLcount[numForwardRxn],
n=0,numTBSRonly=0, numLPLonly=0,
b=0,c=0,LPLcheck=0,
e=0;
int RxnTBSR[numForwardRxn];
FILE *fRxn, *fatne,*frcpm, *ftbsr;
int RxnLPL[numForwardRxn];
double coeffTBSR[numForwardRxn][nSpecies];
char dummy[30];
for(c=0;c<numForwardRxn;c++)
{
j[c]=0;
RxnTBSR[c]=0;
LPLcount[c]=0;
TBSRcount[c]=0;
for(e=0;e<nSpecies;e++)
coeffTBSR[c][e]=0;
}
fp=fopen("try2.out","r");
while ( fgets( buff, sizeof(buff)-1, fp ) != NULL )
{
if(sscanf(buff,"%d. %s %lf %lf %lf",&nn[i],rxnFormula[i],&ArrhFac[i],&tempN[i],&energyAct[i])==5)
{
sprintf(rxnFormula[i],"%s",(replace_str((replace_str(rxnFormula[i], "(+M)")),"(+M)")));
sprintf(rxnFormula[i],"%s",(replace_str((replace_str(rxnFormula[i], "+M")),"+M")));
// sprintf(rxnFormula[i],"%s",(replace_str((replace_str(rxnFormula[i], "<")),"<")));
// sprintf(rxnFormula[i],"%s",(replace_str((replace_str(rxnFormula[i], ">")),">")));
// printf("%2d - %25s - %10.3e %10.3e %10.3e\n",nn[i],rxnFormula[i],ArrhFac[i],tempN[i],energyAct[i]);
// system("PAUSE");
i++;
j[i]=0;
LPLcheck=0;
}
else if(strstr(buff,"Enhanced")!=NULL)
{
if(j[i]==0)//&&LPLcheck==0)
{
RxnTBSR[numTBSRonly]=i;
//printf("%d,%d\n",numTBSRonly,RxnTBSR[numTBSRonly]);
numTBSRonly++;
//printf("%d:TBSR includes %d\n",numTBSRonly-1,RxnTBSR[numTBSRonly-1]);
}
//else if(j==0&&LPLcheck==1)
sscanf(buff,"%s %*s %*s %s",speciesTBSR[i][j[i]],dummy); //coeffTBSR[RxnID][j]
{
coeffTBSR[i][j[i]]=atof(dummy);
//if(LPLcheck==0)
//printf("3rd body surface rxn for rxn %d, %s species with enhancement of %e\n",RxnTBSR[numTBSRonly-1],speciesTBSR[i][j],coeffTBSR[i][j]);
//if(LPLcheck==0)
j[i]++;
TBSRcount[numTBSRonly-1]=j[i];
// if(i==43)
//printf("j %d in TBSRRxn %d\n",TBSRcount[numTBSRonly-1],numTBSRonly-1);
}
}
else if(strstr(buff,"Low pressure limit")!=NULL)
{
sscanf(buff,"%*s %*s %*s\t%lf\t%lf\t%lf",&lpl[i][0],&lpl[i][1],&lpl[i][2]);
//printf("Low pressure limit: %e %e %e\n",lpl[i][0],lpl[i][1],lpl[i][2]);
//tell "Enhanced by" to delete the LPL off//
//LPLcheck=1;
{
RxnLPL[numLPLonly]=i;
// LPLcount[numLPLonly]=TBSRcount[numTBSRonly-1];
LPLcount[numLPLonly]=j[i];
numTBSRonly--;
numLPLonly++;
// goto skip;
}
}
else if(strstr(buff,"TROE centering")!=NULL)
{
numLPLonly--;
sscanf(buff,"%*s %*s\t%lf\t%lf\t%lf\t%lf",&troe[i][0],&troe[i][1],&troe[i][2],&troe[i][3]);
// printf("%E %E %E %E\n",troe[i][0],troe[i][1],troe[i][2],troe[i][3]);
//printf("Low pressure limit: %e %e %e\n",lpl[i][0],lpl[i][1],lpl[i][2]);
koa[numPressuDpdRxn]=lpl[i][0]; lpl[i][0]=0; //zero to avoid messing up
kotn[numPressuDpdRxn]=lpl[i][1]; lpl[i][1]=0;
koe[numPressuDpdRxn]=lpl[i][2]; lpl[i][2]=0;
alfa[numPressuDpdRxn]=troe[i][0];
tts[numPressuDpdRxn]=troe[i][1];
ts[numPressuDpdRxn]=troe[i][2];
tss[numPressuDpdRxn]=troe[i][3];
rxnID_PrDpdRxn[numPressuDpdRxn]=(i); //first i is zero, may need i instead of (i-1)//
// printf("%d. pressure dependent rxn is %d\n",numPressuDpdRxn,i);
numPressuDpdRxn++;
}
}
remove("Reaction.txt");
fRxn=fopen("Reaction.txt","a+");
for(i=0;i<numForwardRxn;i++) fprintf(fRxn,"%s\n",rxnFormula[i]);
fclose(fRxn);
remove("atne.txt");
fatne=fopen("atne.txt","a+");
for(i=0;i<numForwardRxn;i++) fprintf(fatne,"%E\n",ArrhFac[i]);
for(i=0;i<numForwardRxn;i++) fprintf(fatne,"%E\n",tempN[i]);
for(i=0;i<numForwardRxn;i++) fprintf(fatne,"%E\n",energyAct[i]);
fclose(fatne);
remove("rcpm.txt");
frcpm=fopen("rcpm.txt","a+");
for(i=0;i<numPressuDpdRxn;i++) fprintf(frcpm,"%d\n",rxnID_PrDpdRxn[i]);
fclose(frcpm);
remove("Pm.txt");
frcpm=fopen("Pm.txt","a+");
for(i=0;i<numPressuDpdRxn;i++) fprintf(frcpm,"%E\n",koa[i]);
for(i=0;i<numPressuDpdRxn;i++) fprintf(frcpm,"%E\n",kotn[i]);
for(i=0;i<numPressuDpdRxn;i++) fprintf(frcpm,"%E\n",koe[i]);
for(i=0;i<numPressuDpdRxn;i++) fprintf(frcpm,"%E\n",alfa[i]);
for(i=0;i<numPressuDpdRxn;i++) fprintf(frcpm,"%E\n",tts[i]);
for(i=0;i<numPressuDpdRxn;i++) fprintf(frcpm,"%E\n",ts[i]);
for(i=0;i<numPressuDpdRxn;i++) fprintf(frcpm,"%E\n",tss[i]);
remove("tbsr.txt");
ftbsr=fopen("tbsr.txt","a+");
for(i=0;i<numTBSRonly;i++)
{
fprintf(ftbsr,"%d\n",RxnTBSR[i]);
//printf("TBSR includes %d \n",RxnTBSR[i]);
}
fclose(ftbsr);
remove("tbsrcount.txt");
ftbsr=fopen("tbsrcount.txt","a+");
for(i=0;i<numTBSRonly;i++)
{
fprintf(ftbsr,"%d\n",j[RxnTBSR[i]]);
}
remove("Stbsr.txt");
ftbsr=fopen("Stbsr.txt","a+");
for(i=0;i<numTBSRonly;i++)
{
//for(j=0;j<TBSRcount[i];j++)
//printf("i=%d, TBSRcount=%d\n",RxnTBSR[i],TBSRcount[i]);
for(k=0;k<TBSRcount[i];k++) fprintf(ftbsr,"%s\n",speciesTBSR[RxnTBSR[i]][k]);
}
for(i=0;i<numTBSRonly;i++)
{
for(k=0;k<TBSRcount[i];k++) fprintf(ftbsr,"%E\n",coeffTBSR[RxnTBSR[i]][k]);
}
fclose(ftbsr);
FILE *flpl;
remove("lpl.txt");
remove("lplcount.txt");
remove("Slpl.txt");
flpl=fopen("lpl.txt","a+");
for(i=0;i<numLPLonly;i++)
{
fprintf(flpl,"%d\n",RxnLPL[i]);
//printf("%d,LPLcount = %d\n",RxnLPL[i],LPLcount[numLPLonly]);
}
fclose(flpl);
flpl=fopen("lplcount.txt","a+");
for(i=0;i<numLPLonly;i++)
fprintf(flpl,"%d\n",j[RxnLPL[i]]);
fclose(flpl);
flpl=fopen("Slpl.txt","a+");
for(i=0;i<numLPLonly;i++)
{
//for(k=0;j<LPLcount[i];k++)
//printf("i=%d, LPLcount=%d\n",RxnLPL[i],LPLcount[i]);
for(k=0;k<LPLcount[i];k++) fprintf(flpl,"%s\n",speciesTBSR[RxnLPL[i]][k]);
}
for(i=0;i<numLPLonly;i++)
{
for(k=0;k<LPLcount[i];k++) fprintf(flpl,"%E\n",coeffTBSR[RxnLPL[i]][k]);
}
fclose(flpl);
remove("coefflpl.txt");
flpl=fopen("coefflpl.txt","a+");
for(i=0;i<numLPLonly;i++) fprintf(flpl,"%E\n",lpl[RxnLPL[i]][0]);
for(i=0;i<numLPLonly;i++) fprintf(flpl,"%E\n",lpl[RxnLPL[i]][1]);
for(i=0;i<numLPLonly;i++) fprintf(flpl,"%E\n",lpl[RxnLPL[i]][2]);
fclose(flpl);
}
void processRxn(void)
{
puts("here?");
int hh[nSpecies];
int i=0,j=0,k=0,
n=0,p=0,a=0,
b=0,c=0,d=0,
e=0;
char buffer[80];
char temp[2*numForwardRxn][60];
char *sep;
char *sep2;
FILE *fp,*fp2;
remove("Species.txt");
remove("nva.dat");
remove("va1.dat");
remove("va2.dat");
remove("sre.dat");
remove("spr.dat");
int countspecies[nSpecies];
int countspecies2[nSpecies];
int va1[nSpecies][2*numForwardRxn];
int va2[nSpecies][2*numForwardRxn];
int va2temp;
double rateRxnOA[numForwardRxn];
double concS[nSpecies];
double kRxn[2*numForwardRxn];
char rxnstring[2*numForwardRxn];
int srepr[2*numForwardRxn];
int sre[numForwardRxn];
int spr[numForwardRxn];
int srepr2[2*numForwardRxn];
int sre2[3*numForwardRxn];
int spr2[3*numForwardRxn];
for(i=0;i<nSpecies;i++)
{
countspecies[i]=0;
countspecies2[i]=countspecies[i];
hh[i]=0;
for(j=0;j<numForwardRxn;j++)
{
rxnID_SpcN[i][j]=0;
stoichioNum[i][j]=0;
}
}
for(i=0;i<2*numForwardRxn;i++)
srepr[i]=0;
j=0;
fp=fopen("Reaction.txt","r");
while ((fgets(buffer,sizeof(buffer)-1,fp))!=NULL)
{
//printf("something: %s\n",rxnFormula[i]);
//system("PAUSE");
sep=strtok(buffer,"<=>\n"); //seperate the strings with delimiter, '=' and '\n'//
//assign buffer into temporary array//
while(sep!=NULL)
{
strcpy(temp[n],sep);
//printf("%3d)%s\n",n,temp[n]);
n++;
sep=strtok(NULL,"<=>\n");
}
}
fclose(fp);
//splitting temporary array into species//
for(p=0;p<n;p++)
{
//printf("splitting <%s>\n",temp[p]);
sep2=strtok(temp[p],"+");
while(sep2!=NULL)
{
va2temp=1;
if(sscanf(sep2,"%d%s", &va2temp,sep2)==2)
{
//printf("va2temp %d\t",va2temp);
//printf("va2 correct\n");
}
//else
{
}
//check for duplicate//
for(i=0;i<j;i++)
{
if(strcmp(sep2,speciesName[i])==0) //compare strings,0 indicates same strings//
{
//add counter to know how many times the species participate in the mechanism//
countspecies[i]++;
//printf("in strcmp: j=%3d,%7s participate in rxn ID: %d\n",i,species[i],p);
//assign this duplicate species[i] into va1[i][h[i]]//
va1[i][hh[i]]=p;
//if (va2temp!=1)
{
va2[i][hh[i]]=va2temp;
}
//else va2[i][h[i]]=1;
for(k=0;k<hh[i];k++)
{
if(va1[i][hh[i]]==va1[i][k])
{
goto skipwriteva1;
}
}
hh[i]++;
skipwriteva1:
//printf(">>>>duplicate found<<<<\n");
//printf("add one counter to %s\n",species[i]);
// srepr2[c++]=i;
goto skipcopy; //skip writing in the species if there is duplicate//
}
}
//check for duplicate end//
strcpy(speciesName[j],sep2); //assign the splitted token as species after checking for duplicate//
countspecies[j]++;
//assign this species[j] into the va1[species j][h[j]]//
//printf(" j=%3d,%7s participate in rxn ID: %d\n",j,species[j],p);
va1[j][hh[j]]=p;
//if (va2temp!=1)
{
va2[i][hh[j]]=va2temp;
}
//else va2[i][h[j]]=1;
//srepr2[c++]=j;
hh[j]++;
j++;
skipcopy:
//assign va2 value//
//for sre and spr, count how many reactants/products//
if(va2temp!=1)
{
srepr[p]+=(va2temp-1);
}
srepr[p]++;
sep2=strtok(NULL,"+");
}
//ensure all counter will add up to ONE only//
for(i=0;i<j;i++)
{
if(countspecies[i]>(countspecies2[i]+1))
{
countspecies[i]=countspecies2[i]+1;
}
countspecies2[i]=countspecies[i];
}
}
//printf("\n");
//print out the species//
fp=fopen("Species.txt","a+");
for (i=0;i<j;i++)
{
fprintf(fp,"%s\n",speciesName[i]);
//printf("species %2d: <%s>\n",i+1,speciesName[i]);
}
fclose(fp);
//printf("\n");
//print out the number of times each species occurs in//
fp=fopen("nva.dat","a+");
for(i=0;i<j;i++)
{
fprintf(fp,"%d\n",countspecies[i]);
//printf("%3d: %7s found %3d times in total\n",i+1,speciesName[i],countspecies[i]);
numRxnThisSpc[i]=countspecies[i];
}
fclose(fp);
//print va1//
fp=fopen("va1.dat","a+");
//adjust va1, from say 1,2,3,4,5,6,7,8,9,10 into 1,3,5,7,9,2,4,6,8,10//
for(i=0;i<j;i++)
{
for(k=0;k<hh[i];k++)
{
va1[i][k]=va1[i][k]+1;
if((va1[i][k])%2==0)
{
//even//
(va1[i][k])=(va1[i][k]+1)/2+numForwardRxn;
}
else
{
//odd//
(va1[i][k])=va1[i][k]/2+1;
}
rxnID_SpcN[i][k]=va1[i][k];
//printf("%4d",va1[i][k]);
fprintf(fp,"%d\t",va1[i][k]);
}
fprintf(fp,"\n");
//printf("\n");
}
fclose(fp);
//printf("\n\n");
fp=fopen("va2.dat","a+");
for(i=0;i<j;i++)
{
for(k=0;k<hh[i];k++)
{
if(va1[i][k]<=numForwardRxn) //adjust, give negative for those at the LHS of a reaction//
va2[i][k]=-va2[i][k];
stoichioNum[i][k]=va2[i][k];
//printf("%4d",va2[i][k]);
fprintf(fp,"%d\t",va2[i][k]);
}
fprintf(fp,"\n");
//printf("\n");
}
fclose(fp);
//building the rateRxnOA=kRxn*conc-kRxn*conc
for(i=0;i<2*numForwardRxn;i++)
{
// printf("species involved in rxn ID %d includes:\t",i+1);
for(k=0;k<nSpecies;k++)
{
//while (va1[k][a]!=NULL)
for(a=0;a<hh[k];a++)
{
if(va1[k][a]==i+1)
{
c=0;
while(c<abs(va2[k][a]))
{
//printf("%s\t",speciesName[k]);
c++;
if(i<numForwardRxn)
sre2[d++]=k;
else
spr2[e++]=k;
}
}
}
}
//printf("\n");
}
b=0;
//fixing spr and sre, 1st part//
fp=fopen("sre.dat","a+");
fp2=fopen("spr.dat","a+");
for(i=0;i<numForwardRxn;i++)
{
sre[i]=srepr[b]; //here got problem!!, or up there for srepr there//
spr[i]=srepr[b+1];
b+=2;
// printf("sre:%d\tspre:%d\n",sre[i],spr[i]);
numReactSpc[i]=sre[i];
numProdtSpc[i]=spr[i];
fprintf(fp,"%d\n",sre[i]);
//printf("%d\t",spr[i]);
fprintf(fp2,"%d\n",spr[i]);
}
//printf("\n\n");
for(i=0;i<d;i++)
//printf("%d\t",sre2[i]+1)
;
k=0;
for(i=0;i<numForwardRxn;i++)
for(j=0;j<numReactSpc[i];j++)
{
reactSpcIDNum[i][j]=(sre2[k++]+1);
//printf("%d\t",reactSpcIDNum[i][j]);
fprintf(fp,"%d\n",reactSpcIDNum[i][j]);
}
//printf("\n\n");
for(i=0;i<numForwardRxn;i++)
for(j=0;j<numProdtSpc[i];j++)
{
prodtSpcIDNum[i][j]=(spr2[k++]+1);
fprintf(fp2,"%d\n",prodtSpcIDNum[i][j]);
}
fclose(fp);
fclose(fp2);
}
//processRxn end.
void thermoData(void)
{
char buff[82];
char buff2[30];
char tspecies[nSpecies][10];
int n=0,m=0;
int i=0,k=0;
double a[nSpecies][15];
int len;
//FILE *fp;
fp=fopen("thermo30.dat","r");
while ( fgets( buff, sizeof(buff)-1, fp ) != NULL)
{
//printf("something %d\n",m++);
len=strlen(buff);
if(len>75)
{
if(i%4==0)
{
sscanf(buff,"%s",tspecies[k]);
//printf("%s\n",temp[k]);
strncpy(buff2,&buff[67],11);
a[k][14]=atof(buff2);
}
if(i%4==1)
{
//puts(buff);
{
for(n=0;n<5;n++)
{
sscanf(&buff[n*15],"%lf",&a[k][n]);
// printf("%e\n",a[k][n]);
}
}
//printf("\n\n");
}
if(i%4==2)
{
//puts(buff);
{
for(n=0;n<5;n++)
{
sscanf(&buff[n*15],"%lf",&a[k][n+5]);
// printf("%e\n",a[k][n+5]);
}
}
//printf("\n\n");
}
if(i%4==3)
{
//puts(buff);
for(n=0;n<4;n++)
{
sscanf(&buff[n*15],"%lf",&a[k][n+10]);
//printf("%e\n",a[k][n+10]);
}
k++;
//printf("\n\n");
}
i++;
}
}
fclose(fp);
remove("Sthermo.dat");
fp=fopen("Sthermo.dat","a+");
for(m=0;m<nSpecies;m++)
{
for(i=0;i<nSpecies;i++)
if(strcmp(speciesName[m],tspecies[i])==0)
{
for(k=0;k<15;k++)
thermo[m][k]=a[i][k];
}
//printf("%s has the following coeffs:\n",speciesName[m]);
for(k=0;k<15;k++)
//printf("%e\n", thermo[m][k]);
if(k<14)
fprintf(fp,"%.8E\n",thermo[m][k]);
cpCoeff4EqmConst[m][k]=thermo[m][k];
}
for(m=0;m<nSpecies;m++)
fprintf(fp,"%.8E\n",thermo[m][14]);
fclose(fp);
}
char *replace_str(char *str, char *orig)
{
char buffer[4096];
char *pp;
if(!(pp = strstr(str, orig))) // Is 'orig' even in 'str'?
return str;
strncpy(buffer, str, pp-str); // Copy characters from 'str' start to 'orig' st$
buffer[pp-str] = '\0';
sprintf(buffer+(pp-str), "%s", pp+strlen(orig));
return buffer;
}