std::set<int>& KrivodonovaDiscontinuityDetector::get_discontinuous_element_ids(double threshold) { Element* e; for_all_active_elements(e, mesh) { bool element_inserted = false; for(int edge_i = 0; edge_i < e->get_num_surf() && !element_inserted; edge_i++) if(calculate_relative_flow_direction(e, edge_i) < 0 && !e->en[edge_i]->bnd) { double jumps[1]; calculate_jumps(e, edge_i, jumps); double diameter_indicator = calculate_h(e, spaces[0]->get_element_order(e->id)); double edge_length = std::sqrt(std::pow(e->vn[(edge_i + 1) % e->get_num_surf()]->x - e->vn[edge_i]->x, 2) + std::pow(e->vn[(edge_i + 1) % e->get_num_surf()]->y - e->vn[edge_i]->y, 2)); double norms[1]; calculate_norms(e, edge_i, norms); // Number of component jumps tested. unsigned int component_checked_number = 1; for(unsigned int component_i = 0; component_i < component_checked_number; component_i++) { if(norms[component_i] < 1E-8) continue; double discontinuity_detector = jumps[component_i] / (diameter_indicator * edge_length * norms[component_i]); if(discontinuity_detector > threshold) { discontinuous_element_ids.insert(e->id); element_inserted = true; break; } } } }
std::set<int>& DiscontinuityDetector::get_discontinuous_element_ids(double threshold) { Element* e; for_all_active_elements(e, mesh) { for(int edge_i = 0; edge_i < e->get_num_surf(); edge_i++) if(calculate_relative_flow_direction(e, edge_i) < -1e-3 && !e->en[edge_i]->bnd) { double jump = calculate_jumps(e, edge_i); double diameter_indicator = std::pow(e->get_diameter(), (H2D_GET_H_ORDER(spaces[0]->get_element_order(e->id)) + 1) / 2); double edge_length = std::sqrt(std::pow(e->vn[(edge_i + 1) % 4]->x - e->vn[edge_i]->x, 2) + std::pow(e->vn[(edge_i + 1) % 4]->y - e->vn[edge_i]->y, 2)); double norm = calculate_norm(e, edge_i); double discontinuity_detector = jump / (diameter_indicator * edge_length * norm); if(discontinuity_detector > threshold) discontinuous_element_ids.insert(e->id); } } return discontinuous_element_ids; };