void MeshQuality::computeNodesFromCells() { EG_VTKDCN(vtkDoubleArray, node_mesh_quality, m_Grid, "node_mesh_quality"); EG_VTKDCC(vtkDoubleArray, cell_mesh_quality, m_Grid, "cell_mesh_quality"); EG_FORALL_NODES(id_node, m_Grid) { double mq = 1; for (int i = 0; i < m_Part.n2cGSize(id_node); ++i) { vtkIdType id_cell = m_Part.n2cGG(id_node, i); mq = min(cell_mesh_quality->GetValue(id_cell), mq); } node_mesh_quality->SetValue(id_node, mq); }
void CreateHexCore::refineOctree() { m_Octree.resetRefineMarks(); // begin DEBUG /* m_Octree.markToRefine(0); m_Octree.refineAll(); m_Octree.markToRefine(3); m_Octree.markToRefine(8); m_Octree.refineAll(); return; */ // end DEBUG EG_VTKDCN(vtkDoubleArray, cl, m_Grid, "node_meshdensity_desired"); do { for (vtkIdType id_node = 0; id_node < m_Grid->GetNumberOfPoints(); ++id_node) { vtkIdType id_surf = -1; for (int i = 0; i < m_Part.n2cGSize(id_node); ++i) { vtkIdType id_cell = m_Part.n2cGG(id_node, i); if (isSurface(id_cell, m_Grid)) { id_surf = id_node; break; } else { vtkIdType cell_type = m_Grid->GetCellType(id_cell); if (cell_type == VTK_WEDGE) { vtkIdType N_pts, *pts; m_Grid->GetCellPoints(id_cell, N_pts, pts); if (pts[3] == id_node) id_surf = pts[0]; else if (pts[4] == id_node) id_surf = pts[1]; else if (pts[5] == id_node) id_surf = pts[2]; } } } if (id_surf != -1) { vec3_t x; m_Grid->GetPoint(id_node, x.data()); int i_otcell = m_Octree.findCell(x); double h = m_Octree.getDx(i_otcell); h = max(h, m_Octree.getDy(i_otcell)); h = max(h, m_Octree.getDz(i_otcell)); if (h > cl->GetValue(id_surf)) { m_Octree.markToRefine(i_otcell); } } } } while (m_Octree.refineAll()); }
void UpdateDesiredMeshDensity::computeExistingLengths() { QSet<int> all_bcs = GuiMainWindow::pointer()->getAllBoundaryCodes(); QSet<int> fixed_bcs = all_bcs - m_BoundaryCodes; QVector<double> edge_length(m_Grid->GetNumberOfPoints(), 1e99); QVector<int> edge_count(m_Grid->GetNumberOfPoints(), 0); m_Fixed.fill(false, m_Grid->GetNumberOfPoints()); EG_VTKDCC(vtkIntArray, cell_code, m_Grid, "cell_code"); for (vtkIdType id_cell = 0; id_cell < m_Grid->GetNumberOfCells(); ++id_cell) { if (isSurface(id_cell, m_Grid)) { if (fixed_bcs.contains(cell_code->GetValue(id_cell))) { vtkIdType N_pts, *pts; m_Grid->GetCellPoints(id_cell, N_pts, pts); QVector<vec3_t> x(N_pts); for (int i = 0; i < N_pts; ++i) { m_Grid->GetPoint(pts[i], x[i].data()); m_Fixed[pts[i]] = true; } for (int i = 0; i < N_pts; ++i) { int j = i + 1; if (j >= N_pts) { j = 0; } double L = (x[i] - x[j]).abs(); edge_length[pts[i]] = min(edge_length[pts[i]], L); edge_length[pts[j]] = min(edge_length[pts[j]], L); ++edge_count[pts[i]]; ++edge_count[pts[j]]; } } } } EG_VTKDCN(vtkDoubleArray, characteristic_length_desired, m_Grid, "node_meshdensity_desired"); for (vtkIdType id_node = 0; id_node < m_Grid->GetNumberOfPoints(); ++id_node) { if (edge_count[id_node] > 0) { if (edge_length[id_node] > 1e98) { EG_BUG; } characteristic_length_desired->SetValue(id_node, edge_length[id_node]); } } }