Skip to content

Commit

Permalink
add vel field to spiral (not perfect -- shared coords do not share va…
Browse files Browse the repository at this point in the history
…lues, sorryboutit). check for dupe valid coords and divide by num dupes. trust user did better and the values are the same?
  • Loading branch information
nicolemarsaglia committed Mar 20, 2024
1 parent 74cac0a commit 1cbe203
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 25 deletions.
61 changes: 44 additions & 17 deletions src/libs/vtkh/filters/UniformGrid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand All @@ -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)));
Expand All @@ -100,14 +94,19 @@ class GlobalReduceFields
int num_points = mask_portal.GetNumberOfValues();

//create invalid mask where true == invalid
std::vector<float> l_mask(num_points,1);
std::vector<float> g_mask(num_points,1);
std::vector<int> l_mask(num_points,1);
std::vector<int> g_mask(num_points,1);
std::vector<int> g_valid(num_points,0);
std::vector<int> 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<scalarI>())
Expand All @@ -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(),
Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -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<vtkm::Float32,2> points_vec = vtkm::make_Vec(global_x_points[i],global_y_points[i]);
ah_out.WritePortal().Set(i,points_vec);
}
Expand Down Expand Up @@ -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<vtkm::Float64,2> points_vec = vtkm::make_Vec(global_x_points[i],global_y_points[i]);
ah_out.WritePortal().Set(i,points_vec);
}
Expand Down Expand Up @@ -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<vtkm::Float32,3> points_vec = vtkm::make_Vec(global_x_points[i],
global_y_points[i],
Expand Down Expand Up @@ -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<vtkm::Float64,3> points_vec = vtkm::make_Vec(global_x_points[i],
global_y_points[i],
Expand Down Expand Up @@ -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);
Expand Down
45 changes: 37 additions & 8 deletions src/tests/ascent/t_ascent_mpi_uniform_grid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<double> u_array;
std::vector<double> 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)
Expand All @@ -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;
Expand All @@ -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();

Expand Down

0 comments on commit 1cbe203

Please sign in to comment.