MP-Gadget  5.0.1.dev1-76bc7d4726-dirty
petapm.h
Go to the documentation of this file.
1 #ifndef __PETAPM_H__
2 #define __PETAPM_H__
3 #include <pfft.h>
4 
5 #include "powerspectrum.h"
6 
7 typedef struct Region {
8  /* represents a region in the FFT Mesh */
9  ptrdiff_t offset[3];
10  ptrdiff_t size[3];
11  ptrdiff_t strides[3];
12  size_t totalsize;
13  double * buffer;
14  /* below are used mostly for investigation */
15  double center[3];
16  double len;
17  int numpart;
18  int no; /* node number for debugging */
20 
21 /* a layout is the communication object, represent
22  * pencil / cells exchanged */
23 
24 struct Layout {
25  MPI_Comm comm;
26  int NpExport;
27  int NpImport;
28  int * NpSend;
29  int * NpRecv;
30  int * DpSend;
31  int * DpRecv;
32  struct Pencil * PencilSend;
33  struct Pencil * PencilRecv;
34 
35  int NcExport;
36  int NcImport;
37  int * NcSend;
38  int * NcRecv;
39  int * DcSend;
40  int * DcRecv;
41 
42  double * BufSend;
43  double * BufRecv;
44  int * ibuffer;
45 };
46 
47 /* Data which is private to the PetaPM structure. Don't access from outside.*/
48 typedef struct PetaPMPriv {
49  /* These varibles are initialized by petapm_init*/
50 
51  int fftsize;
52  pfft_plan plan_forw;
53  pfft_plan plan_back;
54  MPI_Comm comm_cart_2d;
55 
56  /* these variables are allocated every force calculation */
57  double * meshbuf;
58  size_t meshbufsize;
59  struct Layout layout;
61 
62 typedef struct PetaPM {
63  /* These varibles are initialized by petapm_init*/
64  MPI_Comm comm;
67  double CellSize;
68  int Nmesh;
69  double Asmth;
70  double BoxSize;
71  double G;
73  int ThisTask2d[2];
74  int NTask2d[2];
75  int * Mesh2Task[2]; /* conversion from real space mesh to task2d, */
76  Power ps[1];
78 
79 typedef struct {
80  void * Parts;
81  size_t elsize;
82  size_t offset_pos;
83  size_t offset_mass;
84  int * RegionInd;
85  int (*active) (int i);
86  int64_t NumPart;
88 
89 typedef void (*petapm_transfer_func)(PetaPM * pm, int64_t k2, int kpos[3], pfft_complex * value);
90 typedef void (*petapm_readout_func)(PetaPM * pm, int i, double * mesh, double weight);
91 typedef PetaPMRegion * (*petapm_prepare_func)(PetaPM * pm, PetaPMParticleStruct * pstruct, void * data, int *Nregions);
92 
93 typedef struct {
94  const char * name;
98 
99 /* this mixes up fourier space analysis; with transfer. Shall split them. */
100 typedef struct {
101  /* this is a fourier space readout; need a better name */
103  void (*global_analysis)(PetaPM * pm);
106 
107 /* UNUSED! */
108 typedef void * (*petapm_malloc_func)(char * name, size_t * size);
109 typedef void * (*petapm_mfree_func)(void * ptr);
110 
111 void petapm_module_init(int Nthreads);
112 
113 void petapm_init(PetaPM * pm, double BoxSize, double Asmth, int Nmesh, double G, MPI_Comm comm);
114 void petapm_destroy(PetaPM * pm);
116 
117 void petapm_force(PetaPM * pm,
118  petapm_prepare_func prepare,
121  PetaPMParticleStruct * pstruct,
122  void * userdata);
123 
125  petapm_prepare_func prepare,
126  PetaPMParticleStruct * pstruct,
127  int * Nregions,
128  void * userdata);
129 pfft_complex * petapm_force_r2c(PetaPM * pm,
131  );
132 void petapm_force_c2r(PetaPM * pm,
133  pfft_complex * rho_k, PetaPMRegion * regions,
134  const int Nregions,
136 void petapm_force_finish(PetaPM * pm);
137 
140 int petapm_mesh_to_k(PetaPM * pm, int i);
141 int *petapm_get_thistask2d(PetaPM * pm);
142 int *petapm_get_ntask2d(PetaPM * pm);
143 pfft_complex * petapm_alloc_rhok(PetaPM * pm);
144 
145 #endif
const char * name
Definition: densitykernel.c:93
static PetaPMGlobalFunctions global_functions
Definition: glass.c:33
static PetaPMFunctions functions[]
Definition: gravpm.c:32
struct Region PetaPMRegion
void petapm_module_init(int Nthreads)
Definition: petapm.c:82
struct PetaPMPriv PetaPMPriv
PetaPMRegion * petapm_get_real_region(PetaPM *pm)
Definition: petapm.c:67
void petapm_init(PetaPM *pm, double BoxSize, double Asmth, int Nmesh, double G, MPI_Comm comm)
Definition: petapm.c:94
struct PetaPM PetaPM
void petapm_destroy(PetaPM *pm)
Definition: petapm.c:215
PetaPMRegion *(* petapm_prepare_func)(PetaPM *pm, PetaPMParticleStruct *pstruct, void *data, int *Nregions)
Definition: petapm.h:91
int petapm_mesh_to_k(PetaPM *pm, int i)
Definition: petapm.c:70
void(* petapm_transfer_func)(PetaPM *pm, int64_t k2, int kpos[3], pfft_complex *value)
Definition: petapm.h:89
void petapm_force_finish(PetaPM *pm)
Definition: petapm.c:348
pfft_complex * petapm_force_r2c(PetaPM *pm, PetaPMGlobalFunctions *global_functions)
Definition: petapm.c:273
void(* petapm_readout_func)(PetaPM *pm, int i, double *mesh, double weight)
Definition: petapm.h:90
int * petapm_get_ntask2d(PetaPM *pm)
Definition: petapm.c:77
void petapm_region_init_strides(PetaPMRegion *region)
Definition: petapm.c:813
void petapm_force_c2r(PetaPM *pm, pfft_complex *rho_k, PetaPMRegion *regions, const int Nregions, PetaPMFunctions *functions)
Definition: petapm.c:317
pfft_complex * petapm_alloc_rhok(PetaPM *pm)
Definition: petapm.c:50
PetaPMRegion * petapm_get_fourier_region(PetaPM *pm)
Definition: petapm.c:64
void petapm_force(PetaPM *pm, petapm_prepare_func prepare, PetaPMGlobalFunctions *global_functions, PetaPMFunctions *functions, PetaPMParticleStruct *pstruct, void *userdata)
Definition: petapm.c:353
PetaPMRegion * petapm_force_init(PetaPM *pm, petapm_prepare_func prepare, PetaPMParticleStruct *pstruct, int *Nregions, void *userdata)
Definition: petapm.c:251
int * petapm_get_thistask2d(PetaPM *pm)
Definition: petapm.c:74
Definition: petapm.h:24
int NpExport
Definition: petapm.h:26
int * DcSend
Definition: petapm.h:39
int * ibuffer
Definition: petapm.h:44
struct Pencil * PencilSend
Definition: petapm.h:32
double * BufRecv
Definition: petapm.h:43
int NcExport
Definition: petapm.h:35
int * NpSend
Definition: petapm.h:28
int * NcRecv
Definition: petapm.h:38
int NcImport
Definition: petapm.h:36
int * NpRecv
Definition: petapm.h:29
int NpImport
Definition: petapm.h:27
int * NcSend
Definition: petapm.h:37
MPI_Comm comm
Definition: petapm.h:25
int * DcRecv
Definition: petapm.h:40
struct Pencil * PencilRecv
Definition: petapm.h:33
int * DpSend
Definition: petapm.h:30
int * DpRecv
Definition: petapm.h:31
double * BufSend
Definition: petapm.h:42
Definition: petapm.c:29
petapm_readout_func readout
Definition: petapm.h:96
petapm_transfer_func transfer
Definition: petapm.h:95
const char * name
Definition: petapm.h:94
petapm_transfer_func global_transfer
Definition: petapm.h:104
petapm_transfer_func global_readout
Definition: petapm.h:102
size_t offset_pos
Definition: petapm.h:82
int64_t NumPart
Definition: petapm.h:86
size_t offset_mass
Definition: petapm.h:83
pfft_plan plan_back
Definition: petapm.h:53
struct Layout layout
Definition: petapm.h:59
int fftsize
Definition: petapm.h:51
double * meshbuf
Definition: petapm.h:57
pfft_plan plan_forw
Definition: petapm.h:52
size_t meshbufsize
Definition: petapm.h:58
MPI_Comm comm_cart_2d
Definition: petapm.h:54
Definition: petapm.h:62
int Nmesh
Definition: petapm.h:68
PetaPMPriv priv[1]
Definition: petapm.h:72
MPI_Comm comm
Definition: petapm.h:64
double CellSize
Definition: petapm.h:67
double G
Definition: petapm.h:71
double BoxSize
Definition: petapm.h:70
double Asmth
Definition: petapm.h:69
int ThisTask2d[2]
Definition: petapm.h:73
int NTask2d[2]
Definition: petapm.h:74
Power ps[1]
Definition: petapm.h:76
PetaPMRegion real_space_region
Definition: petapm.h:65
PetaPMRegion fourier_space_region
Definition: petapm.h:66
int * Mesh2Task[2]
Definition: petapm.h:75
Definition: petapm.h:7
size_t totalsize
Definition: petapm.h:12
double center[3]
Definition: petapm.h:15
int numpart
Definition: petapm.h:17
ptrdiff_t size[3]
Definition: petapm.h:10
ptrdiff_t offset[3]
Definition: petapm.h:9
double * buffer
Definition: petapm.h:13
double len
Definition: petapm.h:16
int no
Definition: petapm.h:18
ptrdiff_t strides[3]
Definition: petapm.h:11
static const double G
Definition: test_gravity.c:35