pthread imp started for orig albe (more easier in the beginning)
[physik/posic.git] / moldyn.c
index 4788a81..8d50a69 100644 (file)
--- a/moldyn.c
+++ b/moldyn.c
@@ -1608,33 +1608,6 @@ int moldyn_set_schedule_hook(t_moldyn *moldyn,set_hook hook,void *hook_params) {
  *
  */
 
-/* helper / special functions */
-
-#ifdef PTHREADS
-void *write_save_file(void *ptr) {
-
-       int fd;
-       char dir[128];
-       t_moldyn *moldyn;
-
-       moldyn=ptr;
-
-       snprintf(dir,128,"%s/s-%08.f.save",moldyn->vlsdir,moldyn->time);
-       fd=open(dir,O_WRONLY|O_TRUNC|O_CREAT,S_IRUSR|S_IWUSR);
-       if(fd<0) perror("[moldyn] save fd open");
-       else {
-               write(fd,moldyn,sizeof(t_moldyn));
-               write(fd,moldyn->atom,moldyn->count*sizeof(t_atom));
-       }
-
-       close(fd);
-
-       pthread_exit(NULL);
-
-       return 0;
-}
-#endif
-
 /* start the integration */
 
 int moldyn_integrate(t_moldyn *moldyn) {
@@ -1644,10 +1617,8 @@ int moldyn_integrate(t_moldyn *moldyn) {
        t_3dvec momentum;
        t_moldyn_schedule *sched;
        t_atom *atom;
-#ifndef PTHREADS
        int fd;
        char dir[128];
-#endif
        double ds;
        double energy_scale;
        struct timeval t1,t2;
@@ -1806,6 +1777,21 @@ int moldyn_integrate(t_moldyn *moldyn) {
                }
                if(s) {
                        if(!(moldyn->total_steps%s)) {
+                               snprintf(dir,128,"%s/s-%08.f.save",
+                                        moldyn->vlsdir,moldyn->time);
+                               fd=open(dir,O_WRONLY|O_TRUNC|O_CREAT,
+                                       S_IRUSR|S_IWUSR);
+                               if(fd<0) perror("[moldyn] save fd open");
+                               else {
+                                       write(fd,moldyn,sizeof(t_moldyn));
+                                       write(fd,moldyn->atom,
+                                             moldyn->count*sizeof(t_atom));
+                               }
+                               close(fd);
+                       }       
+               }
+               if(a) {
+                       if(!(moldyn->total_steps%a)) {
 #ifdef PTHREADS
        /* check whether thread has not terminated yet */
        if(!first) {
@@ -1828,29 +1814,14 @@ int moldyn_integrate(t_moldyn *moldyn) {
        md_copy.atom=atom_copy;
        memcpy(atom_copy,moldyn->atom,moldyn->count*sizeof(t_atom));
        change=0;
-       ret=pthread_create(&io_thread,NULL,write_save_file,&md_copy);
+       ret=pthread_create(&io_thread,NULL,visual_atoms,&md_copy);
        if(ret) {
-               perror("[moldyn] create save file thread\n");
+               perror("[moldyn] create visual atoms thread\n");
                return -1;
        }
 #else
-                               snprintf(dir,128,"%s/s-%08.f.save",
-                                        moldyn->vlsdir,moldyn->time);
-                               fd=open(dir,O_WRONLY|O_TRUNC|O_CREAT,
-                                       S_IRUSR|S_IWUSR);
-                               if(fd<0) perror("[moldyn] save fd open");
-                               else {
-                                       write(fd,moldyn,sizeof(t_moldyn));
-                                       write(fd,moldyn->atom,
-                                             moldyn->count*sizeof(t_atom));
-                               }
-                               close(fd);
-#endif
-                       }       
-               }
-               if(a) {
-                       if(!(moldyn->total_steps%a)) {
                                visual_atoms(moldyn);
+#endif
                        }
                }
 
@@ -1980,6 +1951,11 @@ int potential_force_calc(t_moldyn *moldyn) {
 #endif
        u8 bc_ij,bc_ik;
        int dnlc;
+#ifdef PTHREADS
+       int ret;
+       pthread_t kthread[27];
+       t_kdata kdata[27];
+#endif
 
        count=moldyn->count;
        itom=moldyn->atom;
@@ -1988,6 +1964,10 @@ int potential_force_calc(t_moldyn *moldyn) {
        atom=moldyn->atom;
 #endif
 
+#ifdef PTHREADS
+       memset(kdata,0,27*sizeof(t_kdata));
+#endif
+
        /* reset energy */
        moldyn->energy=0.0;
 
@@ -2156,7 +2136,9 @@ int potential_force_calc(t_moldyn *moldyn) {
                                        continue;
                        
                                /* first loop over atoms k */
+#ifndef PTHREADS
                                if(moldyn->func3b_k1) {
+#endif
 
                                for(k=0;k<27;k++) {
 
@@ -2195,11 +2177,25 @@ int potential_force_calc(t_moldyn *moldyn) {
                                                if(ktom==&(itom[i]))
                                                        continue;
 
+#ifdef PTHREADS
+                                               kdata[k].moldyn=moldyn;
+                                               kdata[k].ai=&(itom[i]);
+                                               kdata[k].aj=jtom;
+                                               kdata[k].ak=ktom;
+                                               kdata[k].bc=bc_ik;
+       ret=pthread_create(&(kthread[k]),NULL,moldyn->func3b_k1,&(kdata[k]));
+       if(ret) {
+               perror("[moldyn] create k1 thread");
+               return ret;
+       }
+#else
                                                moldyn->func3b_k1(moldyn,
                                                                  &(itom[i]),
                                                                  jtom,
                                                                  ktom,
                                                                  bc_ik|bc_ij);
+#endif
+
 #ifdef STATIC_LISTS
                                        }
 #elif LOWMEM_LISTS
@@ -2211,7 +2207,9 @@ int potential_force_calc(t_moldyn *moldyn) {
 
                                }
 
+#ifndef PTHREADS
                                }
+#endif
 
                                if(moldyn->func3b_j2)
                                        moldyn->func3b_j2(moldyn,
@@ -3002,7 +3000,11 @@ int visual_bonds_process(t_moldyn *moldyn,t_atom *itom,t_atom *jtom,
        return 0;
 }
 
+#ifdef PTHREADS
+void *visual_atoms(void *ptr) {
+#else
 int visual_atoms(t_moldyn *moldyn) {
+#endif
 
        int i;
        char file[128+64];
@@ -3011,6 +3013,11 @@ int visual_atoms(t_moldyn *moldyn) {
        t_visual *v;
        t_atom *atom;
        t_vb vb;
+#ifdef PTHREADS
+       t_moldyn *moldyn;
+
+       moldyn=ptr;
+#endif
 
        v=&(moldyn->vis);
        dim.x=v->dim.x;
@@ -3024,7 +3031,9 @@ int visual_atoms(t_moldyn *moldyn) {
        vb.fd=open(file,O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR);
        if(vb.fd<0) {
                perror("open visual save file fd");
+#ifndef PTHREADS
                return -1;
+#endif
        }
 
        /* write the actual data file */
@@ -3090,8 +3099,15 @@ int visual_atoms(t_moldyn *moldyn) {
 
        close(vb.fd);
 
+#ifdef PTHREADS
+       pthread_exit(NULL);
+
+}
+#else
+
        return 0;
 }
+#endif
 
 /*
  * fpu cntrol functions