@@ -252,13 +252,13 @@ walk_matset_by_material(const MatsetAccessor &m_acc,
252252 // we *can* walk this elem-dom representation by material, and sometimes
253253 // we have to. But it is not very efficient.
254254
255- const index_t num_zones = m_acc.num_elems ();
255+ const index_t num_elems = m_acc.num_elems ();
256256 // Material ids need not be within in the range [0, N-1), so we iterate
257257 // over the order materials appear in the matset.
258258 for (index_t mat_idx = 0 ; mat_idx < num_materials; mat_idx ++)
259259 {
260260 index_t num_elems_for_mat = 0 ;
261- for (index_t elem_idx = 0 ; elem_idx < num_zones ; elem_idx ++)
261+ for (index_t elem_idx = 0 ; elem_idx < num_elems ; elem_idx ++)
262262 {
263263 const float64 vol_frac = m_acc.get_vol_frac (elem_idx, mat_idx);
264264 if (vol_frac > epsilon)
@@ -327,13 +327,13 @@ walk_matset_species_by_material(const MatsetAccessor &m_acc,
327327 // we *can* walk this elem-dom representation by material, and sometimes
328328 // we have to. But it is not very efficient.
329329
330- const index_t num_zones = m_acc.num_elems ();
330+ const index_t num_elems = m_acc.num_elems ();
331331 // Material ids need not be within in the range [0, N-1), so we iterate
332332 // over the order materials appear in the matset.
333333 for (index_t mat_idx = 0 ; mat_idx < num_materials; mat_idx ++)
334334 {
335335 index_t num_elems_for_mat = 0 ;
336- for (index_t elem_idx = 0 ; elem_idx < num_zones ; elem_idx ++)
336+ for (index_t elem_idx = 0 ; elem_idx < num_elems ; elem_idx ++)
337337 {
338338 const float64 vol_frac = m_acc.get_vol_frac (elem_idx, mat_idx);
339339 if (vol_frac > epsilon)
@@ -1655,30 +1655,32 @@ multi_buffer_by_element_to_multi_buffer_by_material_matset(const conduit::Node &
16551655 conduit::Node &dest_matset,
16561656 const float64 epsilon)
16571657{
1658+ Node material_map;
16581659 if (src_matset.has_child (" material_map" ))
16591660 {
16601661 dest_matset[" material_map" ].set (src_matset[" material_map" ]);
1662+ material_map.set_external (dest_matset[" material_map" ]);
1663+ }
1664+ else
1665+ {
1666+ create_or_reuse_material_map (src_matset, material_map);
16611667 }
16621668
1663- const int num_zones = count_zones_from_matset (src_matset);
1664-
1665- Node material_map;
1666- create_or_reuse_material_map (src_matset, material_map);
1669+ MatsetAccessor m_acc = MatsetAccessor (src_matset);
1670+ const index_t num_elems = m_acc.num_elems ();
16671671
16681672 Node n;
1669- n[" local_element_ids" ].set (DataType::index_t (num_zones ));
1670- n[" local_volume_fractions" ].set (DataType::float64 (num_zones ));
1673+ n[" local_element_ids" ].set (DataType::index_t (num_elems ));
1674+ n[" local_volume_fractions" ].set (DataType::float64 (num_elems ));
16711675 index_t_array local_element_ids = n[" local_element_ids" ].value ();
16721676 float64_array local_volume_fractions = n[" local_volume_fractions" ].value ();
16731677
1674- MatsetAccessor m_acc = MatsetAccessor (src_matset);
1675-
16761678 auto for_each_value = [&](const index_t mat_idx,
1677- const index_t zone_idx ,
1679+ const index_t elem_idx ,
16781680 const index_t eid_id)
16791681 {
1680- local_element_ids[eid_id] = zone_idx ;
1681- local_volume_fractions[eid_id] = m_acc.get_vol_frac (zone_idx , mat_idx);
1682+ local_element_ids[eid_id] = elem_idx ;
1683+ local_volume_fractions[eid_id] = m_acc.get_vol_frac (elem_idx , mat_idx);
16821684 };
16831685
16841686 // what we will do for each material's elem_ids/vol_fracs
@@ -1709,35 +1711,33 @@ multi_buffer_by_element_to_multi_buffer_by_material_field(const conduit::Node &s
17091711 conduit::Node &dest_field,
17101712 const float64 epsilon)
17111713{
1712- const index_t num_zones = count_zones_from_matset (src_matset);
1713-
1714- Node n;
1715- n[" local_matset_values" ].set (DataType::float64 (num_zones));
1716- float64_array local_matset_values = n[" local_matset_values" ].value ();
1717-
17181714 Node material_map;
17191715 create_or_reuse_material_map (src_matset, material_map);
17201716
17211717 MatsetAccessor m_acc = MatsetAccessor (src_matset, src_field);
1718+ const index_t num_elems = m_acc.num_elems ();
1719+
1720+ Node n;
1721+ n[" local_matset_values" ].set (DataType::float64 (num_elems));
1722+ float64_array local_matset_values = n[" local_matset_values" ].value ();
17221723
17231724 auto for_each_value = [&](const index_t mat_idx,
1724- const index_t zone_idx ,
1725+ const index_t elem_idx ,
17251726 const index_t eid_id)
17261727 {
1727- local_matset_values[eid_id] = m_acc.get_mset_val (zone_idx , mat_idx);
1728+ local_matset_values[eid_id] = m_acc.get_mset_val (elem_idx , mat_idx);
17281729 };
17291730
17301731 // what we will do for each material's mset_vals
17311732 auto for_each_material = [&](const index_t mat_idx,
17321733 const index_t num_elems_for_mat)
17331734 {
17341735 const std::string matname = material_map.child (mat_idx).name ();
1735- Node &result_mset_vals = dest_field[" matset_values" ][matname];
1736- result_mset_vals.set (DataType::float64 (num_elems_for_mat));
1737- float64_array result_mset_vals_arr = result_mset_vals.value ();
1736+ dest_field[" matset_values" ][matname].set (DataType::float64 (num_elems_for_mat));
1737+ float64_array matset_values = dest_field[" matset_values" ][matname].value ();
17381738 for (index_t eid_id = 0 ; eid_id < num_elems_for_mat; eid_id ++)
17391739 {
1740- result_mset_vals_arr [eid_id] = local_matset_values[eid_id];
1740+ matset_values [eid_id] = local_matset_values[eid_id];
17411741 }
17421742 };
17431743
@@ -1752,6 +1752,10 @@ multi_buffer_by_element_to_multi_buffer_by_material_specset(const conduit::Node
17521752 conduit::Node &dest_specset,
17531753 const float64 epsilon)
17541754{
1755+ // TODO justin I am stumped here
1756+ // I should probably make a new walk method
1757+ // that walks by materials, species, and then elements
1758+
17551759 auto mat_itr = src_matset[" volume_fractions" ].children ();
17561760 auto smat_itr = src_specset[" matset_values" ].children ();
17571761 while (mat_itr.has_next () && smat_itr.has_next ())
0 commit comments