Skip to content

Commit a5257f4

Browse files
I may have gone too far in a few places
1 parent 9b25785 commit a5257f4

1 file changed

Lines changed: 64 additions & 108 deletions

File tree

src/libs/blueprint/conduit_blueprint_mesh_matset_xforms.cpp

Lines changed: 64 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -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
//-----------------------------------------------------------------------------
9096
template <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
//-----------------------------------------------------------------------------
24732429
template <class VisitZone>
24742430
void
@@ -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

Comments
 (0)