forked from Exawind/exawind-driver
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAMRTiogaIface.cpp
107 lines (89 loc) · 2.9 KB
/
AMRTiogaIface.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <vector>
#include "AMRTiogaIface.h"
#include "amr-wind/CFDSim.H"
#include "amr-wind/overset/TiogaInterface.H"
#include "TiogaMeshInfo.h"
#include "tioga.h"
namespace exawind {
namespace {
template <typename T1, typename T2>
void amr_to_tioga(T1& lhs, T2& rhs)
{
lhs.sz = rhs.size();
lhs.hptr = rhs.h_view.data();
lhs.dptr = rhs.d_view.data();
}
} // namespace
AMRTiogaIface::AMRTiogaIface(amr_wind::CFDSim& sim, TIOGA::tioga& tg)
: m_sim(sim), m_tg(tg), m_info(new TIOGA::AMRMeshInfo)
{}
void AMRTiogaIface::pre_overset_conn_work()
{
m_sim.overset_manager()->pre_overset_conn_work();
register_mesh();
}
void AMRTiogaIface::post_overset_conn_work()
{
m_sim.overset_manager()->post_overset_conn_work();
}
void AMRTiogaIface::register_mesh()
{
BL_PROFILE("exawind::AMRTiogaIface::register_mesh");
const int num_ghost = m_sim.pde_manager().num_ghost_state();
auto* amr_tg_iface =
dynamic_cast<amr_wind::TiogaInterface*>(m_sim.overset_manager());
if (amr_tg_iface == nullptr) {
amrex::Abort("Dynamic cast to TiogaInterface failed");
return;
}
auto& ad = amr_tg_iface->amr_overset_info();
auto& mi = *m_info;
mi.ngrids_global = ad.ngrids_global;
mi.ngrids_local = ad.ngrids_local;
mi.num_ghost = num_ghost;
amr_to_tioga(mi.level, ad.level);
amr_to_tioga(mi.mpi_rank, ad.mpi_rank);
amr_to_tioga(mi.local_id, ad.local_id);
amr_to_tioga(mi.ilow, ad.ilow);
amr_to_tioga(mi.ihigh, ad.ihigh);
amr_to_tioga(mi.dims, ad.dims);
amr_to_tioga(mi.xlo, ad.xlo);
amr_to_tioga(mi.dx, ad.dx);
amr_to_tioga(mi.global_idmap, ad.global_idmap);
amr_to_tioga(mi.iblank_node, ad.iblank_node);
amr_to_tioga(mi.iblank_cell, ad.iblank_cell);
amr_to_tioga(mi.qcell, ad.qcell);
amr_to_tioga(mi.qnode, ad.qnode);
// Will reset when we register solution
mi.nvar_cell = 0;
mi.nvar_node = 0;
m_tg.register_amr_grid(m_info.get());
}
void AMRTiogaIface::register_solution(
const std::vector<std::string>& cell_vars,
const std::vector<std::string>& node_vars)
{
auto* amr_tg_iface =
dynamic_cast<amr_wind::TiogaInterface*>(m_sim.overset_manager());
if (amr_tg_iface == nullptr) {
amrex::Abort("Dynamic cast to TiogaInterface failed");
return;
}
amr_tg_iface->register_solution(cell_vars, node_vars);
auto& qcell = amr_tg_iface->qvars_cell();
auto& qnode = amr_tg_iface->qvars_node();
// Ensure that ghost cells are consistent
AMREX_ALWAYS_ASSERT(qcell.num_grow()[0] == qnode.num_grow()[0]);
auto& ad = amr_tg_iface->amr_overset_info();
auto& mi = *m_info;
mi.nvar_cell = qcell.num_comp();
mi.nvar_node = qnode.num_comp();
amr_to_tioga(mi.qcell, ad.qcell);
amr_to_tioga(mi.qnode, ad.qnode);
m_tg.register_amr_solution();
}
void AMRTiogaIface::update_solution()
{
m_sim.overset_manager()->update_solution();
}
} // namespace exawind