Skip to content
Snippets Groups Projects
RigidBodyController.h 2.79 KiB
#include <vector>
#include <fstream>
#include "RigidBody.h"
/* #include "RandomCUDA.h" */
#include <cuda.h>
#include <cuda_runtime.h>

// #define NUMTHREADS 128					/* try with 64, every 32+ */
#define NUMTHREADS 64
#define NUMSTREAMS 8

class Configuration;
class RandomCPU;

class RigidBodyForcePair  {
	friend class RigidBodyController;

public:
	RigidBodyForcePair(RigidBodyType* t1, RigidBodyType* t2,
										 RigidBody* rb1, RigidBody* rb2,
										 std::vector<int> gridKeyId1, std::vector<int> gridKeyId2, bool isPmf) :
		type1(t1), type2(t2), rb1(rb1), rb2(rb2),
		gridKeyId1(gridKeyId1), gridKeyId2(gridKeyId2), isPmf(isPmf)
		{
			printf("    Constructing RB force pair...\n");
			initialize();
			// printf("    done constructing RB force pair\n");
		}
	RigidBodyForcePair(const RigidBodyForcePair& o) :
		type1(o.type1), type2(o.type2), rb1(o.rb1), rb2(o.rb2),
		gridKeyId1(o.gridKeyId1), gridKeyId2(o.gridKeyId2), isPmf(o.isPmf) {
		printf("    Copying RB force pair...\n");
		initialize();
	}
	RigidBodyForcePair& operator=(RigidBodyForcePair& o) {
		printf("    Copying assigning RB force pair...\n");
		swap(*this,o);
		return *this;
	}
	
	~RigidBodyForcePair();

private:
	int initialize();
	void swap(RigidBodyForcePair& a, RigidBodyForcePair& b);
	
	static const int numThreads = NUMTHREADS;
	
	bool isPmf;
	
	RigidBodyType* type1;
	RigidBodyType* type2;
	RigidBody* rb1;
	RigidBody* rb2;
	
	std::vector<int> gridKeyId1;
	std::vector<int> gridKeyId2;
	std::vector<int> numBlocks;
	
	std::vector<Vector3*> forces;
	std::vector<Vector3*> forces_d;
	std::vector<Vector3*> torques;
	std::vector<Vector3*> torques_d;

	static int nextStreamID; 
	std::vector<int> streamID;
	static cudaStream_t* stream;
	static void createStreams();
	void callGridForceKernel(int pairId, int s);
	void retrieveForces();
	Matrix3 getBasis1(const int i);
	Matrix3 getBasis2(const int i);
	Vector3 getOrigin1(const int i);
	Vector3 getOrigin2(const int i);
};

class RigidBodyController {
public:
	/* DEVICE RigidBodyController(const NamdState *s, int reductionTag, SimParameters *sp); */
	RigidBodyController();
  ~RigidBodyController();
	RigidBodyController(const Configuration& c, const char* outArg);

	void integrate(int step);
	void updateForces(int s);
    
private:
	void copyGridsToDevice();
	void initializeForcePairs();

	void print(int step);
	void printLegend(std::ofstream &file);
	void printData(int step, std::ofstream &file);
public:
		RigidBodyType** rbType_d;
	
private:
	std::ofstream trajFile;
	
	const Configuration& conf;
	const char* outArg;
	
	RandomCPU* random;
	/* RequireReduction *gridReduction; */
	
	Vector3* trans; // would have made these static, but
	Matrix3* rot;  	// there are errors on rigidBody->integrate
	std::vector< std::vector<RigidBody> > rigidBodyByType;
	
	std::vector< RigidBodyForcePair > forcePairs;

	
	
};