private CellConnectivity <TNode>[] CreateElements(TNode[] allVertices) { var cells = new CellConnectivity <TNode> [cellsPerX * cellsPerY * cellsPerZ]; for (int k = 0; k < cellsPerZ; ++k) { for (int j = 0; j < cellsPerY; ++j) { for (int i = 0; i < cellsPerX; ++i) { int cell = k * cellsPerX * cellsPerY + j * cellsPerX + i; int firstVertex = k * verticesPerX * verticesPerY + j * verticesPerX + i; var verticesOfCell = new int[] // Node order for Hexa8 { firstVertex, // (-1, -1, -1) firstVertex + 1, // ( 1, -1, -1) firstVertex + verticesPerY + 1, // ( 1, 1, -1) firstVertex + verticesPerY, // (-1, 1, -1) firstVertex + verticesPerX * verticesPerY, // (-1, -1, 1) firstVertex + verticesPerX * verticesPerY + 1, // ( 1, -1, 1) firstVertex + verticesPerX * verticesPerY + verticesPerY + 1, // ( 1, 1, 1) firstVertex + verticesPerX * verticesPerY + verticesPerY // (-1, 1, 1) }; cells[cell] = new CellConnectivity <TNode>(CellType.Hexa8, verticesOfCell.Select(idx => allVertices[idx]).ToArray()); // row major } } } return(cells); }
private CellConnectivity <TNode>[] CreateElements(TNode[] allVertices) { var cells = new CellConnectivity <TNode> [cellsPerY * cellsPerX]; for (int j = 0; j < cellsPerY; ++j) { for (int i = 0; i < cellsPerX; ++i) { int cell = j * cellsPerX + i; int firstVertex = j * verticesPerX + i; TNode[] verticesOfCell = { allVertices[firstVertex], allVertices[firstVertex + 1], allVertices[firstVertex + verticesPerX + 1], allVertices[firstVertex + verticesPerX] }; cells[cell] = new CellConnectivity <TNode>(CellType.Quad4, verticesOfCell); // row major } } return(cells); }
/// <summary> /// Returns true and a <see cref="CellConnectivity"/> if the <paramref name="cellCode"/> corresponds to a valid /// MSolve <see cref="CellType"/>. /// Otherwise returns false and null. /// </summary> /// <param name="cellCode"></param> /// <param name="vertexIDs"> These must be 0-based</param> /// <param name="cell"></param> /// <returns></returns> public bool TryCreateCell(int cellCode, int[] vertexIDs, out CellConnectivity <TNode> cell) { bool validCell = gmshCellCodes.TryGetValue(cellCode, out CellType type); if (validCell) { var cellVertices = new TNode[vertexIDs.Length]; for (int i = 0; i < vertexIDs.Length; ++i) { int msolveIndex = gmshCellConnectivity[type][i]; cellVertices[msolveIndex] = allVertices[vertexIDs[i]]; } FixVerticesOrder(cellVertices); cell = new CellConnectivity <TNode>(type, cellVertices); return(true); } else { cell = null; return(false); } }
public bool Contains(CellConnectivity <Node> cell, double tol) { return(cell.Vertices.All(node => (node.X >= minX - tol) && (node.X <= maxX + tol) && (node.Y >= minY - tol) && (node.Y <= maxY + tol))); }