+ 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) {
+
+ int ret;
+
+ ret=moldyn_parse_argv(moldyn,argc,argv);
+ if(ret<0) return ret;
+
+ ret=moldyn_log_init(moldyn);
+ if(ret<0) return ret;
+
+ rand_init(&(moldyn->random),NULL,1);
+ moldyn->random.status|=RAND_STAT_VERBOSE;
+
+ moldyn->status=0;
+
+ return 0;
+}
+
+int moldyn_shutdown(t_moldyn *moldyn) {
+
+ moldyn_log_shutdown(moldyn);
+ rand_close(&(moldyn->random));
+ free(moldyn->atom);
+
+ return 0;
+}
+
+int create_lattice(u8 type,int element,double mass,double lc,