Architect0rr

Untitled

Apr 21st, 2021
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <cstdlib>
  5. #include <tuple>
  6. // #include <ctime>
  7.  
  8. #define KELVIN 273.15
  9. #define R 8.314
  10. #define ctemp 30
  11. #define temp_delta 30
  12.  
  13. using std::cout;
  14. using std::endl;
  15.  
  16. const int hmax = 1000;
  17. const int wmax = 0.007;
  18. const double mmassarg = 40*pow(10,-3);
  19. const double massarg = 40*1.66*pow(10,-27);
  20. const double T2 = KELVIN + ctemp;
  21. const double T1 = T2 + temp_delta;
  22. const double V1 = sqrt((3*R*T1)/mmassarg);
  23. const double V2 = sqrt((3*R*T2)/mmassarg);
  24. const double time_delta = 1*pow(10,-6);
  25.  
  26. std::tuple<double,double> getrs(bool fl){
  27.   float x = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
  28.   float y = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
  29.   if (fl) {
  30.     return std::make_tuple(x*V1,y*V1);
  31.   }else{
  32.     return std::make_tuple(x*V2,y*V2);
  33.   }
  34. }
  35.  
  36. struct molecule{
  37.   double posx,posy;
  38.   double speedx,speedy;
  39.   molecule(double posx,double posy,double speedx,double speedy):posx(posx),posy(posy),speedx(speedx),speedy(speedy){}
  40.   molecule(double posx,double posy,std::tuple<double,double> tp):posx(posx),posy(posy){
  41.     speedx = std::get<0>(tp);
  42.     speedy = std::get<1>(tp);
  43.   }
  44. };
  45.  
  46. int main(int argc, char const *argv[]) {
  47.   cout << "App speed1: " << V1 << endl;
  48.   cout << "App speed2: " << V2 << endl;
  49.   molecule am(0.0045,0.0045,getrs(false));
  50.   double time = 0;
  51.   int count = 0;
  52.   double energy = 0;
  53.   double mposx,mposy;
  54.   while (time < 1) {
  55.     mposx = am.posx + am.speedx*time_delta;
  56.     mposy = am.posy + am.speedy*time_delta;
  57.     if (mposx > wmax) {
  58.       double ltime = (wmax-am.posx)/am.speedx;
  59.       double stime = time_delta - ltime;
  60.       am.posx = wmax;
  61.       am.posy = ltime*am.speedy;
  62.       auto [sx,sy] = getrs(false);
  63.       am.speedx = -sx;
  64.       am.speedy = sy;
  65.       am.posx = stime*am.speedx;
  66.       am.posy = stime*am.speedy;
  67.     }
  68.     if (mposx < 0) {
  69.       double E1 = massarg*(am.speedx*am.speedx + am.speedy*am.speedy)/2;
  70.       double ltime = (wmax-am.posx)/am.speedx;
  71.       double stime = time_delta - ltime;
  72.       am.posx = 0;
  73.       am.posy = ltime*am.speedy;
  74.       auto [sx,sy] = getrs(true);
  75.       am.speedx = sx;
  76.       am.speedy = sy;
  77.       am.posx = stime*am.speedx;
  78.       am.posy = stime*am.speedy;
  79.       double E2 = massarg*(am.speedx*am.speedx + am.speedy*am.speedy)/2;
  80.       energy +=abs(E1-E2);
  81.       cout << "E1: " << E1 << " E2: " << E2 << " Delta: " << abs(E1-E2) << endl;
  82.     }
  83.     if (mposy > hmax) {
  84.       am.posx = mposx;
  85.       double ltime = (hmax-am.posy)/am.speedy;
  86.       double stime = time_delta - ltime;
  87.       am.posy = hmax;
  88.       am.speedy = -am.speedy;
  89.       am.posy = stime*am.speedy;
  90.     }
  91.     if (mposy < 0) {
  92.       am.posx = mposx;
  93.       double ltime = (hmax-am.posy)/am.speedy;
  94.       double stime = time_delta - ltime;
  95.       am.posy = 0;
  96.       am.speedy = -am.speedy;
  97.       am.posy = stime*am.speedy;
  98.     }
  99.     time+=time_delta;
  100.     ++count;
  101.   }
  102.  
  103.   cout << count << ' ' << time << endl;
  104.   cout << energy << endl;
  105.  
  106.   return 0;
  107. }
  108.  
Advertisement
Add Comment
Please, Sign In to add comment