+ 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) {
+
+ char sc[256];
+
+ printf("[moldyn] log shutdown\n");
+ if(moldyn->efd) close(moldyn->efd);
+ if(moldyn->mfd) close(moldyn->mfd);
+ if(moldyn->rfd) {
+ dprintf(moldyn->rfd,report_end);
+ close(moldyn->rfd);
+ snprintf(sc,255,"cd %s && gnuplot plot.scr",moldyn->vlsdir);
+ system(sc);
+ snprintf(sc,255,"cd %s && pdflatex report",moldyn->vlsdir);
+ system(sc);
+ snprintf(sc,255,"cd %s && pdflatex report",moldyn->vlsdir);
+ system(sc);
+ snprintf(sc,255,"cd %s && dvipdf report",moldyn->vlsdir);
+ system(sc);
+ }
+ if(&(moldyn->vis)) visual_tini(&(moldyn->vis));
+
+ return 0;
+}
+
+/*
+ * creating lattice functions
+ */
+
+int create_lattice(t_moldyn *moldyn,u8 type,double lc,int element,double mass,
+ u8 attr,u8 brand,int a,int b,int c) {
+
+ int new,count;