Advertisement
Guest User

Untitled

a guest
May 25th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.89 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5. #include "utilities.h"
  6. #include "particle.h"
  7.  
  8. double axilrod_teller(double i, double j, double k) {
  9.  
  10. double r_ij, r_ik, r_kj;
  11. double rsq_ij, rsq_ik, rsq_kj;
  12. double mul, num;
  13.  
  14. r_ij = fmax(fabs(i - j), 1e-10);
  15. r_ik = fmax(fabs(i - k), 1e-10);
  16. r_kj = fmax(fabs(k - j), 1e-10);
  17.  
  18. rsq_ij = r_ij * r_ij;
  19. rsq_ik = r_ik * r_ik;
  20. rsq_kj = r_kj * r_kj;
  21.  
  22. mul = r_ij * r_ik * r_kj;
  23.  
  24. num = 3 * (-rsq_ij + rsq_ik + rsq_kj)
  25. * (rsq_ij - rsq_ik + rsq_kj)
  26. * (rsq_ij + rsq_ik - rsq_kj);
  27.  
  28. return 1 / pow(mul, 3.0) + num / pow(mul, 5.0);
  29. }
  30.  
  31. void compute_forces_dim(double i, double j, double k, double *i_f, double *j_f, double *k_f) {
  32.  
  33. double h = 4.69041575982343e-08;
  34. double h_i, h_j, h_k;
  35. double d_i, d_j, d_k;
  36. double i_f1, i_f2, j_f1, j_f2, k_f1, k_f2;
  37.  
  38. h_i = h * i;
  39. h_j = h * j;
  40. h_k = h * k;
  41.  
  42. d_i = (i + h_i) - (i - h_i);
  43. d_j = (j + h_j) - (j - h_j);
  44. d_k = (k + h_k) - (j - h_k);
  45.  
  46. i_f1 = axilrod_teller(i + h_i, j, k);
  47. i_f2 = axilrod_teller(i - h_i, j, k);
  48. j_f1 = axilrod_teller(i, j + h_j, k);
  49. j_f2 = axilrod_teller(i, j - h_j, k);
  50. k_f1 = axilrod_teller(i, j, k + h_k);
  51. k_f2 = axilrod_teller(i, j, k - h_k);
  52.  
  53. *i_f = - (i_f1 - i_f2) / d_i;
  54. *j_f = - (j_f1 - j_f2) / d_j;
  55. *k_f = - (k_f1 - k_f2) / d_k;
  56. }
  57.  
  58.  
  59. void compute_forces(struct particle *i, struct particle *j, struct particle *k) {
  60.  
  61. compute_forces_dim(i->x, j->x, k->x, &i->fx, &j->fx, &k->fx);
  62. compute_forces_dim(i->y, j->y, k->y, &i->fy, &j->fy, &k->fy);
  63. compute_forces_dim(i->z, j->z, k->z, &i->fz, &j->fz, &k->fz);
  64. }
  65.  
  66. void update(struct particle *p, double deltatime) {
  67.  
  68. p->x += p->vx * deltatime + p->ax * deltatime * deltatime / 2;
  69. p->y += p->vy * deltatime + p->ay * deltatime * deltatime / 2;
  70. p->z += p->vz * deltatime + p->az * deltatime * deltatime / 2;
  71.  
  72. p->ax += p->fx;
  73. p->ay += p->fy;
  74. p->az += p->fz;
  75.  
  76. p->vx += (2 * p->ax - p->fx) * deltatime / 2;
  77. p->vy += (2 * p->ay - p->fy) * deltatime / 2;
  78. p->vz += (2 * p->az - p->fz) * deltatime / 2;
  79.  
  80. p->fx = 0;
  81. p->fy = 0;
  82. p->fz = 0;
  83. }
  84.  
  85. int main() {
  86. int allParticlesCount;
  87. struct particle *allParticles;
  88.  
  89. allParticlesCount = parse_input("./input.txt", &allParticles);
  90.  
  91. for (int i = 0; i < allParticlesCount; ++i) {
  92. for (int j = i + 1; j < allParticlesCount; ++j) {
  93. for (int k = j + 1; k < allParticlesCount; ++k) {
  94. compute_forces(&allParticles[i], &allParticles[j], &allParticles[k]);
  95. }
  96. }
  97. }
  98.  
  99. for (int i = 0; i < allParticlesCount; ++i) {
  100. update(&allParticles[i], 0.5);
  101. }
  102.  
  103. write_output("./output.txt", allParticlesCount, allParticles);
  104.  
  105. free(allParticles);
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement