From 1828cf85d29394b4e87a1cd37f7ae6d005b58184 Mon Sep 17 00:00:00 2001 From: ianhin Date: Mon, 19 Jun 2006 22:13:49 +0000 Subject: imin and imax only need 3 entries, not 6 Fixed bug whereby physical boundary conditions could be called in symmetry zones, and in some cases this could lead to accessing unallocated memory and segfaults. This would never have generated incorrect output, as these points would be overwritten by the symmetry thorn anyway. --- Tools/CodeGen/CodeGen.m | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/Tools/CodeGen/CodeGen.m b/Tools/CodeGen/CodeGen.m index a075fa7..1d917a4 100644 --- a/Tools/CodeGen/CodeGen.m +++ b/Tools/CodeGen/CodeGen.m @@ -386,8 +386,8 @@ DeclareGridLoopVariables[] := {{"i", "j", "k"}, {"istart", "jstart", "kstart"}, {"iend", "jend", "kend"}, {"index_offset_x", "index_offset_y", "index_offset_z", "dir", "face"}}], - Map[DeclareArray[#, 6, "CCTK_INT"] &, {"imin", "imax", "is_symbnd", "is_physbnd", "is_ipbnd"}], - Map[DeclareArray[#, 3, "CCTK_INT"] &, {"bmin", "bmax"}], + Map[DeclareArray[#, 6, "CCTK_INT"] &, {"is_symbnd", "is_physbnd", "is_ipbnd"}], + Map[DeclareArray[#, 3, "CCTK_INT"] &, {"imin", "imax", "bmin", "bmax"}], If[SOURCELANGUAGE == "C", DeclareVariable["index", "CCTK_INT"], "\n"] }]; @@ -486,19 +486,24 @@ BoundaryLoop[block_] := { "\nGenericFD_GetBoundaryInfo(cctkGH, cctk_lsh, cctk_bbox, cctk_nghostzones, imin, imax, is_symbnd, is_physbnd, is_ipbnd);\n", + CommentedBlock["Start by looping over the whole grid, minus the NON-PHYSICAL boundary points, which are set by synchronization. ", { + AssignVariable[arrayElement["bmin", 0], "is_physbnd[0*2+0] ? 0 : imin[0]"], + AssignVariable[arrayElement["bmin", 1], "is_physbnd[1*2+0] ? 0 : imin[1]"], + AssignVariable[arrayElement["bmin", 2], "is_physbnd[2*2+0] ? 0 : imin[2]"], + AssignVariable[arrayElement["bmax", 0], "is_physbnd[0*2+1] ? cctk_lsh[0] : imax[0]"], + AssignVariable[arrayElement["bmax", 1], "is_physbnd[1*2+1] ? cctk_lsh[1] : imax[1]"], + AssignVariable[arrayElement["bmax", 2], "is_physbnd[2*2+1] ? cctk_lsh[2] : imax[2]"]}], + CommentedBlock["Loop over all faces", loopOverInteger["dir", "0", "3", loopOverInteger["face", "0", "2", { - AssignVariable[arrayElement["bmin", 0], 0], - AssignVariable[arrayElement["bmin", 1], 0], - AssignVariable[arrayElement["bmin", 2], 0], - AssignVariable[arrayElement["bmax", 0], arrayElement["cctk_lsh", 0]], - AssignVariable[arrayElement["bmax", 1], arrayElement["cctk_lsh", 1]], - AssignVariable[arrayElement["bmax", 2], arrayElement["cctk_lsh", 2]], + CommentedBlock["Now restrict to only the boundary points on the current face", SwitchStatement["face", - {0, AssignVariable[arrayElement["bmax", "dir"], {arrayElement["imin", "dir"], ""}]}, - {1, AssignVariable[arrayElement["bmin", "dir"], {arrayElement["imax", "dir"], "" }]}], + {0, {AssignVariable[arrayElement["bmax", "dir"], {arrayElement["imin", "dir"], ""}], + AssignVariable[arrayElement["bmin", "dir"], {0, ""}]}}, + {1, {AssignVariable[arrayElement["bmin", "dir"], {arrayElement["imax", "dir"], "" }], + AssignVariable[arrayElement["bmax", "dir"], {"cctk_lsh[dir]", ""}]}}]], conditional[arrayElement["is_physbnd", "dir * 2 + face"], loopOverInteger["k", arrayElement["bmin",2], arrayElement["bmax",2], loopOverInteger["j", arrayElement["bmin",1], arrayElement["bmax",1], -- cgit v1.2.3