Guest User

Untitled

a guest
Jan 22nd, 2018
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.54 KB | None | 0 0
  1. update_state<<<numBlocks,blockSize>>>(positions, momenta, particle_number, dt, t);
  2.  
  3. __global__
  4. void update_state(double *pos, double *mom, unsigned int part_num, double dt, double t)
  5. {
  6. double dx = 0.001, dp = 0.001; //finite differences
  7. double H_pplus, H_pminus, H_xplus, H_xminus;
  8. double p_grad, x_grad;
  9.  
  10. int index = threadIdx.x;
  11. int stride = blockDim.x;
  12.  
  13. __syncthreads();
  14. for (int i = index; i<part_num; i += stride)
  15. {
  16. //Calculate phase space gradient
  17. pos[i] += dx;
  18. H_xplus = Hamiltonian(pos, mom, part_num, t);
  19. pos[i] -= 2*dx;
  20. H_xminus = Hamiltonian(pos, mom, part_num, t);
  21. pos[i] += dx;
  22. x_grad = (H_xplus-H_xminus)/(2*dx);
  23.  
  24. //Update momentum
  25. mom[i] -= dt*x_grad;
  26.  
  27. mom[i] += dp;
  28. H_pplus = Hamiltonian(pos, mom, part_num, t);
  29. mom[i] -= 2*dp;
  30. H_pminus = Hamiltonian(pos, mom, part_num, t);
  31. mom[i] += dp;
  32. p_grad = (H_pplus-H_pminus)/(2*dp);
  33.  
  34. //Update position
  35. pos[i] += dt*p_grad;
  36. }
  37. }
  38.  
  39. void write_state(FILE *fp, double t, double *pos, double *mom, unsigned int part_num)
  40. {
  41. cout << "check 1n";
  42.  
  43. //Write time
  44. fprintf(fp,"%ft",t);
  45.  
  46. cout << "check 2n";
  47.  
  48. //Write positions
  49. for (unsigned int i = 0; i<part_num; i++)
  50. {
  51. cout << "stuff: "<< pos[i] << endl;
  52. fprintf(fp ,"%f %f %f",pos[i],0.,0.);
  53. }
  54.  
  55. cout << "check 3n";
  56.  
  57. //Write momenta
  58. for (unsigned int i = 0; i<part_num; i++)
  59. {
  60. fprintf(fp,"%f",mom[i]);
  61. }
  62. fprintf(fp,"n");
  63. }
Add Comment
Please, Sign In to add comment