• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

contrib/pmgZ/gsdc.c

00001 
00055 #include <stdio.h>
00056 #include <stdlib.h>
00057 #include <string.h>
00058 #include <stdint.h>
00059 
00060 #define MIN(a,b) ((a > b) ? b : a)
00061 #define MAX(a,b) ((a > b) ? a : b)
00062 
00063 void doKernel(int i1,int i2,int j1,int j2,int k1,int k2,int nx,int ny,int nz,
00064                                    double * oN,double * oE,double * uC, 
00065                                    double * oC,double * x,double * fc,double * cc,int red){
00066            
00067            int i,j,k;
00068            
00069            int kxy, jx, ioff;
00070            int ijk, ijp1k, ijm1k;
00071            int ip1jk, im1jk, ijkp1, ijkm1;
00072            
00073            double inter1, inter2;
00074            
00075            for(k=k1;k<k2;k++){
00076                       kxy = k*nx*ny;
00077                       for(j=j1;j<j2;j++){
00078                                  jx = j*nx;
00079                                  ioff = red ? ((j+k) % 2) : (1 - ((j+k) % 2));
00080                                  for(i=i1+ioff;i<i2;i+=2){
00081                                             ijk = kxy+jx+i;
00082                                             
00083                                             ijp1k = kxy+(j+1)*nx+i;
00084                                             ijm1k = kxy+(j-1)*nx+i;
00085                                             
00086                                             ip1jk = (k+1)*nx*ny+jx+i;
00087                                             im1jk = (k-1)*nx*ny+jx+i;
00088                                             
00089                                             ijkp1 = kxy+jx+(i+1);
00090                                             ijkm1 = kxy+jx+(i-1);
00091                                             
00092                                             inter1 = (fc[ijk] + (
00093                                                                                                     + oN[ijk] * x[ijp1k]
00094                                                                                                     + oN[ijm1k] * x[ijm1k]
00095                                                                                                     + oE[ijk] * x[ijkp1]
00096                                                                                                     + oE[ijkm1] * x[ijkm1]
00097                                                                                                     + uC[ijk] * x[ip1jk]
00098                                                                                                     + uC[im1jk] * x[im1jk]
00099                                                                                                     ));
00100                                             inter2 = (oC[ijk] + cc[ijk]);
00101                                             
00102                                             x[ijk] =  inter1 / inter2;
00103                                  }
00104                       }
00105            }
00106 }
00107 
00108 void gsrb7c_(double * oN,double * oE,double * uC, double * oC,
00109                                   double * x,double * fc,double * cc,int * iadjoint,
00110                                   int * aNx,int * aNy,int * aNz,int * aItmax,
00111                                   double * r,int doResid){
00112            
00113            int i,j,k, iters;
00114            int i1,i2,j1,j2,k1,k2;
00115            int nx, ny, nz, itmax;
00116            int ti, tj, tk;
00117            
00118            itmax = *aItmax;
00119            
00120            nx = *aNx;
00121            ny = *aNy;
00122            nz = *aNz;
00123            
00124            ti = nx;
00125            tj = ny;
00126            tk = 1;
00127            
00128            for (iters=0;iters<itmax;iters++){          
00129 //#pragma omp parallel for private(i,j,k,i1,i2,j1,j2,k1,k2) schedule(dynamic,tk)
00130                       for(k=1;k<nz-1;k+=tk){
00131                                  k1 = k;
00132                                  k2 = MIN(k+tk,nz-1);
00133                                  for(j=1;j<ny-1;j+=tj){
00134                                             j1 = j;
00135                                             j2 = MIN(j+tj,ny-1);
00136                                             for(i=1;i<nx-1;i+=ti){
00137                                                        i1 = i;
00138                                                        i2 = MIN(i+ti,nx-1);
00139                                                        doKernel(i1,i2,j1,j2,k1,k2,nx,ny,nz,oN,oE,uC,oC,x,fc,cc,1);
00140                                                        doKernel(i1,i2,j1,j2,k1,k2,nx,ny,nz,oN,oE,uC,oC,x,fc,cc,0);
00141                                             }
00142                                  }
00143                       }
00144            }
00145 }

Generated on Wed Oct 20 2010 11:12:17 for APBS by  doxygen 1.7.2