aboutsummaryrefslogtreecommitdiff
path: root/src/sor_flat.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sor_flat.c')
-rw-r--r--src/sor_flat.c119
1 files changed, 70 insertions, 49 deletions
diff --git a/src/sor_flat.c b/src/sor_flat.c
index 752277b..1b30f1d 100644
--- a/src/sor_flat.c
+++ b/src/sor_flat.c
@@ -21,6 +21,10 @@
#include "Symmetry.h"
#include "Ell_DBstructure.h"
#include "EllBase.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusElliptic_EllSOR_sor_flat_c)
int sor_flat_3d(cGH *GH, int FieldIndex, int MIndex, int NIndex,
CCTK_REAL *AbsTol, CCTK_REAL *RelTol);
@@ -48,13 +52,13 @@ int sor_flat_3d(cGH *GH, int FieldIndex, int MIndex, int NIndex,
CCTK_REAL finf;
CCTK_INT npow;
CCTK_REAL tol;
+ CCTK_REAL zero=0.0;
/* Iteration / stepping variables */
int sorit;
int i,is,ie;
int j,js,je;
- int k,ks,ke,kstep;
- int nxyz;
+ int k,ks,ke,step;
int timelevel;
/* stencil index */
@@ -70,7 +74,8 @@ int sor_flat_3d(cGH *GH, int FieldIndex, int MIndex, int NIndex,
int Mstorage=0, Nstorage=0;
static int firstcall = 1;
CCTK_REAL dx2rec, dy2rec, dz2rec;
-
+ char *ans;
+
/* Get the reduction handle */
sum_handle = CCTK_ReductionArrayHandle("sum");
if (sum_handle<0)
@@ -81,17 +86,20 @@ int sor_flat_3d(cGH *GH, int FieldIndex, int MIndex, int NIndex,
/* IF Robin BCs are set, prepare for a boundary call:
setup stencil width and get Robin constants (set by the routine
which is calling the solver interface) */
- if (CCTK_EQUALS(sor_bound,"robin"))
- {
- sw[0]=1;
- sw[1]=1;
- sw[2]=1;
-
- ierr = Ell_GetRealKey(&finf, "EllLinConfMetric::Bnd::Robin::inf");
- ierr = Ell_GetIntKey (&npow, "EllLinConfMetric::Bnd::Robin::falloff");
- }
+ sw[0]=1;
+ sw[1]=1;
+ sw[2]=1;
+
+ Ell_GetStrKey(&ans,"EllLinFlat::Bnd::Robin");
+ if (CCTK_Equals(ans,"yes"))
+ {
+ CCTK_WARN(1,"Robin boundary conditions are not working properly yet");
+ ierr = Ell_GetRealKey(&finf, "EllLinFlat::Bnd::Robin::inf");
+ ierr = Ell_GetIntKey (&npow, "EllLinFlat::Bnd::Robin::falloff");
+ }
+
/* Only supports absolute tolerance */
tol = AbsTol[0];
if (CCTK_EQUALS(sor_accel,"const"))
@@ -128,39 +136,32 @@ int sor_flat_3d(cGH *GH, int FieldIndex, int MIndex, int NIndex,
on the same timelevel; if we have a negative index for M/N,
this GF is not set, there for don't even look for it and flag it */
/* get the current time level */
- timelevel = CCTK_NumTimeLevelsFromVarI (FieldIndex) - 1;
- if (timelevel > 0)
- {
- timelevel--;
- }
- var = (CCTK_REAL*) CCTK_VarDataPtrI(GH, timelevel, FieldIndex);
+
+ var = (CCTK_REAL*) CCTK_VarDataPtrI(GH, 0, FieldIndex);
if (MIndex>=0)
{
- timelevel = CCTK_NumTimeLevelsFromVarI (MIndex) - 1;
- if (timelevel > 0)
- {
- timelevel--;
- }
- Mlin = (CCTK_REAL*) CCTK_VarDataPtrI(GH,timelevel,MIndex);
+ Mlin = (CCTK_REAL*) CCTK_VarDataPtrI(GH,0,MIndex);
Mstorage = 1;
}
+ else
+ {
+ CCTK_WARN(0,"Stop");
+ }
if (NIndex>=0)
{
- timelevel = CCTK_NumTimeLevelsFromVarI (NIndex) - 1;
- if (timelevel > 0)
- {
- timelevel--;
- }
- Nlin = (CCTK_REAL*) CCTK_VarDataPtrI(GH,timelevel,NIndex);
+ Nlin = (CCTK_REAL*) CCTK_VarDataPtrI(GH,0,NIndex);
Nstorage = 1;
}
+ else
+ {
+ CCTK_WARN(0,"Stop");
+ }
/* Shortcuts */
dx = GH->cctk_delta_space[0];
dy = GH->cctk_delta_space[1];
dz = GH->cctk_delta_space[2];
- nxyz = GH->cctk_lsh[0]*GH->cctk_lsh[1]*GH->cctk_lsh[2];
dx2rec = 1.0/(dx*dx);
dy2rec = 1.0/(dy*dy);
@@ -175,12 +176,10 @@ int sor_flat_3d(cGH *GH, int FieldIndex, int MIndex, int NIndex,
ac_orig = -2.0*dx2rec - 2.0*dy2rec - 2.0*dz2rec;
- is = 1;
- js = 1;
+
ie = GH->cctk_lsh[0]-1;
je = GH->cctk_lsh[1]-1;
ke = GH->cctk_lsh[2]-1;
- kstep = 2;
/* start at 1 for historic (Fortran) reasons */
for (sorit=1; sorit<=maxit; sorit++)
@@ -200,21 +199,26 @@ int sor_flat_3d(cGH *GH, int FieldIndex, int MIndex, int NIndex,
omega = 1.8;
}
- resnorm = 0.0;
+ resnorm = 0.0;
- ks = (sorit%2)+1;
- if (GH->cctk_lsh[2]==3)
- {
- ks = 2;
- }
+ is = 1;
+ js = 1;
+ ks = 1;
- for (k=ks;k<ke;k+=kstep)
+ /*is = ((GH->cctk_lbnd[0])%2)+(sorit%2)+1;
+ js = ((GH->cctk_lbnd[1])%2)+(sorit%2)+1;
+ ks = ((GH->cctk_lbnd[2])%2)+(sorit%2)+1;*/
+
+ /*step = 2;*/
+ step = 1;
+
+ for (k=ks;k<ke;k=k+step)
{
- for (j=js;j<je;j++)
+ for (j=js;j<je;j=j+step)
{
- for (i=is;i<ie;i++)
+ for (i=is;i<ie;i=i+step)
{
-
+
ac = ac_orig;
ijk = CCTK_GFINDEX3D(GH,i ,j ,k );
@@ -248,7 +252,6 @@ int sor_flat_3d(cGH *GH, int FieldIndex, int MIndex, int NIndex,
}
}
- /* reduction operation on processor-local residual values */
ierr = CCTK_ReduceLocScalar(GH, -1, sum_handle,
&resnorm, &glob_residual, CCTK_VARIABLE_REAL);
if (ierr<0)
@@ -256,6 +259,10 @@ int sor_flat_3d(cGH *GH, int FieldIndex, int MIndex, int NIndex,
CCTK_WARN(1,"Reduction of Norm failed");
}
+#ifdef DEBUG_ELLIPTIC
+ printf("it: %d SOR solve residual %f (tol %f)\n",sorit,glob_residual,tol);
+#endif
+
glob_residual = glob_residual /
(GH->cctk_gsh[0]*GH->cctk_gsh[1]*GH->cctk_gsh[2]);
@@ -263,19 +270,25 @@ int sor_flat_3d(cGH *GH, int FieldIndex, int MIndex, int NIndex,
#ifdef DEBUG_ELLIPTIC
printf("it: %d SOR solve residual %f (tol %f)\n",sorit,glob_residual,tol);
#endif
+ /* CCTK_WARN(0,"stop");*/
/* apply symmetry boundary conditions within loop */
if (CartSymVI(GH,FieldIndex)<0)
{
- CCTK_WARN(1,"CartSymVI failed in EllSOR loop");
+ CCTK_WARN(1,"sor_flat: CartSymVI failed in EllSOR loop");
break;
}
+ BndScalarVI(GH,sw,zero,FieldIndex);
/* apply boundary conditions within loop */
- if (CCTK_EQUALS(sor_bound,"robin"))
- {
- ierr = BndRobinVI(GH, sw, finf, npow, FieldIndex);
+ /* FIXME */
+ /*
+ if (BndRobinVI(GH, sw, finf, npow, FieldIndex)<0)
+ {
+ CCTK_WARN(1,"sor_flat: BndRobinVI failed in EllSOR loop");
+ break;
}
+ */
/* synchronization of grid variable */
CCTK_SyncGroupWithVarI(GH, FieldIndex);
@@ -287,6 +300,13 @@ int sor_flat_3d(cGH *GH, int FieldIndex, int MIndex, int NIndex,
}
}
+
+ if (elliptic_verbose)
+ {
+ CCTK_VInfo("EllSOR","Required SOR tolerence was set at %f",tol);
+ CCTK_VInfo("EllSOR","Achieved SOR residual was %f",glob_residual);
+ CCTK_VInfo("EllSOR","Number of iterations was %d (max: %d)",sorit,maxit);
+ }
if (glob_residual>tol)
{
@@ -294,6 +314,7 @@ int sor_flat_3d(cGH *GH, int FieldIndex, int MIndex, int NIndex,
retval = ELL_NOCONVERGENCE;
}
+ if (ans) free(ans);
return retval;
}