275 bool enable_mem_free =
false;
277 auto get_optional_free_mem = [&](
auto &bind_to,
auto &add_to) {
278 if (enable_mem_free) {
280 node.set_edges(bind_to);
281 add_to.push_back(std::make_shared<
decltype(node)>(std::move(node)));
286 storage.ghost_layout = std::make_shared<shamrock::patch::PatchDataLayerLayout>();
290 ghost_layout.
add_field<TgridVec>(
"cell_min", 1);
291 ghost_layout.
add_field<TgridVec>(
"cell_max", 1);
292 ghost_layout.
add_field<Tscal>(
"rho", AMRBlock::block_size);
293 ghost_layout.
add_field<Tscal>(
"rhoetot", AMRBlock::block_size);
294 ghost_layout.
add_field<Tvec>(
"rhovel", AMRBlock::block_size);
296 if (solver_config.is_dust_on()) {
297 auto ndust = solver_config.dust_config.ndust;
298 ghost_layout.
add_field<Tscal>(
"rho_dust", ndust * AMRBlock::block_size);
299 ghost_layout.
add_field<Tvec>(
"rhovel_dust", ndust * AMRBlock::block_size);
302 if (solver_config.is_gravity_on()) {
303 ghost_layout.
add_field<Tscal>(
"phi", AMRBlock::block_size);
306 if (solver_config.is_gas_passive_scalar_on()) {
307 u32 npscal_gas = solver_config.npscal_gas_config.npscal_gas;
308 ghost_layout.
add_field<Tscal>(
"rho_gas_pscal", npscal_gas * AMRBlock::block_size);
316 using namespace shamrock::solvergraph;
323 "global_patch_boxes",
329 edge.
patch_tree = std::ref(storage.serial_patch_tree.get());
335 storage.local_patch_ids
336 = std::make_shared<shamrock::solvergraph::IDataEdge<std::vector<u64>>>(
"",
"");
339 = std::make_shared<shamrock::solvergraph::ScalarEdge<shammath::AABB<TgridVec>>>(
340 "sim_box",
"sim_box");
342 storage.exchange_gz_edge = std::make_shared<shamrock::solvergraph::PatchDataLayerDDShared>(
343 "exchange_gz_edge",
"exchange_gz_edge");
345 storage.idx_in_ghost = std::make_shared<shamrock::solvergraph::DDSharedBuffers<u32>>(
346 "idx_in_ghost",
"idx_in_ghost");
348 storage.ghost_layers_candidates_edge = std::make_shared<
350 "ghost_layers_candidates",
"ghost_layers_candidates");
352 storage.patch_rank_owner = std::make_shared<shamrock::solvergraph::RankGetter>(
353 [&](
u64 patch_id) ->
u32 {
354 return scheduler().get_patch_rank_owner(patch_id);
359 storage.source_patches = std::make_shared<shamrock::solvergraph::PatchDataLayerRefs>(
360 "source_patches",
"P_{\\rm source}");
362 storage.merged_patchdata_ghost = std::make_shared<shamrock::solvergraph::PatchDataLayerEdge>(
363 "merged_patchdata_ghost",
"patchdata_{\\rm ghost}", storage.ghost_layout);
366 = std::make_shared<shamrock::solvergraph::Indexes<u32>>(
"block_count",
"N_{\\rm block}");
368 storage.block_counts_with_ghost = std::make_shared<shamrock::solvergraph::Indexes<u32>>(
369 "block_count_with_ghost",
"N_{\\rm block, with ghost}");
372 storage.refs_block_min = std::make_shared<shamrock::solvergraph::FieldRefs<TgridVec>>(
373 "block_min",
"\\mathbf{r}_{\\rm block, min}");
374 storage.refs_block_max = std::make_shared<shamrock::solvergraph::FieldRefs<TgridVec>>(
375 "block_max",
"\\mathbf{r}_{\\rm block, max}");
377 storage.refs_rho = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"rho",
"\\rho");
379 = std::make_shared<shamrock::solvergraph::FieldRefs<Tvec>>(
"rhovel",
"(\\rho \\mathbf{v})");
381 = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
"rhoetot",
"(\\rho E)");
383 if (solver_config.is_dust_on()) {
384 storage.refs_rho_dust = std::make_shared<shamrock::solvergraph::FieldRefs<Tscal>>(
385 "rho_dust",
"\\rho_{\\rm dust}");
386 storage.refs_rhov_dust = std::make_shared<shamrock::solvergraph::FieldRefs<Tvec>>(
387 "rhovel_dust",
"(\\rho_{\\rm dust} \\mathbf{v}_{\\rm dust})");
391 storage.vel = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
392 AMRBlock::block_size,
"vel",
"\\mathbf{v}");
394 = std::make_shared<shamrock::solvergraph::Field<Tscal>>(AMRBlock::block_size,
"P",
"P");
396 if (solver_config.is_dust_on()) {
397 u32 ndust = solver_config.dust_config.ndust;
400 storage.vel_dust = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
401 AMRBlock::block_size * ndust,
"vel_dust",
"{\\mathbf{v}_{\\rm dust}}");
405 = std::make_shared<solvergraph::TreeEdge<u_morton, TgridVec>>(
"trees",
"\\text{trees}");
407 storage.block_graph_edge = std::make_shared<
409 "block_graph_edge",
"\\text{block graph edge}");
411 storage.cell_graph_edge = std::make_shared<
413 "cell_graph_edge",
"\\text{cell graph edge}");
416 storage.block_cell_sizes = std::make_shared<shamrock::solvergraph::Field<Tscal>>(
417 1,
"block_cell_sizes",
"s_{\\rm cell}");
418 storage.cell0block_aabb_lower = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
419 1,
"cell0block_aabb_lower",
"\\mathbf{s}_{\\rm inf,block}");
421 if (solver_config.is_coordinate_field_required()) {
423 storage.coordinates = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
424 AMRBlock::block_size,
"coordinates",
"\\mathbf{xyz}");
427 if (solver_config.amr_mode.need_level_zero_compute()) {
429 storage.level0_size = std::make_shared<shamrock::solvergraph::ScalarsEdge<TgridVec>>(
430 "level0_amr",
"level0_amr");
433 storage.grad_rho = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
434 AMRBlock::block_size,
"grad_rho",
"\\nabla \\rho");
435 storage.dx_v = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
436 AMRBlock::block_size,
"dx_v",
"\\nabla_x \\mathbf{v}");
437 storage.dy_v = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
438 AMRBlock::block_size,
"dy_v",
"\\nabla_y \\mathbf{v}");
439 storage.dz_v = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
440 AMRBlock::block_size,
"dz_v",
"\\nabla_z \\mathbf{v}");
441 storage.grad_P = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
442 AMRBlock::block_size,
"grad_P",
"\\nabla P");
444 if (solver_config.is_dust_on()) {
445 u32 ndust = solver_config.dust_config.ndust;
446 storage.grad_rho_dust = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
447 AMRBlock::block_size * ndust,
"grad_rho_dust",
"\\nabla \\rho_{\\rm dust}");
448 storage.dx_v_dust = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
449 AMRBlock::block_size * ndust,
"dx_v_dust",
"\\nabla_x \\mathbf{v}_{\\rm dust}");
450 storage.dy_v_dust = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
451 AMRBlock::block_size * ndust,
"dy_v_dust",
"\\nabla_y \\mathbf{v}_{\\rm dust}");
452 storage.dz_v_dust = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
453 AMRBlock::block_size * ndust,
"dz_v_dust",
"\\nabla_z \\mathbf{v}_{\\rm dust}");
459 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
460 "rho_face_xp",
"rho_face_xp", 1);
462 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
463 "rho_face_xm",
"rho_face_xm", 1);
465 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
466 "rho_face_yp",
"rho_face_yp", 1);
468 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
469 "rho_face_ym",
"rho_face_ym", 1);
471 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
472 "rho_face_zp",
"rho_face_zp", 1);
474 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
475 "rho_face_zm",
"rho_face_zm", 1);
478 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
479 "vel_face_xp",
"vel_face_xp", 1);
481 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
482 "vel_face_xm",
"vel_face_xm", 1);
484 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
485 "vel_face_yp",
"vel_face_yp", 1);
487 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
488 "vel_face_ym",
"vel_face_ym", 1);
490 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
491 "vel_face_zp",
"vel_face_zp", 1);
493 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
494 "vel_face_zm",
"vel_face_zm", 1);
496 storage.press_face_xp
497 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
498 "press_face_xp",
"press_face_xp", 1);
499 storage.press_face_xm
500 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
501 "press_face_xm",
"press_face_xm", 1);
502 storage.press_face_yp
503 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
504 "press_face_yp",
"press_face_yp", 1);
505 storage.press_face_ym
506 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
507 "press_face_ym",
"press_face_ym", 1);
508 storage.press_face_zp
509 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
510 "press_face_zp",
"press_face_zp", 1);
511 storage.press_face_zm
512 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
513 "press_face_zm",
"press_face_zm", 1);
516 if (solver_config.is_dust_on()) {
517 u32 ndust = solver_config.dust_config.ndust;
519 storage.rho_dust_face_xp
520 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
521 "rho_dust_face_xp",
"rho_dust_face_xp", ndust);
522 storage.rho_dust_face_xm
523 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
524 "rho_dust_face_xm",
"rho_dust_face_xm", ndust);
525 storage.rho_dust_face_yp
526 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
527 "rho_dust_face_yp",
"rho_dust_face_yp", ndust);
528 storage.rho_dust_face_ym
529 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
530 "rho_dust_face_ym",
"rho_dust_face_ym", ndust);
531 storage.rho_dust_face_zp
532 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
533 "rho_dust_face_zp",
"rho_dust_face_zp", ndust);
534 storage.rho_dust_face_zm
535 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(
536 "rho_dust_face_zm",
"rho_dust_face_zm", ndust);
538 storage.vel_dust_face_xp
539 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
540 "vel_dust_face_xp",
"vel_dust_face_xp", ndust);
541 storage.vel_dust_face_xm
542 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
543 "vel_dust_face_xm",
"vel_dust_face_xm", ndust);
544 storage.vel_dust_face_yp
545 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
546 "vel_dust_face_yp",
"vel_dust_face_yp", ndust);
547 storage.vel_dust_face_ym
548 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
549 "vel_dust_face_ym",
"vel_dust_face_ym", ndust);
550 storage.vel_dust_face_zp
551 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
552 "vel_dust_face_zp",
"vel_dust_face_zp", ndust);
553 storage.vel_dust_face_zm
554 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(
555 "vel_dust_face_zm",
"vel_dust_face_zm", ndust);
558 if (solver_config.should_compute_rho_mean()) {
559 storage.cell_mass = std::make_shared<shamrock::solvergraph::Field<Tscal>>(
560 AMRBlock::block_size,
"cell_mass",
"m");
562 = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
"rho_mean",
"< \\rho >");
563 storage.simulation_volume = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
564 "simulation_volume",
"V_{\\rm sim}");
568 = std::make_shared<shamrock::solvergraph::ScalarEdge<Tscal>>(
"dt_half",
"dt_{half}");
572 storage.flux_rho_face_xm = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
573 "flux_rho_face_xm",
"flux_rho_face_xm", 1);
575 storage.flux_rho_face_xp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
576 "flux_rho_face_xp",
"flux_rho_face_xp", 1);
578 storage.flux_rho_face_ym = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
579 "flux_rho_face_ym",
"flux_rho_face_ym", 1);
581 storage.flux_rho_face_yp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
582 "flux_rho_face_yp",
"flux_rho_face_yp", 1);
584 storage.flux_rho_face_zm = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
585 "flux_rho_face_zm",
"flux_rho_face_zm", 1);
587 storage.flux_rho_face_zp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
588 "flux_rho_face_zp",
"flux_rho_face_zp", 1);
590 storage.flux_rhov_face_xm = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
591 "flux_rhov_face_xm",
"flux_rhov_face_xm", 1);
593 storage.flux_rhov_face_xp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
594 "flux_rhov_face_xp",
"flux_rhov_face_xp", 1);
596 storage.flux_rhov_face_ym = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
597 "flux_rhov_face_ym",
"flux_rhov_face_ym", 1);
599 storage.flux_rhov_face_yp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
600 "flux_rhov_face_yp",
"flux_rhov_face_yp", 1);
602 storage.flux_rhov_face_zm = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
603 "flux_rhov_face_zm",
"flux_rhov_face_zm", 1);
605 storage.flux_rhov_face_zp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
606 "flux_rhov_face_zp",
"flux_rhov_face_zp", 1);
608 storage.flux_rhoe_face_xm = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
609 "flux_rhoe_face_xm",
"flux_rhoe_face_xm", 1);
611 storage.flux_rhoe_face_xp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
612 "flux_rhoe_face_xp",
"flux_rhoe_face_xp", 1);
614 storage.flux_rhoe_face_ym = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
615 "flux_rhoe_face_ym",
"flux_rhoe_face_ym", 1);
617 storage.flux_rhoe_face_yp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
618 "flux_rhoe_face_yp",
"flux_rhoe_face_yp", 1);
620 storage.flux_rhoe_face_zm = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
621 "flux_rhoe_face_zm",
"flux_rhoe_face_zm", 1);
623 storage.flux_rhoe_face_zp = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
624 "flux_rhoe_face_zp",
"flux_rhoe_face_zp", 1);
627 if (solver_config.is_dust_on()) {
628 u32 ndust = solver_config.dust_config.ndust;
630 storage.flux_rho_dust_face_xm
631 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
632 "flux_rho_dust_face_xm",
"flux_rho_dust_face_xm", ndust);
634 storage.flux_rho_dust_face_xp
635 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
636 "flux_rho_dust_face_xp",
"flux_rho_dust_face_xp", ndust);
638 storage.flux_rho_dust_face_ym
639 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
640 "flux_rho_dust_face_ym",
"flux_rho_dust_face_ym", ndust);
642 storage.flux_rho_dust_face_yp
643 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
644 "flux_rho_dust_face_yp",
"flux_rho_dust_face_yp", ndust);
646 storage.flux_rho_dust_face_zm
647 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
648 "flux_rho_dust_face_zm",
"flux_rho_dust_face_zm", ndust);
650 storage.flux_rho_dust_face_zp
651 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tscal>>(
652 "flux_rho_dust_face_zp",
"flux_rho_dust_face_zp", ndust);
654 storage.flux_rhov_dust_face_xm
655 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
656 "flux_rhov_dust_face_xm",
"flux_rhov_dust_face_xm", ndust);
658 storage.flux_rhov_dust_face_xp
659 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
660 "flux_rhov_dust_face_xp",
"flux_rhov_dust_face_xp", ndust);
662 storage.flux_rhov_dust_face_ym
663 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
664 "flux_rhov_dust_face_ym",
"flux_rhov_dust_face_ym", ndust);
666 storage.flux_rhov_dust_face_yp
667 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
668 "flux_rhov_dust_face_yp",
"flux_rhov_dust_face_yp", ndust);
670 storage.flux_rhov_dust_face_zm
671 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
672 "flux_rhov_dust_face_zm",
"flux_rhov_dust_face_zm", ndust);
674 storage.flux_rhov_dust_face_zp
675 = std::make_shared<solvergraph::NeighGraphLinkFieldEdge<Tvec>>(
676 "flux_rhov_dust_face_zp",
"flux_rhov_dust_face_zp", ndust);
679 storage.dtrho = std::make_shared<shamrock::solvergraph::Field<Tscal>>(
680 AMRBlock::block_size,
"dtrho",
"dtrho");
681 storage.dtrhov = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
682 AMRBlock::block_size,
"dtrhov",
"dtrhov");
683 storage.dtrhoe = std::make_shared<shamrock::solvergraph::Field<Tscal>>(
684 AMRBlock::block_size,
"dtrhoe",
"dtrhoe");
686 if (solver_config.is_dust_on()) {
687 u32 ndust = solver_config.dust_config.ndust;
688 storage.dtrho_dust = std::make_shared<shamrock::solvergraph::Field<Tscal>>(
689 AMRBlock::block_size * ndust,
"dtrho_dust",
"dtrho_dust");
690 storage.dtrhov_dust = std::make_shared<shamrock::solvergraph::Field<Tvec>>(
691 AMRBlock::block_size * ndust,
"dtrhov_dust",
"dtrhov_dust");
697 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> solver_sequence;
701 auto cfg_bc_to_geom = [](BCConfig::GhostType ghost_type) {
702 switch (ghost_type) {
703 case BCConfig::GhostType::Periodic :
return modules::GhostType::Periodic;
704 case BCConfig::GhostType::Reflective:
return modules::GhostType::Reflective;
705 case BCConfig::GhostType::Outflow :
return modules::GhostType::Reflective;
708 "Unsupported ghost type: " + std::to_string(
static_cast<int>(ghost_type)));
713 cfg_bc_to_geom(solver_config.bc_config.get_x()),
714 cfg_bc_to_geom(solver_config.bc_config.get_y()),
715 cfg_bc_to_geom(solver_config.bc_config.get_z())};
718 bool transform_vec_x = solver_config.bc_config.get_x() != BCConfig::GhostType::Outflow;
719 bool transform_vec_y = solver_config.bc_config.get_y() != BCConfig::GhostType::Outflow;
720 bool transform_vec_z = solver_config.bc_config.get_z() != BCConfig::GhostType::Outflow;
725 ghost_layer_gen_mode);
726 find_ghost_layer_candidates.set_edges(
727 storage.local_patch_ids,
728 storage.sim_box_edge,
731 storage.ghost_layers_candidates_edge);
732 solver_sequence.push_back(
733 std::make_shared<
decltype(find_ghost_layer_candidates)>(
734 std::move(find_ghost_layer_candidates)));
737 find_ghost_layer_indices.set_edges(
738 storage.sim_box_edge,
739 storage.source_patches,
740 storage.ghost_layers_candidates_edge,
742 storage.idx_in_ghost);
743 solver_sequence.push_back(
744 std::make_shared<
decltype(find_ghost_layer_indices)>(
745 std::move(find_ghost_layer_indices)));
749 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> gz_xchg_sequence;
751 auto &ghost_layout_ptr = storage.ghost_layout;
753 auto copy_fields = std::make_shared<shamrock::solvergraph::CopyPatchDataLayerFields>(
754 scheduler().get_layout_ptr_old(), ghost_layout_ptr);
756 copy_fields->set_edges(storage.source_patches, storage.merged_patchdata_ghost);
757 gz_xchg_sequence.push_back(std::move(copy_fields));
762 = std::make_shared<shammodels::basegodunov::modules::ExtractGhostLayer>(
765 extract_gz_node->set_edges(
766 storage.merged_patchdata_ghost, storage.idx_in_ghost, storage.exchange_gz_edge);
767 gz_xchg_sequence.push_back(std::move(extract_gz_node));
771 auto transform_gz_node = std::make_shared<
773 ghost_layer_gen_mode,
779 transform_gz_node->set_edges(
780 storage.sim_box_edge,
781 storage.ghost_layers_candidates_edge,
782 storage.exchange_gz_edge);
783 gz_xchg_sequence.push_back(std::move(transform_gz_node));
787 auto exchange_gz_node
788 = std::make_shared<shamrock::solvergraph::ExchangeGhostLayer>(ghost_layout_ptr);
789 exchange_gz_node->set_edges(storage.patch_rank_owner, storage.exchange_gz_edge);
790 gz_xchg_sequence.push_back(std::move(exchange_gz_node));
795 = std::make_shared<shammodels::basegodunov::modules::FuseGhostLayer>();
796 fuse_gz_node->set_edges(storage.exchange_gz_edge, storage.merged_patchdata_ghost);
797 gz_xchg_sequence.push_back(std::move(fuse_gz_node));
814 "Ghost zone exchange", std::move(gz_xchg_sequence));
815 solver_sequence.push_back(std::make_shared<
decltype(seq)>(std::move(seq)));
823 extract_counts_node.set_edges(storage.source_patches, storage.block_counts);
824 solver_sequence.push_back(
825 std::make_shared<
decltype(extract_counts_node)>(std::move(extract_counts_node)));
831 extract_counts_node.set_edges(
832 storage.merged_patchdata_ghost, storage.block_counts_with_ghost);
833 solver_sequence.push_back(
834 std::make_shared<
decltype(extract_counts_node)>(std::move(extract_counts_node)));
840 attach_block_min.set_edges(storage.merged_patchdata_ghost, storage.refs_block_min);
841 solver_sequence.push_back(
842 std::make_shared<
decltype(attach_block_min)>(std::move(attach_block_min)));
846 attach_block_max.set_edges(storage.merged_patchdata_ghost, storage.refs_block_max);
847 solver_sequence.push_back(
848 std::make_shared<
decltype(attach_block_max)>(std::move(attach_block_max)));
854 attach_rho.set_edges(storage.merged_patchdata_ghost, storage.refs_rho);
855 solver_sequence.push_back(
856 std::make_shared<
decltype(attach_rho)>(std::move(attach_rho)));
860 attach_rhov.set_edges(storage.merged_patchdata_ghost, storage.refs_rhov);
861 solver_sequence.push_back(
862 std::make_shared<
decltype(attach_rhov)>(std::move(attach_rhov)));
866 storage.ghost_layout,
"rhoetot");
867 attach_rhoe.set_edges(storage.merged_patchdata_ghost, storage.refs_rhoe);
868 solver_sequence.push_back(
869 std::make_shared<
decltype(attach_rhoe)>(std::move(attach_rhoe)));
872 if (solver_config.is_dust_on()) {
875 storage.ghost_layout,
"rho_dust");
876 attach_rho_dust.set_edges(storage.merged_patchdata_ghost, storage.refs_rho_dust);
877 solver_sequence.push_back(
878 std::make_shared<
decltype(attach_rho_dust)>(std::move(attach_rho_dust)));
882 storage.ghost_layout,
"rhovel_dust");
883 attach_rhov_dust.set_edges(storage.merged_patchdata_ghost, storage.refs_rhov_dust);
884 solver_sequence.push_back(
885 std::make_shared<
decltype(attach_rhov_dust)>(std::move(attach_rhov_dust)));
893 storage.block_counts_with_ghost,
894 storage.refs_block_min,
895 storage.refs_block_max,
898 solver_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
902 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> neigh_table_sequence;
906 storage.block_counts_with_ghost,
907 storage.refs_block_min,
908 storage.refs_block_max,
910 storage.block_graph_edge);
915 storage.block_counts_with_ghost,
916 storage.refs_block_min,
917 storage.refs_block_max,
918 storage.block_graph_edge,
919 storage.cell_graph_edge);
922 neigh_table_sequence.push_back(std::make_shared<
decltype(node1)>(std::move(node1)));
923 get_optional_free_mem(storage.trees, neigh_table_sequence);
924 neigh_table_sequence.push_back(std::make_shared<
decltype(node2)>(std::move(node2)));
925 get_optional_free_mem(storage.block_graph_edge, neigh_table_sequence);
928 "Compute neigh table", std::move(neigh_table_sequence));
929 solver_sequence.push_back(std::make_shared<
decltype(seq)>(std::move(seq)));
935 AMRBlock::Nside, solver_config.grid_coord_to_pos_fact};
938 storage.block_counts_with_ghost,
939 storage.refs_block_min,
940 storage.refs_block_max,
941 storage.block_cell_sizes,
942 storage.cell0block_aabb_lower);
943 solver_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
946 if (solver_config.is_coordinate_field_required()) {
949 AMRBlock::block_size,
951 solver_config.grid_coord_to_pos_fact,
954 node_coordinates.set_edges(
955 storage.block_counts,
956 storage.refs_block_min,
957 storage.refs_block_max,
958 storage.coordinates);
960 solver_sequence.push_back(
961 std::make_shared<
decltype(node_coordinates)>(std::move(node_coordinates)));
964 if (solver_config.amr_mode.need_level_zero_compute()) {
967 node_level0_sizes.set_edges(
969 storage.source_patches,
970 storage.level0_size);
971 solver_sequence.push_back(
972 std::make_shared<
decltype(node_level0_sizes)>(std::move(node_level0_sizes)));
975 if (solver_config.amr_mode.need_amr_level_compute()) {
977 node_amr_level.set_edges(
978 storage.block_counts,
980 storage.refs_block_min,
981 storage.refs_block_max,
982 storage.amr_block_levels);
983 solver_sequence.push_back(
984 std::make_shared<
decltype(node_amr_level)>(std::move(node_amr_level)));
987 if (solver_config.should_compute_rho_mean()) {
990 storage.block_counts, storage.block_cell_sizes, storage.refs_rho, storage.cell_mass);
991 solver_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
995 storage.block_counts, storage.cell_mass, storage.simulation_volume, storage.rho_mean);
996 solver_sequence.push_back(std::make_shared<
decltype(node2)>(std::move(node2)));
1000 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> const_to_prim_sequence;
1005 storage.block_counts_with_ghost,
1012 const_to_prim_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1015 if (solver_config.is_dust_on()) {
1016 u32 ndust = solver_config.dust_config.ndust;
1019 storage.block_counts_with_ghost,
1020 storage.refs_rho_dust,
1021 storage.refs_rhov_dust,
1024 const_to_prim_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1028 "Cons to Prim", std::move(const_to_prim_sequence));
1029 solver_sequence.push_back(std::make_shared<
decltype(seq)>(std::move(seq)));
1034 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> grad_sequence;
1038 AMRBlock::block_size, 1, solver_config.slope_config};
1040 storage.block_counts_with_ghost,
1041 storage.cell_graph_edge,
1042 storage.block_cell_sizes,
1045 grad_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
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,
1059 grad_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1063 AMRBlock::block_size, 1, solver_config.slope_config};
1065 storage.block_counts_with_ghost,
1066 storage.cell_graph_edge,
1067 storage.block_cell_sizes,
1070 grad_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1073 if (solver_config.is_dust_on()) {
1074 u32 ndust = solver_config.dust_config.ndust;
1076 AMRBlock::block_size, ndust, solver_config.slope_config};
1078 storage.block_counts_with_ghost,
1079 storage.cell_graph_edge,
1080 storage.block_cell_sizes,
1081 storage.refs_rho_dust,
1082 storage.grad_rho_dust);
1083 grad_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1086 AMRBlock::block_size, ndust, solver_config.slope_config};
1088 storage.block_counts_with_ghost,
1089 storage.cell_graph_edge,
1090 storage.block_cell_sizes,
1095 grad_sequence.push_back(std::make_shared<
decltype(node2)>(std::move(node2)));
1099 "Slope limited gradients", std::move(grad_sequence));
1100 solver_sequence.push_back(std::make_shared<
decltype(seq)>(std::move(seq)));
1104 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> interp_sequence;
1109 storage.cell_graph_edge,
1110 storage.block_cell_sizes,
1111 storage.cell0block_aabb_lower,
1118 storage.rho_face_xp,
1119 storage.rho_face_xm,
1120 storage.rho_face_yp,
1121 storage.rho_face_ym,
1122 storage.rho_face_zp,
1123 storage.rho_face_zm);
1124 interp_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1131 storage.cell_graph_edge,
1132 storage.block_cell_sizes,
1133 storage.cell0block_aabb_lower,
1140 storage.vel_face_xp,
1141 storage.vel_face_xm,
1142 storage.vel_face_yp,
1143 storage.vel_face_ym,
1144 storage.vel_face_zp,
1145 storage.vel_face_zm);
1146 interp_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1151 AMRBlock::block_size, solver_config.eos_gamma};
1154 storage.cell_graph_edge,
1155 storage.block_cell_sizes,
1156 storage.cell0block_aabb_lower,
1163 storage.press_face_xp,
1164 storage.press_face_xm,
1165 storage.press_face_yp,
1166 storage.press_face_ym,
1167 storage.press_face_zp,
1168 storage.press_face_zm);
1169 interp_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1172 if (solver_config.is_dust_on()) {
1173 u32 ndust = solver_config.dust_config.ndust;
1177 storage.cell_graph_edge,
1178 storage.block_cell_sizes,
1179 storage.cell0block_aabb_lower,
1180 storage.refs_rho_dust,
1181 storage.grad_rho_dust,
1186 storage.rho_dust_face_xp,
1187 storage.rho_dust_face_xm,
1188 storage.rho_dust_face_yp,
1189 storage.rho_dust_face_ym,
1190 storage.rho_dust_face_zp,
1191 storage.rho_dust_face_zm);
1192 interp_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1195 if (solver_config.is_dust_on()) {
1196 u32 ndust = solver_config.dust_config.ndust;
1200 storage.cell_graph_edge,
1201 storage.block_cell_sizes,
1202 storage.cell0block_aabb_lower,
1203 storage.refs_rho_dust,
1208 storage.vel_dust_face_xp,
1209 storage.vel_dust_face_xm,
1210 storage.vel_dust_face_yp,
1211 storage.vel_dust_face_ym,
1212 storage.vel_dust_face_zp,
1213 storage.vel_dust_face_zm);
1214 interp_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1218 "Interpolate to face", std::move(interp_sequence));
1219 solver_sequence.push_back(std::make_shared<
decltype(seq)>(std::move(seq)));
1224 std::vector<std::shared_ptr<shamrock::solvergraph::INode>> flux_sequence;
1226 if (solver_config.riemann_config == Rusanov) {
1230 solver_config.eos_gamma,
1231 storage.cell_graph_edge,
1232 storage.rho_face_xp,
1233 storage.rho_face_xm,
1234 storage.rho_face_yp,
1235 storage.rho_face_ym,
1236 storage.rho_face_zp,
1237 storage.rho_face_zm,
1238 storage.vel_face_xp,
1239 storage.vel_face_xm,
1240 storage.vel_face_yp,
1241 storage.vel_face_ym,
1242 storage.vel_face_zp,
1243 storage.vel_face_zm,
1244 storage.press_face_xp,
1245 storage.press_face_xm,
1246 storage.press_face_yp,
1247 storage.press_face_ym,
1248 storage.press_face_zp,
1249 storage.press_face_zm,
1250 storage.flux_rho_face_xp,
1251 storage.flux_rho_face_xm,
1252 storage.flux_rho_face_yp,
1253 storage.flux_rho_face_ym,
1254 storage.flux_rho_face_zp,
1255 storage.flux_rho_face_zm,
1256 storage.flux_rhov_face_xp,
1257 storage.flux_rhov_face_xm,
1258 storage.flux_rhov_face_yp,
1259 storage.flux_rhov_face_ym,
1260 storage.flux_rhov_face_zp,
1261 storage.flux_rhov_face_zm,
1262 storage.flux_rhoe_face_xp,
1263 storage.flux_rhoe_face_xm,
1264 storage.flux_rhoe_face_yp,
1265 storage.flux_rhoe_face_ym,
1266 storage.flux_rhoe_face_zp,
1267 storage.flux_rhoe_face_zm);
1268 flux_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1269 }
else if (solver_config.riemann_config == HLL) {
1272 solver_config.eos_gamma,
1273 storage.cell_graph_edge,
1274 storage.rho_face_xp,
1275 storage.rho_face_xm,
1276 storage.rho_face_yp,
1277 storage.rho_face_ym,
1278 storage.rho_face_zp,
1279 storage.rho_face_zm,
1280 storage.vel_face_xp,
1281 storage.vel_face_xm,
1282 storage.vel_face_yp,
1283 storage.vel_face_ym,
1284 storage.vel_face_zp,
1285 storage.vel_face_zm,
1286 storage.press_face_xp,
1287 storage.press_face_xm,
1288 storage.press_face_yp,
1289 storage.press_face_ym,
1290 storage.press_face_zp,
1291 storage.press_face_zm,
1292 storage.flux_rho_face_xp,
1293 storage.flux_rho_face_xm,
1294 storage.flux_rho_face_yp,
1295 storage.flux_rho_face_ym,
1296 storage.flux_rho_face_zp,
1297 storage.flux_rho_face_zm,
1298 storage.flux_rhov_face_xp,
1299 storage.flux_rhov_face_xm,
1300 storage.flux_rhov_face_yp,
1301 storage.flux_rhov_face_ym,
1302 storage.flux_rhov_face_zp,
1303 storage.flux_rhov_face_zm,
1304 storage.flux_rhoe_face_xp,
1305 storage.flux_rhoe_face_xm,
1306 storage.flux_rhoe_face_yp,
1307 storage.flux_rhoe_face_ym,
1308 storage.flux_rhoe_face_zp,
1309 storage.flux_rhoe_face_zm);
1310 flux_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1311 }
else if (solver_config.riemann_config == HLLC) {
1314 solver_config.eos_gamma,
1315 storage.cell_graph_edge,
1316 storage.rho_face_xp,
1317 storage.rho_face_xm,
1318 storage.rho_face_yp,
1319 storage.rho_face_ym,
1320 storage.rho_face_zp,
1321 storage.rho_face_zm,
1322 storage.vel_face_xp,
1323 storage.vel_face_xm,
1324 storage.vel_face_yp,
1325 storage.vel_face_ym,
1326 storage.vel_face_zp,
1327 storage.vel_face_zm,
1328 storage.press_face_xp,
1329 storage.press_face_xm,
1330 storage.press_face_yp,
1331 storage.press_face_ym,
1332 storage.press_face_zp,
1333 storage.press_face_zm,
1334 storage.flux_rho_face_xp,
1335 storage.flux_rho_face_xm,
1336 storage.flux_rho_face_yp,
1337 storage.flux_rho_face_ym,
1338 storage.flux_rho_face_zp,
1339 storage.flux_rho_face_zm,
1340 storage.flux_rhov_face_xp,
1341 storage.flux_rhov_face_xm,
1342 storage.flux_rhov_face_yp,
1343 storage.flux_rhov_face_ym,
1344 storage.flux_rhov_face_zp,
1345 storage.flux_rhov_face_zm,
1346 storage.flux_rhoe_face_xp,
1347 storage.flux_rhoe_face_xm,
1348 storage.flux_rhoe_face_yp,
1349 storage.flux_rhoe_face_ym,
1350 storage.flux_rhoe_face_zp,
1351 storage.flux_rhoe_face_zm);
1352 flux_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1357 if (solver_config.is_dust_on()) {
1358 u32 ndust = solver_config.dust_config.ndust;
1359 if (solver_config.dust_config.dust_riemann_config ==
DHLL) {
1361 NodeComputeFluxDustMode<Tvec, TgridVec, modules::DustRiemannSolverMode::DHLL>
1363 "Dust flux compute",
1365 storage.cell_graph_edge,
1366 storage.rho_dust_face_xp,
1367 storage.rho_dust_face_xm,
1368 storage.rho_dust_face_yp,
1369 storage.rho_dust_face_ym,
1370 storage.rho_dust_face_zp,
1371 storage.rho_dust_face_zm,
1372 storage.vel_dust_face_xp,
1373 storage.vel_dust_face_xm,
1374 storage.vel_dust_face_yp,
1375 storage.vel_dust_face_ym,
1376 storage.vel_dust_face_zp,
1377 storage.vel_dust_face_zm,
1378 storage.flux_rho_dust_face_xp,
1379 storage.flux_rho_dust_face_xm,
1380 storage.flux_rho_dust_face_yp,
1381 storage.flux_rho_dust_face_ym,
1382 storage.flux_rho_dust_face_zp,
1383 storage.flux_rho_dust_face_zm,
1384 storage.flux_rhov_dust_face_xp,
1385 storage.flux_rhov_dust_face_xm,
1386 storage.flux_rhov_dust_face_yp,
1387 storage.flux_rhov_dust_face_ym,
1388 storage.flux_rhov_dust_face_zp,
1389 storage.flux_rhov_dust_face_zm);
1390 flux_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1391 }
else if (solver_config.dust_config.dust_riemann_config ==
HB) {
1394 "Dust flux compute",
1396 storage.cell_graph_edge,
1397 storage.rho_dust_face_xp,
1398 storage.rho_dust_face_xm,
1399 storage.rho_dust_face_yp,
1400 storage.rho_dust_face_ym,
1401 storage.rho_dust_face_zp,
1402 storage.rho_dust_face_zm,
1403 storage.vel_dust_face_xp,
1404 storage.vel_dust_face_xm,
1405 storage.vel_dust_face_yp,
1406 storage.vel_dust_face_ym,
1407 storage.vel_dust_face_zp,
1408 storage.vel_dust_face_zm,
1409 storage.flux_rho_dust_face_xp,
1410 storage.flux_rho_dust_face_xm,
1411 storage.flux_rho_dust_face_yp,
1412 storage.flux_rho_dust_face_ym,
1413 storage.flux_rho_dust_face_zp,
1414 storage.flux_rho_dust_face_zm,
1415 storage.flux_rhov_dust_face_xp,
1416 storage.flux_rhov_dust_face_xm,
1417 storage.flux_rhov_dust_face_yp,
1418 storage.flux_rhov_dust_face_ym,
1419 storage.flux_rhov_dust_face_zp,
1420 storage.flux_rhov_dust_face_zm);
1421 flux_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1428 solver_sequence.push_back(std::make_shared<
decltype(seq)>(std::move(seq)));
1433 AMRBlock::block_size, solver_config.grid_coord_to_pos_fact};
1435 storage.block_counts,
1436 storage.cell_graph_edge,
1437 storage.block_cell_sizes,
1438 storage.cell0block_aabb_lower,
1439 storage.flux_rho_face_xp,
1440 storage.flux_rho_face_xm,
1441 storage.flux_rho_face_yp,
1442 storage.flux_rho_face_ym,
1443 storage.flux_rho_face_zp,
1444 storage.flux_rho_face_zm,
1445 storage.flux_rhov_face_xp,
1446 storage.flux_rhov_face_xm,
1447 storage.flux_rhov_face_yp,
1448 storage.flux_rhov_face_ym,
1449 storage.flux_rhov_face_zp,
1450 storage.flux_rhov_face_zm,
1451 storage.flux_rhoe_face_xp,
1452 storage.flux_rhoe_face_xm,
1453 storage.flux_rhoe_face_yp,
1454 storage.flux_rhoe_face_ym,
1455 storage.flux_rhoe_face_zp,
1456 storage.flux_rhoe_face_zm,
1460 solver_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1463 if (solver_config.is_dust_on()) {
1465 AMRBlock::block_size,
1466 solver_config.grid_coord_to_pos_fact,
1467 solver_config.dust_config.ndust};
1469 storage.block_counts,
1470 storage.cell_graph_edge,
1471 storage.block_cell_sizes,
1472 storage.cell0block_aabb_lower,
1473 storage.flux_rho_dust_face_xp,
1474 storage.flux_rho_dust_face_xm,
1475 storage.flux_rho_dust_face_yp,
1476 storage.flux_rho_dust_face_ym,
1477 storage.flux_rho_dust_face_zp,
1478 storage.flux_rho_dust_face_zm,
1479 storage.flux_rhov_dust_face_xp,
1480 storage.flux_rhov_dust_face_xm,
1481 storage.flux_rhov_dust_face_yp,
1482 storage.flux_rhov_dust_face_ym,
1483 storage.flux_rhov_dust_face_zp,
1484 storage.flux_rhov_dust_face_zm,
1486 storage.dtrhov_dust);
1487 solver_sequence.push_back(std::make_shared<
decltype(node)>(std::move(node)));
1491 storage.solver_sequence = std::make_shared<decltype(seq)>(std::move(seq));