-
Notifications
You must be signed in to change notification settings - Fork 1
/
Cell.h
88 lines (79 loc) · 2.42 KB
/
Cell.h
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
#ifndef __CELL_H__
#define __CELL_H__
#include "ckmulticast.h"
#include <string>
//data message to be sent to computes
struct ParticleDataMsg : public CkMcastBaseMsg, public CMessage_ParticleDataMsg {
vec3* part; //list of atoms
int lengthAll; //length of list
int x, y, z; // (x,y,z) coordinate of cell sending this message
ParticleDataMsg(const int x_, const int y_, const int z_, const int numPos)
: x(x_), y(y_), z(z_), lengthAll(numPos) { }
void pup(PUP::er &p){
CMessage_ParticleDataMsg::pup(p);
p | lengthAll;
p | x; p | y; p | z;
if (p.isUnpacking()) part = new vec3[lengthAll];
PUParray(p, part, lengthAll);
}
};
class CellMap : public CkArrayMap {
int num_x, num_y, num_z, num_yz;
float ratio;
public:
CellMap(int num_x_, int num_y_, int num_z_) :
num_x(num_x_), num_y(num_y_), num_z(num_z_)
{
num_yz = num_y * num_z;
ratio = ((float)CkNumPes())/(num_x * num_yz);
}
CellMap(CkMigrateMessage *m) {}
int registerArray(CkArrayIndex& numElements, CkArrayID aid) {
return 0;
}
int procNum(int arrayHdl, const CkArrayIndex &idx) {
int *index =(int *)idx.data();
int patchID = index[2] + index[1] * num_z + index[0] * num_yz;
return (int)(patchID * ratio);
}
};
//chare used to represent a cell
class Cell : public CBase_Cell {
private:
Cell_SDAG_CODE;
// list of atoms
std::vector<Particle> particles;
// my compute locations
std::vector<CkArrayIndex6D> computesList;
// to count the number of steps, and decide when to stop
int stepCount;
// number of atoms in my cell
int myNumParts;
// number of interacting neighbors
int inbrs;
double stepTime;
int updateCount;
// store kinetic energy - initial and final
double energy[2];
int numReadyCheckpoint;
void migrateToCell(Particle p, int &px, int &py, int &pz);
// updates properties after receiving forces from computes
void updateProperties(vec3 *forces);
// limit velcities to an upper limit
void limitVelocity(Particle &p);
// particles going out of right enters from left
Particle& wrapAround(Particle &p);
// handle to section proxy of computes
CProxySection_Compute mCastSecProxy;
public:
Cell();
Cell(CkMigrateMessage *msg);
~Cell();
void createComputes(); //add my computes
void createSection(); //created multicast section of computes
void migrateParticles();
void sendPositions();
void startCheckpoint(int);
void pup(PUP::er &p);
};
#endif