From 8b4da06b7fa675fbdb73b505490142e5eae804ea Mon Sep 17 00:00:00 2001 From: Noah Elliott Date: Mon, 20 Apr 2020 11:08:23 -0700 Subject: [PATCH] verify for structured options for adjsets (#374) * Verify method for blueprint nestset * Updated the 'blueprint::mesh::nestset' verify function based on discussed refinements (circa 5/29). * Adding index verifiers for 'nestsets' Blueprint field. * Finished the initial implementation of the misc nestsets blueprint example. * * Added all of the test cases for the new structured AMR schema. * Made some minor improvements to the automated structured AMR schema generation code. * Fixing an issue with builds on Windows. * Trying another thing to fix the Windows build. * Fixed a minor bug in 'conduit::Node::set' that was causing memory problems when setting an existing object/list node to a scalar type. * Refactored the 'nestset' example code to use explicit transform operator to simplify code. * Add blueprint verify for structured version of adjsets * Small fixes in adjset verify * Added "windows" to adjset verify. * Change adjsets verify to allow for neighbor integers only * Add an example to verify the uniform version of adjset * Add manual build-up of adjest windows for testing * Fix adjset example to set coords for vertices, not zones * Add ratio for adjacency neighbors on different AMR levels * Add ratios to structured adjset blueprint mesh example Co-authored-by: Joseph Ciurej --- src/libs/blueprint/conduit_blueprint_mesh.cpp | 60 +- .../conduit_blueprint_mesh_examples.cpp | 571 ++++++++++++++++++ .../conduit_blueprint_mesh_examples.hpp | 3 + .../blueprint/t_blueprint_mesh_verify.cpp | 33 +- 4 files changed, 664 insertions(+), 3 deletions(-) diff --git a/src/libs/blueprint/conduit_blueprint_mesh.cpp b/src/libs/blueprint/conduit_blueprint_mesh.cpp index fce8f256c..f7ff1249d 100644 --- a/src/libs/blueprint/conduit_blueprint_mesh.cpp +++ b/src/libs/blueprint/conduit_blueprint_mesh.cpp @@ -4114,8 +4114,66 @@ mesh::adjset::verify(const Node &adjset, bool group_res = true; group_res &= verify_integer_field(protocol, chld, chld_info, "neighbors"); - group_res &= verify_integer_field(protocol, chld, chld_info, "values"); + if(chld.has_child("values")) + { + group_res &= verify_integer_field(protocol, chld, + chld_info, "values"); + } + else if(chld.has_child("windows")) + { + + group_res &= verify_object_field(protocol, chld, + chld_info, "windows"); + + bool windows_res = true; + NodeConstIterator witr = chld["windows"].children(); + while(witr.has_next()) + { + const Node &wndw = witr.next(); + const std::string wndw_name = witr.name(); + Node &wndw_info = chld_info["windows"][wndw_name]; + + bool window_res = true; + window_res &= verify_field_exists(protocol, wndw, + wndw_info, "origin") && + mesh::logical_dims::verify(wndw["origin"], + wndw_info["origin"]); + window_res &= verify_field_exists(protocol, wndw, + wndw_info, "dims") && + mesh::logical_dims::verify(wndw["dims"], + wndw_info["dims"]); + window_res &= verify_field_exists(protocol, wndw, + wndw_info, "ratio") && + mesh::logical_dims::verify(wndw["ratio"], + wndw_info["ratio"]); + + // verify that dimensions for "origin" and + // "dims" and "ratio" are the same + if(window_res) + { + index_t window_dim = wndw["origin"].number_of_children(); + window_res &= !wndw.has_child("dims") || + verify_object_field(protocol, wndw, + wndw_info, "dims", false, window_dim); + window_res &= !wndw.has_child("ratio") || + verify_object_field(protocol, wndw, + wndw_info, "ratio", false, window_dim); + } + + log::validation(wndw_info,window_res); + windows_res &= window_res; + } + + log::validation(chld_info["windows"],windows_res); + res &= windows_res; + if(chld.has_child("orientation")) + { + group_res &= verify_integer_field(protocol, chld, + chld_info, "orientation"); + } + } + log::validation(chld_info,group_res); groups_res &= group_res; } diff --git a/src/libs/blueprint/conduit_blueprint_mesh_examples.cpp b/src/libs/blueprint/conduit_blueprint_mesh_examples.cpp index cb95defd1..ee13827a1 100644 --- a/src/libs/blueprint/conduit_blueprint_mesh_examples.cpp +++ b/src/libs/blueprint/conduit_blueprint_mesh_examples.cpp @@ -2857,6 +2857,577 @@ misc(const std::string &mesh_type, } //----------------------------------------------------------------------------- +void +adjset_uniform(Node &res) +{ + for(index_t i = 0; i < 8; i++) + { + std::ostringstream oss; + oss << "domain" << i; + const std::string domain_name = oss.str(); + + Node &domain_node = res[domain_name]; + + domain_node["state/domain_id"].set(i); + Node &domain_coords = domain_node["coordsets/coords"]; + domain_coords["type"].set_string("uniform"); + domain_coords["dims/i"].set_int32(21); + domain_coords["dims/j"].set_int32(21); + domain_coords["spacing/dx"].set_float64(0.0125); + domain_coords["spacing/dy"].set_float64(0.025); + domain_coords["origin/x"].set_float64(0.25*(i/2)); + domain_coords["origin/y"].set_float64(0.5*(i%2)); + + Node &domain_topo = domain_node["topologies/topo"]; + domain_topo["elements/origin/i0"].set_int32(20*(i/2)); + domain_topo["elements/origin/j0"].set_int32(20*(i%2)); + domain_topo["type"].set_string("uniform"); + domain_topo["coordset"].set_string("coords"); + + Node &domain_adjsets = domain_node["adjsets/adjset"]; + domain_adjsets["association"].set_string("vertex"); + domain_adjsets["topology"].set_string("topo"); + Node &adjset_groups = domain_adjsets["groups"]; + + if (i == 0) + { + adjset_groups["group_000001/neighbors"] = DataType::int32(2); + adjset_groups["group_000002/neighbors"] = DataType::int32(2); + adjset_groups["group_000003/neighbors"] = DataType::int32(2); + adjset_groups["group_000001/neighbors"].as_int_array()[0] = 0; + adjset_groups["group_000002/neighbors"].as_int_array()[0] = 0; + adjset_groups["group_000003/neighbors"].as_int_array()[0] = 0; + adjset_groups["group_000001/neighbors"].as_int_array()[1] = 1; + adjset_groups["group_000002/neighbors"].as_int_array()[1] = 2; + adjset_groups["group_000003/neighbors"].as_int_array()[1] = 3; + Node &windows_node1 = adjset_groups["group_000001/windows"]; + for(index_t w = 0; w <= 1; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node1[window_name]["origin/i"] = 0; + windows_node1[window_name]["origin/j"] = 20; + windows_node1[window_name]["dims/i"] = 21; + windows_node1[window_name]["dims/j"] = 1; + windows_node1[window_name]["ratio/i"] = 1; + windows_node1[window_name]["ratio/j"] = 1; + } + Node &windows_node2 = adjset_groups["group_000002/windows"]; + for(index_t w = 0; w <= 2; w += 2) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node2[window_name]["origin/i"] = 0; + windows_node2[window_name]["origin/j"] = 20; + windows_node2[window_name]["dims/i"] = 21; + windows_node2[window_name]["dims/j"] = 1; + windows_node2[window_name]["ratio/i"] = 1; + windows_node2[window_name]["ratio/j"] = 1; + } + Node &windows_node3 = adjset_groups["group_000003/windows"]; + for(index_t w = 0; w <= 3; w += 3) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node3[window_name]["origin/i"] = 20; + windows_node3[window_name]["origin/j"] = 20; + windows_node3[window_name]["dims/i"] = 1; + windows_node3[window_name]["dims/j"] = 1; + windows_node3[window_name]["ratio/i"] = 1; + windows_node3[window_name]["ratio/j"] = 1; + } + } + else if (i == 1) + { + adjset_groups["group_000000/neighbors"] = DataType::int32(2); + adjset_groups["group_000002/neighbors"] = DataType::int32(2); + adjset_groups["group_000003/neighbors"] = DataType::int32(2); + adjset_groups["group_000000/neighbors"].as_int_array()[0] = 1; + adjset_groups["group_000002/neighbors"].as_int_array()[0] = 1; + adjset_groups["group_000003/neighbors"].as_int_array()[0] = 1; + adjset_groups["group_000000/neighbors"].as_int_array()[1] = 0; + adjset_groups["group_000002/neighbors"].as_int_array()[1] = 2; + adjset_groups["group_000003/neighbors"].as_int_array()[1] = 3; + Node &windows_node0 = adjset_groups["group_000000/windows"]; + for(index_t w = 0; w <= 1; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node0[window_name]["origin/i"] = 0; + windows_node0[window_name]["origin/j"] = 20; + windows_node0[window_name]["dims/i"] = 21; + windows_node0[window_name]["dims/j"] = 1; + windows_node0[window_name]["ratio/i"] = 1; + windows_node0[window_name]["ratio/j"] = 1; + } + Node &windows_node2 = adjset_groups["group_000002/windows"]; + for(index_t w = 1; w <= 2; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node2[window_name]["origin/i"] = 20; + windows_node2[window_name]["origin/j"] = 20; + windows_node2[window_name]["dims/i"] = 1; + windows_node2[window_name]["dims/j"] = 1; + windows_node2[window_name]["ratio/i"] = 1; + windows_node2[window_name]["ratio/j"] = 1; + } + Node &windows_node3 = adjset_groups["group_000003/windows"]; + for(index_t w = 1; w <= 3; w += 2) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node3[window_name]["origin/i"] = 20; + windows_node3[window_name]["origin/j"] = 20; + windows_node3[window_name]["dims/i"] = 1; + windows_node3[window_name]["dims/j"] = 21; + windows_node3[window_name]["ratio/i"] = 1; + windows_node3[window_name]["ratio/j"] = 1; + } + } + else if (i == 2) + { + adjset_groups["group_000000/neighbors"] = DataType::int32(2); + adjset_groups["group_000001/neighbors"] = DataType::int32(2); + adjset_groups["group_000003/neighbors"] = DataType::int32(2); + adjset_groups["group_000004/neighbors"] = DataType::int32(2); + adjset_groups["group_000005/neighbors"] = DataType::int32(2); + adjset_groups["group_000000/neighbors"].as_int_array()[0] = 2; + adjset_groups["group_000001/neighbors"].as_int_array()[0] = 2; + adjset_groups["group_000003/neighbors"].as_int_array()[0] = 2; + adjset_groups["group_000004/neighbors"].as_int_array()[0] = 2; + adjset_groups["group_000005/neighbors"].as_int_array()[0] = 2; + adjset_groups["group_000000/neighbors"].as_int_array()[1] = 0; + adjset_groups["group_000001/neighbors"].as_int_array()[1] = 1; + adjset_groups["group_000003/neighbors"].as_int_array()[1] = 3; + adjset_groups["group_000004/neighbors"].as_int_array()[1] = 4; + adjset_groups["group_000005/neighbors"].as_int_array()[1] = 5; + Node &windows_node0 = adjset_groups["group_000000/windows"]; + for(index_t w = 0; w <= 2; w += 2) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node0[window_name]["origin/i"] = 20; + windows_node0[window_name]["origin/j"] = 0; + windows_node0[window_name]["dims/i"] = 1; + windows_node0[window_name]["dims/j"] = 21; + windows_node0[window_name]["ratio/i"] = 1; + windows_node0[window_name]["ratio/j"] = 1; + } + Node &windows_node1 = adjset_groups["group_000001/windows"]; + for(index_t w = 1; w <= 2; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node1[window_name]["origin/i"] = 20; + windows_node1[window_name]["origin/j"] = 20; + windows_node1[window_name]["dims/i"] = 1; + windows_node1[window_name]["dims/j"] = 1; + windows_node1[window_name]["ratio/i"] = 1; + windows_node1[window_name]["ratio/j"] = 1; + } + Node &windows_node3 = adjset_groups["group_000003/windows"]; + for(index_t w = 2; w <= 3; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node3[window_name]["origin/i"] = 20; + windows_node3[window_name]["origin/j"] = 20; + windows_node3[window_name]["dims/i"] = 21; + windows_node3[window_name]["dims/j"] = 1; + windows_node3[window_name]["ratio/i"] = 1; + windows_node3[window_name]["ratio/j"] = 1; + } + Node &windows_node4 = adjset_groups["group_000004/windows"]; + for(index_t w = 2; w <= 4; w += 2) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node4[window_name]["origin/i"] = 40; + windows_node4[window_name]["origin/j"] = 0; + windows_node4[window_name]["dims/i"] = 1; + windows_node4[window_name]["dims/j"] = 21; + windows_node4[window_name]["ratio/i"] = 1; + windows_node4[window_name]["ratio/j"] = 1; + } + Node &windows_node5 = adjset_groups["group_000005/windows"]; + for(index_t w = 2; w <= 5; w += 3) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node5[window_name]["origin/i"] = 40; + windows_node5[window_name]["origin/j"] = 20; + windows_node5[window_name]["dims/i"] = 1; + windows_node5[window_name]["dims/j"] = 1; + windows_node5[window_name]["ratio/i"] = 1; + windows_node5[window_name]["ratio/j"] = 1; + } + } + else if (i == 3) + { + adjset_groups["group_000000/neighbors"] = DataType::int32(2); + adjset_groups["group_000001/neighbors"] = DataType::int32(2); + adjset_groups["group_000002/neighbors"] = DataType::int32(2); + adjset_groups["group_000004/neighbors"] = DataType::int32(2); + adjset_groups["group_000005/neighbors"] = DataType::int32(2); + adjset_groups["group_000000/neighbors"].as_int_array()[0] = 3; + adjset_groups["group_000001/neighbors"].as_int_array()[0] = 3; + adjset_groups["group_000002/neighbors"].as_int_array()[0] = 3; + adjset_groups["group_000004/neighbors"].as_int_array()[0] = 3; + adjset_groups["group_000005/neighbors"].as_int_array()[0] = 3; + adjset_groups["group_000000/neighbors"].as_int_array()[1] = 0; + adjset_groups["group_000001/neighbors"].as_int_array()[1] = 1; + adjset_groups["group_000002/neighbors"].as_int_array()[1] = 2; + adjset_groups["group_000004/neighbors"].as_int_array()[1] = 4; + adjset_groups["group_000005/neighbors"].as_int_array()[1] = 5; + Node &windows_node0 = adjset_groups["group_000000/windows"]; + for(index_t w = 0; w <= 3; w += 3) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node0[window_name]["origin/i"] = 20; + windows_node0[window_name]["origin/j"] = 20; + windows_node0[window_name]["dims/i"] = 1; + windows_node0[window_name]["dims/j"] = 1; + windows_node0[window_name]["ratio/i"] = 1; + windows_node0[window_name]["ratio/j"] = 1; + } + Node &windows_node1 = adjset_groups["group_000001/windows"]; + for(index_t w = 1; w <= 3; w += 2) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node1[window_name]["origin/i"] = 20; + windows_node1[window_name]["origin/j"] = 20; + windows_node1[window_name]["dims/i"] = 1; + windows_node1[window_name]["dims/j"] = 21; + windows_node1[window_name]["ratio/i"] = 1; + windows_node1[window_name]["ratio/j"] = 1; + } + Node &windows_node2 = adjset_groups["group_000002/windows"]; + for(index_t w = 2; w <= 3; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node2[window_name]["origin/i"] = 20; + windows_node2[window_name]["origin/j"] = 20; + windows_node2[window_name]["dims/i"] = 21; + windows_node2[window_name]["dims/j"] = 1; + windows_node2[window_name]["ratio/i"] = 1; + windows_node2[window_name]["ratio/j"] = 1; + } + Node &windows_node4 = adjset_groups["group_000004/windows"]; + for(index_t w = 3; w <= 4; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node4[window_name]["origin/i"] = 40; + windows_node4[window_name]["origin/j"] = 20; + windows_node4[window_name]["dims/i"] = 1; + windows_node4[window_name]["dims/j"] = 1; + windows_node4[window_name]["ratio/i"] = 1; + windows_node4[window_name]["ratio/j"] = 1; + } + Node &windows_node5 = adjset_groups["group_000005/windows"]; + for(index_t w = 3; w <= 4; w += 2) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node5[window_name]["origin/i"] = 40; + windows_node5[window_name]["origin/j"] = 20; + windows_node5[window_name]["dims/i"] = 1; + windows_node5[window_name]["dims/j"] = 21; + windows_node5[window_name]["ratio/i"] = 1; + windows_node5[window_name]["ratio/j"] = 1; + } + } + else if (i == 4) + { + adjset_groups["group_000002/neighbors"] = DataType::int32(2); + adjset_groups["group_000003/neighbors"] = DataType::int32(2); + adjset_groups["group_000005/neighbors"] = DataType::int32(2); + adjset_groups["group_000006/neighbors"] = DataType::int32(2); + adjset_groups["group_000007/neighbors"] = DataType::int32(2); + adjset_groups["group_000002/neighbors"].as_int_array()[0] = 4; + adjset_groups["group_000003/neighbors"].as_int_array()[0] = 4; + adjset_groups["group_000005/neighbors"].as_int_array()[0] = 4; + adjset_groups["group_000006/neighbors"].as_int_array()[0] = 4; + adjset_groups["group_000007/neighbors"].as_int_array()[0] = 4; + adjset_groups["group_000002/neighbors"].as_int_array()[1] = 2; + adjset_groups["group_000003/neighbors"].as_int_array()[1] = 3; + adjset_groups["group_000005/neighbors"].as_int_array()[1] = 5; + adjset_groups["group_000006/neighbors"].as_int_array()[1] = 6; + adjset_groups["group_000007/neighbors"].as_int_array()[1] = 7; + Node &windows_node2 = adjset_groups["group_000002/windows"]; + for(index_t w = 2; w <= 4; w += 2) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node2[window_name]["origin/i"] = 40; + windows_node2[window_name]["origin/j"] = 0; + windows_node2[window_name]["dims/i"] = 1; + windows_node2[window_name]["dims/j"] = 21; + windows_node2[window_name]["ratio/i"] = 1; + windows_node2[window_name]["ratio/j"] = 1; + } + Node &windows_node3 = adjset_groups["group_000003/windows"]; + for(index_t w = 3; w <= 4; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node3[window_name]["origin/i"] = 40; + windows_node3[window_name]["origin/j"] = 20; + windows_node3[window_name]["dims/i"] = 1; + windows_node3[window_name]["dims/j"] = 1; + windows_node3[window_name]["ratio/i"] = 1; + windows_node3[window_name]["ratio/j"] = 1; + } + Node &windows_node5 = adjset_groups["group_000005/windows"]; + for(index_t w = 4; w <= 5; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node5[window_name]["origin/i"] = 40; + windows_node5[window_name]["origin/j"] = 20; + windows_node5[window_name]["dims/i"] = 21; + windows_node5[window_name]["dims/j"] = 1; + windows_node5[window_name]["ratio/i"] = 1; + windows_node5[window_name]["ratio/j"] = 1; + } + Node &windows_node6 = adjset_groups["group_000006/windows"]; + for(index_t w = 4; w <= 6; w += 2) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node6[window_name]["origin/i"] = 60; + windows_node6[window_name]["origin/j"] = 0; + windows_node6[window_name]["dims/i"] = 1; + windows_node6[window_name]["dims/j"] = 21; + windows_node6[window_name]["ratio/i"] = 1; + windows_node6[window_name]["ratio/j"] = 1; + } + Node &windows_node7 = adjset_groups["group_000007/windows"]; + for(index_t w = 4; w <= 7; w += 3) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node7[window_name]["origin/i"] = 60; + windows_node7[window_name]["origin/j"] = 20; + windows_node7[window_name]["dims/i"] = 1; + windows_node7[window_name]["dims/j"] = 1; + windows_node7[window_name]["ratio/i"] = 1; + windows_node7[window_name]["ratio/j"] = 1; + } + } + else if (i == 5) + { + adjset_groups["group_000002/neighbors"] = DataType::int32(2); + adjset_groups["group_000003/neighbors"] = DataType::int32(2); + adjset_groups["group_000004/neighbors"] = DataType::int32(2); + adjset_groups["group_000006/neighbors"] = DataType::int32(2); + adjset_groups["group_000007/neighbors"] = DataType::int32(2); + adjset_groups["group_000002/neighbors"].as_int_array()[0] = 5; + adjset_groups["group_000003/neighbors"].as_int_array()[0] = 5; + adjset_groups["group_000004/neighbors"].as_int_array()[0] = 5; + adjset_groups["group_000006/neighbors"].as_int_array()[0] = 5; + adjset_groups["group_000007/neighbors"].as_int_array()[0] = 5; + adjset_groups["group_000002/neighbors"].as_int_array()[1] = 2; + adjset_groups["group_000003/neighbors"].as_int_array()[1] = 3; + adjset_groups["group_000004/neighbors"].as_int_array()[1] = 4; + adjset_groups["group_000006/neighbors"].as_int_array()[1] = 6; + adjset_groups["group_000007/neighbors"].as_int_array()[1] = 7; + Node &windows_node2 = adjset_groups["group_000002/windows"]; + for(index_t w = 2; w <= 5; w += 3) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node2[window_name]["origin/i"] = 40; + windows_node2[window_name]["origin/j"] = 20; + windows_node2[window_name]["dims/i"] = 1; + windows_node2[window_name]["dims/j"] = 1; + windows_node2[window_name]["ratio/i"] = 1; + windows_node2[window_name]["ratio/j"] = 1; + } + Node &windows_node3 = adjset_groups["group_000003/windows"]; + for(index_t w = 3; w <= 5; w += 2) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node3[window_name]["origin/i"] = 40; + windows_node3[window_name]["origin/j"] = 20; + windows_node3[window_name]["dims/i"] = 1; + windows_node3[window_name]["dims/j"] = 21; + windows_node3[window_name]["ratio/i"] = 1; + windows_node3[window_name]["ratio/j"] = 1; + } + Node &windows_node4 = adjset_groups["group_000004/windows"]; + for(index_t w = 4; w <= 5; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node4[window_name]["origin/i"] = 40; + windows_node4[window_name]["origin/j"] = 20; + windows_node4[window_name]["dims/i"] = 1; + windows_node4[window_name]["dims/j"] = 21; + windows_node4[window_name]["ratio/i"] = 1; + windows_node4[window_name]["ratio/j"] = 1; + } + Node &windows_node6 = adjset_groups["group_000006/windows"]; + for(index_t w = 5; w <= 6; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node6[window_name]["origin/i"] = 60; + windows_node6[window_name]["origin/j"] = 20; + windows_node6[window_name]["dims/i"] = 1; + windows_node6[window_name]["dims/j"] = 1; + windows_node6[window_name]["ratio/i"] = 1; + windows_node6[window_name]["ratio/j"] = 1; + } + Node &windows_node7 = adjset_groups["group_000007/windows"]; + for(index_t w = 5; w <= 7; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node7[window_name]["origin/i"] = 60; + windows_node7[window_name]["origin/j"] = 20; + windows_node7[window_name]["dims/i"] = 1; + windows_node7[window_name]["dims/j"] = 21; + windows_node7[window_name]["ratio/i"] = 1; + windows_node7[window_name]["ratio/j"] = 1; + } + } + else if (i == 6) + { + adjset_groups["group_000004/neighbors"] = DataType::int32(2); + adjset_groups["group_000005/neighbors"] = DataType::int32(2); + adjset_groups["group_000007/neighbors"] = DataType::int32(2); + adjset_groups["group_000004/neighbors"].as_int_array()[0] = 6; + adjset_groups["group_000005/neighbors"].as_int_array()[0] = 6; + adjset_groups["group_000007/neighbors"].as_int_array()[0] = 6; + adjset_groups["group_000004/neighbors"].as_int_array()[1] = 4; + adjset_groups["group_000005/neighbors"].as_int_array()[1] = 5; + adjset_groups["group_000007/neighbors"].as_int_array()[1] = 7; + Node &windows_node4 = adjset_groups["group_000004/windows"]; + for(index_t w = 4; w <= 6; w += 2) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node4[window_name]["origin/i"] = 60; + windows_node4[window_name]["origin/j"] = 0; + windows_node4[window_name]["dims/i"] = 1; + windows_node4[window_name]["dims/j"] = 21; + windows_node4[window_name]["ratio/i"] = 1; + windows_node4[window_name]["ratio/j"] = 1; + } + Node &windows_node5 = adjset_groups["group_000005/windows"]; + for(index_t w = 5; w <= 6; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node5[window_name]["origin/i"] = 60; + windows_node5[window_name]["origin/j"] = 20; + windows_node5[window_name]["dims/i"] = 1; + windows_node5[window_name]["dims/j"] = 1; + windows_node5[window_name]["ratio/i"] = 1; + windows_node5[window_name]["ratio/j"] = 1; + } + Node &windows_node7 = adjset_groups["group_000007/windows"]; + for(index_t w = 6; w <= 7; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node7[window_name]["origin/i"] = 60; + windows_node7[window_name]["origin/j"] = 20; + windows_node7[window_name]["dims/i"] = 21; + windows_node7[window_name]["dims/j"] = 1; + windows_node7[window_name]["ratio/i"] = 1; + windows_node7[window_name]["ratio/j"] = 1; + } + } + else if (i == 7) + { + adjset_groups["group_000004/neighbors"] = DataType::int32(2); + adjset_groups["group_000005/neighbors"] = DataType::int32(2); + adjset_groups["group_000006/neighbors"] = DataType::int32(2); + adjset_groups["group_000004/neighbors"].as_int_array()[0] = 7; + adjset_groups["group_000005/neighbors"].as_int_array()[0] = 7; + adjset_groups["group_000006/neighbors"].as_int_array()[0] = 7; + adjset_groups["group_000004/neighbors"].as_int_array()[1] = 4; + adjset_groups["group_000005/neighbors"].as_int_array()[1] = 5; + adjset_groups["group_000006/neighbors"].as_int_array()[1] = 6; + Node &windows_node4 = adjset_groups["group_000004/windows"]; + for(index_t w = 4; w <= 7; w += 3) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node4[window_name]["origin/i"] = 60; + windows_node4[window_name]["origin/j"] = 20; + windows_node4[window_name]["dims/i"] = 1; + windows_node4[window_name]["dims/j"] = 1; + windows_node4[window_name]["ratio/i"] = 1; + windows_node4[window_name]["ratio/j"] = 1; + } + Node &windows_node5 = adjset_groups["group_000005/windows"]; + for(index_t w = 5; w <= 7; w += 2) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node5[window_name]["origin/i"] = 60; + windows_node5[window_name]["origin/j"] = 20; + windows_node5[window_name]["dims/i"] = 1; + windows_node5[window_name]["dims/j"] = 21; + windows_node5[window_name]["ratio/i"] = 1; + windows_node5[window_name]["ratio/j"] = 1; + } + Node &windows_node6 = adjset_groups["group_000006/windows"]; + for(index_t w = 6; w <= 7; w++) + { + std::ostringstream w_oss; + w_oss << "window_00000" << w; + const std::string window_name = w_oss.str(); + windows_node6[window_name]["origin/i"] = 60; + windows_node6[window_name]["origin/j"] = 20; + windows_node6[window_name]["dims/i"] = 21; + windows_node6[window_name]["dims/j"] = 1; + windows_node6[window_name]["ratio/i"] = 1; + windows_node6[window_name]["ratio/j"] = 1; + } + } + } +} + } //----------------------------------------------------------------------------- // -- end conduit::blueprint::mesh::examples -- diff --git a/src/libs/blueprint/conduit_blueprint_mesh_examples.hpp b/src/libs/blueprint/conduit_blueprint_mesh_examples.hpp index d12a43be4..a89ff2430 100644 --- a/src/libs/blueprint/conduit_blueprint_mesh_examples.hpp +++ b/src/libs/blueprint/conduit_blueprint_mesh_examples.hpp @@ -129,6 +129,9 @@ namespace examples conduit::index_t ny, conduit::index_t nz, conduit::Node &res); + + /// Generates a mesh that uses uniform adjsets + void CONDUIT_BLUEPRINT_API adjset_uniform(conduit::Node &res); } //----------------------------------------------------------------------------- // -- end conduit::blueprint::mesh::examples -- diff --git a/src/tests/blueprint/t_blueprint_mesh_verify.cpp b/src/tests/blueprint/t_blueprint_mesh_verify.cpp index 957411ac8..b1cb5d54a 100644 --- a/src/tests/blueprint/t_blueprint_mesh_verify.cpp +++ b/src/tests/blueprint/t_blueprint_mesh_verify.cpp @@ -1122,7 +1122,7 @@ TEST(conduit_blueprint_mesh_verify, adjset_general) n["groups"].reset(); n["groups"]["g1"]["neighbors"].set(DataType::int32(5)); - CHECK_MESH(verify_adjset,n,info,false); + CHECK_MESH(verify_adjset,n,info,true); n["groups"]["g1"]["values"].set(DataType::float32(5)); CHECK_MESH(verify_adjset,n,info,false); n["groups"]["g1"]["values"].set(DataType::int32(5)); @@ -1153,6 +1153,35 @@ TEST(conduit_blueprint_mesh_verify, adjset_general) } } + +//----------------------------------------------------------------------------- +TEST(conduit_blueprint_mesh_verify, adjset_structured) +{ + VerifyFun verify_adjset_funs[] = { + blueprint::mesh::adjset::verify, + verify_adjset_protocol}; + + for(index_t fi = 0; fi < 2; fi++) + { + VerifyFun verify_adjset = verify_adjset_funs[fi]; + + Node mesh, info; + CHECK_MESH(verify_adjset,mesh,info,false); + + blueprint::mesh::examples::adjset_uniform(mesh); + + NodeConstIterator itr = mesh.children(); + while(itr.has_next()) + { + const Node &chld= itr.next(); + const std::string chld_name = itr.name(); + + const Node& n = chld["adjsets/adjset"]; + CHECK_MESH(verify_adjset,n,info[chld_name],true); + } + } +} + /// Mesh Domain Nesting (AMR) Tests /// //----------------------------------------------------------------------------- @@ -2227,7 +2256,7 @@ TEST(conduit_blueprint_mesh_verify, mesh_general) Node &groups = domain["adjsets"]["mesh"]["groups"]; groups["g1"]["neighbors"].set(DataType::int32(10)); - CHECK_MESH(verify_mesh,mesh,info,false); + CHECK_MESH(verify_mesh,mesh,info,true); groups["g1"]["values"].set(DataType::float32(10)); CHECK_MESH(verify_mesh,mesh,info,false); groups["g1"]["values"].set(DataType::int32(10));