XGC1
domain_decomposition.hpp
Go to the documentation of this file.
1 #ifndef DOMAIN_DECOMPOSITION_HPP
2 #define DOMAIN_DECOMPOSITION_HPP
3 #include "space_settings.hpp"
4 #include "NamelistReader.hpp"
5 #ifdef USE_MPI
6 # include "my_mpi.hpp"
7 #endif
9 #include "grid_weights.hpp"
10 #include "vertex_list.hpp"
11 
12 #include "vertex_list.hpp"
13 #include "host_array.hpp"
14 #include "xgc_io.hpp"
15 
17  View<int*,CLayout,HostType> cnts;
18  View<int*,CLayout,HostType> displs;
19  int my_rank;
20 
22 
23  DistributionPlan(int my_rank_in, int nranks)
24  : cnts(NoInit("cnts"), nranks),
25  displs(NoInit("displs"), nranks),
26  my_rank(my_rank_in)
27  {}
28 
29  int my_count() const{
30  return cnts(my_rank);
31  }
32 
33  int my_displ() const{
34  return displs(my_rank);
35  }
36 };
37 
38 // Decomposition class
39 template<class Device>
41  public:
42 
43  // Constructor
45 
46  DomainDecomposition(NLReader::NamelistReader& nlr, int nnodes_in);
47 
48  DomainDecomposition(int nranks_in);
49 
50  void setup_gvid0_pid(NLReader::NamelistReader& nlr, int nnodes_in);
51 
52  int nplanes;
53 
54 #ifdef USE_MPI
55  // MPI communicators etc
56  const MyMPI mpi;
57 #endif
58 
59  // Updater
60  void update(int new_f0_inode1);
61 
62  void update_pol_decomp();
63 
64  void update_flux_surf(const HostArray<VertexList>& surfaces);
65 
66  KOKKOS_INLINE_FUNCTION int node_to_plane_rank(int node) const;
67 
68  KOKKOS_INLINE_FUNCTION void node_to_rank(const SimdGridWeights<Order::Zero, PIT_GLOBAL>& grid_wts0, const Simd<int>& iphi, bool plane_sort_only, Simd<int>& pid) const;
69 
70  int node_to_plane_rank_h(int node, int initial_guess) const;
71 
73 
74  VertexList vertex_list() const;
75 
76  VertexList vertex_list(int ipid) const;
77 
78  void write_checkpoint_files(const XGC_IO_Stream& stream) const;
79  void read_checkpoint_files(const XGC_IO_Stream& stream);
80 
81  // Constants
82  bool pol_decomp;
85  int n_pids;
86  int my_pid;
90 
93 
94  // Variables
96  int nnodes;
97 
98  // Views
99  Kokkos::View<int*,Kokkos::LayoutRight,HostType> gvid0_pid_h;
100  Kokkos::View<int*,Kokkos::LayoutRight,Device> gvid0_pid;
101 
102  View<int*,CLayout,HostType> surfs;
103  View<int*,CLayout,HostType> ranks_sharing_flux_surf;
104 
105 };
106 
107 #include "domain_decomposition.tpp"
108 #endif
Definition: domain_decomposition.hpp:40
int nnodes_on_plane
Number of nodes on local plane.
Definition: domain_decomposition.hpp:89
Kokkos::View< int *, Kokkos::LayoutRight, Device > gvid0_pid
Which processors get which vertices.
Definition: domain_decomposition.hpp:100
View< int *, CLayout, HostType > surfs
Which surfaces are at least partially on this rank.
Definition: domain_decomposition.hpp:102
int pe_per_plane
Processors per plane.
Definition: domain_decomposition.hpp:83
int n_pids
Processors per plane?
Definition: domain_decomposition.hpp:85
void read_checkpoint_files(const XGC_IO_Stream &stream)
Definition: domain_decomposition.cpp:305
bool decompose_fields
Whether to decompose fields.
Definition: domain_decomposition.hpp:91
DistributionPlan mpi_distribution_plan(int nv) const
int nnodes
Number of nodes belonging to this MPI rank.
Definition: domain_decomposition.hpp:96
FieldDecomposition< Device > field_decomp
Definition: domain_decomposition.hpp:92
int node_to_plane_rank_h(int node, int initial_guess) const
Definition: domain_decomposition.cpp:249
int my_pid
ID of this processor.
Definition: domain_decomposition.hpp:86
void update(int new_f0_inode1)
Definition: domain_decomposition.cpp:206
int my_plane_pid
Poloidal ID of this processor.
Definition: domain_decomposition.hpp:87
bool pol_decomp
Use poloidal decomposition.
Definition: domain_decomposition.hpp:82
VertexList vertex_list() const
Definition: domain_decomposition.cpp:279
int nplanes
Definition: domain_decomposition.hpp:52
void write_checkpoint_files(const XGC_IO_Stream &stream) const
Definition: domain_decomposition.cpp:291
KOKKOS_INLINE_FUNCTION void node_to_rank(const SimdGridWeights< Order::Zero, PIT_GLOBAL > &grid_wts0, const Simd< int > &iphi, bool plane_sort_only, Simd< int > &pid) const
Definition: domain_decomposition.tpp:32
void setup_gvid0_pid(NLReader::NamelistReader &nlr, int nnodes_in)
Definition: domain_decomposition.cpp:68
KOKKOS_INLINE_FUNCTION int node_to_plane_rank(int node) const
Definition: domain_decomposition.tpp:14
void update_pol_decomp()
Definition: domain_decomposition.cpp:226
Kokkos::View< int *, Kokkos::LayoutRight, HostType > gvid0_pid_h
Which processors get which vertices (host)
Definition: domain_decomposition.hpp:99
void update_flux_surf(const HostArray< VertexList > &surfaces)
Definition: domain_decomposition.cpp:115
DomainDecomposition(NLReader::NamelistReader &nlr)
Definition: domain_decomposition.cpp:21
int plane_totalpe
Processors per plane?
Definition: domain_decomposition.hpp:84
View< int *, CLayout, HostType > ranks_sharing_flux_surf
Which processors share a flux surface with this one.
Definition: domain_decomposition.hpp:103
int plane_index
Offset of local plane.
Definition: domain_decomposition.hpp:88
int node_offset
Offset of first mesh node belonging to this MPI rank.
Definition: domain_decomposition.hpp:95
Definition: field_decomposition.hpp:12
Definition: NamelistReader.hpp:193
Definition: vertex_list.hpp:53
Definition: xgc_io.hpp:24
Kokkos::ViewAllocateWithoutInitializing NoInit
Definition: space_settings.hpp:69
Definition: domain_decomposition.hpp:16
int my_displ() const
Definition: domain_decomposition.hpp:33
View< int *, CLayout, HostType > displs
Definition: domain_decomposition.hpp:18
View< int *, CLayout, HostType > cnts
Definition: domain_decomposition.hpp:17
DistributionPlan(int my_rank_in, int nranks)
Definition: domain_decomposition.hpp:23
int my_count() const
Definition: domain_decomposition.hpp:29
int my_rank
Definition: domain_decomposition.hpp:19
DistributionPlan()
Definition: domain_decomposition.hpp:21
Definition: my_mpi.hpp:19
Definition: grid_weights.hpp:47