+#include "visual/visual.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("-R <runs> (%d)\n",MOLDYN_RUNS);
+ 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;
+
+ /* 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 'D':
+ moldyn->dwrite=atoi(argv[++i]);
+ strncpy(moldyn->dfb,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 'R':
+ moldyn->time_steps=atoi(argv[++i]);
+ break;
+ 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,void *v) {
+
+ moldyn->lvstat=0;
+ t_visual *vis;
+
+ vis=v;
+
+ 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->dwrite) {
+ moldyn->dfd=open(moldyn->dfb,O_WRONLY|O_CREAT|O_TRUNC);
+ if(moldyn->dfd<0) {
+ perror("[moldyn] dfd open");
+ return moldyn->dfd;
+ }
+ write(moldyn->dfd,moldyn,sizeof(t_moldyn));
+ moldyn->lvstat|=MOLDYN_LVSTAT_DUMP;
+ }
+
+ 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_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);