+int set_nn_dist(t_moldyn *moldyn,double dist) {
+
+ moldyn->nnd=dist;
+
+ return 0;
+}
+
+int set_pbc(t_moldyn *moldyn,u8 x,u8 y,u8 z) {
+
+ printf("[moldyn] periodic boundary conditions:\n");
+
+ if(x)
+ moldyn->status|=MOLDYN_STAT_PBX;
+
+ if(y)
+ moldyn->status|=MOLDYN_STAT_PBY;
+
+ if(z)
+ moldyn->status|=MOLDYN_STAT_PBZ;
+
+ printf(" x: %s\n",x?"yes":"no");
+ printf(" y: %s\n",y?"yes":"no");
+ printf(" z: %s\n",z?"yes":"no");
+
+ return 0;
+}
+
+int set_potential1b(t_moldyn *moldyn,pf_func1b func,void *params) {
+
+ moldyn->func1b=func;
+ moldyn->pot1b_params=params;
+
+ return 0;
+}
+
+int set_potential2b(t_moldyn *moldyn,pf_func2b func,void *params) {
+
+ moldyn->func2b=func;
+ moldyn->pot2b_params=params;
+
+ return 0;
+}
+
+int set_potential2b_post(t_moldyn *moldyn,pf_func2b_post func,void *params) {
+
+ moldyn->func2b_post=func;
+ moldyn->pot2b_params=params;
+
+ return 0;
+}
+
+int set_potential3b(t_moldyn *moldyn,pf_func3b func,void *params) {
+
+ moldyn->func3b=func;
+ moldyn->pot3b_params=params;
+
+ return 0;
+}
+
+int moldyn_set_log_dir(t_moldyn *moldyn,char *dir) {
+
+ strncpy(moldyn->vlsdir,dir,127);
+
+ return 0;
+}
+
+int moldyn_set_report(t_moldyn *moldyn,char *author,char *title) {
+
+ strncpy(moldyn->rauthor,author,63);
+ strncpy(moldyn->rtitle,title,63);
+
+ return 0;
+}
+
+int moldyn_set_log(t_moldyn *moldyn,u8 type,int timer) {
+
+ char filename[128];
+ int ret;
+
+ printf("[moldyn] set log: ");
+
+ switch(type) {
+ case LOG_TOTAL_ENERGY:
+ moldyn->ewrite=timer;
+ snprintf(filename,127,"%s/energy",moldyn->vlsdir);
+ moldyn->efd=open(filename,
+ O_WRONLY|O_CREAT|O_EXCL,
+ S_IRUSR|S_IWUSR);
+ if(moldyn->efd<0) {
+ perror("[moldyn] energy log fd open");
+ return moldyn->efd;
+ }
+ dprintf(moldyn->efd,"# total energy log file\n");
+ printf("total energy (%d)\n",timer);
+ break;
+ case LOG_TOTAL_MOMENTUM:
+ moldyn->mwrite=timer;
+ snprintf(filename,127,"%s/momentum",moldyn->vlsdir);
+ moldyn->mfd=open(filename,
+ O_WRONLY|O_CREAT|O_EXCL,
+ S_IRUSR|S_IWUSR);
+ if(moldyn->mfd<0) {
+ perror("[moldyn] momentum log fd open");
+ return moldyn->mfd;
+ }
+ dprintf(moldyn->efd,"# total momentum log file\n");
+ printf("total momentum (%d)\n",timer);
+ break;
+ case SAVE_STEP:
+ moldyn->swrite=timer;
+ printf("save file (%d)\n",timer);
+ break;
+ case VISUAL_STEP:
+ moldyn->vwrite=timer;
+ ret=visual_init(&(moldyn->vis),moldyn->vlsdir);
+ if(ret<0) {
+ printf("[moldyn] visual init failure\n");
+ return ret;
+ }
+ printf("visual file (%d)\n",timer);
+ break;
+ case CREATE_REPORT:
+ snprintf(filename,127,"%s/report.tex",moldyn->vlsdir);
+ moldyn->rfd=open(filename,
+ O_WRONLY|O_CREAT|O_EXCL,
+ S_IRUSR|S_IWUSR);
+ if(moldyn->rfd<0) {
+ perror("[moldyn] report fd open");
+ return moldyn->rfd;
+ }
+ snprintf(filename,127,"%s/plot.scr",moldyn->vlsdir);
+ moldyn->pfd=open(filename,
+ O_WRONLY|O_CREAT|O_EXCL,
+ S_IRUSR|S_IWUSR);
+ if(moldyn->pfd<0) {
+ perror("[moldyn] plot fd open");
+ return moldyn->pfd;
+ }
+ dprintf(moldyn->rfd,report_start,
+ moldyn->rauthor,moldyn->rtitle);
+ dprintf(moldyn->pfd,plot_script);
+ close(moldyn->pfd);
+ break;
+ default:
+ printf("unknown log type: %02x\n",type);
+ return -1;
+ }
+
+ return 0;
+}
+
+int moldyn_log_shutdown(t_moldyn *moldyn) {