/* $Header$ */ #include #include #include #include #include "cctk.h" #include "cctk_Arguments.h" #include "cctk_Parameters.h" #include "cctk_Functions.h" #include "util_ErrorCodes.h" #include "util_Table.h" #define MAXDIM 3 #define REFLEVEL (ilogb(cctk_levfac[0])) void setup_epsdis (CCTK_ARGUMENTS) { DECLARE_CCTK_ARGUMENTS; DECLARE_CCTK_PARAMETERS; int ai,aj,ak; int ni,nj,nk; int i,j,k,s,l,m; int index,indexP; int ierr; int npts; int *inds; CCTK_REAL *xa,*ya,*za,*rads; CCTK_REAL maxrad; CCTK_REAL xmin,xmax, ymin,ymax, zmin,zmax; CCTK_REAL odx,ody,odz; CCTK_REAL radp; const CCTK_INT MAXSURFNUM=100; /* XXX hard limit */ CCTK_INT doBC[2*MAXDIM],symbnd[2*MAXDIM]; CCTK_INT symtable; int reflvl = REFLEVEL; if (verbose) { CCTK_VInfo(CCTK_THORNSTRING,"Setting up spatially varying dissipation at T=%g", (double)cctk_time); } ai=cctk_ash[0]; aj=cctk_ash[1]; ak=cctk_ash[2]; ni=cctk_lsh[0]; nj=cctk_lsh[1]; nk=cctk_lsh[2]; if (epsdis_for_level[reflvl] > 0.0) for (i=0; i outer_boundary_max_epsdis) { epsdisA[index] = outer_boundary_max_epsdis; } } } } } if(doBC[1]) { for (k=0;k=ni-outer_bound_npoints;i--) { index = CCTK_GFINDEX3D(cctkGH,i,j,k); indexP= CCTK_GFINDEX3D(cctkGH,ni-outer_bound_npoints-1,j,k); epsdisA[index]=epsdis+ob_slope*fabs(x[index]-x[indexP]); if (epsdisA[index] > outer_boundary_max_epsdis) { epsdisA[index] = outer_boundary_max_epsdis; } } } } } if(doBC[2]) { for (k=0;k outer_boundary_max_epsdis) { epsdisA[index] = outer_boundary_max_epsdis; } } } } } if(doBC[3]) { for (k=0;k=nj-outer_bound_npoints;j--) { for (i=0;i outer_boundary_max_epsdis) { epsdisA[index] = outer_boundary_max_epsdis; } } } } } if(doBC[4]) { for (k=0;k outer_boundary_max_epsdis) { epsdisA[index] = outer_boundary_max_epsdis; } } } } } if(doBC[5]) { for (k=nk-1;k>=nk-outer_bound_npoints;k--) { for (j=0;j outer_boundary_max_epsdis) { epsdisA[index] = outer_boundary_max_epsdis; } } } } } } if (extra_dissipation_in_horizons && cctk_iteration%update_ah_every == 0) { if (verbose) { CCTK_INFO("Linear Interpolation into AH surfaces"); } for (s=0;s=2); assert (cctk_nghostzones[1]>=2); assert (cctk_nghostzones[2]>=2); npts=0; for (i=2;i=xmin &&y[m]<=ymax&&y[m]>=ymin &&z[m]<=zmax&&z[m]>=zmin) && (!respect_emask || ( (emask[CCTK_GFINDEX3D(cctkGH,i-1,j,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i-2,j,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i+1,j,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i+2,j,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j-1,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j-2,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j+1,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j+2,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j,k-1)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j,k-2)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j,k+1)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j,k+2)]>0.4) )) ) { npts++; } } xa=(CCTK_REAL *) malloc(npts*sizeof(CCTK_REAL)); ya=(CCTK_REAL *) malloc(npts*sizeof(CCTK_REAL)); za=(CCTK_REAL *) malloc(npts*sizeof(CCTK_REAL)); rads=(CCTK_REAL *) malloc(npts*sizeof(CCTK_REAL)); inds=(CCTK_INT *) malloc(npts*sizeof(CCTK_INT)); for (i=0;i=xmin &&y[m]<=ymax&&y[m]>=ymin &&z[m]<=zmax&&z[m]>=zmin) && (!respect_emask || ( (emask[CCTK_GFINDEX3D(cctkGH,i-1,j,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i-2,j,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i+1,j,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i+2,j,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j-1,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j-2,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j+1,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j+2,k)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j,k-1)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j,k-2)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j,k+1)]>0.4) && (emask[CCTK_GFINDEX3D(cctkGH,i,j,k+2)]>0.4) )) ) { xa[l]=x[m]; ya[l]=y[m]; za[l]=z[m]; inds[l]=m; l++; } } ierr=HorizonRadiusInDirection(horizon_number[s], npts, xa, ya, za, rads); assert(!ierr); for (i=0;i ah_max_epsdis) { epsdisA[inds[i]] = ah_max_epsdis; } } } free(xa); free(ya); free(za); free(rads); free(inds); } } }