]> git.treefish.org Git - phys/latlib.git/commitdiff
...
authorAlex Schmidt <alex@treefish.org>
Wed, 18 Jul 2012 13:11:05 +0000 (15:11 +0200)
committerAlex Schmidt <alex@treefish.org>
Wed, 18 Jul 2012 13:11:05 +0000 (15:11 +0200)
CMakeLists.txt
neigh.cpp
neigh.h

index 586117ce007bf32920042ca471a643194c99854c..5b5abad1bc42c2150fc8db2c11d7dbb47980beaf 100644 (file)
@@ -1,8 +1,8 @@
 project(latlib)
 
-add_library(configcache configcache.cpp)
-target_link_libraries(configcache boost_iostreams)
+add_library(lat_configcache configcache.cpp)
+target_link_libraries(lat_configcache boost_iostreams)
 
-add_library(neigh neigh.cpp)
+add_library(lat_neigh neigh.cpp)
 
-add_library(writeout writeout.cpp)
\ No newline at end of file
+add_library(lat_writeout writeout.cpp)
index a25d1e70de0f91deb940b9155c83107cfb183eda..8e4084cce461d4f2318d453bd8e0984f94f0bfa8 100644 (file)
--- a/neigh.cpp
+++ b/neigh.cpp
@@ -1,28 +1,44 @@
 #include "neigh.h"
 
-neigh::neigh(const int& dimension, const int& length)
+#include <iostream>
+
+using namespace std;
+
+int neigh::dirstep(int dir)
 {
-  nfield = new int[ipow(dimension,length)*2*dimension];
+  int step=1;
+  for(int idir=0; idir<dir; idir++) step*=len[idir];
+  return step;
+}
+
+neigh::neigh(const int& dimension, ...)
+{
+  int totsize=1;
+  len = new int[dimension];
+  va_list length;
+
+  va_start(length, dimension);
+  for(int idim=0; idim < dimension; idim++) {
+    len[idim] = va_arg(length, int);
+    totsize *= len[idim];
+  }
+  va_end(length);
+
+  nfield = new int[totsize*2*dimension];
 
-  for (int ipos = 0; ipos < ipow(length,dimension); ipos++)
-    {
-      for (int idir = 0; idir < 2*dimension; idir++)
-       {
-         if ( idir < dimension ) //pos direction
-           {
-             if ( ( ipos/ipow(length,idir%dimension) ) % length == length-1 )
-               nfield[ipos*2*dimension + idir] = ipos - ipow(length,idir%dimension)*(length-1);
-             else
-               nfield[ipos*2*dimension + idir] = ipos + ipow(length,idir%dimension);
-           }
-         else //negative dir
-           {
-             if ( ( ipos/ipow(length,idir%dimension) ) % length == 0 )
-               nfield[ipos*2*dimension + idir] = ipos + ipow(length,idir%dimension)*(length-1);
-             else
-               nfield[ipos*2*dimension + idir] = ipos - ipow(length,idir%dimension);
-           }
-         
-       }
-    }
+  for( int ipos=0; ipos<totsize; ipos++ )
+    for( int idir=0; idir<2*dimension; idir++) {
+      if( idir < dimension ) { // positive direction
+       if ( ( ipos/dirstep(idir%dimension) ) % len[idir%dimension] == len[idir%dimension]-1 )
+         nfield[ipos*2*dimension + idir] = ipos - dirstep(idir%dimension)*(len[idir%dimension]-1);
+       else
+         nfield[ipos*2*dimension + idir] = ipos + dirstep(idir%dimension);
+      }
+      else { // negative direction
+       if ( ( ipos/dirstep(idir%dimension) ) % len[idir%dimension] == 0 )
+         nfield[ipos*2*dimension + idir] = ipos + dirstep(idir%dimension)*(len[idir%dimension]-1);
+       else
+         nfield[ipos*2*dimension + idir] = ipos - dirstep(idir%dimension);
+      }
+    }  
 }
diff --git a/neigh.h b/neigh.h
index 73ffe62d96db78128b889001ed863c1bc52f00df..9112c53db9692968356c554921761b1c3ff776f5 100644 (file)
--- a/neigh.h
+++ b/neigh.h
@@ -1,17 +1,21 @@
 #ifndef NEIGH_H
 #define NEIGH_H
 
+#include <stdarg.h>
+
 class neigh
 {
  private:
+  int *len;
   int *nfield;
+  int dirstep(int dir);
   static int ipow(const int& x, const int& p){
     if (p == 0) return 1;
     if (p == 1) return x;
     return x * ipow(x, p-1);
   }
  public:
-  neigh(const int& length, const int& dimension);
+  neigh(const int& dimension, ...);
   int& operator[] (int i) {return nfield[i];}
 };