diff --git a/src/libs/vtkh/filters/UniformGrid.cpp b/src/libs/vtkh/filters/UniformGrid.cpp index ed357a187..28cb5b89f 100644 --- a/src/libs/vtkh/filters/UniformGrid.cpp +++ b/src/libs/vtkh/filters/UniformGrid.cpp @@ -40,21 +40,13 @@ class GlobalReduceFields vtkm::cont::DataSet res; res.CopyStructure(m_dataset); int num_fields = m_dataset.GetNumberOfFields(); - std::cerr << "NUM fields: " << num_fields << std::endl; - m_dataset.PrintSummary(std::cerr); for(int i = 0; i < num_fields; ++i) { vtkm::cont::Field field = m_dataset.GetField(i); - std::cerr << "inputing field: " << std::endl; - field.PrintSummary(std::cerr); - std::cerr << "inputing field END: " << std::endl; ReduceField r_field(field, m_dataset, m_invalid_value); vtkm::cont::Field res_field = r_field.reduce(); //auto reduce_field = field.GetData().ResetTypes(vtkm::TypeListCommon(),VTKM_DEFAULT_STORAGE_LIST{}); //reduce_field.CastAndCall(r_field); - std::cerr << "resulting field: " << std::endl; - res_field.PrintSummary(std::cerr); - std::cerr << "resulting field END: " << std::endl; res.AddField(res_field); } @@ -76,6 +68,8 @@ class GlobalReduceFields vtkm::cont::Field reduce() { + if(m_input_field.GetName() == "mask") + return m_input_field; vtkm::cont::Field res; MPI_Comm mpi_comm = MPI_Comm_f2c(vtkh::GetMPICommHandle()); vtkm::cont::EnvironmentTracker::SetCommunicator(vtkmdiy::mpi::communicator(vtkmdiy::mpi::make_DIY_MPI_Comm(mpi_comm))); @@ -100,14 +94,19 @@ class GlobalReduceFields int num_points = mask_portal.GetNumberOfValues(); //create invalid mask where true == invalid - std::vector l_mask(num_points,1); - std::vector g_mask(num_points,1); + std::vector l_mask(num_points,1); + std::vector g_mask(num_points,1); + std::vector g_valid(num_points,0); + std::vector l_valid(num_points,0); for(int j = 0; j < num_points; ++j) { l_mask[j] = l_mask[j] && mask_portal.Get(j); + if(l_mask[j] == 0) + l_valid[j] = 1; } - MPI_Reduce(l_mask.data(), g_mask.data(), num_points, MPI_FLOAT, MPI_LAND, 0, MPI_COMM_WORLD); + MPI_Reduce(l_mask.data(), g_mask.data(), num_points, MPI_INT, MPI_LAND, 0, MPI_COMM_WORLD); + MPI_Reduce(l_valid.data(), g_valid.data(), num_points, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); ////send to root process if(uah_field.CanConvert()) @@ -133,6 +132,10 @@ class GlobalReduceFields { global_field[i] = m_invalid_value; } + if(g_valid[i] > 1) + { + global_field[i] = global_field[i]/g_valid[i]; + } } scalarI ah_out = vtkm::cont::make_ArrayHandle(global_field.data(),num_points,vtkm::CopyFlag::On); vtkm::cont::Field out_field(m_input_field.GetName(), @@ -167,6 +170,10 @@ class GlobalReduceFields { global_field[i] = m_invalid_value; } + if(g_valid[i] > 1) + { + global_field[i] = global_field[i]/g_valid[i]; + } } scalarF ah_out = vtkm::cont::make_ArrayHandle(global_field.data(),num_points,vtkm::CopyFlag::On); vtkm::cont::Field out_field(m_input_field.GetName(), @@ -200,6 +207,10 @@ class GlobalReduceFields { global_field[i] = m_invalid_value; } + if(g_valid[i] > 1) + { + global_field[i] = global_field[i]/g_valid[i]; + } } scalarD ah_out = vtkm::cont::make_ArrayHandle(global_field.data(),num_points,vtkm::CopyFlag::On); vtkm::cont::Field out_field(m_input_field.GetName(), @@ -246,6 +257,11 @@ class GlobalReduceFields global_x_points[i] = m_invalid_value; global_y_points[i] = m_invalid_value; } + if(g_valid[i] > 1) + { + global_x_points[i] = global_x_points[i]/g_valid[i]; + global_y_points[i] = global_y_points[i]/g_valid[i]; + } vtkm::Vec points_vec = vtkm::make_Vec(global_x_points[i],global_y_points[i]); ah_out.WritePortal().Set(i,points_vec); } @@ -293,6 +309,11 @@ class GlobalReduceFields global_x_points[i] = m_invalid_value; global_y_points[i] = m_invalid_value; } + if(g_valid[i] > 1) + { + global_x_points[i] = global_x_points[i]/g_valid[i]; + global_y_points[i] = global_y_points[i]/g_valid[i]; + } vtkm::Vec points_vec = vtkm::make_Vec(global_x_points[i],global_y_points[i]); ah_out.WritePortal().Set(i,points_vec); } @@ -345,6 +366,12 @@ class GlobalReduceFields global_y_points[i] = m_invalid_value; global_z_points[i] = m_invalid_value; } + if(g_valid[i] > 1) + { + global_x_points[i] = global_x_points[i]/g_valid[i]; + global_y_points[i] = global_y_points[i]/g_valid[i]; + global_z_points[i] = global_z_points[i]/g_valid[i]; + } vtkm::Vec points_vec = vtkm::make_Vec(global_x_points[i], global_y_points[i], @@ -400,6 +427,12 @@ class GlobalReduceFields global_y_points[i] = m_invalid_value; global_z_points[i] = m_invalid_value; } + if(g_valid[i] > 1) + { + global_x_points[i] = global_x_points[i]/g_valid[i]; + global_y_points[i] = global_y_points[i]/g_valid[i]; + global_z_points[i] = global_z_points[i]/g_valid[i]; + } vtkm::Vec points_vec = vtkm::make_Vec(global_x_points[i], global_y_points[i], @@ -479,12 +512,6 @@ UniformGrid::DoExecute() #ifdef VTKH_PARALLEL vtkh::detail::GlobalReduceFields g_reducefields(dataset,m_invalid_value); auto output = g_reducefields.Reduce(); - std::cerr << "AFTER Reduce();" << std::endl; - if(par_rank == 0) - { - std::cerr << "output after reduce: " << std::endl; - output.PrintSummary(std::cerr); - } //auto full = field.GetData().ResetTypes(vtkm::TypeListCommon(),VTKM_DEFAULT_STORAGE_LIST{}); //full.CastAndCall(g_reducefields); this->m_output->AddDomain(output, domain_id); diff --git a/src/tests/ascent/t_ascent_mpi_uniform_grid.cpp b/src/tests/ascent/t_ascent_mpi_uniform_grid.cpp index 5274aaa26..e7e40139f 100644 --- a/src/tests/ascent/t_ascent_mpi_uniform_grid.cpp +++ b/src/tests/ascent/t_ascent_mpi_uniform_grid.cpp @@ -57,23 +57,53 @@ TEST(ascent_uniform_regular_grid, test_uniform_grid_smaller_by1_than_input) return; } - Node res; - conduit::blueprint::mesh::examples::braid("rectilinear",2,2,0,res); - res.print(); // // Create an example mesh. // Node data, verify_info; conduit::blueprint::mpi::mesh::examples::spiral_round_robin(NUM_DOMAINS,data,comm); + + int local_domains = data.number_of_children(); + for(int i = 0; i < local_domains; ++i) + { + double x_min, x_max, y_min, y_max; + Node vel_field; + vel_field["association"] = "vertex"; + vel_field["topology"] = "topo"; + Node &dom = data.child(i); + Node &values = dom["coordsets/coords/values"]; + Node &x = values["x"]; + Node &y = values["y"]; + int x_nvalues = x.dtype().number_of_elements(); + int y_nvalues = y.dtype().number_of_elements(); + double * x_array = x.value(); + double * y_array = y.value(); + x_max = x_array[x_nvalues-1]; + x_min = x_array[0]; + y_max = y_array[y_nvalues-1]; + y_min = y_array[0]; + int num_values = x_nvalues * y_nvalues; + double x_step = (x_max - x_min)/num_values; + double y_step = (y_max - y_min)/num_values; + std::vector u_array; + std::vector v_array; + for(int i = 0; i < num_values; ++i) + { + u_array.push_back(x_min + x_step*i); + v_array.push_back(y_min + y_step*i); + } + vel_field["values/u"].set(u_array); + vel_field["values/v"].set(v_array); + dom["fields/vel"] = vel_field; + } EXPECT_TRUE(conduit::blueprint::mesh::verify(data,verify_info)); - data.print(); ASCENT_INFO("Testing mpi uniform grid of conduit::blueprint spiral input\n"); string output_path = prepare_output_dir(); string output_file = conduit::utils::join_file_path(output_path,"tout_mpi_uniform_grid"); - string image_file = conduit::utils::join_file_path(output_path,"tout_mpi_uniform_grid"); + string image_file = conduit::utils::join_file_path(output_path,"tout_mpi_uniform_grid10"); // remove old images before rendering if(par_rank == 0) @@ -91,7 +121,7 @@ TEST(ascent_uniform_regular_grid, test_uniform_grid_smaller_by1_than_input) conduit::Node scenes; scenes["s1/plots/p1/type"] = "pseudocolor"; - scenes["s1/plots/p1/field"] = "braid"; + scenes["s1/plots/p1/field"] = "dist"; scenes["s1/plots/p1/pipeline"] = "pl1"; scenes["s1/image_prefix"] = image_file; @@ -117,8 +147,7 @@ TEST(ascent_uniform_regular_grid, test_uniform_grid_smaller_by1_than_input) ascent_opts["mpi_comm"] = MPI_Comm_c2f(comm); ascent_opts["exceptions"] = "forward"; ascent.open(ascent_opts); -// ascent.publish(data); - ascent.publish(res); + ascent.publish(data); ascent.execute(actions); ascent.close();