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
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 }