9 #include "../global/global.h"
10 #include "../grid/grid3D.h"
13 #include "fftw3-mpi.h"
21extern int procID_node;
27extern MPI_Datatype MPI_CHREAL;
30extern MPI_Datatype MPI_PART_INT;
35extern MPI_Request *send_request;
36extern MPI_Request *recv_request;
45extern Real *d_send_buffer_x0;
46extern Real *d_send_buffer_x1;
47extern Real *d_send_buffer_y0;
48extern Real *d_send_buffer_y1;
49extern Real *d_send_buffer_z0;
50extern Real *d_send_buffer_z1;
51extern Real *d_recv_buffer_x0;
52extern Real *d_recv_buffer_x1;
53extern Real *d_recv_buffer_y0;
54extern Real *d_recv_buffer_y1;
55extern Real *d_recv_buffer_z0;
56extern Real *d_recv_buffer_z1;
58extern Real *h_send_buffer_x0;
59extern Real *h_send_buffer_x1;
60extern Real *h_send_buffer_y0;
61extern Real *h_send_buffer_y1;
62extern Real *h_send_buffer_z0;
63extern Real *h_send_buffer_z1;
64extern Real *h_recv_buffer_x0;
65extern Real *h_recv_buffer_x1;
66extern Real *h_recv_buffer_y0;
67extern Real *h_recv_buffer_y1;
68extern Real *h_recv_buffer_z0;
69extern Real *h_recv_buffer_z1;
73extern Real *d_send_buffer_x0_particles;
74extern Real *d_send_buffer_x1_particles;
75extern Real *d_send_buffer_y0_particles;
76extern Real *d_send_buffer_y1_particles;
77extern Real *d_send_buffer_z0_particles;
78extern Real *d_send_buffer_z1_particles;
79extern Real *d_recv_buffer_x0_particles;
80extern Real *d_recv_buffer_x1_particles;
81extern Real *d_recv_buffer_y0_particles;
82extern Real *d_recv_buffer_y1_particles;
83extern Real *d_recv_buffer_z0_particles;
84extern Real *d_recv_buffer_z1_particles;
86extern Real *h_send_buffer_x0_particles;
87extern Real *h_send_buffer_x1_particles;
88extern Real *h_send_buffer_y0_particles;
89extern Real *h_send_buffer_y1_particles;
90extern Real *h_send_buffer_z0_particles;
91extern Real *h_send_buffer_z1_particles;
92extern Real *h_recv_buffer_x0_particles;
93extern Real *h_recv_buffer_x1_particles;
94extern Real *h_recv_buffer_y0_particles;
95extern Real *h_recv_buffer_y1_particles;
96extern Real *h_recv_buffer_z0_particles;
97extern Real *h_recv_buffer_z1_particles;
100extern int buffer_length_particles_x0_send;
101extern int buffer_length_particles_x0_recv;
102extern int buffer_length_particles_x1_send;
103extern int buffer_length_particles_x1_recv;
104extern int buffer_length_particles_y0_send;
105extern int buffer_length_particles_y0_recv;
106extern int buffer_length_particles_y1_send;
107extern int buffer_length_particles_y1_recv;
108extern int buffer_length_particles_z0_send;
109extern int buffer_length_particles_z0_recv;
110extern int buffer_length_particles_z1_send;
111extern int buffer_length_particles_z1_recv;
114extern MPI_Request *send_request_n_particles;
115extern MPI_Request *recv_request_n_particles;
117extern MPI_Request *send_request_particles_transfer;
118extern MPI_Request *recv_request_particles_transfer;
121extern int send_buffer_length;
122extern int recv_buffer_length;
123extern int x_buffer_length;
124extern int y_buffer_length;
125extern int z_buffer_length;
129extern ptrdiff_t nx_global;
130extern ptrdiff_t ny_global;
131extern ptrdiff_t nz_global;
132extern ptrdiff_t nx_local;
133extern ptrdiff_t ny_local;
134extern ptrdiff_t nz_local;
135extern ptrdiff_t nx_local_start;
136extern ptrdiff_t ny_local_start;
137extern ptrdiff_t nz_local_start;
140extern ptrdiff_t n_local_complex;
150void InitializeChollaMPI(
int *pargc,
char **pargv[]);
153void DomainDecomposition(
struct Parameters *P,
struct Header *H,
int nx_global,
int ny_global,
int nz_global);
155void DomainDecompositionBLOCK(
struct Parameters *P,
struct Header *H,
int nx_global,
int ny_global,
int nz_global);
158void TileBlockDecomposition(
void);
161Real ReduceRealMax(Real x);
164Real ReduceRealMin(Real x);
167Real ReduceRealAvg(Real x);
175size_t Reduce_size_t_Max(
size_t in);
179Real ReducePartIntSum(part_int_t x);
183part_int_t Get_Particles_IDs_Global_MPI_Offset(part_int_t n_local);
187void Check_and_Grow_Particles_Buffer(Real **part_buffer,
int *current_size_ptr,
int new_size);
191void Print_Domain_Properties(
struct Header H);
194void Allocate_MPI_DeviceBuffers(
struct Header *H);
197int greatest_prime_factor(
int n);
202int ***three_dimensional_int_array(
int n,
int l,
int m);
207void deallocate_three_dimensional_int_array(
int ***x,
int n,
int l,
int m);
210void copyHostToDeviceReceiveBuffer(
int direction);
217std::pair<int, int> MPI_Comm_node();