/* Subroutine: abc_com.c This program handles command-line input for the ABC simulator, auto- matically opening and closing input script files (*.s assumed). Command parameters may be separated with blanks, commas, or tabs. All input after a '#' will be ignored (comment symbol). Command options are described below in com_hlp. */ #include "abc.h" /* File variables */ int lfl1,lfl2,lfl3,nfl=0; char nfl1[80],nfl2[80],nfl3[80],nfle[80]; FILE *vfl1,*vfl2,*vfl3; /* Input parameters */ int npr; char par[maxpar][maxnam]; char inp[maxinp]; void abc_com(int argc,char **argv) { int iret,ierr,iobj,i,j; int i0,i1,i2,i3,i4,i5,i6,i7,i8,i9; char c0,c1,c2,c3,c4,c5,c6,c7,c8,c9; double r0,r1,r2,r3,r4,r5,r6,r7,r8,r9; if(abctag) { abctag = 0; strcpy(inp,"i abc"); com_inp(); goto command_exe; } command_inp: com_inp(); command_exe: /* Set process tags */ ierr = 0; if(npr != 1) ierr++; if(iret = sscanf(par[1],"%lf",&r1) != 1) ierr++; iret = 0; if(strcmp(par[0],"dectag") == 0) { dectag = !dectag; iret = 1; } if(strcmp(par[0],"lostag") == 0) { lostag = !lostag; iret = 1; } if(strcmp(par[0],"magtag") == 0) { magtag = !magtag; iret = 1; } if(strcmp(par[0],"mlttag") == 0) { mlttag = !mlttag; iret = 1; } if(strcmp(par[0],"maxstp") == 0) if(ierr == 0) { maxstp = r1; iret = 1; } if(strcmp(par[0],"minstp") == 0) if(ierr == 0) { minstp = r1; iret = 1; } if(strcmp(par[0],"minmom") == 0) if(ierr == 0) { minmom = r1; iret = 1; } if(strcmp(par[0],"mintol") == 0) if(ierr == 0) { mintol = r1; iret = 1; } if(strcmp(par[0],"inclos") == 0) if(ierr == 0) { inclos = r1; iret = 1; } if(strcmp(par[0],"incmag") == 0) if(ierr == 0) { incmag = r1; iret = 1; } if(strcmp(par[0],"incrad") == 0) if(ierr == 0) { incrad = r1; iret = 1; } if(iret) goto command_inp; /* Perform tasks */ if(strcmp(par[0],"t") == 0) { if(npr < 1) goto command_inp; if(iret = sscanf(par[1],"%d",&i0) != 1) i0 = 0; /* Normal variables */ if(i0 == 1) { if(iret = sscanf(par[2],"%d", &i1) != 1) i1 = 10; if(iret = sscanf(par[3],"%lf",&r1) != 1) r1 = 0.0; if(iret = sscanf(par[4],"%lf",&r2) != 1) r2 = 1.0; for(i=0;i r2) goto task2; fprintf(stdout,"%f\n",r3); } } /* Bethe-Bloch Equation */ if(i0 == 3) { if(iret = sscanf(par[2],"%d", &i1) != 1) i1 = 3; if(iret = sscanf(par[3],"%d", &i2) != 1) i2 = 10; if(iret = sscanf(par[4],"%lf",&r1) != 1) r1 = 0.01; if(iret = sscanf(par[5],"%lf",&r2) != 1) r2 = 100.; if(iret = sscanf(par[6],"%lf",&r3) != 1) r3 = 0.01; r4 = r1; while(r4 <= r2) { r9 = sqrt(r4*r4 + prtmas[i2]*prtmas[i2]); r5 = -10.0*los_bbl(0,i1,i2,r9)/matden[i1]; r6 = -10.0*los_bbl(1,i1,i2,r9)/matden[i1]; r7 = -10.0*los_bbl(2,i1,i2,r9)/matden[i1]; fprintf(stdout,"%14.4e %14.4e %14.4e %14.4e \n",r4,r5,r6,r7); r4 += r3; } } /* Range */ if(i0 == 4) { if(iret = sscanf(par[2],"%d", &i1) != 1) i1 = 3; if(iret = sscanf(par[3],"%d", &i2) != 1) i2 = 6; if(iret = sscanf(par[4],"%lf",&r1) != 1) r1 = 10.0; if(iret = sscanf(par[5],"%lf",&r2) != 1) r2 = 0.01; if(iret = sscanf(par[6],"%lf",&r3) != 1) r3 = 0.01; r4 = r1; r7 = 0.0; while(r4 >= r3) { r5 = sqrt(r4*r4 + prtmas[i2]*prtmas[i2]); r6 = los_bbl(2,i1,i2,r5); fprintf(stdout,"%14.4e %14.4e %14.4e %14.4e \n",r7,r4,r5,r6); r8 = los_rk4(2,i1,i2,r5,r6,r7,r2); r7 += r2; r4 = sqrt(r8*r8 - prtmas[i2]*prtmas[i2]); } } goto command_inp; } /* Drawing routine */ if(strcmp(par[0],"d") == 0) { if(drwtag == 2) { return; } if(drwtag == 1) { drwtag = 2; drw_hlp(); abc_drw(argc,argv); } fprintf(stderr," Error: display deactivated (drwtag=0) \n"); goto command_inp; } /* Generate particles */ if(npr <= 1 && (iret = sscanf(par[0],"%d",&i0) == 1)) { ierr = 0; i1 = 1; if(npr == 1) if(iret = sscanf(par[1],"%d",&i1) != 1) ierr++; if(ierr == 0) { if(i0 == 0) i0 = 10; for(i=1;i<=i1;i++) { abc_gen(i0); trknum = 0; hitnum = 0; } } else fprintf(stderr," Usage: [] \n"); goto command_inp; } /* Color data */ if(iret = strcmp(par[0],"c") == 0) { ierr = 0; if(npr != 4) ierr++; if(iret = sscanf(par[1],"%d", &i0) != 1) ierr++; if(iret = sscanf(par[2],"%lf",&r1) != 1) ierr++; if(iret = sscanf(par[3],"%lf",&r2) != 1) ierr++; if(iret = sscanf(par[4],"%lf",&r3) != 1) ierr++; if(ierr == 0) { if(i0 <= 0 || i0 >= maxcol) fprintf(stderr, " Error: color number range (1,%d) \n",maxcol-1); else { drwcol[i0][0] = 1.0; drwcol[i0][1] = r1; drwcol[i0][2] = r2; drwcol[i0][3] = r3; } } else fprintf(stderr," Usage: c \n"); goto command_inp; } /* Set output format */ if(strcmp(par[0],"f") == 0) { ierr = 0; if(npr != 1) ierr++; if(iret = sscanf(par[1],"%d",&i0) != 1) ierr++; if(i0 < 0 || i0 > 2) ierr++; if(ierr == 0) { dattag = i0; } else fprintf(stderr," Usage: f <0,1,2> \n"); goto command_inp; } /* Generator data */ if(strcmp(par[0],"g") == 0) { ierr = 0; if(npr != 10) ierr++; if(iret = sscanf(par[1], "%d", &i0) != 1) ierr++; if(iret = sscanf(par[2], "%d", &i1) != 1) ierr++; if(iret = sscanf(par[3], "%d", &i2) != 1) ierr++; if(iret = sscanf(par[4], "%lf",&r1) != 1) ierr++; if(iret = sscanf(par[5], "%lf",&r2) != 1) ierr++; if(iret = sscanf(par[6], "%lf",&r3) != 1) ierr++; if(iret = sscanf(par[7], "%lf",&r4) != 1) ierr++; if(iret = sscanf(par[8], "%lf",&r5) != 1) ierr++; if(iret = sscanf(par[9], "%lf",&r6) != 1) ierr++; if(iret = sscanf(par[10],"%lf",&r0) != 1) ierr++; if(ierr == 0) { if(i0 <= 0 || i0 >= maxgen) fprintf(stderr, " Error: generator range (1,%d) \n",maxgen-1); else { genprt[i0] = i1; genflg[i0] = i2; gendmo[i0] = r0; genxpo[i0] = r1; genypo[i0] = r2; genzpo[i0] = r3; genxmo[i0] = r4; genymo[i0] = r5; genzmo[i0] = r6; } } else fprintf(stderr," Usage: g \n"); goto command_inp; } /* Material data */ if(strcmp(par[0],"m") == 0) { ierr = 0; if(npr != 6) ierr++; if(iret = sscanf(par[1],"%d", &i0) != 1) ierr++; if(iret = sscanf(par[3],"%lf",&r1) != 1) ierr++; if(iret = sscanf(par[4],"%lf",&r2) != 1) ierr++; if(iret = sscanf(par[5],"%lf",&r3) != 1) ierr++; if(iret = sscanf(par[6],"%lf",&r4) != 1) ierr++; if(ierr == 0) { if(i0 <= 0 || i0 >= maxmat) fprintf(stderr, " Error: material number range (1,%d) \n",maxmat-1); else { matnum[i0] = i0; strcpy(matnam[i0],par[2]); matatm[i0] = r1; matatn[i0] = r2; matden[i0] = r3; matrad[i0] = r4; } } else fprintf(stderr," Usage: m \n"); goto command_inp; } /* Object data */ if(strcmp(par[0],"u") == 0) { ierr = 0; if(npr != 8) ierr++; if(iret = sscanf(par[1],"%d", &i1) != 1) ierr++; if(iret = sscanf(par[2],"%d", &i2) != 1) ierr++; if(iret = sscanf(par[3],"%lf",&r1) != 1) ierr++; if(iret = sscanf(par[4],"%lf",&r2) != 1) ierr++; if(iret = sscanf(par[5],"%lf",&r3) != 1) ierr++; if(iret = sscanf(par[6],"%lf",&r4) != 1) ierr++; if(iret = sscanf(par[7],"%lf",&r5) != 1) ierr++; if(iret = sscanf(par[8],"%lf",&r6) != 1) ierr++; if(ierr == 0) { objnum[0] = 0; objbmg[0] = 0.0; objcol[0] = i1; objdet[0] = 0; objbty[0] = '0'; objmat[0] = i2; strcpy(objshp[0],"box"); strcpy(objnam[0],"universe"); objdim[0][1] = (r1+r2)/2; objdim[0][4] = r2-r1; objdim[0][7] = 0.0; objdim[0][2] = (r3+r4)/2; objdim[0][5] = r4-r3; objdim[0][8] = 0.0; objdim[0][3] = (r5+r6)/2; objdim[0][6] = r6-r5; objdim[0][9] = 0.0; } else fprintf(stderr, " Usage: u \n"); goto command_inp; } if(strcmp(par[0],"o") == 0) { ierr = 0; if(npr != 17) ierr++; if(iret = sscanf(par[1], "%d", &i0) != 1) ierr++; if(iret = sscanf(par[4], "%d", &i1) != 1) ierr++; if(iret = sscanf(par[5], "%d", &i2) != 1) ierr++; if(iret = sscanf(par[6], "%d", &i3) != 1) ierr++; if(iret = sscanf(par[7], "%c", &c0) != 1) ierr++; if(iret = sscanf(par[8], "%lf",&r0) != 1) ierr++; if(iret = sscanf(par[9], "%lf",&r1) != 1) ierr++; if(iret = sscanf(par[10],"%lf",&r2) != 1) ierr++; if(iret = sscanf(par[11],"%lf",&r3) != 1) ierr++; if(iret = sscanf(par[12],"%lf",&r4) != 1) ierr++; if(iret = sscanf(par[13],"%lf",&r5) != 1) ierr++; if(iret = sscanf(par[14],"%lf",&r6) != 1) ierr++; if(iret = sscanf(par[15],"%lf",&r7) != 1) ierr++; if(iret = sscanf(par[16],"%lf",&r8) != 1) ierr++; if(iret = sscanf(par[17],"%lf",&r9) != 1) ierr++; if(ierr == 0) { if(i0 <= 0 || i0 >= maxobj) fprintf(stderr, " Error: object number range (1,%d) \n",maxobj-1); else { objnum[i0] = i0; objmat[i0] = i2; objbty[i0] = c0; objcol[i0] = i1; objdet[i0] = i3; objbmg[i0] = r0; strcpy(objnam[i0],par[2]); strcpy(objshp[i0],par[3]); objdim[i0][1] = r1; objdim[i0][2] = r2; objdim[i0][3] = r3; objdim[i0][4] = r4; objdim[i0][5] = r5; objdim[i0][6] = r6; objdim[i0][7] = r7; objdim[i0][8] = r8; objdim[i0][9] = r9; } } else { fprintf(stderr," Usage: o "); fprintf(stderr," "); fprintf(stderr," \n"); } goto command_inp; } /* Particle data */ if(strcmp(par[0],"p") == 0) { ierr = 0; if(npr != 7) ierr++; if(iret = sscanf(par[1],"%d", &i0) != 1) ierr++; if(iret = sscanf(par[3],"%d", &i1) != 1) ierr++; if(iret = sscanf(par[4],"%lf",&r1) != 1) ierr++; if(iret = sscanf(par[5],"%lf",&r2) != 1) ierr++; if(iret = sscanf(par[6],"%lf",&r3) != 1) ierr++; if(iret = sscanf(par[7],"%d", &i2) != 1) ierr++; if(ierr == 0) { if(i0 <= 0 || i0 >= maxprt) fprintf(stderr, " Error: particle number range (1,%d) \n",maxprt-1); else { prtnum[i0] = i0; prtcol[i0] = i1; strcpy(prtnam[i0],par[2]); prtchr[i0] = r1; prtmas[i0] = r2; prtlif[i0] = r3; prtmdn[i0] = i2; if(prtmdn[i0] > 0) for(i=1;i<=prtmdn[i0];i++) { com_inp(); ierr = 0; if(npr != 1) ierr++; if(iret = sscanf(par[0],"%d", &i3) != 1) ierr++; if(iret = sscanf(par[1],"%lf",&r4) != 1) ierr++; if(ierr == 0) { prtmdp[i0][i] = i3; prtmdb[i0][i] = r4; } else fprintf(stderr," Usage: \n"); } } } else fprintf(stderr, " Usage: p \n"); goto command_inp; } /* List data */ if(strcmp(par[0],"l") == 0) { if(npr == 1 && strcmp(par[1],"c") == 0) { fprintf(stderr," Colors: red grn blu \n"); for(i=1;i 0.0) { fprintf(stderr," %02d %4.2f %4.2f %4.2f \n", i,drwcol[i][1],drwcol[i][2],drwcol[i][3]); } goto command_inp; } if(npr == 1 && strcmp(par[1],"g") == 0) { fprintf(stderr," Gen: prt flg "); fprintf(stderr," pos-(x,y,z) mom-(x,y,z) "); fprintf(stderr," del \n"); for(i=1;i 0) { fprintf(stderr," %02d %02d %d ", i,genprt[i],genflg[i]); fprintf(stderr,"%9.2e %9.2e %9.2e %9.2e %9.2e %9.2e %4.1f\n", genxpo[i],genypo[i],genzpo[i], genxmo[i],genymo[i],genzmo[i],gendmo[i]); } goto command_inp; } if(npr == 1 && strcmp(par[1],"m") == 0) { fprintf(stderr," Materials: A Z "); fprintf(stderr," den rad \n"); for(i=1;i 0) { fprintf(stderr," %02d %-8.8s %9.2f %9.2f %9.2f %9.2f \n", matnum[i],matnam[i],matatm[i],matatn[i],matden[i],matrad[i]); } goto command_inp; } if(npr == 1 && strcmp(par[1],"o") == 0) { fprintf(stderr," Objects: shp c m d bty/mg "); fprintf(stderr," pos-(x,y,z) siz-(1,2,3) ang-(a,b,c) \n"); for(i=0;i 0) { fprintf(stderr," %02d %-8.8s %s %02d", objnum[i],objnam[i],objshp[i],objcol[i]); fprintf(stderr," %02d %02d %c %4.1f ", objmat[i],objdet[i],objbty[i],objbmg[i]); for(j=1;j<=9;j++) fprintf(stderr," %4.1f",objdim[i][j]); fprintf(stderr,"\n"); } goto command_inp; } if(npr == 1 && strcmp(par[1],"p") == 0) { fprintf(stderr," Particles: chr mas lif mdn"); fprintf(stderr," mdp mdb \n"); for(i=1;i 0) { fprintf(stderr," %02d %-10.10s %4.1f %8.6f %9.2e %d \n", prtnum[i],prtnam[i],prtchr[i],prtmas[i],prtlif[i],prtmdn[i]); if(prtmdn[i] > 0) for(j=1;j<=prtmdn[i];j++) { fprintf(stderr,"%43d %06d %9.2e \n", j,prtmdp[i][j],prtmdb[i][j]); } } goto command_inp; } fprintf(stderr," Usage: l \n"); goto command_inp; } /* Show process tags and simulator constants */ if(strcmp(par[0],"s") == 0) { fprintf(stderr," Process tags: dectag = %d \n",dectag); fprintf(stderr," lostag = %d \n",lostag); fprintf(stderr," magtag = %d \n",magtag); fprintf(stderr," mlttag = %d \n",mlttag); fprintf(stderr,"\n"); fprintf(stderr," Simulator constants: minstp = %8.6f \n",minstp); fprintf(stderr," maxstp = %8.6f \n",maxstp); fprintf(stderr," minmom = %8.6f \n",minmom); fprintf(stderr," mintol = %8.6f \n",mintol); fprintf(stderr," inclos = %8.6f \n",inclos); fprintf(stderr," incmag = %8.6f \n",incmag); fprintf(stderr," incrad = %8.6f \n",incrad); goto command_inp; } /* Zero data */ if(strcmp(par[0],"z") == 0) { ierr = 1; if(npr == 1) { if(strcmp(par[1],"c") == 0) { ierr = 0; for(i=0;i \n"); goto command_inp; } /* Help list */ if(strcmp(par[0],"help") == 0) strcpy(par[0],"?"); if(strcmp(par[0],"?") == 0) { com_hlp(); goto command_inp; } /* Flag unknown commands or quit */ if(strcmp(par[0],"exit") == 0) strcpy(par[0],"q"); if(strcmp(par[0],"quit") == 0) strcpy(par[0],"q"); if(strcmp(par[0],"q") != 0) { fprintf(stderr," Error: unknown command %s",par[0]); if(nfl == 1) fprintf(stderr," (%s, line %d)",nfl1,lfl1); if(nfl == 2) fprintf(stderr," (%s, line %d)",nfl2,lfl2); if(nfl == 3) fprintf(stderr," (%s, line %d)",nfl3,lfl3); fprintf(stderr,"\n"); goto command_inp; } fprintf(stderr,"\n"); exit(0); } void com_inp() { int iret,i; char ca,cb,cc[2]; /* Input commands */ if(iret = strcmp(inp,"\0") != 0) goto parseinput; getinput: if(nfl == 3) { if(iret=fgets(inp,sizeof(inp),vfl3) == 0) { fclose(vfl3); nfl--; if(vrbtag) fprintf(stderr," File: %s read with %d lines\n",nfl3,lfl3); } else { lfl3++; } } if(nfl == 2) { if(iret=fgets(inp,sizeof(inp),vfl2) == 0) { fclose(vfl2); nfl--; if(vrbtag) fprintf(stderr," File: %s read with %d lines\n",nfl2,lfl2); } else { lfl2++; } } if(nfl == 1) { if(iret=fgets(inp,sizeof(inp),vfl1) == 0) { fclose(vfl1); nfl--; if(vrbtag) fprintf(stderr," File: %s read with %d lines\n",nfl1,lfl1); } else { lfl1++; } } if(nfl == 0) { fprintf(stderr," ABC> "); fgets(inp,sizeof(inp),stdin); } /* Parse commands */ parseinput: for(i=0;i \n"); goto getinput; } strcpy(nfle,par[1]); strcat(nfle,".s"); if(nfl == 3) { fprintf(stderr," Error: %s not opened (file num exceeded) \n",nfle); } if(nfl == 2) { strcpy(nfl3,nfle); vfl3 = fopen(nfl3,"r"); if(vfl3 == NULL) fprintf(stderr," Error: %s does not exist \n",nfl3); else { nfl = 3; lfl3 = 0; } } if(nfl == 1) { strcpy(nfl2,nfle); vfl2 = fopen(nfl2,"r"); if(vfl2 == NULL) fprintf(stderr," Error: %s does not exist \n",nfl2); else { nfl = 2; lfl2 = 0; } } if(nfl == 0) { strcpy(nfl1,nfle); vfl1 = fopen(nfl1,"r"); if(vfl1 == NULL) fprintf(stderr," Error: %s does not exist \n",nfl1); else { nfl = 1; lfl1 = 0; } } goto getinput; } } void com_hlp() { fprintf(stderr,"\n"); fprintf(stderr," Commands: (type '?' for help, 'q' to quit) \n"); fprintf(stderr,"\n"); fprintf(stderr," # - generate particle # [n times] \n"); fprintf(stderr," c - define color \n"); fprintf(stderr," d - display \n"); fprintf(stderr," f - set output format \n"); fprintf(stderr," g - define generator \n"); fprintf(stderr," i - input script file \n"); fprintf(stderr," l - list data \n"); fprintf(stderr," m - define material \n"); fprintf(stderr," o - define object \n"); fprintf(stderr," p - define particle \n"); fprintf(stderr," s - show parameters \n"); fprintf(stderr," u - define universe \n"); fprintf(stderr," z - zero data \n"); fprintf(stderr,"\n"); }