/* * Copyright(C) 1999-2020, 2023 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * * See packages/seacas/LICENSE for details */ #include "refine_map.h" // for refine_vdata, refine_edata #include "structs.h" double compute_mesh_edata(struct refine_edata *edata, /* desire data for current edge */ struct refine_vdata *vdata, /* data for all vertices */ int mesh_dims[3], /* dimensions of processor mesh */ struct vtx_data **comm_graph, /* communication graph */ int *node2vtx /* maps mesh nodes to graph vertices */ ) { double desire; /* edge's interest in flipping */ float ewgt; /* edge weight */ int vtx1, vtx2; /* vertices on either side of wire */ int off; /* index into vdata */ vtx1 = node2vtx[edata->node1]; vtx2 = node2vtx[edata->node2]; off = edata->dim * mesh_dims[0] * mesh_dims[1] * mesh_dims[2]; desire = (vdata[off + vtx1].above - vdata[off + vtx1].below - vdata[off + vtx1].same) + (vdata[off + vtx2].below - vdata[off + vtx2].above - vdata[off + vtx2].same); /* Subtract off potential doubly counted edge. */ if (is_an_edge(comm_graph[vtx1], vtx2, &ewgt)) { desire -= 2 * ewgt; } return (desire); }