276 bool enable_mem_free =
false;
278 auto get_optional_free_mem = [&](
auto &bind_to,
auto &add_to) {
279 if (enable_mem_free) {
281 node.set_edges(bind_to);
282 add_to.push_back(std::make_shared<
decltype(node)>(std::move(node)));
287 storage.ghost_layout = std::make_shared<shamrock::patch::PatchDataLayerLayout>();
291 ghost_layout.
add_field<TgridVec>(
"cell_min", 1);
292 ghost_layout.
add_field<TgridVec>(
"cell_max", 1);
293 ghost_layout.
add_field<Tscal>(
"rho", AMRBlock::block_size);
294 ghost_layout.
add_field<Tscal>(
"rhoetot", AMRBlock::block_size);
295 ghost_layout.
add_field<Tvec>(
"rhovel", AMRBlock::block_size);
297 if (solver_config.is_dust_on()) {
298 auto ndust = solver_config.dust_config.ndust;
299 ghost_layout.
add_field<Tscal>(
"rho_dust", ndust * AMRBlock::block_size);
300 ghost_layout.
add_field<Tvec>(
"rhovel_dust", ndust * AMRBlock::block_size);
303 if (solver_config.is_gravity_on()) {
304 ghost_layout.
add_field<Tscal>(
"phi", AMRBlock::block_size);
307 if (solver_config.is_gas_passive_scalar_on()) {
308 u32 npscal_gas = solver_config.npscal_gas_config.npscal_gas;
309 ghost_layout.
add_field<Tscal>(
"rho_gas_pscal", npscal_gas * AMRBlock::block_size);
317 using namespace shamrock::solvergraph;
324 "global_patch_boxes",
330 edge.
patch_tree = std::ref(storage.serial_patch_tree.get());
336 storage.local_patch_ids
337 = std::make_shared<shamrock::solvergraph::IDataEdge<std::vector<u64>>>(
"",
"");
340 = std::make_shared<shamrock::solvergraph::ScalarEdge<shammath::AABB<TgridVec>>>(
341 "sim_box",
"sim_box");
343 storage.exchange_gz_edge = std::make_shared<shamrock::solvergraph::PatchDataLayerDDShared>(
344 "exchange_gz_edge",
"exchange_gz_edge");
346 storage.idx_in_ghost = std::make_shared<shamrock::solvergraph::DDSharedBuffers<u32>>(
347 "idx_in_ghost",
"idx_in_ghost");
349 storage.ghost_layers_candidates_edge = std::make_shared<
351 "ghost_layers_candidates",
"ghost_layers_candidates");
353 storage.patch_rank_owner = std::make_shared<shamrock::solvergraph::RankGetter>(
354 [&](
u64 patch_id) ->
u32 {
355 return scheduler().get_patch_rank_owner(patch_id);
360 storage.source_patches = std::make_shared<shamrock::solvergraph::PatchDataLayerRefs>(
361 "source_patches",
"P_{\\rm source}");
363 storage.merged_patchdata_ghost = std::make_shared<shamrock::solvergraph::PatchDataLayerEdge>(
364 "merged_patchdata_ghost",
"patchdata_{\\rm ghost}", storage.ghost_layout);
367 = std::make_shared<shamrock::solvergraph::Indexes<u32>>(
"block_count",
"N_{\\rm block}");
369 storage.block_counts_with_ghost = std::make_shared<shamrock::solvergraph::Indexes<u32>>(
370 "block_count_with_ghost",
"N_{\\rm block, with ghost}");
373 storage.refs_block_min = std::make_shared<shamrock::solvergraph::FieldRefs<TgridVec>>(
374 "block_min",
"\\mathbf{r}_{\\rm block, min}");
375 storage.refs_block_max = std::make_shared<shamrock::solvergraph::FieldRefs<TgridVec>>(
376 "block_max",
"\\mathbf{r}_{\\rm block, max}");
378 storage.refs_rho = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"rho",
"\\rho");
380 = std::make_shared<shamrock::solvergraph::FieldRefs<Tvec>>(
"rhovel",
"(\\rho \\mathbf{v})");
382 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"rhoetot",
"(\\rho E)");
384 if (solver_config.is_dust_on()) {
385 storage.refs_rho_dust = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
386 "rho_dust",
"\\rho_{\\rm dust}");
387 storage.refs_rhov_dust = std::make_shared<shamrock::solvergraph::FieldRefs<Tvec>>(
388 "rhovel_dust",
"(\\rho_{\\rm dust} \\mathbf{v}_{\\rm dust})");
392 storage.vel = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
393 AMRBlock::block_size,
"vel",
"\\mathbf{v}");
395 = std::make_shared<shamrock::solvergraph::Field<Tscal>>(AMRBlock::block_size,
"P",
"P");
397 if (!solver_config.amr_mode.old_amr) {
398 storage.rho_primitive = std::make_shared<shamrock::solvergraph::Field<Tscal>>(
399 AMRBlock::block_size,
"rho-prim",
"rho-prim");
402 if (solver_config.is_dust_on()) {
403 u32 ndust = solver_config.dust_config.ndust;
406 storage.vel_dust = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
407 AMRBlock::block_size * ndust,
"vel_dust",
"{\\mathbf{v}_{\\rm dust}}");
411 = std::make_shared<solvergraph::TreeEdge<u_morton, TgridVec>>(
"trees",
"\\text{trees}");
413 storage.block_graph_edge = std::make_shared<
415 "block_graph_edge",
"\\text{block graph edge}");
417 storage.cell_graph_edge = std::make_shared<
419 "cell_graph_edge",
"\\text{cell graph edge}");
422 storage.block_cell_sizes = std::make_shared<shamrock::solvergraph::Field<Tscal>>(
423 1,
"block_cell_sizes",
"s_{\\rm cell}");
424 storage.cell0block_aabb_lower = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
425 1,
"cell0block_aabb_lower",
"\\mathbf{s}_{\\rm inf,block}");
427 if (solver_config.is_coordinate_field_required()) {
429 storage.coordinates = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
430 AMRBlock::block_size,
"coordinates",
"\\mathbf{xyz}");
433 if (solver_config.amr_mode.need_level_zero_compute()) {
435 storage.level0_size = std::make_shared<shamrock::solvergraph::ScalarsEdge<TgridVec>>(
436 "level0_amr",
"level0_amr");
439 if (solver_config.amr_mode.need_amr_level_compute()) {
440 using TgridUint =
typename std::make_unsigned<shambase::VecComponent<TgridVec>>::type;
441 storage.amr_block_levels
442 = std::make_shared<shamrock::solvergraph::Field<TgridUint>>(1,
"",
"");
445 storage.grad_rho = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
446 AMRBlock::block_size,
"grad_rho",
"\\nabla \\rho");
447 storage.dx_v = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
448 AMRBlock::block_size,
"dx_v",
"\\nabla_x \\mathbf{v}");
449 storage.dy_v = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
450 AMRBlock::block_size,
"dy_v",
"\\nabla_y \\mathbf{v}");
451 storage.dz_v = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
452 AMRBlock::block_size,
"dz_v",
"\\nabla_z \\mathbf{v}");
453 storage.grad_P = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
454 AMRBlock::block_size,
"grad_P",
"\\nabla P");
456 if (solver_config.is_dust_on()) {
457 u32 ndust = solver_config.dust_config.ndust;
458 storage.grad_rho_dust = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
459 AMRBlock::block_size * ndust,
"grad_rho_dust",
"\\nabla \\rho_{\\rm dust}");
460 storage.dx_v_dust = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
461 AMRBlock::block_size * ndust,
"dx_v_dust",
"\\nabla_x \\mathbf{v}_{\\rm dust}");
462 storage.dy_v_dust = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
463 AMRBlock::block_size * ndust,
"dy_v_dust",
"\\nabla_y \\mathbf{v}_{\\rm dust}");
464 storage.dz_v_dust = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
465 AMRBlock::block_size * ndust,
"dz_v_dust",
"\\nabla_z \\mathbf{v}_{\\rm dust}");
471 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
472 "rho_face_xp",
"rho_face_xp", 1);
474 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
475 "rho_face_xm",
"rho_face_xm", 1);
477 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
478 "rho_face_yp",
"rho_face_yp", 1);
480 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
481 "rho_face_ym",
"rho_face_ym", 1);
483 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
484 "rho_face_zp",
"rho_face_zp", 1);
486 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
487 "rho_face_zm",
"rho_face_zm", 1);
490 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
491 "vel_face_xp",
"vel_face_xp", 1);
493 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
494 "vel_face_xm",
"vel_face_xm", 1);
496 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
497 "vel_face_yp",
"vel_face_yp", 1);
499 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
500 "vel_face_ym",
"vel_face_ym", 1);
502 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
503 "vel_face_zp",
"vel_face_zp", 1);
505 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
506 "vel_face_zm",
"vel_face_zm", 1);
508 storage.press_face_xp
509 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
510 "press_face_xp",
"press_face_xp", 1);
511 storage.press_face_xm
512 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
513 "press_face_xm",
"press_face_xm", 1);
514 storage.press_face_yp
515 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
516 "press_face_yp",
"press_face_yp", 1);
517 storage.press_face_ym
518 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
519 "press_face_ym",
"press_face_ym", 1);
520 storage.press_face_zp
521 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
522 "press_face_zp",
"press_face_zp", 1);
523 storage.press_face_zm
524 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
525 "press_face_zm",
"press_face_zm", 1);
528 if (solver_config.is_dust_on()) {
529 u32 ndust = solver_config.dust_config.ndust;
531 storage.rho_dust_face_xp
532 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
533 "rho_dust_face_xp",
"rho_dust_face_xp", ndust);
534 storage.rho_dust_face_xm
535 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
536 "rho_dust_face_xm",
"rho_dust_face_xm", ndust);
537 storage.rho_dust_face_yp
538 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
539 "rho_dust_face_yp",
"rho_dust_face_yp", ndust);
540 storage.rho_dust_face_ym
541 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
542 "rho_dust_face_ym",
"rho_dust_face_ym", ndust);
543 storage.rho_dust_face_zp
544 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
545 "rho_dust_face_zp",
"rho_dust_face_zp", ndust);
546 storage.rho_dust_face_zm
547 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
548 "rho_dust_face_zm",
"rho_dust_face_zm", ndust);
550 storage.vel_dust_face_xp
551 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
552 "vel_dust_face_xp",
"vel_dust_face_xp", ndust);
553 storage.vel_dust_face_xm
554 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
555 "vel_dust_face_xm",
"vel_dust_face_xm", ndust);
556 storage.vel_dust_face_yp
557 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
558 "vel_dust_face_yp",
"vel_dust_face_yp", ndust);
559 storage.vel_dust_face_ym
560 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
561 "vel_dust_face_ym",
"vel_dust_face_ym", ndust);
562 storage.vel_dust_face_zp
563 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
564 "vel_dust_face_zp",
"vel_dust_face_zp", ndust);
565 storage.vel_dust_face_zm
566 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
567 "vel_dust_face_zm",
"vel_dust_face_zm", ndust);
570 if (solver_config.should_compute_rho_mean()) {
571 storage.cell_mass = std::make_shared<shamrock::solvergraph::Field<Tscal>>(
572 AMRBlock::block_size,
"cell_mass",
"m");
574 = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
"rho_mean",
"< \\rho >");
575 storage.simulation_volume = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
576 "simulation_volume",
"V_{\\rm sim}");
580 = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
"dt_half",
"dt_{half}");
584 storage.flux_rho_face_xm = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
585 "flux_rho_face_xm",
"flux_rho_face_xm", 1);
587 storage.flux_rho_face_xp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
588 "flux_rho_face_xp",
"flux_rho_face_xp", 1);
590 storage.flux_rho_face_ym = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
591 "flux_rho_face_ym",
"flux_rho_face_ym", 1);
593 storage.flux_rho_face_yp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
594 "flux_rho_face_yp",
"flux_rho_face_yp", 1);
596 storage.flux_rho_face_zm = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
597 "flux_rho_face_zm",
"flux_rho_face_zm", 1);
599 storage.flux_rho_face_zp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
600 "flux_rho_face_zp",
"flux_rho_face_zp", 1);
602 storage.flux_rhov_face_xm = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
603 "flux_rhov_face_xm",
"flux_rhov_face_xm", 1);
605 storage.flux_rhov_face_xp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
606 "flux_rhov_face_xp",
"flux_rhov_face_xp", 1);
608 storage.flux_rhov_face_ym = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
609 "flux_rhov_face_ym",
"flux_rhov_face_ym", 1);
611 storage.flux_rhov_face_yp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
612 "flux_rhov_face_yp",
"flux_rhov_face_yp", 1);
614 storage.flux_rhov_face_zm = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
615 "flux_rhov_face_zm",
"flux_rhov_face_zm", 1);
617 storage.flux_rhov_face_zp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
618 "flux_rhov_face_zp",
"flux_rhov_face_zp", 1);
620 storage.flux_rhoe_face_xm = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
621 "flux_rhoe_face_xm",
"flux_rhoe_face_xm", 1);
623 storage.flux_rhoe_face_xp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
624 "flux_rhoe_face_xp",
"flux_rhoe_face_xp", 1);
626 storage.flux_rhoe_face_ym = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
627 "flux_rhoe_face_ym",
"flux_rhoe_face_ym", 1);
629 storage.flux_rhoe_face_yp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
630 "flux_rhoe_face_yp",
"flux_rhoe_face_yp", 1);
632 storage.flux_rhoe_face_zm = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
633 "flux_rhoe_face_zm",
"flux_rhoe_face_zm", 1);
635 storage.flux_rhoe_face_zp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
636 "flux_rhoe_face_zp",
"flux_rhoe_face_zp", 1);
639 if (solver_config.is_dust_on()) {
640 u32 ndust = solver_config.dust_config.ndust;
642 storage.flux_rho_dust_face_xm
643 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
644 "flux_rho_dust_face_xm",
"flux_rho_dust_face_xm", ndust);
646 storage.flux_rho_dust_face_xp
647 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
648 "flux_rho_dust_face_xp",
"flux_rho_dust_face_xp", ndust);
650 storage.flux_rho_dust_face_ym
651 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
652 "flux_rho_dust_face_ym",
"flux_rho_dust_face_ym", ndust);
654 storage.flux_rho_dust_face_yp
655 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
656 "flux_rho_dust_face_yp",
"flux_rho_dust_face_yp", ndust);
658 storage.flux_rho_dust_face_zm
659 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
660 "flux_rho_dust_face_zm",
"flux_rho_dust_face_zm", ndust);
662 storage.flux_rho_dust_face_zp
663 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
664 "flux_rho_dust_face_zp",
"flux_rho_dust_face_zp", ndust);
666 storage.flux_rhov_dust_face_xm
667 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
668 "flux_rhov_dust_face_xm",
"flux_rhov_dust_face_xm", ndust);
670 storage.flux_rhov_dust_face_xp
671 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
672 "flux_rhov_dust_face_xp",
"flux_rhov_dust_face_xp", ndust);
674 storage.flux_rhov_dust_face_ym
675 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
676 "flux_rhov_dust_face_ym",
"flux_rhov_dust_face_ym", ndust);
678 storage.flux_rhov_dust_face_yp
679 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
680 "flux_rhov_dust_face_yp",
"flux_rhov_dust_face_yp", ndust);
682 storage.flux_rhov_dust_face_zm
683 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
684 "flux_rhov_dust_face_zm",
"flux_rhov_dust_face_zm", ndust);
686 storage.flux_rhov_dust_face_zp
687 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
688 "flux_rhov_dust_face_zp",
"flux_rhov_dust_face_zp", ndust);
691 storage.dtrho = std::make_shared<shamrock::solvergraph::Field<Tscal>>(
692 AMRBlock::block_size,
"dtrho",
"dtrho");
693 storage.dtrhov = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
694 AMRBlock::block_size,
"dtrhov",
"dtrhov");
695 storage.dtrhoe = std::make_shared<shamrock::solvergraph::Field<Tscal>>(
696 AMRBlock::block_size,
"dtrhoe",
"dtrhoe");
698 if (solver_config.is_dust_on()) {
699 u32 ndust = solver_config.dust_config.ndust;
700 storage.dtrho_dust = std::make_shared<shamrock::solvergraph::Field<Tscal>>(
701 AMRBlock::block_size * ndust,
"dtrho_dust",
"dtrho_dust");
702 storage.dtrhov_dust = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
703 AMRBlock::block_size * ndust,
"dtrhov_dust",
"dtrhov_dust");
709 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> solver_sequence;
713 auto cfg_bc_to_geom = [](BCConfig::GhostType ghost_type) {
714 switch (ghost_type) {
715 case BCConfig::GhostType::Periodic :
return modules::GhostType::Periodic;
716 case BCConfig::GhostType::Reflective:
return modules::GhostType::Reflective;
717 case BCConfig::GhostType::Outflow :
return modules::GhostType::Reflective;
720 "Unsupported ghost type: " + std::to_string(
static_cast<int>(ghost_type)));
725 cfg_bc_to_geom(solver_config.bc_config.get_x()),
726 cfg_bc_to_geom(solver_config.bc_config.get_y()),
727 cfg_bc_to_geom(solver_config.bc_config.get_z())};
730 bool transform_vec_x = solver_config.bc_config.get_x() != BCConfig::GhostType::Outflow;
731 bool transform_vec_y = solver_config.bc_config.get_y() != BCConfig::GhostType::Outflow;
732 bool transform_vec_z = solver_config.bc_config.get_z() != BCConfig::GhostType::Outflow;
737 ghost_layer_gen_mode);
738 find_ghost_layer_candidates.set_edges(
739 storage.local_patch_ids,
740 storage.sim_box_edge,
743 storage.ghost_layers_candidates_edge);
744 solver_sequence.push_back(
745 std::make_shared<
decltype(find_ghost_layer_candidates)>(
746 std::move(find_ghost_layer_candidates)));
749 find_ghost_layer_indices.set_edges(
750 storage.sim_box_edge,
751 storage.source_patches,
752 storage.ghost_layers_candidates_edge,
754 storage.idx_in_ghost);
755 solver_sequence.push_back(
756 std::make_shared<
decltype(find_ghost_layer_indices)>(
757 std::move(find_ghost_layer_indices)));
761 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> gz_xchg_sequence;
763 auto &ghost_layout_ptr = storage.ghost_layout;
765 auto copy_fields = std::make_shared<shamrock::solvergraph::CopyPatchDataLayerFields>(
766 scheduler().get_layout_ptr_old(), ghost_layout_ptr);
768 copy_fields->set_edges(storage.source_patches, storage.merged_patchdata_ghost);
769 gz_xchg_sequence.push_back(std::move(copy_fields));
774 = std::make_shared<shammodels::basegodunov::modules::ExtractGhostLayer>(
777 extract_gz_node->set_edges(
778 storage.merged_patchdata_ghost, storage.idx_in_ghost, storage.exchange_gz_edge);
779 gz_xchg_sequence.push_back(std::move(extract_gz_node));
783 auto transform_gz_node = std::make_shared<
785 ghost_layer_gen_mode,
791 transform_gz_node->set_edges(
792 storage.sim_box_edge,
793 storage.ghost_layers_candidates_edge,
794 storage.exchange_gz_edge);
795 gz_xchg_sequence.push_back(std::move(transform_gz_node));
799 auto exchange_gz_node
800 = std::make_shared<shamrock::solvergraph::ExchangeGhostLayer>(ghost_layout_ptr);
801 exchange_gz_node->set_edges(storage.patch_rank_owner, storage.exchange_gz_edge);
802 gz_xchg_sequence.push_back(std::move(exchange_gz_node));
807 = std::make_shared<shammodels::basegodunov::modules::FuseGhostLayer>();
808 fuse_gz_node->set_edges(storage.exchange_gz_edge, storage.merged_patchdata_ghost);
809 gz_xchg_sequence.push_back(std::move(fuse_gz_node));
826 "Ghost zone exchange", std::move(gz_xchg_sequence));
827 solver_sequence.push_back(std::make_shared<
decltype(seq)>(std::move(seq)));
835 extract_counts_node.set_edges(storage.source_patches, storage.block_counts);
836 solver_sequence.push_back(
837 std::make_shared<
decltype(extract_counts_node)>(std::move(extract_counts_node)));
843 extract_counts_node.set_edges(
844 storage.merged_patchdata_ghost, storage.block_counts_with_ghost);
845 solver_sequence.push_back(
846 std::make_shared<
decltype(extract_counts_node)>(std::move(extract_counts_node)));
852 attach_block_min.set_edges(storage.merged_patchdata_ghost, storage.refs_block_min);
853 solver_sequence.push_back(
854 std::make_shared<
decltype(attach_block_min)>(std::move(attach_block_min)));
858 attach_block_max.set_edges(storage.merged_patchdata_ghost, storage.refs_block_max);
859 solver_sequence.push_back(
860 std::make_shared<
decltype(attach_block_max)>(std::move(attach_block_max)));
866 attach_rho.set_edges(storage.merged_patchdata_ghost, storage.refs_rho);
867 solver_sequence.push_back(
868 std::make_shared<
decltype(attach_rho)>(std::move(attach_rho)));
872 attach_rhov.set_edges(storage.merged_patchdata_ghost, storage.refs_rhov);
873 solver_sequence.push_back(
874 std::make_shared<
decltype(attach_rhov)>(std::move(attach_rhov)));
878 storage.ghost_layout,
"rhoetot");
879 attach_rhoe.set_edges(storage.merged_patchdata_ghost, storage.refs_rhoe);
880 solver_sequence.push_back(
881 std::make_shared<
decltype(attach_rhoe)>(std::move(attach_rhoe)));
884 if (solver_config.is_dust_on()) {
887 storage.ghost_layout,
"rho_dust");
888 attach_rho_dust.set_edges(storage.merged_patchdata_ghost, storage.refs_rho_dust);
889 solver_sequence.push_back(
890 std::make_shared<
decltype(attach_rho_dust)>(std::move(attach_rho_dust)));
894 storage.ghost_layout,
"rhovel_dust");
895 attach_rhov_dust.set_edges(storage.merged_patchdata_ghost, storage.refs_rhov_dust);
896 solver_sequence.push_back(
897 std::make_shared<
decltype(attach_rhov_dust)>(std::move(attach_rhov_dust)));
905 storage.block_counts_with_ghost,
906 storage.refs_block_min,
907 storage.refs_block_max,
910 solver_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
914 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> neigh_table_sequence;
918 storage.block_counts_with_ghost,
919 storage.refs_block_min,
920 storage.refs_block_max,
922 storage.block_graph_edge);
927 storage.block_counts_with_ghost,
928 storage.refs_block_min,
929 storage.refs_block_max,
930 storage.block_graph_edge,
931 storage.cell_graph_edge);
934 neigh_table_sequence.push_back(std::make_shared<
decltype(node1)>(std::move(node1)));
935 get_optional_free_mem(storage.trees, neigh_table_sequence);
936 neigh_table_sequence.push_back(std::make_shared<
decltype(node2)>(std::move(node2)));
937 get_optional_free_mem(storage.block_graph_edge, neigh_table_sequence);
940 "Compute neigh table", std::move(neigh_table_sequence));
941 solver_sequence.push_back(std::make_shared<
decltype(seq)>(std::move(seq)));
947 AMRBlock::Nside, solver_config.grid_coord_to_pos_fact};
950 storage.block_counts_with_ghost,
951 storage.refs_block_min,
952 storage.refs_block_max,
953 storage.block_cell_sizes,
954 storage.cell0block_aabb_lower);
955 solver_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
958 if (solver_config.is_coordinate_field_required()) {
961 AMRBlock::block_size,
963 solver_config.grid_coord_to_pos_fact,
966 node_coordinates.set_edges(
967 storage.block_counts,
968 storage.refs_block_min,
969 storage.refs_block_max,
970 storage.coordinates);
972 solver_sequence.push_back(
973 std::make_shared<
decltype(node_coordinates)>(std::move(node_coordinates)));
976 if (solver_config.amr_mode.need_level_zero_compute()) {
979 node_level0_sizes.set_edges(
981 storage.source_patches,
982 storage.level0_size);
983 solver_sequence.push_back(
984 std::make_shared<
decltype(node_level0_sizes)>(std::move(node_level0_sizes)));
987 if (solver_config.amr_mode.need_amr_level_compute()) {
989 node_amr_level.set_edges(
990 storage.block_counts,
992 storage.refs_block_min,
993 storage.refs_block_max,
994 storage.amr_block_levels);
995 solver_sequence.push_back(
996 std::make_shared<
decltype(node_amr_level)>(std::move(node_amr_level)));
999 if (solver_config.should_compute_rho_mean()) {
1002 storage.block_counts, storage.block_cell_sizes, storage.refs_rho, storage.cell_mass);
1003 solver_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1007 storage.block_counts, storage.cell_mass, storage.simulation_volume, storage.rho_mean);
1008 solver_sequence.push_back(std::make_shared<
decltype(node2)>(std::move(node2)));
1012 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> const_to_prim_sequence;
1017 storage.block_counts_with_ghost,
1024 const_to_prim_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1027 if (solver_config.is_dust_on()) {
1028 u32 ndust = solver_config.dust_config.ndust;
1031 storage.block_counts_with_ghost,
1032 storage.refs_rho_dust,
1033 storage.refs_rhov_dust,
1036 const_to_prim_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1040 "Cons to Prim", std::move(const_to_prim_sequence));
1041 solver_sequence.push_back(std::make_shared<
decltype(seq)>(std::move(seq)));
1046 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> grad_sequence;
1050 AMRBlock::block_size, 1, solver_config.slope_config};
1052 storage.block_counts_with_ghost,
1053 storage.cell_graph_edge,
1054 storage.block_cell_sizes,
1057 grad_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1062 AMRBlock::block_size, 1, solver_config.slope_config};
1064 storage.block_counts_with_ghost,
1065 storage.cell_graph_edge,
1066 storage.block_cell_sizes,
1071 grad_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1075 AMRBlock::block_size, 1, solver_config.slope_config};
1077 storage.block_counts_with_ghost,
1078 storage.cell_graph_edge,
1079 storage.block_cell_sizes,
1082 grad_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1085 if (solver_config.is_dust_on()) {
1086 u32 ndust = solver_config.dust_config.ndust;
1088 AMRBlock::block_size, ndust, solver_config.slope_config};
1090 storage.block_counts_with_ghost,
1091 storage.cell_graph_edge,
1092 storage.block_cell_sizes,
1093 storage.refs_rho_dust,
1094 storage.grad_rho_dust);
1095 grad_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1098 AMRBlock::block_size, ndust, solver_config.slope_config};
1100 storage.block_counts_with_ghost,
1101 storage.cell_graph_edge,
1102 storage.block_cell_sizes,
1107 grad_sequence.push_back(std::make_shared<
decltype(node2)>(std::move(node2)));
1111 "Slope limited gradients", std::move(grad_sequence));
1112 solver_sequence.push_back(std::make_shared<
decltype(seq)>(std::move(seq)));
1116 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> interp_sequence;
1121 storage.cell_graph_edge,
1122 storage.block_cell_sizes,
1123 storage.cell0block_aabb_lower,
1130 storage.rho_face_xp,
1131 storage.rho_face_xm,
1132 storage.rho_face_yp,
1133 storage.rho_face_ym,
1134 storage.rho_face_zp,
1135 storage.rho_face_zm);
1136 interp_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1143 storage.cell_graph_edge,
1144 storage.block_cell_sizes,
1145 storage.cell0block_aabb_lower,
1152 storage.vel_face_xp,
1153 storage.vel_face_xm,
1154 storage.vel_face_yp,
1155 storage.vel_face_ym,
1156 storage.vel_face_zp,
1157 storage.vel_face_zm);
1158 interp_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1163 AMRBlock::block_size, solver_config.eos_gamma};
1166 storage.cell_graph_edge,
1167 storage.block_cell_sizes,
1168 storage.cell0block_aabb_lower,
1175 storage.press_face_xp,
1176 storage.press_face_xm,
1177 storage.press_face_yp,
1178 storage.press_face_ym,
1179 storage.press_face_zp,
1180 storage.press_face_zm);
1181 interp_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1184 if (solver_config.is_dust_on()) {
1185 u32 ndust = solver_config.dust_config.ndust;
1189 storage.cell_graph_edge,
1190 storage.block_cell_sizes,
1191 storage.cell0block_aabb_lower,
1192 storage.refs_rho_dust,
1193 storage.grad_rho_dust,
1198 storage.rho_dust_face_xp,
1199 storage.rho_dust_face_xm,
1200 storage.rho_dust_face_yp,
1201 storage.rho_dust_face_ym,
1202 storage.rho_dust_face_zp,
1203 storage.rho_dust_face_zm);
1204 interp_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1207 if (solver_config.is_dust_on()) {
1208 u32 ndust = solver_config.dust_config.ndust;
1212 storage.cell_graph_edge,
1213 storage.block_cell_sizes,
1214 storage.cell0block_aabb_lower,
1215 storage.refs_rho_dust,
1220 storage.vel_dust_face_xp,
1221 storage.vel_dust_face_xm,
1222 storage.vel_dust_face_yp,
1223 storage.vel_dust_face_ym,
1224 storage.vel_dust_face_zp,
1225 storage.vel_dust_face_zm);
1226 interp_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1230 "Interpolate to face", std::move(interp_sequence));
1231 solver_sequence.push_back(std::make_shared<
decltype(seq)>(std::move(seq)));
1236 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> flux_sequence;
1238 if (solver_config.riemann_config == Rusanov) {
1242 solver_config.eos_gamma,
1243 storage.cell_graph_edge,
1244 storage.rho_face_xp,
1245 storage.rho_face_xm,
1246 storage.rho_face_yp,
1247 storage.rho_face_ym,
1248 storage.rho_face_zp,
1249 storage.rho_face_zm,
1250 storage.vel_face_xp,
1251 storage.vel_face_xm,
1252 storage.vel_face_yp,
1253 storage.vel_face_ym,
1254 storage.vel_face_zp,
1255 storage.vel_face_zm,
1256 storage.press_face_xp,
1257 storage.press_face_xm,
1258 storage.press_face_yp,
1259 storage.press_face_ym,
1260 storage.press_face_zp,
1261 storage.press_face_zm,
1262 storage.flux_rho_face_xp,
1263 storage.flux_rho_face_xm,
1264 storage.flux_rho_face_yp,
1265 storage.flux_rho_face_ym,
1266 storage.flux_rho_face_zp,
1267 storage.flux_rho_face_zm,
1268 storage.flux_rhov_face_xp,
1269 storage.flux_rhov_face_xm,
1270 storage.flux_rhov_face_yp,
1271 storage.flux_rhov_face_ym,
1272 storage.flux_rhov_face_zp,
1273 storage.flux_rhov_face_zm,
1274 storage.flux_rhoe_face_xp,
1275 storage.flux_rhoe_face_xm,
1276 storage.flux_rhoe_face_yp,
1277 storage.flux_rhoe_face_ym,
1278 storage.flux_rhoe_face_zp,
1279 storage.flux_rhoe_face_zm);
1280 flux_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1281 }
else if (solver_config.riemann_config == HLL) {
1284 solver_config.eos_gamma,
1285 storage.cell_graph_edge,
1286 storage.rho_face_xp,
1287 storage.rho_face_xm,
1288 storage.rho_face_yp,
1289 storage.rho_face_ym,
1290 storage.rho_face_zp,
1291 storage.rho_face_zm,
1292 storage.vel_face_xp,
1293 storage.vel_face_xm,
1294 storage.vel_face_yp,
1295 storage.vel_face_ym,
1296 storage.vel_face_zp,
1297 storage.vel_face_zm,
1298 storage.press_face_xp,
1299 storage.press_face_xm,
1300 storage.press_face_yp,
1301 storage.press_face_ym,
1302 storage.press_face_zp,
1303 storage.press_face_zm,
1304 storage.flux_rho_face_xp,
1305 storage.flux_rho_face_xm,
1306 storage.flux_rho_face_yp,
1307 storage.flux_rho_face_ym,
1308 storage.flux_rho_face_zp,
1309 storage.flux_rho_face_zm,
1310 storage.flux_rhov_face_xp,
1311 storage.flux_rhov_face_xm,
1312 storage.flux_rhov_face_yp,
1313 storage.flux_rhov_face_ym,
1314 storage.flux_rhov_face_zp,
1315 storage.flux_rhov_face_zm,
1316 storage.flux_rhoe_face_xp,
1317 storage.flux_rhoe_face_xm,
1318 storage.flux_rhoe_face_yp,
1319 storage.flux_rhoe_face_ym,
1320 storage.flux_rhoe_face_zp,
1321 storage.flux_rhoe_face_zm);
1322 flux_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1323 }
else if (solver_config.riemann_config == HLLC) {
1326 solver_config.eos_gamma,
1327 storage.cell_graph_edge,
1328 storage.rho_face_xp,
1329 storage.rho_face_xm,
1330 storage.rho_face_yp,
1331 storage.rho_face_ym,
1332 storage.rho_face_zp,
1333 storage.rho_face_zm,
1334 storage.vel_face_xp,
1335 storage.vel_face_xm,
1336 storage.vel_face_yp,
1337 storage.vel_face_ym,
1338 storage.vel_face_zp,
1339 storage.vel_face_zm,
1340 storage.press_face_xp,
1341 storage.press_face_xm,
1342 storage.press_face_yp,
1343 storage.press_face_ym,
1344 storage.press_face_zp,
1345 storage.press_face_zm,
1346 storage.flux_rho_face_xp,
1347 storage.flux_rho_face_xm,
1348 storage.flux_rho_face_yp,
1349 storage.flux_rho_face_ym,
1350 storage.flux_rho_face_zp,
1351 storage.flux_rho_face_zm,
1352 storage.flux_rhov_face_xp,
1353 storage.flux_rhov_face_xm,
1354 storage.flux_rhov_face_yp,
1355 storage.flux_rhov_face_ym,
1356 storage.flux_rhov_face_zp,
1357 storage.flux_rhov_face_zm,
1358 storage.flux_rhoe_face_xp,
1359 storage.flux_rhoe_face_xm,
1360 storage.flux_rhoe_face_yp,
1361 storage.flux_rhoe_face_ym,
1362 storage.flux_rhoe_face_zp,
1363 storage.flux_rhoe_face_zm);
1364 flux_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1369 if (solver_config.is_dust_on()) {
1370 u32 ndust = solver_config.dust_config.ndust;
1371 if (solver_config.dust_config.dust_riemann_config ==
DHLL) {
1373 NodeComputeFluxDustMode<Tvec, TgridVec, modules::DustRiemannSolverMode::DHLL>
1375 "Dust flux compute",
1377 storage.cell_graph_edge,
1378 storage.rho_dust_face_xp,
1379 storage.rho_dust_face_xm,
1380 storage.rho_dust_face_yp,
1381 storage.rho_dust_face_ym,
1382 storage.rho_dust_face_zp,
1383 storage.rho_dust_face_zm,
1384 storage.vel_dust_face_xp,
1385 storage.vel_dust_face_xm,
1386 storage.vel_dust_face_yp,
1387 storage.vel_dust_face_ym,
1388 storage.vel_dust_face_zp,
1389 storage.vel_dust_face_zm,
1390 storage.flux_rho_dust_face_xp,
1391 storage.flux_rho_dust_face_xm,
1392 storage.flux_rho_dust_face_yp,
1393 storage.flux_rho_dust_face_ym,
1394 storage.flux_rho_dust_face_zp,
1395 storage.flux_rho_dust_face_zm,
1396 storage.flux_rhov_dust_face_xp,
1397 storage.flux_rhov_dust_face_xm,
1398 storage.flux_rhov_dust_face_yp,
1399 storage.flux_rhov_dust_face_ym,
1400 storage.flux_rhov_dust_face_zp,
1401 storage.flux_rhov_dust_face_zm);
1402 flux_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1403 }
else if (solver_config.dust_config.dust_riemann_config ==
HB) {
1406 "Dust flux compute",
1408 storage.cell_graph_edge,
1409 storage.rho_dust_face_xp,
1410 storage.rho_dust_face_xm,
1411 storage.rho_dust_face_yp,
1412 storage.rho_dust_face_ym,
1413 storage.rho_dust_face_zp,
1414 storage.rho_dust_face_zm,
1415 storage.vel_dust_face_xp,
1416 storage.vel_dust_face_xm,
1417 storage.vel_dust_face_yp,
1418 storage.vel_dust_face_ym,
1419 storage.vel_dust_face_zp,
1420 storage.vel_dust_face_zm,
1421 storage.flux_rho_dust_face_xp,
1422 storage.flux_rho_dust_face_xm,
1423 storage.flux_rho_dust_face_yp,
1424 storage.flux_rho_dust_face_ym,
1425 storage.flux_rho_dust_face_zp,
1426 storage.flux_rho_dust_face_zm,
1427 storage.flux_rhov_dust_face_xp,
1428 storage.flux_rhov_dust_face_xm,
1429 storage.flux_rhov_dust_face_yp,
1430 storage.flux_rhov_dust_face_ym,
1431 storage.flux_rhov_dust_face_zp,
1432 storage.flux_rhov_dust_face_zm);
1433 flux_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1440 solver_sequence.push_back(std::make_shared<
decltype(seq)>(std::move(seq)));
1445 AMRBlock::block_size, solver_config.grid_coord_to_pos_fact};
1447 storage.block_counts,
1448 storage.cell_graph_edge,
1449 storage.block_cell_sizes,
1450 storage.cell0block_aabb_lower,
1451 storage.flux_rho_face_xp,
1452 storage.flux_rho_face_xm,
1453 storage.flux_rho_face_yp,
1454 storage.flux_rho_face_ym,
1455 storage.flux_rho_face_zp,
1456 storage.flux_rho_face_zm,
1457 storage.flux_rhov_face_xp,
1458 storage.flux_rhov_face_xm,
1459 storage.flux_rhov_face_yp,
1460 storage.flux_rhov_face_ym,
1461 storage.flux_rhov_face_zp,
1462 storage.flux_rhov_face_zm,
1463 storage.flux_rhoe_face_xp,
1464 storage.flux_rhoe_face_xm,
1465 storage.flux_rhoe_face_yp,
1466 storage.flux_rhoe_face_ym,
1467 storage.flux_rhoe_face_zp,
1468 storage.flux_rhoe_face_zm,
1472 solver_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1475 if (solver_config.is_dust_on()) {
1477 AMRBlock::block_size,
1478 solver_config.grid_coord_to_pos_fact,
1479 solver_config.dust_config.ndust};
1481 storage.block_counts,
1482 storage.cell_graph_edge,
1483 storage.block_cell_sizes,
1484 storage.cell0block_aabb_lower,
1485 storage.flux_rho_dust_face_xp,
1486 storage.flux_rho_dust_face_xm,
1487 storage.flux_rho_dust_face_yp,
1488 storage.flux_rho_dust_face_ym,
1489 storage.flux_rho_dust_face_zp,
1490 storage.flux_rho_dust_face_zm,
1491 storage.flux_rhov_dust_face_xp,
1492 storage.flux_rhov_dust_face_xm,
1493 storage.flux_rhov_dust_face_yp,
1494 storage.flux_rhov_dust_face_ym,
1495 storage.flux_rhov_dust_face_zp,
1496 storage.flux_rhov_dust_face_zm,
1498 storage.dtrhov_dust);
1499 solver_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1503 storage.solver_sequence = std::make_shared<decltype(seq)>(std::move(seq));