+#include "list/list.h"
+
+int moldyn_usage(char **argv) {
+
+ printf("\n%s usage:\n\n",argv[0]);
+ printf("--- general options ---\n");
+ printf("-E <steps> <file> (log total energy)\n");
+ printf("-M <steps> <file> (log total momentum)\n");
+ printf("-D <steps> <file> (dump total information)\n");
+ printf("-S <steps> <filebase> (single save file)\n");
+ printf("-V <steps> <filebase> (rasmol file)\n");
+ printf("--- physics options ---\n");
+ printf("-T <temperature> [K] (%f)\n",MOLDYN_TEMP);
+ printf("-t <timestep tau> [s] (%.15f)\n",MOLDYN_TAU);
+ printf("-C <cutoff radius> [m] (%.15f)\n",MOLDYN_CUTOFF);
+ printf("-R <runs> (%d)\n",MOLDYN_RUNS);
+ printf(" -- integration algo --\n");
+ printf(" -I <number> (%d)\n",MOLDYN_INTEGRATE_DEFAULT);
+ printf(" 0: velocity verlet\n");
+ printf(" -- potential --\n");
+ printf(" -P <number> <param1 param2 ...>\n");
+ printf(" 0: harmonic oscillator\n");
+ printf(" param1: spring constant\n");
+ printf(" param2: equilibrium distance\n");
+ printf(" 1: lennard jones\n");
+ printf(" param1: epsilon\n");
+ printf(" param2: sigma\n");
+ printf("\n");
+
+ return 0;
+}
+
+int moldyn_parse_argv(t_moldyn *moldyn,int argc,char **argv) {
+
+ int i;
+
+ memset(moldyn,0,sizeof(t_moldyn));
+
+ /* default values */
+ moldyn->t=MOLDYN_TEMP;
+ moldyn->tau=MOLDYN_TAU;
+ moldyn->time_steps=MOLDYN_RUNS;
+ moldyn->integrate=velocity_verlet;
+
+ /* parse argv */
+ for(i=1;i<argc;i++) {
+ if(argv[i][0]=='-') {
+ switch(argv[i][1]){
+ case 'E':
+ moldyn->ewrite=atoi(argv[++i]);
+ strncpy(moldyn->efb,argv[++i],64);
+ break;
+ case 'M':
+ moldyn->mwrite=atoi(argv[++i]);
+ strncpy(moldyn->mfb,argv[++i],64);
+ break;
+ case 'S':
+ moldyn->swrite=atoi(argv[++i]);
+ strncpy(moldyn->sfb,argv[++i],64);
+ break;
+ case 'V':
+ moldyn->vwrite=atoi(argv[++i]);
+ strncpy(moldyn->vfb,argv[++i],64);
+ break;
+ case 'T':
+ moldyn->t=atof(argv[++i]);
+ break;
+ case 't':
+ moldyn->tau=atof(argv[++i]);
+ break;
+ case 'C':
+ moldyn->cutoff=atof(argv[++i]);
+ break;
+ case 'R':
+ moldyn->time_steps=atoi(argv[++i]);
+ break;
+ case 'I':
+ /* integration algorithm */
+ switch(atoi(argv[++i])) {
+ case MOLDYN_INTEGRATE_VERLET:
+ moldyn->integrate=velocity_verlet;
+ break;
+ default:
+ printf("unknown integration algo %s\n",argv[i]);
+ moldyn_usage(argv);
+ return -1;
+ }
+
+ case 'P':
+ /* potential + params */
+ switch(atoi(argv[++i])) {
+ case MOLDYN_POTENTIAL_HO:
+ hop.spring_constant=atof(argv[++i]);
+ hop.equilibrium_distance=atof(argv[++i]);
+ moldyn->pot_params=malloc(sizeof(t_ho_params));
+ memcpy(moldyn->pot_params,&hop,sizeof(t_ho_params));
+ moldyn->potential_force_function=harmonic_oscillator;
+ break;
+ case MOLDYN_POTENTIAL_LJ:
+ e=atof(argv[++i]);
+ s=atof(argv[++i]);
+ ljp.epsilon4=4*e;
+ ljp.sigma6=s*s*s*s*s*s;
+ ljp.sigma12=ljp.sigma6*ljp.sigma6;
+ moldyn->pot_params=malloc(sizeof(t_lj_params));
+ memcpy(moldyn->pot_params,&ljp,sizeof(t_lj_params));
+ moldyn->potential_force_function=lennard_jones;
+ break;
+ default:
+ printf("unknown potential %s\n",argv[i]);
+ moldyn_usage(argv);
+ return -1;
+ }
+
+ default:
+ printf("unknown option %s\n",argv[i]);
+ moldyn_usage(argv);
+ return -1;
+ }
+ } else {
+ moldyn_usage(argv);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+int moldyn_log_init(t_moldyn *moldyn) {
+
+ moldyn->lvstat=0;
+ t_visual *vis;
+
+ vis=&(moldyn->vis);
+
+ if(moldyn->ewrite) {
+ moldyn->efd=open(moldyn->efb,O_WRONLY|O_CREAT|O_TRUNC);
+ if(moldyn->efd<0) {
+ perror("[moldyn] efd open");
+ return moldyn->efd;
+ }
+ dprintf(moldyn->efd,"# moldyn total energy logfile\n");
+ moldyn->lvstat|=MOLDYN_LVSTAT_TOTAL_E;
+ }
+
+ if(moldyn->mwrite) {
+ moldyn->mfd=open(moldyn->mfb,O_WRONLY|O_CREAT|O_TRUNC);
+ if(moldyn->mfd<0) {
+ perror("[moldyn] mfd open");
+ return moldyn->mfd;
+ }
+ dprintf(moldyn->mfd,"# moldyn total momentum logfile\n");
+ moldyn->lvstat|=MOLDYN_LVSTAT_TOTAL_M;
+ }
+
+ if(moldyn->swrite)
+ moldyn->lvstat|=MOLDYN_LVSTAT_SAVE;
+
+ if((moldyn->vwrite)&&(vis)) {
+ moldyn->visual=vis;
+ visual_init(vis,moldyn->vfb);
+ moldyn->lvstat|=MOLDYN_LVSTAT_VISUAL;
+ }
+
+ moldyn->lvstat|=MOLDYN_LVSTAT_INITIALIZED;
+
+ return 0;
+}
+
+int moldyn_log_shutdown(t_moldyn *moldyn) {
+
+ if(moldyn->efd) close(moldyn->efd);
+ if(moldyn->mfd) close(moldyn->efd);
+ if(moldyn->dfd) close(moldyn->efd);
+ if(moldyn->visual) visual_tini(moldyn->visual);
+
+ return 0;
+}
+
+int moldyn_init(t_moldyn *moldyn,int argc,char **argv) {