@@ -80,12 +80,18 @@ create_material_map(const conduit::Node &matset,
8080}
8181
8282// -----------------------------------------------------------------------------
83- struct ZoneArrays
83+ struct ZoneArraysContext
8484{
8585 std::vector<index_t > local_material_ids;
8686 std::vector<float64> local_volume_fractions;
8787};
8888
89+ // -----------------------------------------------------------------------------
90+ struct SizeContext
91+ {
92+ int size;
93+ };
94+
8995// -----------------------------------------------------------------------------
9096template <class Context ,
9197 class FillContext ,
@@ -1360,33 +1366,70 @@ multi_buffer_by_element_to_uni_buffer_by_element_matset(const conduit::Node &src
13601366 mat_id ++;
13611367 }
13621368
1363- const int nmats = dest_matset[" material_map" ].number_of_children ();
1369+ // const int nmats = dest_matset["material_map"].number_of_children();
13641370
13651371 std::vector<double > vol_fracs;
13661372 std::vector<int > mat_ids;
13671373 std::vector<int > sizes;
13681374 std::vector<int > offsets;
13691375
13701376 const int num_elems = src_matset[" volume_fractions" ][0 ].dtype ().number_of_elements ();
1377+
1378+ using Context = detail::SizeContext;
1379+
13711380 int offset = 0 ;
13721381
1373- for (int elem_id = 0 ; elem_id < num_elems; elem_id ++)
1374- {
1375- int size = 0 ;
1376- for (int mat_id = 0 ; mat_id < nmats; mat_id ++)
1382+ auto fill_context =
1383+ [&](const int zone_id, Context &ctx)
13771384 {
1378- float64 vol_frac = full_vol_fracs[mat_id][elem_id];
1379- if (vol_frac > epsilon)
1380- {
1381- vol_fracs.push_back (vol_frac);
1382- mat_ids.push_back (mat_id);
1383- size ++;
1384- }
1385- }
1386- sizes.push_back (size);
1387- offsets.push_back (offset);
1388- offset += size;
1389- }
1385+ ctx.size = 0 ;
1386+
1387+ auto visit_value =
1388+ [&](const index_t mat_id,
1389+ const float64 vol_frac,
1390+ const int /* zone_id*/ )
1391+ {
1392+ vol_fracs.push_back (vol_frac);
1393+ mat_ids.push_back (mat_id);
1394+ ctx.size ++;
1395+ };
1396+
1397+ detail::walk_full_matset_element_by_value (src_matset,
1398+ dest_matset[" material_map" ],
1399+ zone_id,
1400+ visit_value,
1401+ epsilon);
1402+ };
1403+
1404+ auto visit_zone_with_ctx =
1405+ [&](const int /* zone_id*/ , const Context &ctx)
1406+ {
1407+ sizes.push_back (ctx.size );
1408+ offsets.push_back (offset);
1409+ offset += ctx.size ;
1410+ };
1411+
1412+ detail::walk_zones_with_context<Context>(num_elems,
1413+ fill_context,
1414+ visit_zone_with_ctx);
1415+
1416+ // for (int elem_id = 0; elem_id < num_elems; elem_id ++)
1417+ // {
1418+ // int size = 0;
1419+ // for (int mat_id = 0; mat_id < nmats; mat_id ++)
1420+ // {
1421+ // float64 vol_frac = full_vol_fracs[mat_id][elem_id];
1422+ // if (vol_frac > epsilon)
1423+ // {
1424+ // vol_fracs.push_back(vol_frac);
1425+ // mat_ids.push_back(mat_id);
1426+ // size ++;
1427+ // }
1428+ // }
1429+ // sizes.push_back(size);
1430+ // offsets.push_back(offset);
1431+ // offset += size;
1432+ // }
13901433
13911434 dest_matset[" volume_fractions" ].set (vol_fracs);
13921435 dest_matset[" material_ids" ].set (mat_ids);
@@ -2382,93 +2425,6 @@ walk_matset_by_element_value(const conduit::Node &matset,
23822425 }
23832426}
23842427
2385- // TODO
2386- // //-----------------------------------------------------------------------------
2387- // template <class VisitZone, class VisitValue>
2388- // void
2389- // walk_matset_by_element_and_value(const conduit::Node &matset,
2390- // const conduit::Node &material_map,
2391- // const int num_zones,
2392- // VisitZone &&visit_zone,
2393- // VisitValue &&visit_value,
2394- // const float64 epsilon)
2395- // {
2396- // // extra seat belt here
2397- // if (! matset.dtype().is_object())
2398- // {
2399- // CONDUIT_ERROR("blueprint::mesh::matset::count_zones_in_matset"
2400- // " passed matset node must be a valid matset tree.");
2401- // }
2402-
2403- // if (is_element_dominant(matset))
2404- // {
2405- // // full
2406- // if (is_multi_buffer(matset))
2407- // {
2408- // for (int zone_id = 0; zone_id < num_zones; zone_id ++)
2409- // {
2410- // // std::vector<int> local_material_ids; // material ids in this zone
2411- // // std::vector<float64> local_volume_fractions; // volume fractions in this zone
2412-
2413- // // // we need to gather info from each value for the zones
2414- // // auto fill_arrays = [&](const index_t mat_id,
2415- // // const float64 vol_frac,
2416- // // const int zone_id)
2417- // // {
2418- // // (void) zone_id;
2419- // // local_material_ids.push_back(mat_id);
2420- // // local_volume_fractions.push_back(vol_frac);
2421- // // };
2422-
2423- // context;
2424-
2425- // detail::walk_full_matset_element_by_value(matset,
2426- // material_map,
2427- // zone_id,
2428- // visit_value,
2429- // epsilon);
2430-
2431- // visit_zone();
2432-
2433- // // visit_zone(zone_id,
2434- // // local_material_ids,
2435- // // local_volume_fractions);
2436- // }
2437- // }
2438- // // sparse by element
2439- // else
2440- // {
2441- // for (int zone_id = 0; zone_id < num_zones; zone_id ++)
2442- // {
2443- // std::vector<int> local_material_ids; // material ids in this zone
2444- // std::vector<float64> local_volume_fractions; // volume fractions in this zone
2445-
2446- // // we need to gather info from each value for the zones
2447- // auto fill_arrays = [&](const index_t mat_id,
2448- // const float64 vol_frac,
2449- // const int zone_id)
2450- // {
2451- // (void) zone_id;
2452- // local_material_ids.push_back(mat_id);
2453- // local_volume_fractions.push_back(vol_frac);
2454- // };
2455-
2456- // detail::walk_sbe_matset_element_by_value(matset,
2457- // zone_id,
2458- // fill_arrays);
2459-
2460- // visit_zone(zone_id,
2461- // local_material_ids,
2462- // local_volume_fractions);
2463- // }
2464- // }
2465- // }
2466- // else
2467- // {
2468- // CONDUIT_ERROR("Walking by element is only supported for element-dominant material sets.");
2469- // }
2470- // }
2471-
24722428// -----------------------------------------------------------------------------
24732429template <class VisitZone >
24742430void
@@ -2528,13 +2484,13 @@ walk_matset_by_element(const conduit::Node &matset,
25282484 CONDUIT_ERROR (" Walking by element is only supported for element-dominant material sets." );
25292485 }
25302486
2531- using Context = detail::ZoneArrays ;
2487+ using Context = detail::ZoneArraysContext ;
25322488
25332489 // full
25342490 if (is_multi_buffer (matset))
25352491 {
25362492 auto fill_context =
2537- [&](int zone_id, Context &ctx)
2493+ [&](const int zone_id, Context &ctx)
25382494 {
25392495 ctx.local_material_ids .clear ();
25402496 ctx.local_volume_fractions .clear ();
@@ -2571,7 +2527,7 @@ walk_matset_by_element(const conduit::Node &matset,
25712527 else
25722528 {
25732529 auto fill_context =
2574- [&](int zone_id, Context &ctx)
2530+ [&](const int zone_id, Context &ctx)
25752531 {
25762532 ctx.local_material_ids .clear ();
25772533 ctx.local_volume_fractions .clear ();
0 commit comments