]> git.treefish.org Git - phys/latlib.git/blob - neigh.cpp
...
[phys/latlib.git] / neigh.cpp
1 #include "neigh.h"
2
3 #include <iostream>
4
5 using namespace std;
6
7 int neigh::dirstep(int dir)
8 {
9   int step=1;
10   for(int idir=0; idir<dir; idir++) step*=len[idir];
11   return step;
12 }
13
14 neigh::neigh(const int& dimension, ...)
15 {
16   int totsize=1;
17   len = new int[dimension];
18   va_list length;
19
20   va_start(length, dimension);
21   for(int idim=0; idim < dimension; idim++) {
22     len[idim] = va_arg(length, int);
23     totsize *= len[idim];
24   }
25   va_end(length);
26
27   nfield = new int[totsize*2*dimension];
28
29   for( int ipos=0; ipos<totsize; ipos++ )
30     for( int idir=0; idir<2*dimension; idir++) {
31       if( idir < dimension ) { // positive direction
32         if ( ( ipos/dirstep(idir%dimension) ) % len[idir%dimension] == len[idir%dimension]-1 )
33           nfield[ipos*2*dimension + idir] = ipos - dirstep(idir%dimension)*(len[idir%dimension]-1);
34         else
35           nfield[ipos*2*dimension + idir] = ipos + dirstep(idir%dimension);
36       }
37       else { // negative direction
38         if ( ( ipos/dirstep(idir%dimension) ) % len[idir%dimension] == 0 )
39           nfield[ipos*2*dimension + idir] = ipos + dirstep(idir%dimension)*(len[idir%dimension]-1);
40         else
41           nfield[ipos*2*dimension + idir] = ipos - dirstep(idir%dimension);
42       }
43     }  
44 }