FGColumnVector3 FGRotor::rotor::body_forces(double a_ic, double b_ic) { FGColumnVector3 F_s( - H_drag*cos(beta_orient) - J_side*sin(beta_orient) + Thrust*b_ic, - H_drag*sin(beta_orient) + J_side*cos(beta_orient) + Thrust*a_ic, - Thrust); if (dump_req && (flags & eMain) ) { printf("# abß: % f % f % f\n", a_ic, b_ic, beta_orient ); printf("# HJT: % .2f % .2f % .2f\n", H_drag, J_side, Thrust ); printf("# F_s: % .2f % .2f % .2f\n", F_s(1), F_s(2), F_s(3) ); FGColumnVector3 F_h; F_h = ShaftToBody * F_s; printf("# F_h: % .2f % .2f % .2f\n", F_h(1), F_h(2), F_h(3) ); } return ShaftToBody * F_s; }
//---------------------------------------------------------------------- int main(int argc, char** argv) { int i, j, k; double r_ij; FILE *XYZ_file, *p_file; std::ifstream IN_file; std::string buffer; std::string IN_filename = "in"; std::string OUT_filename ="out"; std::string XYZ_filename = "xyz"; parameters param; state stat; Vector sumaP; /* Load data */ IN_file.open(IN_filename); IN_file >> param.n; std::getline(IN_file, buffer); IN_file >> param.m; std::getline(IN_file, buffer); IN_file >> param.e; std::getline(IN_file, buffer); IN_file >> param.R; std::getline(IN_file, buffer); IN_file >> param.f; std::getline(IN_file, buffer); IN_file >> param.L; std::getline(IN_file, buffer); IN_file >> param.a; std::getline(IN_file, buffer); IN_file >> stat.T; std::getline(IN_file, buffer); IN_file >> param.tau; std::getline(IN_file, buffer); IN_file >> param.So; std::getline(IN_file, buffer); IN_file >> param.Sd; std::getline(IN_file, buffer); IN_file >> param.Sout; std::getline(IN_file, buffer); IN_file >> param.Sxyz; std::getline(IN_file, buffer); IN_file.close(); param.L = param.L * param.a*(param.n - 1); /* Okreslanie stanu poczatkowego ukladu */ srand(time_t(NULL)); param.N = (int) pow(param.n, 3); stat.r = new Vector[param.N]; stat.p = new Vector[param.N]; stat.F_p = new Vector[param.N]; stat.F_s = new Vector[param.N]; printf("init \n"); for (i = 0; i < param.n; i++){ for (j = 0; j < param.n; j++){ for (k = 0; k < param.n; k++){ stat.r[i + j*param.n + k*param.n*param.n].x = (i - (param.n - 1) / 2.f)*param.a + (j - (param.n - 1) / 2) * param.a / 2.f + (k - (param.n - 1) / 2)*param.a / 2.f; stat.r[i + j*param.n + k*param.n*param.n].y = (j - (param.n - 1) / 2)*param.a*sqrt(3.f) / 2 + (k - (param.n - 1) / 2)*param.a*sqrt(3.f) / 6; stat.r[i + j*param.n + k*param.n*param.n].z = (k - (param.n - 1) / 2)*param.a * sqrt(2.f / 3.f); } } } /* XYZ_file = fopen( XYZ_filename.c_str(), "w"); fprintf(XYZ_file, "%d\n", param.N); fprintf(XYZ_file, "STEP:\t%d\n", param.N); for (i = 0; i < param.N; i++){ fprintf(XYZ_file, "Ar\t%f\t%f\t%f\n", stat.r[i].x, stat.r[i].y, stat.r[i].z); } fprintf(XYZ_file, "\n", param.N); */ printf("p \n"); for (i = 0; i < param.N; i++){ stat.r[i].r = sqrt(pow(stat.r[i].x, 2) + pow(stat.r[i].y, 2) + pow(stat.r[i].z, 2)); stat.p[i].x = znak()*sqrt(2*param.m*(-K_B*stat.T*log(r0_1()) / 2)); stat.p[i].y = znak()*sqrt(2*param.m*(-K_B*stat.T*log(r0_1()) / 2)); stat.p[i].z = znak()*sqrt(2*param.m*(-K_B*stat.T*log(r0_1()) / 2)); stat.p[i].r = sqrt(pow(stat.p[i].x, 2) + pow(stat.p[i].y, 2) + pow(stat.p[i].z, 2)); } sumaP.x = 0; sumaP.y = 0; sumaP.z = 0; printf("sum p \n"); for (i = 0; i < param.N; i++){ sumaP.x += stat.p[i].x; sumaP.y += stat.p[i].y; sumaP.z += stat.p[i].z; stat.F_s[i].x = 0; stat.F_s[i].y = 0; stat.F_s[i].z = 0; stat.F_p[i].x = 0; stat.F_p[i].y = 0; stat.F_p[i].z = 0; } p_file = fopen( "p", "w"); /* for (i = 0; i < param.N; i++){ stat.p[i].x -= sumaP.x / (double) param.N; stat.p[i].y -= sumaP.y / (double) param.N; stat.p[i].z -= sumaP.z / (double) param.N; fprintf(p_file, "%f\t%f\t%f\n", stat.p[i].x, stat.p[i].y, stat.p[i].z); } */ fclose(p_file); /* Initial state */ stat.V_p = 0; stat.V_s = 0; printf("main \n"); for (i = 0; i < param.N; i++){ /* if (stat.r[i].r >= param.L){ stat.V_s += param.f*pow(stat.r[i].r - param.L, 2) / 2; stat.F_s[i].x += param.f*(param.L - stat.r[i].r)* stat.r[i].x / stat.r[i].r; stat.F_s[i].y += param.f*(param.L - stat.r[i].r)* stat.r[i].y / stat.r[i].r; stat.F_s[i].z += param.f*(param.L - stat.r[i].r)* stat.r[i].z / stat.r[i].r; } */ for (j = i; j < param.N; j++){ if (i != j){ r_ij = sqrt(pow(stat.r[i].x - stat.r[j].x, 2) + pow(stat.r[i].y - stat.r[j].y, 2) + pow(stat.r[i].z - stat.r[j].z, 2)); stat.V_p += param.e*(pow(param.R / r_ij, 12) - 2 * pow(param.R / r_ij, 6)); stat.F_p[i].x += 12 * param.e*(pow(param.R / r_ij, 12) - pow(param.R / r_ij, 6))*(stat.r[i].x - stat.r[j].x) / pow(r_ij, 2); stat.F_p[j].x -= stat.F_p[i].x; stat.F_p[i].y += 12 * param.e*(pow(param.R / r_ij, 12) - pow(param.R / r_ij, 6))*(stat.r[i].y - stat.r[j].y) / pow(r_ij, 2); stat.F_p[j].y -= stat.F_p[i].y; stat.F_p[i].z += 12 * param.e*(pow(param.R / r_ij, 12) - pow(param.R / r_ij, 6))*(stat.r[i].z - stat.r[j].z) / pow(r_ij, 2); stat.F_p[j].z -= stat.F_p[i].z; } } printf("%d/%d\r",i,param.N); } printf("\n"); //-------------------------------------------------------------------- printf("Hello, OpenCL\n"); //Setup our GLUT window and OpenGL related things //glut callback functions are setup here too init_gl(argc, argv); //initialize our CL object, this sets up the context example = new CL(); //load and build our CL program from the file #include "part2.cl" //std::string kernel_source is defined in this file example->loadProgram(kernel_source); //initialize our particle system with positions, velocities and color int num = NUM_PARTICLES; std::vector<Vec4> pos(num); std::vector<Vec4> color(num); std::vector<Vec4> F_p(num); std::vector<Vec4> F_s(num); std::vector<Vec4> Mom(num); //fill our vectors with initial data for(int i = 0; i < num; i++) { pos[i].x = stat.r[i].x; pos[i].y = stat.r[i].y; pos[i].z = stat.r[i].z; pos[i].w = 1.0f; F_p[i].x = stat.F_p[i].x; F_p[i].y = stat.F_p[i].y; F_p[i].z = stat.F_p[i].z; F_p[i].w = 1.0f; F_s[i].x = stat.F_s[i].x; F_s[i].y = stat.F_s[i].y; F_s[i].z = stat.F_s[i].z; F_s[i].w = 1.0f; Mom[i].x = stat.p[i].x; Mom[i].y = stat.p[i].y; Mom[i].z = stat.p[i].z; Mom[i].w = 1.0f; color[i] = Vec4(1.0f, 0.0f,0.0f, 1.0f); } //our load data function sends our initial values to the GPU example->loadData(pos, color, F_p, F_s, Mom); //initialize the kernel example->popCorn(); //this starts the GLUT program, from here on out everything we want //to do needs to be done in glut callback functions glutMainLoop(); }