From e3e4732c4a1650730b51d90c5360f611331f721d Mon Sep 17 00:00:00 2001 From: Nicole Date: Mon, 29 Apr 2024 13:12:04 -0700 Subject: [PATCH] add tubes for rendering streamlines (#1239) * add tubes for rendering streamlines * add seed population options --- CHANGELOG.md | 3 + .../cpp/ascent_tutorial_cpp_utils.hpp | 156 +++++ src/docs/sphinx/Actions/Examples.rst | 23 + src/docs/sphinx/Actions/Pipelines.rst | 186 ++++++ .../tout_streamline_point_list100.png | Bin 0 -> 405802 bytes .../tout_streamline_point_list100.yaml | 35 ++ .../examples/tout_streamline_render100.png | Bin 0 -> 411504 bytes .../examples/tout_streamline_render100.yaml | 35 ++ .../images/tout_render_streamlines_box100.png | Bin 0 -> 407686 bytes .../tout_render_streamlines_line100.png | Bin 0 -> 405538 bytes .../tout_render_streamlines_point100.png | Bin 0 -> 405235 bytes .../tout_render_streamlines_point_list100.png | Bin 0 -> 405303 bytes .../ascent_runtime_vtkh_filters.cpp | 583 ++++++++++++++++-- src/libs/vtkh/DataSet.cpp | 17 + src/libs/vtkh/DataSet.hpp | 1 + src/libs/vtkh/filters/Streamline.cpp | 61 +- src/libs/vtkh/filters/Streamline.hpp | 14 + src/libs/vtkh/filters/WarpXStreamline.cpp | 79 ++- src/libs/vtkh/filters/WarpXStreamline.hpp | 13 + .../tout_render_streamlines_box100.png | Bin 0 -> 419231 bytes ...treamlines_box100_img_compare_results.json | 13 + .../tout_render_streamlines_line100.png | Bin 0 -> 408346 bytes ...reamlines_line100_img_compare_results.json | 13 + .../tout_render_streamlines_point100.png | Bin 0 -> 405301 bytes ...eamlines_point100_img_compare_results.json | 13 + .../tout_render_streamlines_point_list100.png | Bin 0 -> 413748 bytes ...nes_point_list100_img_compare_results.json | 13 + src/tests/ascent/line_seeds.cpp | 197 ++++++ .../ascent/t_ascent_particle_advection.cpp | 534 +++++++++++++++- src/tests/vtkh/CMakeLists.txt | 3 +- .../vtkh/t_vtk-h_particle_advection_par.cpp | 54 +- src/tests/vtkh/t_vtk-h_warpx_streamline.cpp | 94 ++- .../vtkh/t_vtk-h_warpx_streamline_par.cpp | 195 ++++++ 33 files changed, 2207 insertions(+), 128 deletions(-) create mode 100644 install/examples/ascent/tutorial/ascent_intro/cpp/ascent_tutorial_cpp_utils.hpp create mode 100644 src/docs/sphinx/Actions/examples/tout_streamline_point_list100.png create mode 100644 src/docs/sphinx/Actions/examples/tout_streamline_point_list100.yaml create mode 100644 src/docs/sphinx/Actions/examples/tout_streamline_render100.png create mode 100644 src/docs/sphinx/Actions/examples/tout_streamline_render100.yaml create mode 100644 src/docs/sphinx/images/tout_render_streamlines_box100.png create mode 100644 src/docs/sphinx/images/tout_render_streamlines_line100.png create mode 100644 src/docs/sphinx/images/tout_render_streamlines_point100.png create mode 100644 src/docs/sphinx/images/tout_render_streamlines_point_list100.png create mode 100644 src/tests/_baseline_images/tout_render_streamlines_box100.png create mode 100644 src/tests/_baseline_images/tout_render_streamlines_box100_img_compare_results.json create mode 100644 src/tests/_baseline_images/tout_render_streamlines_line100.png create mode 100644 src/tests/_baseline_images/tout_render_streamlines_line100_img_compare_results.json create mode 100644 src/tests/_baseline_images/tout_render_streamlines_point100.png create mode 100644 src/tests/_baseline_images/tout_render_streamlines_point100_img_compare_results.json create mode 100644 src/tests/_baseline_images/tout_render_streamlines_point_list100.png create mode 100644 src/tests/_baseline_images/tout_render_streamlines_point_list100_img_compare_results.json create mode 100644 src/tests/ascent/line_seeds.cpp create mode 100644 src/tests/vtkh/t_vtk-h_warpx_streamline_par.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index b5a6811cd..19c258e04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,9 +14,12 @@ and this project aspires to adhere to [Semantic Versioning](https://semver.org/s - Added parameters to control HDF5 compression options to the Relay Extract. - Added check to make sure all domain IDs are unique - Added a `vtk` extract that saves each mesh domain to a legacy vtk file grouped, with all domain data grouped by a `.visit` file. +- Added WarpX Streamline filter that uses charged particles. +- Added seed population options for particle advection: point, point list, line, and box ### Changed - Changed the Data Binning filter to accept a `reduction_field` parameter (instead of `var`), and similarly the axis parameters to take `field` (instead of `var`). The `var` style parameters are still accepted, but deprecated and will be removed in a future release. +- Changed the Streamline and WarpXStreamline filters to apply the VTK-m Tube filter to their outputs, allowing for the results to be rendered. ## [0.9.2] - Released 2023-06-30 ### Preferred dependency versions for ascent@0.9.2 diff --git a/install/examples/ascent/tutorial/ascent_intro/cpp/ascent_tutorial_cpp_utils.hpp b/install/examples/ascent/tutorial/ascent_intro/cpp/ascent_tutorial_cpp_utils.hpp new file mode 100644 index 000000000..f0dce55d8 --- /dev/null +++ b/install/examples/ascent/tutorial/ascent_intro/cpp/ascent_tutorial_cpp_utils.hpp @@ -0,0 +1,156 @@ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Copyright (c) Lawrence Livermore National Security, LLC and other Ascent +// Project developers. See top-level LICENSE AND COPYRIGHT files for dates and +// other details. No copyright assignment is required to contribute to Ascent. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + +//----------------------------------------------------------------------------- +/// +/// file: ascent_tutorial_cpp_utils.hpp +/// +//----------------------------------------------------------------------------- + +#ifndef ASCENT_TUTORIAL_CPP_UTILS_H +#define ASCENT_TUTORIAL_CPP_UTILS_H + +#include +#include "conduit_blueprint.hpp" + +#include + +using namespace conduit; + +const float64 PI_VALUE = 3.14159265359; + +// --------------------------------------------------------------------------// +void +tutorial_tets_example(Node &mesh) +{ + mesh.reset(); + + // + // (create example tet mesh from blueprint example 2) + // + // Create a 3D mesh defined on an explicit set of points, + // composed of two tets, with two element associated fields + // (`var1` and `var2`) + // + + // create an explicit coordinate set + double X[5] = { -1.0, 0.0, 0.0, 0.0, 1.0 }; + double Y[5] = { 0.0, -1.0, 0.0, 1.0, 0.0 }; + double Z[5] = { 0.0, 0.0, 1.0, 0.0, 0.0 }; + mesh["coordsets/coords/type"] = "explicit"; + mesh["coordsets/coords/values/x"].set(X, 5); + mesh["coordsets/coords/values/y"].set(Y, 5); + mesh["coordsets/coords/values/z"].set(Z, 5); + + + // add an unstructured topology + mesh["topologies/mesh/type"] = "unstructured"; + // reference the coordinate set by name + mesh["topologies/mesh/coordset"] = "coords"; + // set topology shape type + mesh["topologies/mesh/elements/shape"] = "tet"; + // add a connectivity array for the tets + int64 connectivity[8] = { 0, 1, 3, 2, 4, 3, 1, 2 }; + mesh["topologies/mesh/elements/connectivity"].set(connectivity, 8); + + const int num_elements = 2; + float var1_vals[num_elements] = { 0, 1 }; + float var2_vals[num_elements] = { 1, 0 }; + + // create a field named var1 + mesh["fields/var1/association"] = "element"; + mesh["fields/var1/topology"] = "mesh"; + mesh["fields/var1/values"].set(var1_vals, 2); + + // create a field named var2 + mesh["fields/var2/association"] = "element"; + mesh["fields/var2/topology"] = "mesh"; + mesh["fields/var2/values"].set(var2_vals, 2); + + // make sure the mesh we created conforms to the blueprint + Node verify_info; + if(!blueprint::mesh::verify(mesh, verify_info)) + { + std::cout << "Mesh Verify failed!" << std::endl; + std::cout << verify_info.to_yaml() << std::endl; + } +} + +// --------------------------------------------------------------------------// +void +tutorial_gyre_example(float64 time_value, Node &mesh) +{ + mesh.reset(); + int xy_dims = 40; + int z_dims = 2; + + conduit::blueprint::mesh::examples::braid("hexs", + xy_dims, + xy_dims, + z_dims, + mesh); + + mesh["state/time"] = time_value; + Node &field = mesh["fields/gyre"]; + field["association"] = "vertex"; + field["topology"] = "mesh"; + field["values"].set(DataType::float64(xy_dims*xy_dims*z_dims)); + + Node &vec_field = mesh["fields/gyre_vel"]; + vec_field["association"] = "vertex"; + vec_field["topology"] = "mesh"; + vec_field["values/u"].set(DataType::float64(xy_dims*xy_dims*z_dims)); + vec_field["values/v"].set(DataType::float64(xy_dims*xy_dims*z_dims)); + vec_field["values/w"].set(DataType::float64(xy_dims*xy_dims*z_dims)); + + float64 *values_ptr = field["values"].value(); + float64 *u_values_ptr = vec_field["values/u"].value(); + float64 *v_values_ptr = vec_field["values/v"].value(); + float64 *w_values_ptr = vec_field["values/w"].value(); + + float64 e = 0.25; + float64 A = 0.1; + float64 w = (2.0 * PI_VALUE) / 10.0; + float64 a_t = e * sin(w * time_value); + float64 b_t = 1.0 - 2 * e * sin(w * time_value); + // print("e: " + str(e) + " A " + str(A) + " w " + str(w) + " a_t " + str(a_t) + " b_t " + str(b_t)) + // print(b_t) + // print(w) + int idx = 0; + for (int z=0; z < z_dims; z++) + { + for (int y=0; y < xy_dims; y++) + { + // scale y to 0-1 + float64 y_n = float64(y)/float64(xy_dims); + float64 y_t = sin(PI_VALUE * y_n); + for (int x=0; x < xy_dims; x++) + { + // scale x to 0-1 + float64 x_f = float(x)/ (float(xy_dims) * .5); + float64 f_t = a_t * x_f * x_f + b_t * x_f; + // print(f_t) + float64 value = A * sin(PI_VALUE * f_t) * y_t; + float64 u = -PI_VALUE * A * sin(PI_VALUE * f_t) * cos(PI_VALUE * y_n); + float64 df_dx = 2.0 * a_t + b_t; + // print("df_dx " + str(df_dx)) + float64 v = PI_VALUE * A * cos(PI_VALUE * f_t) * sin(PI_VALUE * y_n) * df_dx; + values_ptr[idx] = sqrt(u * u + v * v); + u_values_ptr[idx] = u; + v_values_ptr[idx] = v; + w_values_ptr[idx] = 0; + // values[idx] = u * u + v * v + // values[idx] = value + // print("u " + str(u) + " v " + str(v) + " mag " + str(math.sqrt(u * u + v * v))) + idx++; + } + } + } + + //print(values) +} + +#endif diff --git a/src/docs/sphinx/Actions/Examples.rst b/src/docs/sphinx/Actions/Examples.rst index 7ae1681f9..7fec42425 100644 --- a/src/docs/sphinx/Actions/Examples.rst +++ b/src/docs/sphinx/Actions/Examples.rst @@ -238,6 +238,17 @@ Resulting image: .. image:: examples/tout_trigger_extract_inline100.png +An example of the streamline filter using point list seed placement +-------------------------------------------------------------------- + +YAML actions: + +.. literalinclude:: examples/tout_streamline_point_list100.yaml + +Resulting image: + +.. image:: examples/tout_streamline_point_list100.png + An example of the interconnecting pipelines. --------------------------------------------- @@ -755,6 +766,18 @@ Resulting image: .. image:: examples/tout_cell_gradient_mag_radial100.png +An example of using the streamline filter and associated tube parameters to produce a rendering. +-------------------------------------------------------------------------------------------------- + +YAML actions: + +.. literalinclude:: examples/tout_streamline_render100.yaml + +Resulting image: + +.. image:: examples/tout_streamline_render100.png + + An example of using the xray extract. -------------------------------------- diff --git a/src/docs/sphinx/Actions/Pipelines.rst b/src/docs/sphinx/Actions/Pipelines.rst index 5955eb63b..010a3df0f 100644 --- a/src/docs/sphinx/Actions/Pipelines.rst +++ b/src/docs/sphinx/Actions/Pipelines.rst @@ -607,6 +607,192 @@ values are removed from the data set. An example of creating a iso-volume of values between 5.0 and 10.0. +Particle Advection +~~~~~~~~~~~~~~~~ +The particle advection filter distributes some number of weightless particles over a user-specified vector field (``field``) and, given some advection distance (``step_size``), advects them for some number of advection steps (``num_steps``). + +.. code-block:: c++ + + conduit::Node pipelines; + // pipeline 1 + pipelines["pl1/f1/type"] = "particle_advection"; + //required params + conduit::Node ¶ms = pipelines["pl1/f1/params"]; + params["field"] = "vel"; // name of the vector field + params["step_size"] = 0.01; // advection step size + params["num_steps"] = 100; // number of advection steps + +Users also need to specify how to generate seed placements (``seeds``). +The seed placements can be an individual point (``point``), a list of points (``point_list``), a line (``line``), or a box (``box``). +The seed placement type will determine the necessary parameters: + + - ``point`` requires a ``location`` as an [x,y,z] list of doubles. + - ``point_list`` requires a ``location`` as an [x0,y0,z0,...,xn,yn,zn] list of doubles. + - ``line`` requires a ``start`` and ``end`` as [x,y,z] lists of doubles, the number of seeds (``num_seeds``) to place on the line as well as defining the spacing between seeds (``sampling_type``) as either ``uniform`` or ``random``. + - ``box`` requires the sampling space (``sampling_space``) to be defined (``boundary`` or ``interior``), the sampling type (``sampling_type``) to be defined (``random`` or ``uniform``). By default the boundary of the entire dataset is used, but user can define a new boundary (``x_extents``, ``y_extents``, and ``z_extents``). + + +At this time, Ascent can only save the output of the particle advection filter as an extract. For rendering, consider using the streamline filter. + +Streamlines +~~~~~~~~~~~~ +The streamline filter behaves similarly to the particle advection filter, but as the particles are advected, the path of the particle is is collected as a streamline that can be rendered or saved as an extract. +The streamlines are rendered using tubes, which transform the streamline data into a 3D surface. +Tubes are on by default but they can be disabled, though this would also disable rendering capabilities. + +.. code-block:: c++ + + conduit::Node pipelines; + // pipeline 1 + pipelines["pl1/f1/type"] = "streamline"; + // filter knobs (all these are optional) + conduit::Node ¶ms = pipelines["pl1/f1/params"]; + params["field"] = "vel"; // name of the vector field + params["num_steps"] = 1; // number of advection steps + params["step_size"] = 0.01; // advection step size + params["seeds/type"] = "point"; + params["seeds/location"] = [-0.826997,-5.62082,3.52779]; + //all tubing params are optional + params["enable_tubes"] = "true"; //default: true + params["tube_size"] = 0.4; //default: based on bounds + params["tube_sides"] = 4; //default: 3 + params["tube_val"] = 1.0; //default: 0.0 + params["tube_capping"] = "true"; //default: true + params["output_field"] = "lines"; //name of streamline tubes for rendering + //default: "field" + "_streamlines" + //e.g "vel_streamlines" + +.. figure:: ../images/tout_render_streamlines_point100.png + :scale: 50 % + :align: center + + An example of creating a pseudocolor plot of streamline seed placements using ``point``. + +.. code-block:: c++ + + conduit::Node pipelines; + // pipeline 1 + pipelines["pl1/f1/type"] = "streamline"; + // filter knobs (all these are optional) + conduit::Node ¶ms = pipelines["pl1/f1/params"]; + params["field"] = "vel"; // name of the vector field + params["num_steps"] = 1; // number of advection steps + params["step_size"] = 0.01; // advection step size + params["seeds/type"] = "point_list"; + params["seeds/location"] = [-9,-9,-9,1,1,1]; // two points + //all tubing params are optional + params["enable_tubes"] = "true"; //default: true + params["tube_size"] = 0.4; //default: based on bounds + params["tube_sides"] = 4; //default: 3 + params["tube_val"] = 1.0; //default: 0.0 + params["tube_capping"] = "true"; //default: true + params["output_field"] = "lines"; //name of streamline tubes for rendering + //default: "field" + "_streamlines" + //e.g "vel_streamlines" + +.. figure:: ../images/tout_render_streamlines_point_list100.png + :scale: 50 % + :align: center + + An example of creating a pseudocolor plot of streamline seed placements using ``point_list``. +.. code-block:: c++ + + conduit::Node pipelines; + // pipeline 1 + pipelines["pl1/f1/type"] = "streamline"; + // filter knobs (all these are optional) + conduit::Node ¶ms = pipelines["pl1/f1/params"]; + params["field"] = "vel"; // name of the vector field + params["num_steps"] = 1; // number of advection steps + params["step_size"] = 0.01; // advection step size + params["seeds/type"] = "line"; + //required: how to space the seeds on the line + params["seeds/sampling_type"] = "uniform"; //or "random" + params["seeds/start"] = [-9,-9,-9]; // required: start of line + params["seeds/end"] = [9,9,9]; // required: end of line + params["seeds/num_seeds"] = 10; // required: number of seeds + //all tubing params are optional + params["enable_tubes"] = "true"; //default: true + params["tube_size"] = 0.1; //default: based on bounds + params["tube_sides"] = 4; //default: 3 + params["tube_val"] = 1.0; //default: 0.0 + params["tube_capping"] = "true"; //default: true + params["output_field"] = "lines"; //name of streamline tubes for rendering + //default: "field" + "_streamlines" + //e.g "vel_streamlines" + +.. figure:: ../images/tout_render_streamlines_line100.png + :scale: 50 % + :align: center + + An example of creating a pseudocolor plot of streamline seed placements using ``line``. + +.. code-block:: c++ + + conduit::Node pipelines; + // pipeline 1 + pipelines["pl1/f1/type"] = "streamline"; + // filter knobs (all these are optional) + conduit::Node ¶ms = pipelines["pl1/f1/params"]; + params["field"] = "vel"; // name of the vector field + params["step_size"] = 0.01; // advection step size + params["num_steps"] = 1; // number of advection steps + //seed parameters + params["seeds/type"] = "box"; + params["seeds/sampling_type"] = "uniform"; //or "random" + params["seeds/sampling_space"] = "interior"; //or "boundary" + //default is using the boundary of the entire dataset + params["seeds/x_extents"] = [-9,9]; //optional: define the boundary + params["seeds/y_extents"] = [-9,9]; //for the distribution + params["seeds/z_extents"] = [-9,9]; //of the particles + //all tubing params are optional + params["enable_tubes"] = "true"; //default: true + params["tube_size"] = 0.1; //default: based on bounds + params["tube_sides"] = 4; //default: 3 + params["tube_val"] = 1.0; //default: 0.0 + params["tube_capping"] = "true"; //default: true + params["output_field"] = "lines"; //name of streamline tubes for rendering + //default: "field" + "_streamlines" + //e.g "vel_streamlines" + +.. figure:: ../images/tout_render_streamlines_box100.png + :scale: 50 % + :align: center + + An example of creating a pseudocolor plot of streamline seed placements using ``box``. + +Streamlines with Charged Particles (WarpX) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The streamlines with charged particles filter behaves similarly to the streamline filter, but instead utilizes charged particles, which are particles with physical attributes (``charge``, ``mass``, ``momentum``, ``weighting``), that are advected using magnetic (``b_field``) and electric (``e_field``) vector fields. +The resulting streamlines are rendered using tubes, which transform the streamline data into a 3D surface. +Note: the tube functionality is not behaving correctly, currently this functionality is OFF by default. +Otherwise, the resulting streamlines can be saved via an extract. + +.. code-block:: c++ + + conduit::Node pipelines; + // pipeline 1 + pipelines["pl1/f1/type"] = "warpx_streamline"; + // filter knobs (all these are optional) + conduit::Node ¶ms = pipelines["pl1/f1/params"]; + //vector fields + params["b_field"] = "magnetic_field"; //default: B + params["e_field"] = "electric_field"; //default: E + //charged particle params + params["charge_field"] = "charge_field"; //default: Charge + params["mass_field"] = "mass_field"; //default: Mass + params["momentum_field"] = "momentum_field"; //default: Momentum + params["weighting_field"] = "weighting_field"; //default: Weighting + //tubing params + params["enable_tubes"] = "true"; //default: false + params["tube_size"] = 0.2; //default: based on bounds + params["tube_sides"] = 4; //default: 3 + params["tube_val"] = 1.0; //default: 0.0 + params["tube_capping"] = "true"; //default: true + params["output_field"] = "lines"; //name of streamline tubes for rendering + //default: "b_field" + "e_field" + "_streamlines" + //e.g "B_E_streamlines" + Vector Magnitude ~~~~~~~~~~~~~~~~ Vector magnitude creates a new field on the data set representing the magitude diff --git a/src/docs/sphinx/Actions/examples/tout_streamline_point_list100.png b/src/docs/sphinx/Actions/examples/tout_streamline_point_list100.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd98a485714e2dafba30de775304313cf15ed1e GIT binary patch literal 405802 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 Yh$}@0UVG#&PRMKjn(@lsmjl=Se;Yv13IG5A literal 0 HcmV?d00001 diff --git a/src/docs/sphinx/Actions/examples/tout_streamline_point_list100.yaml b/src/docs/sphinx/Actions/examples/tout_streamline_point_list100.yaml new file mode 100644 index 000000000..d85aed06d --- /dev/null +++ b/src/docs/sphinx/Actions/examples/tout_streamline_point_list100.yaml @@ -0,0 +1,35 @@ +#An example of using the streamline flow filter. + +- + action: "add_pipelines" + pipelines: + pl1: + f1: + type: "streamline" + params: + field: "vel" + num_steps: 100 + step_size: 0.01 + seeds: + type: "point_list" + location: [-0.826997, -5.62082, 3.57729, 0.388328, -9.30856, 0.594004, -8.66316, 3.73545, 8.60873, 3.07838, 4.02381, 5.24396, -3.43532, 5.12821, -2.69323, 5.06712, -8.54628, 7.69414, -0.445364, -4.50186, -6.66986, -8.78871, 0.0904583, -3.61934, -8.18534, -8.52502, -2.31716, -0.711083, -8.99832, 5.40409, 3.76911, 2.59087, 4.50824, -3.87356, 0.265474, 6.91963, -1.69211, -0.641653, -6.43345, -9.33892, -0.0303976, 4.96585, 6.84079, -5.74497, -7.39145, -1.71413, 4.19639, -5.20178, 3.04117, 3.62692, -2.24549, 6.91151, 9.10818, -7.03697, 1.29797, -0.229709, 9.2219, 2.58538, 3.02507, 6.06146] + rendering: + enable_tubes: "true" + tube_capping: "false" + tube_size: 0.4 + tube_sides: 4 + tube_value: 0.0 + output_field: "lines" +- + action: "add_scenes" + scenes: + s1: + plots: + p1: + type: "pseudocolor" + field: "lines" + pipeline: "pl1" + renders: + r1: + image_prefix: "/home/user/ascent/build/tests/_output/tout_render_streamlines_point_list" + dataset_bounds: [-10.0, 10.0, -10.0, 10.0, -10.0, 10.0] diff --git a/src/docs/sphinx/Actions/examples/tout_streamline_render100.png b/src/docs/sphinx/Actions/examples/tout_streamline_render100.png new file mode 100644 index 0000000000000000000000000000000000000000..8dcdec3ec106933d91c68e2daaf055e2c815dbe5 GIT binary patch literal 411504 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 Khd!IR_5T6#+VhkE literal 0 HcmV?d00001 diff --git a/src/docs/sphinx/Actions/examples/tout_streamline_render100.yaml b/src/docs/sphinx/Actions/examples/tout_streamline_render100.yaml new file mode 100644 index 000000000..15043235a --- /dev/null +++ b/src/docs/sphinx/Actions/examples/tout_streamline_render100.yaml @@ -0,0 +1,35 @@ +#An example of using the streamline filter and rendering the result. + +- + action: "add_pipelines" + pipelines: + pl1: + f2: + type: "streamline" + params: + field: "vel" + num_seeds: 10 + num_steps: 100 + step_size: 0.01 + seed_bounding_box_x_min: 0.0 + seed_bounding_box_x_max: 1.0 + seed_bounding_box_y_min: 0.0 + seed_bounding_box_y_max: 1.0 + seed_bounding_box_z_min: 0.0 + seed_bounding_box_z_max: 1.0 + enable_tubes: "true" + tube_capping: "false" + tube_size: 0.1 + tube_sides: 4 + tube_value: 0.0 + output_name: "lines" +- + action: "add_scenes" + scenes: + s1: + plots: + p1: + type: "pseudocolor" + field: "lines" + pipeline: "pl1" + image_prefix: "/Users/harrison37/Work/alpine/ascent/build-debug/tests/_output/tout_streamline_vel" diff --git a/src/docs/sphinx/images/tout_render_streamlines_box100.png b/src/docs/sphinx/images/tout_render_streamlines_box100.png new file mode 100644 index 0000000000000000000000000000000000000000..958e6772f2f79074aad0177cc4d3763fbe8655ee GIT binary patch literal 407686 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 literal 0 HcmV?d00001 diff --git a/src/docs/sphinx/images/tout_render_streamlines_point100.png b/src/docs/sphinx/images/tout_render_streamlines_point100.png new file mode 100644 index 0000000000000000000000000000000000000000..c892e6932cc769825b6db18afa847ed8e0aac0f5 GIT binary patch literal 405235 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 Do*w`y literal 0 HcmV?d00001 diff --git a/src/docs/sphinx/images/tout_render_streamlines_point_list100.png b/src/docs/sphinx/images/tout_render_streamlines_point_list100.png new file mode 100644 index 0000000000000000000000000000000000000000..de3e5bb509c0929ae77e4ed29f46541c4b2f34eb GIT binary patch literal 405303 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 CR2$v^ literal 0 HcmV?d00001 diff --git a/src/libs/ascent/runtimes/flow_filters/ascent_runtime_vtkh_filters.cpp b/src/libs/ascent/runtimes/flow_filters/ascent_runtime_vtkh_filters.cpp index 86c876267..a9ff6e95e 100644 --- a/src/libs/ascent/runtimes/flow_filters/ascent_runtime_vtkh_filters.cpp +++ b/src/libs/ascent/runtimes/flow_filters/ascent_runtime_vtkh_filters.cpp @@ -3763,29 +3763,111 @@ bool VTKHParticleAdvection::verify_params(const conduit::Node ¶ms, conduit::Node &info) { - info.reset(); bool res = check_string("field", params, info, true); - res &= check_numeric("num_seeds", params, info, true, true); res &= check_numeric("num_steps", params, info, true, true); res &= check_numeric("step_size", params, info, true, true); - res &= check_numeric("seed_bounding_box_xmin", params, info, true, true); - res &= check_numeric("seed_bounding_box_xmax", params, info, true, true); - res &= check_numeric("seed_bounding_box_ymin", params, info, true, true); - res &= check_numeric("seed_bounding_box_ymax", params, info, true, true); - res &= check_numeric("seed_bounding_box_zmin", params, info, true, true); - res &= check_numeric("seed_bounding_box_zmax", params, info, true, true); + info.reset(); + + if(!params.has_child("seeds")) + { + info["errors"].append() = "Missing required parameter. Particle Advection must specify seeds"; + res = false; + } + else + { + conduit::Node seed_params = params["seeds"]; + if(!seed_params.has_child("type")) + { + info["errors"].append() = "Missing required parameter. Particle Advection must specify seed type"; + res = false; + } + else + { + + res &= check_string("type", seed_params, info, true); + std::string type = seed_params["type"].as_string(); + if(type == "point") + { + res &= check_numeric("location",seed_params,info,true); + } + else if(type == "point_list") + { + res &= check_numeric("location",seed_params,info,true); + } + else if(type == "line") + { + res &= check_numeric("start",seed_params,info,true); + res &= check_numeric("end",seed_params,info,true); + res &= check_numeric("num_seeds",seed_params,info,true); + res &= check_string("sampling_type", seed_params, info, true); + } + else if(type == "box") + { + res &= check_string("sampling_space", seed_params, info, true); + res &= check_string("sampling_type", seed_params, info, true); + string sampling_type = seed_params["sampling_type"].as_string(); + if(sampling_type == "uniform") + { + res &= check_numeric("num_seeds_x",seed_params,info,true); + res &= check_numeric("num_seeds_y",seed_params,info,true); + res &= check_numeric("num_seeds_z",seed_params,info,true); + } + else + { + res &= check_numeric("num_seeds",seed_params,info,true); + } + + if(seed_params.has_child("extents_x")) + { + res &= check_numeric("extents_x",seed_params,info,true); + res &= check_numeric("extents_y",seed_params,info,true); + res &= check_numeric("extents_z",seed_params,info,true); + } + } + else + { + info["errors"].append() = "Unrecognized parameter. Particle Advection supports seed types 'point', 'point_list', 'line', or 'box'."; + res = false; + } + + + } + } + + if(params.has_child("rendering")) + { + res &= check_string("rendering/enable_tubes", params, info, false); + res &= check_string("rendering/tube_capping", params, info, false); + res &= check_numeric("rendering/tube_size", params, info, false); + res &= check_numeric("rendering/tube_sides", params, info, false); + res &= check_numeric("rendering/tube_value", params, info, false); + res &= check_string("rendering/output_field", params, info, false); + } std::vector valid_paths; valid_paths.push_back("field"); - valid_paths.push_back("num_seeds"); valid_paths.push_back("num_steps"); valid_paths.push_back("step_size"); - valid_paths.push_back("seed_bounding_box_xmin"); - valid_paths.push_back("seed_bounding_box_xmax"); - valid_paths.push_back("seed_bounding_box_ymin"); - valid_paths.push_back("seed_bounding_box_ymax"); - valid_paths.push_back("seed_bounding_box_zmin"); - valid_paths.push_back("seed_bounding_box_zmax"); + valid_paths.push_back("seeds/type"); + valid_paths.push_back("seeds/location"); + valid_paths.push_back("seeds/start"); + valid_paths.push_back("seeds/end"); + valid_paths.push_back("seeds/num_seeds"); + valid_paths.push_back("seeds/num_seeds_x"); + valid_paths.push_back("seeds/num_seeds_y"); + valid_paths.push_back("seeds/num_seeds_z"); + valid_paths.push_back("seeds/extents_x"); + valid_paths.push_back("seeds/extents_y"); + valid_paths.push_back("seeds/extents_z"); + valid_paths.push_back("seeds/sampling_type"); + valid_paths.push_back("seeds/sampling_space"); + + valid_paths.push_back("rendering/enable_tubes"); + valid_paths.push_back("rendering/tube_capping"); + valid_paths.push_back("rendering/tube_size"); + valid_paths.push_back("rendering/tube_sides"); + valid_paths.push_back("rendering/tube_value"); + valid_paths.push_back("rendering/output_field"); std::string surprises = surprise_check(valid_paths, params); @@ -3831,47 +3913,356 @@ VTKHParticleAdvection::execute() std::string topo_name = collection->field_topology(field_name); vtkh::DataSet &data = collection->dataset_by_topology(topo_name); - - int numSeeds = get_int32(params()["num_seeds"], data_object); int numSteps = get_int32(params()["num_steps"], data_object); float stepSize = get_float32(params()["step_size"], data_object); + std::random_device device; + std::default_random_engine generator(0); + float zero(0), one(1); + std::uniform_real_distribution distribution(zero, one); - float seedBBox[6]; - seedBBox[0] = get_float32(params()["seed_bounding_box_xmin"], data_object); - seedBBox[1] = get_float32(params()["seed_bounding_box_xmax"], data_object); - seedBBox[2] = get_float32(params()["seed_bounding_box_ymin"], data_object); - seedBBox[3] = get_float32(params()["seed_bounding_box_ymax"], data_object); - seedBBox[4] = get_float32(params()["seed_bounding_box_zmin"], data_object); - seedBBox[5] = get_float32(params()["seed_bounding_box_zmax"], data_object); + conduit::Node n_seeds = params()["seeds"]; + std::string seed_type = n_seeds["type"].as_string(); + std::vector seeds; + if(seed_type == "point") + { + const Node &n_loc_vals = n_seeds["location"]; - float dx = seedBBox[1] - seedBBox[0]; - float dy = seedBBox[3] - seedBBox[2]; - float dz = seedBBox[5] - seedBBox[4]; + //convert to contig doubles + Node n_loc_vals_dbls; + n_loc_vals.to_float64_array(n_loc_vals_dbls); - if (dx < 0 || dy < 0 || dz < 0) + double* location = n_loc_vals_dbls.as_double_ptr(); + double x = location[0]; + double y = location[1]; + double z = location[2]; + //std::cerr << "seed point" << ": " << x << " " << y << " " << z << std::endl; + seeds.push_back(vtkm::Particle({x,y,z}, 0)); + } + else if(seed_type == "point_list") { - bool throw_error = false; - detail::field_error(field_name, this->name(), collection, throw_error); - // this creates a data object with an invalid soource - set_output(new DataObject()); - return; + const Node &n_loc_vals = n_seeds["location"]; + + //convert to contig doubles + Node n_loc_vals_dbls; + n_loc_vals.to_float64_array(n_loc_vals_dbls); + + double* location = n_loc_vals_dbls.as_double_ptr(); + + int num_points = (n_loc_vals_dbls.dtype().number_of_elements()); + //std::cerr << "num_points: " << num_points << std::endl; + for(int i = 0; i < num_points; i+=3) + { + double x = location[i]; + double y = location[i+1]; + double z = location[i+2]; + //std::cerr << "seed point " << i/3 << ": " << x << " " << y << " " << z << std::endl; + seeds.push_back(vtkm::Particle({x,y,z}, i/3)); + } } + else if(seed_type == "line") + { + const Node &n_start_vals = n_seeds["start"]; + const Node &n_end_vals = n_seeds["end"]; + std::string sampling = n_seeds["sampling_type"].as_string(); + int num_seeds = n_seeds["num_seeds"].as_int(); - std::random_device device; - std::default_random_engine generator(0); - float zero(0), one(1); - std::uniform_real_distribution distribution(zero, one); - //Generate seeds - std::vector seeds; - for (int i = 0; i < numSeeds; i++) + //convert to contig doubles + Node n_start_vals_dbls; + n_start_vals.to_float64_array(n_start_vals_dbls); + Node n_end_vals_dbls; + n_end_vals.to_float64_array(n_end_vals_dbls); + + double* start = n_start_vals_dbls.as_double_ptr(); + double* end = n_end_vals_dbls.as_double_ptr(); + + double dist_x = end[0] - start[0]; + double dist_y = end[1] - start[1]; + double dist_z = end[2] - start[2]; + + if(sampling == "uniform") + { + double dx = (dist_x)/(num_seeds-1); + double dy = (dist_y)/(num_seeds-1); + double dz = (dist_z)/(num_seeds-1); + for(int i = 0; i < num_seeds; ++i) + { + double x = start[0] + dx*i; + double y = start[1] + dy*i; + double z = start[2] + dz*i; + //std::cerr << "seed point" << ": " << x << " " << y << " " << z << std::endl; + seeds.push_back(vtkm::Particle({x,y,z}, i)); + } + } + else + { + std::random_device device; + std::default_random_engine generator(0); + float zero(0), one(1); + std::uniform_real_distribution distribution(zero, one); + for(int i = 0; i < num_seeds; ++i) + { + double rand = distribution(generator); + double x = start[0] + dist_x*rand; + double y = start[1] + dist_y*rand; + double z = start[2] + dist_z*rand; + //std::cerr << "seed point" << ": " << x << " " << y << " " << z << std::endl; + seeds.push_back(vtkm::Particle({x,y,z}, i)); + } + } + } + else if(seed_type == "box") { - float x = seedBBox[0] + dx * distribution(generator); - float y = seedBBox[2] + dy * distribution(generator); - float z = seedBBox[4] + dz * distribution(generator); - seeds.push_back(vtkm::Particle({x,y,z}, i)); + double dist_x, dist_y, dist_z; + double x_min, y_min, z_min; + double x_max, y_max, z_max; + if(n_seeds.has_child("extents_x")) + { + const Node &n_extents_x_vals = n_seeds["extents_x"]; + const Node &n_extents_y_vals = n_seeds["extents_y"]; + const Node &n_extents_z_vals = n_seeds["extents_z"]; + Node n_extents_x_vals_dbls; + Node n_extents_y_vals_dbls; + Node n_extents_z_vals_dbls; + n_extents_x_vals.to_float64_array(n_extents_x_vals_dbls); + n_extents_y_vals.to_float64_array(n_extents_y_vals_dbls); + n_extents_z_vals.to_float64_array(n_extents_z_vals_dbls); + double* extents_x = n_extents_x_vals_dbls.as_double_ptr(); + double* extents_y = n_extents_y_vals_dbls.as_double_ptr(); + double* extents_z = n_extents_z_vals_dbls.as_double_ptr(); + dist_x = extents_x[1] - extents_x[0]; + dist_y = extents_y[1] - extents_y[0]; + dist_z = extents_z[1] - extents_z[0]; + x_min = extents_x[0]; + y_min = extents_y[0]; + z_min = extents_z[0]; + x_max = extents_x[1]; + y_max = extents_y[1]; + z_max = extents_z[1]; + } + else// whole dataset + { + vtkm::Bounds global_bounds = data.GetGlobalBounds(); + dist_x = global_bounds.X.Length(); + dist_y = global_bounds.Y.Length(); + dist_z = global_bounds.Z.Length(); + x_min = global_bounds.X.Min; + y_min = global_bounds.Y.Min; + z_min = global_bounds.Z.Min; + x_max = global_bounds.X.Max; + y_max = global_bounds.Y.Max; + z_max = global_bounds.Z.Max; + } + std::string sampling_type = n_seeds["sampling_type"].as_string(); + std::string sampling_space = n_seeds["sampling_space"].as_string(); + if(sampling_type != "uniform" && sampling_type != "random") + { + ASCENT_ERROR("Particle Advection box seeds accepts either 'uniform' or 'random' as the 'sampling_type'"); + } + + if(sampling_space == "interior") + { + if(sampling_type == "uniform") + { + + int num_seeds_x = n_seeds["num_seeds_x"].as_int(); + int num_seeds_y = n_seeds["num_seeds_y"].as_int(); + int num_seeds_z = n_seeds["num_seeds_z"].as_int(); + + double dx = 1, dy = 1, dz = 1; + if(num_seeds_x != 0) + if(num_seeds_x != 1) + dx = dist_x/(num_seeds_x-1); + else + dx = dist_x/num_seeds_x; + if(num_seeds_y != 0) + if(num_seeds_y != 1) + dy = dist_y/(num_seeds_y-1); + else + dy = dist_y/num_seeds_y; + if(num_seeds_z != 0) + if(num_seeds_z != 1) + dz = dist_z/(num_seeds_z-1); + else + dz = dist_z/num_seeds_z; + + for(int i = 0; i < num_seeds_x; ++i) + { + double x = x_min + dx*i; + for(int j = 0; j < num_seeds_y; ++j) + { + double y = y_min + dy*j; + for(int k = 0; k < num_seeds_z; ++k) + { + double z = z_min + dz*k; + //std::cerr << "seed point" << ": " << x << " " << y << " " << z << std::endl; + seeds.push_back(vtkm::Particle({x,y,z}, i)); + } + } + } + } + else //random + { + std::random_device device; + std::default_random_engine generator(0); + float zero(0), one(1); + std::uniform_real_distribution distribution(zero, one); + int num_seeds = n_seeds["num_seeds"].as_int(); + for(int i = 0; i < num_seeds; ++i) + { + double rand = distribution(generator); + double x = x_min + dist_x*distribution(generator); + double y = y_min + dist_y*distribution(generator); + double z = z_min + dist_z*distribution(generator); + //std::cerr << "seed point" << ": " << x << " " << y << " " << z << std::endl; + seeds.push_back(vtkm::Particle({x,y,z}, i)); + } + } + + } + else if (sampling_space == "boundary") + { + if(sampling_type == "uniform") + { + int num_seeds_x = n_seeds["num_seeds_x"].as_int(); + int num_seeds_y = n_seeds["num_seeds_y"].as_int(); + int num_seeds_z = n_seeds["num_seeds_z"].as_int(); + + double dx = 1, dy = 1, dz = 1; + if(num_seeds_x != 0) + if(num_seeds_x != 1) + dx = dist_x/(num_seeds_x-1); + else + dx = dist_x/num_seeds_x; + if(num_seeds_y != 0) + if(num_seeds_y != 1) + dy = dist_y/(num_seeds_y-1); + else + dy = dist_y/num_seeds_y; + if(num_seeds_z != 0) + if(num_seeds_z != 1) + dz = dist_z/(num_seeds_z-1); + else + dz = dist_z/num_seeds_z; + + int seed_count = 0; + for(int i = 0; i < num_seeds_x; ++i) + { + double x = x_min + dx*i; + for(int j = 0; j < num_seeds_z; ++j) + { + double z = z_min + dz*j; + //std::cerr << "seed point" << ": " << x << " " << y_min << " " << z << std::endl; + //std::cerr << "seed point" << ": " << x << " " << y_max << " " << z << std::endl; + //std::cerr << "seed_count: " << seed_count << std::endl; + seeds.push_back(vtkm::Particle({x,y_min,z}, seed_count++)); + seeds.push_back(vtkm::Particle({x,y_max,z}, seed_count++)); + } + } + for(int j = 0; j < num_seeds_y; ++j) + { + double y = y_min + dy*j; + for(int k = 0; k < num_seeds_z; ++k) + { + double z = z_min + dz*k; + //std::cerr << "seed point" << ": " << x_min << " " << y << " " << z << std::endl; + //std::cerr << "seed point" << ": " << x_max << " " << y << " " << z << std::endl; + //std::cerr << "seed_count: " << seed_count << std::endl; + seeds.push_back(vtkm::Particle({x_min,y,z}, seed_count++)); + seeds.push_back(vtkm::Particle({x_max,y,z}, seed_count++)); + } + } + } + else //random + { + std::random_device device; + std::default_random_engine generator(0); + float zero(0), one(1); + std::uniform_real_distribution distribution(zero, one); + int num_seeds = n_seeds["num_seeds"].as_int(); + for(int i = 0; i < num_seeds; ++i) + { + int side = std::rand()%4; + //std::cerr << "side: " << side << std::endl; + if(side == 0) //x_max + { + double y = y_min + dist_y*distribution(generator); + double z = z_min + dist_z*distribution(generator); + seeds.push_back(vtkm::Particle({x_max,y,z}, i)); + //std::cerr << "seed point" << ": " << x_max << " " << y << " " << z << std::endl; + } + else if(side == 1) //x_min + { + double y = y_min + dist_y*distribution(generator); + double z = z_min + dist_z*distribution(generator); + seeds.push_back(vtkm::Particle({x_min,y,z}, i)); + //std::cerr << "seed point" << ": " << x_min << " " << y << " " << z << std::endl; + } + else if(side == 2) //y_max + { + double x = x_min + dist_x*distribution(generator); + double z = z_min + dist_z*distribution(generator); + seeds.push_back(vtkm::Particle({x,y_max,z}, i)); + //std::cerr << "seed point" << ": " << x << " " << y_max << " " << z << std::endl; + } + else //y_min + { + double x = x_min + dist_x*distribution(generator); + double z = z_min + dist_z*distribution(generator); + seeds.push_back(vtkm::Particle({x,y_min,z}, i)); + //std::cerr << "seed point" << ": " << x << " " << y_min << " " << z << std::endl; + } + } + } + } + else //error + { + ASCENT_ERROR("Particle Advection box seeds accepts either 'interior' or 'boundary' as the 'sampling_space'"); + } + + } + auto seedArray = vtkm::cont::make_ArrayHandle(seeds, vtkm::CopyFlag::On); + //int numSeeds = get_int32(params()["num_seeds"], data_object); + + //tube params + std::string output_field = field_name + "_streamlines"; + + bool draw_tubes = true; + if(params().has_path("rendering/enable_tubes")) + { + if(params()["rendering/enable_tubes"].as_string() == "false") + { + draw_tubes = false; + } + } + + //float seedBBox[6]; + //seedBBox[0] = get_float32(params()["seed_bounding_box_xmin"], data_object); + //seedBBox[1] = get_float32(params()["seed_bounding_box_xmax"], data_object); + //seedBBox[2] = get_float32(params()["seed_bounding_box_ymin"], data_object); + //seedBBox[3] = get_float32(params()["seed_bounding_box_ymax"], data_object); + //seedBBox[4] = get_float32(params()["seed_bounding_box_zmin"], data_object); + //seedBBox[5] = get_float32(params()["seed_bounding_box_zmax"], data_object); + + //float dx = seedBBox[1] - seedBBox[0]; + //float dy = seedBBox[3] - seedBBox[2]; + //float dz = seedBBox[5] - seedBBox[4]; + + + //Generate seeds + + //std::vector seeds; + //for (int i = 0; i < numSeeds; i++) + //{ + // float x = seedBBox[0] + dx * distribution(generator); + // float y = seedBBox[2] + dy * distribution(generator); + // float z = seedBBox[4] + dz * distribution(generator); + // std::cerr << "seed " << i << ": " << x << " " << y << " " << z << std::endl; + // seeds.push_back(vtkm::Particle({x,y,z}, i)); + //} + //auto seedArray = vtkm::cont::make_ArrayHandle(seeds, vtkm::CopyFlag::On); vtkh::DataSet *output = nullptr; @@ -3882,6 +4273,45 @@ VTKHParticleAdvection::execute() sl.SetNumberOfSteps(numSteps); sl.SetSeeds(seeds); sl.SetField(field_name); + if(draw_tubes) + { + sl.SetTubes(true); + if(params().has_path("rendering/output_field")) + { + std::string output_field = params()["rendering/output_field"].as_string(); + sl.SetOutputField(output_field); + } + else + { + std::string output_field = field_name + "_streamlines"; + sl.SetOutputField(output_field); + } + if(params().has_path("rendering/tube_value")) + { + double tube_value = params()["rendering/tube_value"].as_float64(); + sl.SetTubeValue(tube_value); + } + if(params().has_path("rendering/tube_size")) + { + double tube_size = params()["rendering/tube_size"].as_float64(); + sl.SetTubeSize(tube_size); + } + if(params().has_path("rendering/tube_sides")) + { + int tube_sides = params()["rendering/tube_sides"].as_int32(); + sl.SetTubeSides(tube_sides); + } + if(params().has_path("rendering/tube_capping")) + { + bool tube_capping = true; + if(params()["rendering/tube_capping"].as_string() == "false") + { + tube_capping = false; + } + sl.SetTubeCapping(tube_capping); + } + } + sl.SetInput(&data); sl.Update(); output = sl.GetOutput(); @@ -3964,6 +4394,16 @@ VTKHWarpXStreamline::verify_params(const conduit::Node ¶ms, res &= check_numeric("num_steps", params, info, true, true); res &= check_numeric("step_size", params, info, true, true); + if(params.has_child("rendering")) + { + res &= check_string("rendering/enable_tubes", params, info, false); + res &= check_string("rendering/tube_capping", params, info, false); + res &= check_numeric("rendering/tube_size", params, info, false); + res &= check_numeric("rendering/tube_sides", params, info, false); + res &= check_numeric("rendering/tube_value", params, info, false); + res &= check_string("rendering/output_field", params, info, false); + } + std::vector valid_paths; valid_paths.push_back("b_field"); valid_paths.push_back("e_field"); @@ -3973,6 +4413,12 @@ VTKHWarpXStreamline::verify_params(const conduit::Node ¶ms, valid_paths.push_back("weighting_field"); valid_paths.push_back("num_steps"); valid_paths.push_back("step_size"); + valid_paths.push_back("rendering/enable_tubes"); + valid_paths.push_back("rendering/tube_capping"); + valid_paths.push_back("rendering/tube_size"); + valid_paths.push_back("rendering/tube_sides"); + valid_paths.push_back("rendering/tube_value"); + valid_paths.push_back("rendering/output_field"); std::string surprises = surprise_check(valid_paths, params); @@ -4047,6 +4493,15 @@ VTKHWarpXStreamline::execute() int numSteps = get_int32(params()["num_steps"], data_object); float stepSize = get_float32(params()["step_size"], data_object); + //tube params + bool draw_tubes = false; + if(params().has_path("enable_tubes")) + { + if(params()["rendering/enable_tubes"].as_string() == "true") + { + draw_tubes = true; + } + } vtkh::DataSet *output = nullptr; vtkh::WarpXStreamline sl; @@ -4058,6 +4513,46 @@ VTKHWarpXStreamline::execute() sl.SetMassField(mass_field); sl.SetMomentumField(momentum_field); sl.SetWeightingField(weighting_field); + + if(draw_tubes) + { + sl.SetTubes(true); + if(params().has_path("output_field")) + { + std::string output_field = params()["rendering/output_field"].as_string(); + sl.SetOutputField(output_field); + } + else + { + std::string output_field = b_field+ "_" + e_field + "_streamlines"; + sl.SetOutputField(output_field); + } + if(params().has_path("tube_value")) + { + double tube_value = params()["rendering/tube_value"].as_float64(); + sl.SetTubeValue(tube_value); + } + if(params().has_path("tube_size")) + { + double tube_size = params()["rendering/tube_size"].as_float64(); + sl.SetTubeSize(tube_size); + } + if(params().has_path("tube_sides")) + { + int tube_sides = params()["rendering/tube_sides"].as_int32(); + sl.SetTubeSides(tube_sides); + } + if(params().has_path("tube_capping")) + { + bool tube_capping = true; + if(params()["rendering/tube_capping"].as_string() == "false") + { + tube_capping = false; + } + sl.SetTubeCapping(tube_capping); + } + } + sl.SetInput(&data); sl.Update(); output = sl.GetOutput(); diff --git a/src/libs/vtkh/DataSet.cpp b/src/libs/vtkh/DataSet.cpp index e09c0ad59..0fdc524af 100644 --- a/src/libs/vtkh/DataSet.cpp +++ b/src/libs/vtkh/DataSet.cpp @@ -692,6 +692,23 @@ DataSet::AddConstantPointField(const vtkm::Float32 value, const std::string fiel } } +void +DataSet::AddLinearPointField(const vtkm::Float32 value, const std::string fieldname) +{ + const size_t size = m_domain_ids.size(); + + for(size_t i = 0; i < size; ++i) + { + vtkm::Id num_points = m_domains[i].GetCoordinateSystem().GetData().GetNumberOfValues(); + vtkm::cont::ArrayHandle array; + detail::MemSet(array, value, num_points); + for(int j = 0; j < num_points; ++j) + array.WritePortal().Set(j,j); + vtkm::cont::Field field(fieldname, vtkm::cont::Field::Association::Points, array); + m_domains[i].AddField(field); + } +} + bool DataSet::FieldExists(const std::string &field_name) const { diff --git a/src/libs/vtkh/DataSet.hpp b/src/libs/vtkh/DataSet.hpp index b0071c180..881b92b80 100644 --- a/src/libs/vtkh/DataSet.hpp +++ b/src/libs/vtkh/DataSet.hpp @@ -93,6 +93,7 @@ class VTKH_API DataSet // add a scalar field to this data set with a constant value void AddConstantPointField(const vtkm::Float32 value, const std::string fieldname); + void AddLinearPointField(const vtkm::Float32 value, const std::string fieldname); bool HasDomainId(const vtkm::Id &domain_id) const; /*! \brief IsStructured returns true if all domains, globally, diff --git a/src/libs/vtkh/filters/Streamline.cpp b/src/libs/vtkh/filters/Streamline.cpp index ed91fcc00..7d82c3aaa 100644 --- a/src/libs/vtkh/filters/Streamline.cpp +++ b/src/libs/vtkh/filters/Streamline.cpp @@ -1,9 +1,10 @@ #include #include -#include -#include #include #include +#include +#include +#include #if VTKH_PARALLEL #include @@ -15,6 +16,11 @@ namespace vtkh { Streamline::Streamline() +: m_tubes(true), + m_radius_set(false), + m_tube_sides(3.0), + m_tube_capping(true), + m_tube_value(0.0) { } @@ -106,9 +112,56 @@ void Streamline::DoExecute() streamlineFilter.SetNumberOfSteps(m_num_steps); auto out = streamlineFilter.Execute(inputs); - for (vtkm::Id i = 0; i < out.GetNumberOfPartitions(); i++) + //call tube filter if we want to render output + if(m_tubes) { - this->m_output->AddDomain(out.GetPartition(i), i); + + if(!m_radius_set) + { + vtkm::Float32 radius = 0.0; + vtkm::Bounds coordBounds = out.GetPartition(0).GetCoordinateSystem().GetBounds(); + // set a default radius + vtkm::Float64 lx = coordBounds.X.Length(); + vtkm::Float64 ly = coordBounds.Y.Length(); + vtkm::Float64 lz = coordBounds.Z.Length(); + vtkm::Float64 mag = vtkm::Sqrt(lx * lx + ly * ly + lz * lz); + // same as used in vtk ospray + constexpr vtkm::Float64 heuristic = 1000.; + radius = static_cast(mag / heuristic); + m_tube_size = radius; + } + + //if the tubes are too small they cannot be rendered + float min_tube_size = 0.00000001; + if(m_tube_size < min_tube_size) + { + int num_domains = out.GetNumberOfPartitions(); + for (vtkm::Id i = 0; i < num_domains; i++) + { + this->m_output->AddDomain(out.GetPartition(i), i); + } + return; + } + + vtkm::filter::geometry_refinement::Tube tubeFilter; + tubeFilter.SetCapping(m_tube_capping); + tubeFilter.SetNumberOfSides(m_tube_sides); + tubeFilter.SetRadius(m_tube_size); + + auto tubeOut = tubeFilter.Execute(out); + + for (vtkm::Id i = 0; i < tubeOut.GetNumberOfPartitions(); i++) + { + this->m_output->AddDomain(tubeOut.GetPartition(i), i); + } + this->m_output->AddConstantPointField(m_tube_value, m_output_field_name); + } + else + { + for (vtkm::Id i = 0; i < out.GetNumberOfPartitions(); i++) + { + this->m_output->AddDomain(out.GetPartition(i), i); + } } #endif } diff --git a/src/libs/vtkh/filters/Streamline.hpp b/src/libs/vtkh/filters/Streamline.hpp index cf075f8f2..687d12901 100644 --- a/src/libs/vtkh/filters/Streamline.hpp +++ b/src/libs/vtkh/filters/Streamline.hpp @@ -22,12 +22,26 @@ class VTKH_API Streamline : public Filter void SetSeeds(const std::vector& seeds) { m_seeds = seeds; } void SetNumberOfSteps(int numSteps) { m_num_steps = numSteps; } + void SetOutputField(const std::string &output_field_name) { m_output_field_name = output_field_name; } + void SetTubes(bool tubes) {m_tubes = tubes;} + void SetTubeCapping(bool capping) {m_tube_capping = capping;} + void SetTubeValue(double val) {m_tube_value = val;} + void SetTubeSize(double size) {m_tube_size = size; m_radius_set = true;} + void SetTubeSides(double sides) {m_tube_sides = sides;} + protected: void PreExecute() override; void PostExecute() override; void DoExecute() override; std::string m_field_name; + std::string m_output_field_name; + bool m_tubes; + bool m_tube_capping; + bool m_radius_set; + double m_tube_value; + double m_tube_size; + double m_tube_sides; double m_step_size; int m_num_steps; std::vector m_seeds; diff --git a/src/libs/vtkh/filters/WarpXStreamline.cpp b/src/libs/vtkh/filters/WarpXStreamline.cpp index acfe7033c..1d077a5c8 100644 --- a/src/libs/vtkh/filters/WarpXStreamline.cpp +++ b/src/libs/vtkh/filters/WarpXStreamline.cpp @@ -1,9 +1,11 @@ #include +#include +#include #include +#include #include #include -#include -#include +#include #if VTKH_PARALLEL #include @@ -12,6 +14,15 @@ #endif +#include +#include +#include +#include +#include +#include + + + namespace vtkh { @@ -55,7 +66,13 @@ WarpXStreamline::WarpXStreamline() m_charge_field_name("Charge"), m_mass_field_name("Mass"), m_momentum_field_name("Momentum"), - m_weighting_field_name("Weighting") + m_weighting_field_name("Weighting"), + m_tubes(false), + m_radius_set(false), + m_tube_sides(3.0), + m_tube_capping(true), + m_tube_value(0.0), + m_output_field_name("E_B_streamlines") { } @@ -176,11 +193,61 @@ void WarpXStreamline::DoExecute() warpxStreamlineFilter.SetSeeds(seeds); warpxStreamlineFilter.SetNumberOfSteps(m_num_steps); auto out = warpxStreamlineFilter.Execute(inputs); + + //std::cerr << "streamline output:" << std::endl; //out.PrintSummary(std::cerr); - int num_domains = m_output->GetNumberOfDomains(); - for (vtkm::Id i = 0; i < out.GetNumberOfPartitions(); i++) + + //call tube filter if we want to render output + if(m_tubes) + { + if(!m_radius_set) + { + vtkm::Float32 radius = 0.0; + vtkm::Bounds coordBounds = out.GetPartition(0).GetCoordinateSystem().GetBounds(); + // set a default radius + vtkm::Float64 lx = coordBounds.X.Length(); + vtkm::Float64 ly = coordBounds.Y.Length(); + vtkm::Float64 lz = coordBounds.Z.Length(); + vtkm::Float64 mag = vtkm::Sqrt(lx * lx + ly * ly + lz * lz); + // same as used in vtk ospray + constexpr vtkm::Float64 heuristic = 1000.; + radius = static_cast(mag / heuristic); + m_tube_size = radius; + } + + //if the tubes are too small they cannot be rendered + float min_tube_size = 0.00000001; + if(m_tube_size < min_tube_size) + { + int num_domains = out.GetNumberOfPartitions(); + for (vtkm::Id i = 0; i < num_domains; i++) + { + this->m_output->AddDomain(out.GetPartition(i), i); + } + return; + } + + vtkm::filter::geometry_refinement::Tube tubeFilter; + tubeFilter.SetCapping(m_tube_capping); + tubeFilter.SetNumberOfSides(m_tube_sides); + tubeFilter.SetRadius(m_tube_size); + //std::cerr << "tube size: " << radius << std::endl; + auto tubeOut = tubeFilter.Execute(out); + + int num_domains = tubeOut.GetNumberOfPartitions(); + for (vtkm::Id i = 0; i < num_domains; i++) + { + this->m_output->AddDomain(tubeOut.GetPartition(i), i); + } + this->m_output->AddConstantPointField(m_tube_value, m_output_field_name); + } + else { - this->m_output->AddDomain(out.GetPartition(i), num_domains + i); + int num_domains = out.GetNumberOfPartitions(); + for (vtkm::Id i = 0; i < num_domains; i++) + { + this->m_output->AddDomain(out.GetPartition(i), i); + } } #endif } diff --git a/src/libs/vtkh/filters/WarpXStreamline.hpp b/src/libs/vtkh/filters/WarpXStreamline.hpp index eab180ef3..f2fb77cae 100644 --- a/src/libs/vtkh/filters/WarpXStreamline.hpp +++ b/src/libs/vtkh/filters/WarpXStreamline.hpp @@ -25,6 +25,12 @@ class VTKH_API WarpXStreamline : public Filter void SetWeightingField(const std::string &field_name) { m_weighting_field_name = field_name; } void SetStepSize(const double &step_size) { m_step_size = step_size; } void SetNumberOfSteps(int numSteps) { m_num_steps = numSteps; } + void SetTubes(bool tubes) {m_tubes = tubes;} + void SetTubeCapping(bool capping) {m_tube_capping = capping;} + void SetTubeValue(double val) {m_tube_value = val;} + void SetTubeSize(double size) {m_tube_size = size; m_radius_set = true;} + void SetTubeSides(double sides) {m_tube_sides = sides;} + void SetOutputField(const std::string &output_field_name) { m_output_field_name = output_field_name; } protected: void PreExecute() override; @@ -37,6 +43,13 @@ class VTKH_API WarpXStreamline : public Filter std::string m_mass_field_name; std::string m_momentum_field_name; std::string m_weighting_field_name; + std::string m_output_field_name; + bool m_tubes; + bool m_tube_capping; + bool m_radius_set; + double m_tube_value; + double m_tube_size; + double m_tube_sides; double m_step_size; int m_num_steps; }; diff --git a/src/tests/_baseline_images/tout_render_streamlines_box100.png b/src/tests/_baseline_images/tout_render_streamlines_box100.png new file mode 100644 index 0000000000000000000000000000000000000000..7f9383315d1349f7e62088028816c6998846a19c GIT binary patch literal 419231 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 KX75vB@Bcpn=x`+f literal 0 HcmV?d00001 diff --git a/src/tests/_baseline_images/tout_render_streamlines_line100_img_compare_results.json b/src/tests/_baseline_images/tout_render_streamlines_line100_img_compare_results.json new file mode 100644 index 000000000..cd3a74f9e --- /dev/null +++ b/src/tests/_baseline_images/tout_render_streamlines_line100_img_compare_results.json @@ -0,0 +1,13 @@ + +{ + "test_file": + { + "path": "/home/user/ascent/build/tests/_output/tout_render_streamlines_line100.png", + "exists": "true" + }, + "baseline_file": + { + "path": "/home/user/ascent/src/tests/_baseline_images/tout_render_streamlines_line100.png", + "exists": "false" + } +} \ No newline at end of file diff --git a/src/tests/_baseline_images/tout_render_streamlines_point100.png b/src/tests/_baseline_images/tout_render_streamlines_point100.png new file mode 100644 index 0000000000000000000000000000000000000000..7a7c18bd8a65ac9b97462ff3b3bf22bab0330ff1 GIT binary patch literal 405301 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 Kc03pU*Z&8KJl@s- literal 0 HcmV?d00001 diff --git a/src/tests/_baseline_images/tout_render_streamlines_point100_img_compare_results.json b/src/tests/_baseline_images/tout_render_streamlines_point100_img_compare_results.json new file mode 100644 index 000000000..3e2bd2e07 --- /dev/null +++ b/src/tests/_baseline_images/tout_render_streamlines_point100_img_compare_results.json @@ -0,0 +1,13 @@ + +{ + "test_file": + { + "path": "/home/user/ascent/build/tests/_output/tout_render_streamlines_point100.png", + "exists": "true" + }, + "baseline_file": + { + "path": "/home/user/ascent/src/tests/_baseline_images/tout_render_streamlines_point100.png", + "exists": "false" + } +} \ No newline at end of file diff --git a/src/tests/_baseline_images/tout_render_streamlines_point_list100.png b/src/tests/_baseline_images/tout_render_streamlines_point_list100.png new file mode 100644 index 0000000000000000000000000000000000000000..4ba9d48f6bdd45ac04c32e44084d165fc43435d7 GIT binary patch literal 413748 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 literal 0 HcmV?d00001 diff --git a/src/tests/_baseline_images/tout_render_streamlines_point_list100_img_compare_results.json b/src/tests/_baseline_images/tout_render_streamlines_point_list100_img_compare_results.json new file mode 100644 index 000000000..a24fc049b --- /dev/null +++ b/src/tests/_baseline_images/tout_render_streamlines_point_list100_img_compare_results.json @@ -0,0 +1,13 @@ + +{ + "test_file": + { + "path": "/home/user/ascent/build/tests/_output/tout_render_streamlines_point_list100.png", + "exists": "true" + }, + "baseline_file": + { + "path": "/home/user/ascent/src/tests/_baseline_images/tout_render_streamlines_point_list100.png", + "exists": "false" + } +} \ No newline at end of file diff --git a/src/tests/ascent/line_seeds.cpp b/src/tests/ascent/line_seeds.cpp new file mode 100644 index 000000000..4e39feb13 --- /dev/null +++ b/src/tests/ascent/line_seeds.cpp @@ -0,0 +1,197 @@ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Copyright (c) Lawrence Livermore National Security, LLC and other Ascent +// Project developers. See top-level LICENSE AND COPYRIGHT files for dates and +// other details. No copyright assignment is required to contribute to Ascent. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + +//----------------------------------------------------------------------------- +/// +/// file: t_ascent_particle_advection.cpp +/// +//----------------------------------------------------------------------------- + + +#include "gtest/gtest.h" + +#include +#include +#include +#include + +#include "t_config.hpp" +#include "t_utils.hpp" + +using namespace std; +using namespace conduit; +using namespace ascent; + +index_t EXAMPLE_MESH_SIDE_DIM = 20; + +void testFilter(bool isStreamline) +{ + // the vtkm runtime is currently our only rendering runtime + Node n; + ascent::about(n); + // only run this test if ascent was built with vtkm support + if(n["runtimes/ascent/vtkm/status"].as_string() == "disabled") + { + ASCENT_INFO("Ascent vtkm support disabled, skipping test"); + return; + } + + + string output_path = ASCENT_T_BIN_DIR; + + ASCENT_INFO("Execute test from folder: " + output_path + "/ascent"); + output_path = conduit::utils::join_file_path(output_path,"ascent/output"); + ASCENT_INFO("Creating output folder: " + output_path); + if(!conduit::utils::is_directory(output_path)) + { + conduit::utils::create_directory(output_path); + } + + // + // Create an example mesh. + // + Node data, verify_info; + conduit::blueprint::mesh::examples::braid("uniform", + EXAMPLE_MESH_SIDE_DIM, + EXAMPLE_MESH_SIDE_DIM, + EXAMPLE_MESH_SIDE_DIM, + data); + + EXPECT_TRUE(conduit::blueprint::mesh::verify(data,verify_info)); + data["state/cycle"] = 100; + string output_file, msg; + if (isStreamline) + { + ASCENT_INFO("Testing Streamline filter"); + output_file = conduit::utils::join_file_path(output_path,"tout_streamline"); + msg = "An example of using the streamline flow filter."; + } + else + { + ASCENT_INFO("Testing Particle Advection filter"); + output_file = conduit::utils::join_file_path(output_path,"tout_particle_advection"); + msg = "An example of using the particle_advection flow filter."; + } + ASCENT_INFO("POO POO"); + ASCENT_INFO(output_file); + + // remove old stuff before rendering + remove_test_file(output_file); + + // + // Create the actions. + // + + conduit::Node pipelines; + // pipeline 1 + if (isStreamline) + pipelines["pl1/f1/type"] = "streamline"; + else + pipelines["pl1/f1/type"] = "particle_advection"; + + // filter knobs + conduit::Node &sl_params = pipelines["pl1/f1/params"]; + sl_params["field"] = "vel"; + sl_params["num_steps"] = 10; + sl_params["step_size"] = 0.01; + sl_params["seeds/type"] = "line"; + double start[3] = {-10.,-10.,-10.}; + double end[3] = {0.,0.,0.}; + sl_params["seeds/start"].set_float64_ptr(start,3); + sl_params["seeds/end"].set_float64_ptr(end,3); + sl_params["seeds/sampling_type"] = "random"; + sl_params["seeds/num_seeds"] = 10; + if (isStreamline) + { + sl_params["rendering/enable_tubes"] = "true"; + sl_params["rendering/tube_capping"] = "false"; + //sl_params["rendering/tube_capping"] = "true"; + sl_params["rendering/tube_size"] = 0.07; + sl_params["rendering/tube_sides"] = 3; + sl_params["rendering/tube_value"] = 0.0; + sl_params["rendering/output_field"] = "lines"; + } + + conduit::Node actions; + // add the pipeline + conduit::Node &add_pipelines = actions.append(); + add_pipelines["action"] = "add_pipelines"; + add_pipelines["pipelines"] = pipelines; + + std::string output_image; + if(isStreamline) + { + string image_path = ASCENT_T_BIN_DIR; + + image_path = conduit::utils::join_file_path(image_path,"_output"); + output_image = conduit::utils::join_file_path(image_path, + "tout_render_streamlines"); + conduit::Node &add_plots = actions.append(); + add_plots["action"] = "add_scenes"; + conduit::Node &scenes = add_plots["scenes"]; + scenes["s1/plots/p1/type"] = "pseudocolor"; + scenes["s1/plots/p1/field"] = "lines"; + scenes["s1/plots/p1/pipeline"] = "pl1"; + scenes["s1/image_prefix"] = output_image; + + // remove old image before rendering + remove_test_image(output_image); + } + actions.print(); + + // + // Run Ascent + // + + Ascent ascent; + + Node ascent_opts; + ascent_opts["runtime/type"] = "ascent"; + ascent.open(ascent_opts); + ascent.publish(data); + ascent.execute(actions); + ascent.close(); + + // check that we created the right output + ASCENT_ACTIONS_DUMP(actions,output_file,msg); + if(isStreamline) + { + output_image = output_image + "100"; + EXPECT_TRUE(check_test_file(output_image)); + } + + // clean up + remove_test_file(output_file); + conduit::utils::remove_directory(output_path); +} + +//----------------------------------------------------------------------------- +TEST(ascent_streamline, test_streamline) +{ + testFilter(true); +} + +TEST(ascent_particle_advection, test_particle_advection) +{ + testFilter(false); +} + +//----------------------------------------------------------------------------- +int main(int argc, char* argv[]) +{ + int result = 0; + + ::testing::InitGoogleTest(&argc, argv); + + // allow override of the data size via the command line + if(argc == 2) + { + EXAMPLE_MESH_SIDE_DIM = atoi(argv[1]); + } + + result = RUN_ALL_TESTS(); + return result; +} diff --git a/src/tests/ascent/t_ascent_particle_advection.cpp b/src/tests/ascent/t_ascent_particle_advection.cpp index 3cb573276..2e70c7ea6 100644 --- a/src/tests/ascent/t_ascent_particle_advection.cpp +++ b/src/tests/ascent/t_ascent_particle_advection.cpp @@ -27,7 +27,7 @@ using namespace ascent; index_t EXAMPLE_MESH_SIDE_DIM = 20; -void testFilter(bool isStreamline) +void testFilterPoint(bool isStreamline) { // the vtkm runtime is currently our only rendering runtime Node n; @@ -61,18 +61,158 @@ void testFilter(bool isStreamline) data); EXPECT_TRUE(conduit::blueprint::mesh::verify(data,verify_info)); + data["state/cycle"] = 100; + string output_file, msg; + if (isStreamline) + { + ASCENT_INFO("Testing Streamline filter"); + output_file = conduit::utils::join_file_path(output_path,"tout_streamline_point"); + msg = "An example of using the streamline flow filter."; + } + else + { + ASCENT_INFO("Testing Particle Advection filter"); + output_file = conduit::utils::join_file_path(output_path,"tout_particle_advection_point"); + msg = "An example of using the particle_advection flow filter."; + } + ASCENT_INFO("POO POO"); + ASCENT_INFO(output_file); + + // remove old stuff before rendering + remove_test_file(output_file); + // + // Create the actions. + // + + conduit::Node pipelines; + // pipeline 1 + if (isStreamline) + pipelines["pl1/f1/type"] = "streamline"; + else + pipelines["pl1/f1/type"] = "particle_advection"; + + // filter knobs + conduit::Node &sl_params = pipelines["pl1/f1/params"]; + sl_params["field"] = "vel"; + sl_params["num_steps"] = 100; + sl_params["step_size"] = 0.01; + sl_params["seeds/type"] = "point"; + double loc[3] = {-0.826997, -5.62082, 3.57729}; + sl_params["seeds/location"].set_float64_ptr(loc,3); + if (isStreamline) + { + sl_params["rendering/enable_tubes"] = "true"; + sl_params["rendering/tube_capping"] = "false"; + //sl_params["rendering/tube_capping"] = "true"; + sl_params["rendering/tube_size"] = 0.4; + sl_params["rendering/tube_sides"] = 4; + sl_params["rendering/tube_value"] = 0.0; + sl_params["rendering/output_field"] = "lines"; + } + + conduit::Node actions; + // add the pipeline + conduit::Node &add_pipelines = actions.append(); + add_pipelines["action"] = "add_pipelines"; + add_pipelines["pipelines"] = pipelines; + + std::string output_image; + if(isStreamline) + { + string image_path = ASCENT_T_BIN_DIR; + + image_path = conduit::utils::join_file_path(image_path,"_output"); + output_image = conduit::utils::join_file_path(image_path, + "tout_render_streamlines_point"); + conduit::Node &add_plots = actions.append(); + add_plots["action"] = "add_scenes"; + conduit::Node &scenes = add_plots["scenes"]; + scenes["s1/plots/p1/type"] = "pseudocolor"; + scenes["s1/plots/p1/field"] = "lines"; + scenes["s1/plots/p1/pipeline"] = "pl1"; + scenes["s1/renders/r1/image_prefix"] = output_image; + double bounds[6] = {-10.0,10.0,-10.0,10.0,-10.0,10.0}; + scenes["s1/renders/r1/dataset_bounds"].set_float64_ptr(bounds,6); + + // remove old image before rendering + remove_test_image(output_image); + } + actions.print(); + + // + // Run Ascent + // + + Ascent ascent; + + Node ascent_opts; + ascent_opts["runtime/type"] = "ascent"; + ascent.open(ascent_opts); + ascent.publish(data); + ascent.execute(actions); + ascent.close(); + + // check that we created the right output + ASCENT_ACTIONS_DUMP(actions,output_file,msg); + if(isStreamline) + { + std::cerr << "output image: " << output_image << std::endl; + EXPECT_TRUE(check_test_image(output_image)); + } + + // clean up + //remove_test_file(output_file); + conduit::utils::remove_directory(output_path); +} + +//----------------------------------------------------------------------------- +void testFilterPointList(bool isStreamline) +{ + // the vtkm runtime is currently our only rendering runtime + Node n; + ascent::about(n); + // only run this test if ascent was built with vtkm support + if(n["runtimes/ascent/vtkm/status"].as_string() == "disabled") + { + ASCENT_INFO("Ascent vtkm support disabled, skipping test"); + return; + } + + + string output_path = ASCENT_T_BIN_DIR; + + ASCENT_INFO("Execute test from folder: " + output_path + "/ascent"); + output_path = conduit::utils::join_file_path(output_path,"ascent/output"); + ASCENT_INFO("Creating output folder: " + output_path); + if(!conduit::utils::is_directory(output_path)) + { + conduit::utils::create_directory(output_path); + } + + // + // Create an example mesh. + // + Node data, verify_info; + conduit::blueprint::mesh::examples::braid("uniform", + EXAMPLE_MESH_SIDE_DIM, + EXAMPLE_MESH_SIDE_DIM, + EXAMPLE_MESH_SIDE_DIM, + data); + + EXPECT_TRUE(conduit::blueprint::mesh::verify(data,verify_info)); + data["state/cycle"] = 100; string output_file, msg; if (isStreamline) { ASCENT_INFO("Testing Streamline filter"); - output_file = conduit::utils::join_file_path(output_path,"tout_streamline"); + output_file = conduit::utils::join_file_path(output_path,"tout_streamline_point_list"); msg = "An example of using the streamline flow filter."; } else { ASCENT_INFO("Testing Particle Advection filter"); - output_file = conduit::utils::join_file_path(output_path,"tout_particle_advection"); + output_file = conduit::utils::join_file_path(output_path,"tout_particle_advection_point_list"); msg = "An example of using the particle_advection flow filter."; } ASCENT_INFO("POO POO"); @@ -95,15 +235,21 @@ void testFilter(bool isStreamline) // filter knobs conduit::Node &sl_params = pipelines["pl1/f1/params"]; sl_params["field"] = "vel"; - sl_params["num_seeds"] = 2; sl_params["num_steps"] = 100; sl_params["step_size"] = 0.01; - sl_params["seed_bounding_box_xmin"] = 0.0; - sl_params["seed_bounding_box_xmax"] = 1.0; - sl_params["seed_bounding_box_ymin"] = 0.0; - sl_params["seed_bounding_box_ymax"] = 1.0; - sl_params["seed_bounding_box_zmin"] = 0.0; - sl_params["seed_bounding_box_zmax"] = 1.0; + sl_params["seeds/type"] = "point_list"; + double loc[60] = {-0.826997, -5.62082, 3.57729,0.388328, -9.30856, 0.594004,-8.66316, 3.73545, 8.60873,3.07838, 4.02381, 5.24396,-3.43532, 5.12821, -2.69323,5.06712, -8.54628, 7.69414,-0.445364, -4.50186, -6.66986,-8.78871, 0.0904583, -3.61934,-8.18534, -8.52502, -2.31716,-0.711083, -8.99832, 5.40409, 3.76911, 2.59087, 4.50824,-3.87356, 0.265474, 6.91963,-1.69211, -0.641653, -6.43345,-9.33892, -0.0303976, 4.96585,6.84079, -5.74497, -7.39145,-1.71413, 4.19639, -5.20178,3.04117, 3.62692, -2.24549,6.91151, 9.10818, -7.03697,1.29797, -0.229709, 9.2219,2.58538, 3.02507, 6.06146}; + sl_params["seeds/location"].set_float64_ptr(loc,60); + if (isStreamline) + { + sl_params["rendering/enable_tubes"] = "true"; + sl_params["rendering/tube_capping"] = "false"; + //sl_params["rendering/tube_capping"] = "true"; + sl_params["rendering/tube_size"] = 0.4; + sl_params["rendering/tube_sides"] = 4; + sl_params["rendering/tube_value"] = 0.0; + sl_params["rendering/output_field"] = "lines"; + } conduit::Node actions; // add the pipeline @@ -111,6 +257,29 @@ void testFilter(bool isStreamline) add_pipelines["action"] = "add_pipelines"; add_pipelines["pipelines"] = pipelines; + std::string output_image; + if(isStreamline) + { + string image_path = ASCENT_T_BIN_DIR; + + image_path = conduit::utils::join_file_path(image_path,"_output"); + output_image = conduit::utils::join_file_path(image_path, + "tout_render_streamlines_point_list"); + conduit::Node &add_plots = actions.append(); + add_plots["action"] = "add_scenes"; + conduit::Node &scenes = add_plots["scenes"]; + scenes["s1/plots/p1/type"] = "pseudocolor"; + scenes["s1/plots/p1/field"] = "lines"; + scenes["s1/plots/p1/pipeline"] = "pl1"; + scenes["s1/renders/r1/image_prefix"] = output_image; + double bounds[6] = {-10.0,10.0,-10.0,10.0,-10.0,10.0}; + scenes["s1/renders/r1/dataset_bounds"].set_float64_ptr(bounds,6); + + // remove old image before rendering + remove_test_image(output_image); + } + actions.print(); + // // Run Ascent // @@ -126,7 +295,10 @@ void testFilter(bool isStreamline) // check that we created the right output ASCENT_ACTIONS_DUMP(actions,output_file,msg); - //EXPECT_TRUE(check_test_file(output_file)); + if(isStreamline) + { + EXPECT_TRUE(check_test_image(output_image)); + } // clean up remove_test_file(output_file); @@ -134,16 +306,348 @@ void testFilter(bool isStreamline) } //----------------------------------------------------------------------------- -TEST(ascent_streamline, test_streamline) +void testFilterLine(bool isStreamline) { - testFilter(true); + // the vtkm runtime is currently our only rendering runtime + Node n; + ascent::about(n); + // only run this test if ascent was built with vtkm support + if(n["runtimes/ascent/vtkm/status"].as_string() == "disabled") + { + ASCENT_INFO("Ascent vtkm support disabled, skipping test"); + return; + } + + + string output_path = ASCENT_T_BIN_DIR; + + ASCENT_INFO("Execute test from folder: " + output_path + "/ascent"); + output_path = conduit::utils::join_file_path(output_path,"ascent/output"); + ASCENT_INFO("Creating output folder: " + output_path); + if(!conduit::utils::is_directory(output_path)) + { + conduit::utils::create_directory(output_path); + } + + // + // Create an example mesh. + // + Node data, verify_info; + conduit::blueprint::mesh::examples::braid("uniform", + EXAMPLE_MESH_SIDE_DIM, + EXAMPLE_MESH_SIDE_DIM, + EXAMPLE_MESH_SIDE_DIM, + data); + + EXPECT_TRUE(conduit::blueprint::mesh::verify(data,verify_info)); + data["state/cycle"] = 100; + string output_file, msg; + if (isStreamline) + { + ASCENT_INFO("Testing Streamline filter"); + output_file = conduit::utils::join_file_path(output_path,"tout_streamline_line"); + msg = "An example of using the streamline flow filter."; + } + else + { + ASCENT_INFO("Testing Particle Advection filter"); + output_file = conduit::utils::join_file_path(output_path,"tout_particle_advection_line"); + msg = "An example of using the particle_advection flow filter."; + } + ASCENT_INFO("POO POO"); + ASCENT_INFO(output_file); + + // remove old stuff before rendering + remove_test_file(output_file); + + // + // Create the actions. + // + + conduit::Node pipelines; + // pipeline 1 + if (isStreamline) + pipelines["pl1/f1/type"] = "streamline"; + else + pipelines["pl1/f1/type"] = "particle_advection"; + + // filter knobs + conduit::Node &sl_params = pipelines["pl1/f1/params"]; + sl_params["field"] = "vel"; + sl_params["num_steps"] = 100; + sl_params["step_size"] = 0.01; + sl_params["seeds/type"] = "line"; + double start[3] = {-9,-9,-9}; + double end[3] = {9,9,9}; + sl_params["seeds/start"].set_float64_ptr(start,3); + sl_params["seeds/end"].set_float64_ptr(end,3); + sl_params["seeds/num_seeds"] = 10; + sl_params["seeds/sampling_type"] = "uniform"; + + if (isStreamline) + { + sl_params["rendering/enable_tubes"] = "true"; + sl_params["rendering/tube_capping"] = "false"; + //sl_params["rendering/tube_capping"] = "true"; + sl_params["rendering/tube_size"] = 0.1; + sl_params["rendering/tube_sides"] = 4; + sl_params["rendering/tube_value"] = 0.0; + sl_params["rendering/output_field"] = "lines"; + } + + conduit::Node actions; + // add the pipeline + conduit::Node &add_pipelines = actions.append(); + add_pipelines["action"] = "add_pipelines"; + add_pipelines["pipelines"] = pipelines; + + std::string output_image; + if(isStreamline) + { + string image_path = ASCENT_T_BIN_DIR; + + image_path = conduit::utils::join_file_path(image_path,"_output"); + output_image = conduit::utils::join_file_path(image_path, + "tout_render_streamlines_line"); + conduit::Node &add_plots = actions.append(); + add_plots["action"] = "add_scenes"; + conduit::Node &scenes = add_plots["scenes"]; + scenes["s1/plots/p1/type"] = "pseudocolor"; + scenes["s1/plots/p1/field"] = "lines"; + scenes["s1/plots/p1/pipeline"] = "pl1"; + scenes["s1/renders/r1/image_prefix"] = output_image; + double bounds[6] = {-10.0,10.0,-10.0,10.0,-10.0,10.0}; + scenes["s1/renders/r1/dataset_bounds"].set_float64_ptr(bounds,6); + + // remove old image before rendering + remove_test_image(output_image); + } + actions.print(); + + // + // Run Ascent + // + + Ascent ascent; + + Node ascent_opts; + ascent_opts["runtime/type"] = "ascent"; + ascent.open(ascent_opts); + ascent.publish(data); + ascent.execute(actions); + ascent.close(); + + // check that we created the right output + ASCENT_ACTIONS_DUMP(actions,output_file,msg); + if(isStreamline) + { + EXPECT_TRUE(check_test_image(output_image)); + } + + // clean up + remove_test_file(output_file); + conduit::utils::remove_directory(output_path); +} + + +//----------------------------------------------------------------------------- +void testFilterBox(bool isStreamline) +{ + // the vtkm runtime is currently our only rendering runtime + Node n; + ascent::about(n); + // only run this test if ascent was built with vtkm support + if(n["runtimes/ascent/vtkm/status"].as_string() == "disabled") + { + ASCENT_INFO("Ascent vtkm support disabled, skipping test"); + return; + } + + + string output_path = ASCENT_T_BIN_DIR; + + ASCENT_INFO("Execute test from folder: " + output_path + "/ascent"); + output_path = conduit::utils::join_file_path(output_path,"ascent/output"); + ASCENT_INFO("Creating output folder: " + output_path); + if(!conduit::utils::is_directory(output_path)) + { + conduit::utils::create_directory(output_path); + } + + // + // Create an example mesh. + // + Node data, verify_info; + conduit::blueprint::mesh::examples::braid("uniform", + EXAMPLE_MESH_SIDE_DIM, + EXAMPLE_MESH_SIDE_DIM, + EXAMPLE_MESH_SIDE_DIM, + data); + + EXPECT_TRUE(conduit::blueprint::mesh::verify(data,verify_info)); + data["state/cycle"] = 100; + string output_file, msg; + if (isStreamline) + { + ASCENT_INFO("Testing Streamline filter"); + output_file = conduit::utils::join_file_path(output_path,"tout_streamline_box"); + msg = "An example of using the streamline flow filter."; + } + else + { + ASCENT_INFO("Testing Particle Advection filter"); + output_file = conduit::utils::join_file_path(output_path,"tout_particle_advection_box"); + msg = "An example of using the particle_advection flow filter."; + } + ASCENT_INFO("POO POO"); + ASCENT_INFO(output_file); + + // remove old stuff before rendering + remove_test_file(output_file); + + // + // Create the actions. + // + + conduit::Node pipelines; + // pipeline 1 + if (isStreamline) + pipelines["pl1/f1/type"] = "streamline"; + else + pipelines["pl1/f1/type"] = "particle_advection"; + + // filter knobs + conduit::Node &sl_params = pipelines["pl1/f1/params"]; + sl_params["field"] = "vel"; + sl_params["num_steps"] = 100; + sl_params["step_size"] = 0.01; + sl_params["seeds/type"] = "box"; + //sl_params["seeds/sampling_space"] = "boundary"; + sl_params["seeds/sampling_space"] = "interior"; + sl_params["seeds/sampling_type"] = "uniform"; + //sl_params["seeds/sampling_type"] = "random"; + //sl_params["seeds/num_seeds"] = 20; + sl_params["seeds/num_seeds_x"] = 4; + sl_params["seeds/num_seeds_y"] = 4; + sl_params["seeds/num_seeds_z"] = 4; + double extents_x[2] = {-9.0,9.0}; + double extents_y[2] = {-9.0,9.0}; + double extents_z[2] = {-9.0,9.0}; + sl_params["seeds/extents_x"].set_float64_ptr(extents_x,2); + sl_params["seeds/extents_y"].set_float64_ptr(extents_y,2); + sl_params["seeds/extents_z"].set_float64_ptr(extents_z,2); + if (isStreamline) + { + sl_params["rendering/enable_tubes"] = "true"; + sl_params["rendering/tube_capping"] = "false"; + //sl_params["rendering/tube_capping"] = "true"; + sl_params["rendering/tube_size"] = 0.1; + sl_params["rendering/tube_sides"] = 4; + sl_params["rendering/tube_value"] = 0.0; + sl_params["rendering/output_field"] = "lines"; + } + + conduit::Node actions; + // add the pipeline + conduit::Node &add_pipelines = actions.append(); + add_pipelines["action"] = "add_pipelines"; + add_pipelines["pipelines"] = pipelines; + + std::string output_image; + if(isStreamline) + { + string image_path = ASCENT_T_BIN_DIR; + + image_path = conduit::utils::join_file_path(image_path,"_output"); + output_image = conduit::utils::join_file_path(image_path, + "tout_render_streamlines_box"); + conduit::Node &add_plots = actions.append(); + add_plots["action"] = "add_scenes"; + conduit::Node &scenes = add_plots["scenes"]; + scenes["s1/plots/p1/type"] = "pseudocolor"; + scenes["s1/plots/p1/field"] = "lines"; + scenes["s1/plots/p1/pipeline"] = "pl1"; + scenes["s1/renders/r1/image_prefix"] = output_image; + double bounds[6] = {-10.0,10.0,-10.0,10.0,-10.0,10.0}; + scenes["s1/renders/r1/dataset_bounds"].set_float64_ptr(bounds,6); + + // remove old image before rendering + remove_test_image(output_image); + } + actions.print(); + + // + // Run Ascent + // + + Ascent ascent; + + Node ascent_opts; + ascent_opts["runtime/type"] = "ascent"; + ascent.open(ascent_opts); + ascent.publish(data); + ascent.execute(actions); + ascent.close(); + + // check that we created the right output + ASCENT_ACTIONS_DUMP(actions,output_file,msg); + if(isStreamline) + { + EXPECT_TRUE(check_test_image(output_image)); + } + + // clean up + remove_test_file(output_file); + conduit::utils::remove_directory(output_path); +} + +//----------------------------------------------------------------------------- +//Point Test +TEST(ascent_streamline_point, test_streamline_point) +{ + testFilterPoint(true); +} + +TEST(ascent_particle_advection_point, test_particle_advection_point) +{ + testFilterPoint(false); } -TEST(ascent_particle_advection, test_particle_advection) +//----------------------------------------------------------------------------- +//Point List Test +TEST(ascent_streamline_point_list, test_streamline_point_list) +{ + testFilterPointList(true); +} + +TEST(ascent_particle_advection_point_list, test_particle_advection_point_list) +{ + testFilterPointList(false); +} +//----------------------------------------------------------------------------- +//Line Test +TEST(ascent_streamline_line, test_streamline_line) { - testFilter(false); + testFilterLine(true); } +TEST(ascent_particle_advection_line, test_particle_advection_line) +{ + testFilterLine(false); +} +//----------------------------------------------------------------------------- +//Box Test +TEST(ascent_streamline_box, test_streamline_box) +{ + testFilterBox(true); +} + +TEST(ascent_particle_advection_box, test_particle_advection_box) +{ + testFilterBox(false); +} + + //----------------------------------------------------------------------------- int main(int argc, char* argv[]) { diff --git a/src/tests/vtkh/CMakeLists.txt b/src/tests/vtkh/CMakeLists.txt index 6cedf32f3..2f2eac8bd 100644 --- a/src/tests/vtkh/CMakeLists.txt +++ b/src/tests/vtkh/CMakeLists.txt @@ -36,6 +36,7 @@ set(BASIC_TESTS t_vtk-h_smoke t_vtk-h_render t_vtk-h_slice t_vtk-h_volume_renderer + t_vtk-h_warpx_streamline ) # Contour tree depends on the VTK-m build type. @@ -59,7 +60,7 @@ set(MPI_TESTS t_vtk-h_smoke_par t_vtk-h_raytracer_par t_vtk-h_sampling_par t_vtk-h_volume_renderer_par - t_vtk-h_warpx_streamline + t_vtk-h_warpx_streamline_par ) # Contour tree depends on the VTK-m build type. diff --git a/src/tests/vtkh/t_vtk-h_particle_advection_par.cpp b/src/tests/vtkh/t_vtk-h_particle_advection_par.cpp index 483be0bf3..48023ee1c 100644 --- a/src/tests/vtkh/t_vtk-h_particle_advection_par.cpp +++ b/src/tests/vtkh/t_vtk-h_particle_advection_par.cpp @@ -5,15 +5,19 @@ //----------------------------------------------------------------------------- #include "gtest/gtest.h" +#include "t_vtkm_test_utils.hpp" #include #include #include #include +#include +#include + #include #include #include -#include "t_vtkm_test_utils.hpp" + #include #include @@ -28,11 +32,10 @@ void checkValidity(vtkh::DataSet *data, const int maxSteps, bool isSL) auto cs = currentDomain.GetCellSet(); if (isSL) { - auto cellSet = cs.AsCellSet>(); //Ensure that streamlines took <= to the max number of steps - for(int j = 0; j < cellSet.GetNumberOfCells(); j++) + for(int j = 0; j < cs.GetNumberOfCells(); j++) { - EXPECT_LE(cellSet.GetNumberOfPointsInCell(j), maxSteps); + EXPECT_LE(cs.GetNumberOfPointsInCell(j), maxSteps); } } else @@ -131,17 +134,52 @@ TEST(vtkh_particle_advection, vtkh_serial_particle_advection) } vtkh::DataSet *outPA=NULL, *outSL=NULL; - outPA = RunFilter(data_set, "vector_data_Float64", seeds, maxAdvSteps, 0.1); - outPA->PrintSummary(std::cout); + std::cerr << "Particle Advection Output:" << std::endl; + outPA->PrintSummary(std::cerr); checkValidity(outPA, maxAdvSteps+1, false); - outSL = RunFilter(data_set, "vector_data_Float64", seeds, maxAdvSteps, 0.1); - outSL->PrintSummary(std::cout); + vtkh::Streamline streamline; + streamline.SetInput(&data_set); + streamline.SetField("vector_data_Float64"); + streamline.SetNumberOfSteps(maxAdvSteps); + streamline.SetStepSize(0.1); + streamline.SetSeeds(seeds); + streamline.SetTubes(true); + streamline.SetTubeCapping(true); + streamline.SetTubeSize(0.1); + streamline.SetTubeSides(3); + streamline.SetOutputField("lines"); + streamline.Update(); + + outSL = streamline.GetOutput(); + //outSL = RunFilter(data_set, "vector_data_Float64", seeds, maxAdvSteps, 0.1); checkValidity(outSL, maxAdvSteps+1, true); + std::cerr << "Streamline Output:" << std::endl; + outSL->PrintSummary(std::cerr); writeDataSet(outSL, "advection_SeedsRandomWhole", rank); + vtkm::Bounds paBounds = outSL->GetGlobalBounds(); + + vtkm::rendering::Camera camera; + camera.SetPosition(vtkm::Vec(-16, -16, -16)); + camera.ResetToBounds(paBounds); + vtkh::Render render = vtkh::MakeRender(512, + 512, + camera, + *outSL, + "tout_streamline_render"); + + vtkh::RayTracer tracer; + tracer.SetInput(outSL); + tracer.SetField("lines"); + + vtkh::Scene scene; + scene.AddRender(render); + scene.AddRenderer(&tracer); + scene.Render(); + MPI_Barrier(MPI_COMM_WORLD); MPI_Finalize(); } diff --git a/src/tests/vtkh/t_vtk-h_warpx_streamline.cpp b/src/tests/vtkh/t_vtk-h_warpx_streamline.cpp index 27a9a5cf0..8512fcdc8 100644 --- a/src/tests/vtkh/t_vtk-h_warpx_streamline.cpp +++ b/src/tests/vtkh/t_vtk-h_warpx_streamline.cpp @@ -1,6 +1,6 @@ //----------------------------------------------------------------------------- /// -/// file: t_vtk-h_particle_advection_par.cpp +/// file: t_vtk-h_warpx_steamlines_par.cpp /// //----------------------------------------------------------------------------- @@ -12,13 +12,15 @@ #include #include #include +#include +#include #include #include #include #include #include "t_vtkm_test_utils.hpp" #include -#include + void checkValidity(vtkh::DataSet *data, const int maxSteps, bool isSL) { @@ -31,11 +33,10 @@ void checkValidity(vtkh::DataSet *data, const int maxSteps, bool isSL) auto cs = currentDomain.GetCellSet(); if (isSL) { - auto cellSet = cs.AsCellSet>(); //Ensure that streamlines took <= to the max number of steps - for(int j = 0; j < cellSet.GetNumberOfCells(); j++) + for(int j = 0; j < cs.GetNumberOfCells(); j++) { - EXPECT_LE(cellSet.GetNumberOfPointsInCell(j), maxSteps); + EXPECT_LE(cs.GetNumberOfPointsInCell(j), maxSteps); } } else @@ -46,14 +47,14 @@ void checkValidity(vtkh::DataSet *data, const int maxSteps, bool isSL) } } -void writeDataSet(vtkh::DataSet *data, std::string fName, int rank) +void writeDataSet(vtkh::DataSet *data, std::string fName) { int numDomains = data->GetNumberOfDomains(); std::cerr << "num domains " << numDomains << std::endl; for(int i = 0; i < numDomains; i++) { char fileNm[128]; - sprintf(fileNm, "%s.rank%d.domain%d.vtk", fName.c_str(), rank, i); + sprintf(fileNm, "%s.domain%d.vtk", fName.c_str(), i); vtkm::io::VTKDataSetWriter write(fileNm); write.WriteDataSet(data->GetDomain(i)); } @@ -96,61 +97,35 @@ template vtkh::DataSet * RunWFilter(vtkh::DataSet& input, int maxAdvSteps, + std::string output_field, double stepSize) { FilterType filter; filter.SetInput(&input); filter.SetNumberOfSteps(maxAdvSteps); - //warpxstreamline will make its own seeds - //if(!std::is_same::value) - // filter.SetSeeds(seeds); filter.SetStepSize(stepSize); + //warpxstreamline will make its own seeds + filter.SetTubeSize(0.00000007); + filter.SetTubeCapping(true); + filter.SetTubeValue(1.0); + filter.SetTubeSides(3); + filter.SetOutputField(output_field); filter.Update(); return filter.GetOutput(); } //---------------------------------------------------------------------------- -TEST(vtkh_particle_advection, vtkh_serial_particle_advection) +TEST(vtkh_serial_warpx_streamlines, vtkh_serial_warpx_streamlines) { #ifdef VTKM_ENABLE_KOKKOS vtkh::InitializeKokkos(); #endif - MPI_Init(NULL, NULL); - int comm_size, rank; - MPI_Comm_size(MPI_COMM_WORLD, &comm_size); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - vtkh::SetMPICommHandle(MPI_Comm_c2f(MPI_COMM_WORLD)); - - std::cout << "Running parallel Particle Advection, vtkh - with " << comm_size << " ranks" << std::endl; - - vtkh::DataSet data_set, warpx_data_set; - const int base_size = 32; - const int blocks_per_rank = 1; const int maxAdvSteps = 1000; - const int num_blocks = comm_size * blocks_per_rank; - - for(int i = 0; i < blocks_per_rank; ++i) - { - int domain_id = rank * blocks_per_rank + i; - data_set.AddDomain(CreateTestDataRectilinear(domain_id, num_blocks, base_size), domain_id); - } - std::vector seeds; + std::cout << "Running serial WarpX Charged Particle Advection" << std::endl; - vtkm::Bounds bounds = data_set.GetGlobalBounds(); - std::cout<<"Bounds= "<(i)); - - seeds.push_back(p); - } + vtkh::DataSet warpx_data_set; std::string warpxParticlesFile = test_data_file("warpXparticles.vtk"); std::string warpxFieldsFile = test_data_file("warpXfields.vtk"); @@ -180,15 +155,34 @@ TEST(vtkh_particle_advection, vtkh_serial_particle_advection) 1.0 / (SPEED_OF_LIGHT * vtkm::Sqrt(1. / spacing[0] + 1. / spacing[1] + 1. / spacing[2]))); std::cout << "CFL length : " << length << std::endl; - vtkh::DataSet *outWSL=NULL; //warpx_data_set.PrintSummary(std::cerr); - outWSL = RunWFilter(warpx_data_set, maxAdvSteps, length); - //outWSL->PrintSummary(std::cerr); - checkValidity(outWSL, maxAdvSteps+1, true); - writeDataSet(outWSL, "warpx_streamline", rank); - MPI_Barrier(MPI_COMM_WORLD); - MPI_Finalize(); + outWSL = RunWFilter(warpx_data_set, maxAdvSteps, "streamlines", length); + outWSL->PrintSummary(std::cerr); + + checkValidity(outWSL, maxAdvSteps+1, true); + writeDataSet(outWSL, "warpx_streamline"); +// vtkm::Bounds tBounds = outWSL->GetGlobalBounds(); +// +// vtkm::rendering::Camera camera; +// camera.SetPosition(vtkm::Vec(-16, -16, -16)); +// camera.ResetToBounds(tBounds); +// vtkh::Render render = vtkh::MakeRender(512, +// 512, +// camera, +// *outWSL, +// "tout_warpx_render"); +// +// vtkh::RayTracer tracer; +// tracer.SetInput(outWSL); +// tracer.SetField("streamlines"); +// std::string fieldName = "streamlines"; +// +// vtkh::Scene scene; +// scene.AddRender(render); +// scene.AddRenderer(&tracer); +// scene.Render(); +// } diff --git a/src/tests/vtkh/t_vtk-h_warpx_streamline_par.cpp b/src/tests/vtkh/t_vtk-h_warpx_streamline_par.cpp new file mode 100644 index 000000000..f11f8128a --- /dev/null +++ b/src/tests/vtkh/t_vtk-h_warpx_streamline_par.cpp @@ -0,0 +1,195 @@ +//----------------------------------------------------------------------------- +/// +/// file: t_vtk-h_warpx_steamlines_par.cpp +/// +//----------------------------------------------------------------------------- + +#include "gtest/gtest.h" +#include "t_utils.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "t_vtkm_test_utils.hpp" +#include +#include + +void checkValidity(vtkh::DataSet *data, const int maxSteps, bool isSL) +{ + int numDomains = data->GetNumberOfDomains(); + + //Check all domains + for(int i = 0; i < numDomains; i++) + { + auto currentDomain = data->GetDomain(i); + auto cs = currentDomain.GetCellSet(); + if (isSL) + { + //Ensure that streamlines took <= to the max number of steps + for(int j = 0; j < cs.GetNumberOfCells(); j++) + { + EXPECT_LE(cs.GetNumberOfPointsInCell(j), maxSteps); + } + } + else + { + if (!cs.IsType>()) + EXPECT_TRUE(false); + } + } +} + +void writeDataSet(vtkh::DataSet *data, std::string fName, int rank) +{ + int numDomains = data->GetNumberOfDomains(); + std::cerr << "num domains " << numDomains << std::endl; + for(int i = 0; i < numDomains; i++) + { + char fileNm[128]; + sprintf(fileNm, "%s.rank%d.domain%d.vtk", fName.c_str(), rank, i); + vtkm::io::VTKDataSetWriter write(fileNm); + write.WriteDataSet(data->GetDomain(i)); + } +} + +static inline vtkm::FloatDefault +rand01() +{ + return (vtkm::FloatDefault)rand() / (RAND_MAX+1.0f); +} + +static inline vtkm::FloatDefault +randRange(const vtkm::FloatDefault &a, const vtkm::FloatDefault &b) +{ + return a + (b-a)*rand01(); +} + + +template +vtkh::DataSet * +RunFilter(vtkh::DataSet& input, + const std::string& fieldName, + const std::vector& seeds, + int maxAdvSteps, + double stepSize) +{ + FilterType filter; + + filter.SetInput(&input); + filter.SetField(fieldName); + filter.SetNumberOfSteps(maxAdvSteps); + filter.SetSeeds(seeds); + filter.SetStepSize(stepSize); + filter.Update(); + + return filter.GetOutput(); +} + +template +vtkh::DataSet * +RunWFilter(vtkh::DataSet& input, + int maxAdvSteps, + std::string output_field, + double stepSize) +{ + FilterType filter; + + filter.SetInput(&input); + filter.SetNumberOfSteps(maxAdvSteps); + filter.SetStepSize(stepSize); + //warpxstreamline will make its own seeds + filter.SetTubeSize(0.1); + filter.SetTubeCapping(true); + filter.SetTubeValue(1.0); + filter.SetTubeSides(2); + filter.SetOutputField(output_field); + filter.Update(); + + return filter.GetOutput(); +} +//---------------------------------------------------------------------------- +TEST(vtkh_warpx_streamlines_par, vtkh_warpx_streamlines_par) +{ +#ifdef VTKM_ENABLE_KOKKOS + vtkh::InitializeKokkos(); +#endif + const int maxAdvSteps = 1000; + + MPI_Init(NULL, NULL); + int comm_size, rank; + MPI_Comm_size(MPI_COMM_WORLD, &comm_size); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + vtkh::SetMPICommHandle(MPI_Comm_c2f(MPI_COMM_WORLD)); + + std::cout << "Running parallel WarpX Charged Particle Advection, vtkh - with " << comm_size << " ranks" << std::endl; + + vtkh::DataSet warpx_data_set; + + std::string warpxParticlesFile = test_data_file("warpXparticles.vtk"); + std::string warpxFieldsFile = test_data_file("warpXfields.vtk"); + + vtkm::io::VTKDataSetReader seedsReader(warpxParticlesFile); + vtkm::cont::DataSet seedsData = seedsReader.ReadDataSet(); + vtkm::io::VTKDataSetReader fieldsReader(warpxFieldsFile); + vtkm::cont::DataSet fieldsData = fieldsReader.ReadDataSet(); + warpx_data_set.AddDomain(seedsData,0); + warpx_data_set.AddDomain(fieldsData,1); + vtkm::cont::UnknownCellSet cells = fieldsData.GetCellSet(); + vtkm::cont::CoordinateSystem coords = fieldsData.GetCoordinateSystem(); + + auto w_bounds = coords.GetBounds(); + using Structured3DType = vtkm::cont::CellSetStructured<3>; + Structured3DType castedCells; + cells.AsCellSet(castedCells); + auto dims = castedCells.GetSchedulingRange(vtkm::TopologyElementTagPoint()); + vtkm::Vec3f spacing = { static_cast(w_bounds.X.Length()) / (dims[0] - 1), + static_cast(w_bounds.Y.Length()) / (dims[1] - 1), + static_cast(w_bounds.Z.Length()) / (dims[2] - 1) }; + constexpr static vtkm::FloatDefault SPEED_OF_LIGHT = + static_cast(2.99792458e8); + spacing = spacing * spacing; + + vtkm::FloatDefault length = static_cast( + 1.0 / (SPEED_OF_LIGHT * vtkm::Sqrt(1. / spacing[0] + 1. / spacing[1] + 1. / spacing[2]))); + std::cout << "CFL length : " << length << std::endl; + + vtkh::DataSet *outWSL=NULL; + + //warpx_data_set.PrintSummary(std::cerr); + + outWSL = RunWFilter(warpx_data_set, maxAdvSteps, "streamlines", length); + outWSL->PrintSummary(std::cerr); + + checkValidity(outWSL, maxAdvSteps+1, true); + writeDataSet(outWSL, "warpx_streamline", rank); +// vtkm::Bounds tBounds = outWSL->GetGlobalBounds(); +// +// vtkm::rendering::Camera camera; +// camera.SetPosition(vtkm::Vec(-16, -16, -16)); +// camera.ResetToBounds(tBounds); +// vtkh::Render render = vtkh::MakeRender(512, +// 512, +// camera, +// *outWSL, +// "tout_warpx_streamline_render"); +// +// vtkh::RayTracer tracer; +// tracer.SetInput(outWSL); +// tracer.SetField("streamlines"); +// +// vtkh::Scene scene; +// scene.AddRender(render); +// scene.AddRenderer(&tracer); +// scene.Render(); + + MPI_Barrier(MPI_COMM_WORLD); + MPI_Finalize(); +}