Advertisement
phystota

FREE_new

Mar 22nd, 2019 (edited)
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.78 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <cmath>
  5. #include <windows.h>
  6. #define _USE_MATH_DEFINES
  7. using namespace std;
  8.  
  9. #define m 9.1094e-28
  10. #define MN2 46.4968e-24
  11. #define n0 1e16
  12. #define q 4.8032e-10
  13. #define En 300          //в Td    
  14. #define d 0.3918e-4
  15. #define T0 0.26 //500K 1K = 1.3806*10^-16 erg
  16. #define eps0 1.6e-12 //перевод энергии
  17. #define B0 2.4668e-4
  18. #define Tk 0.3
  19. #define hw 0.29299
  20.  
  21.  
  22. #define N 100001 //кол-во шагов по времени
  23. #define M 200 //кол-во шагов по энергии
  24. #define t 1e-14 //шаг по времени
  25. #define h 0.1 //шаг по энергии  эВ
  26.  
  27.  
  28.  
  29. double T[100][2];               // транспортное сечение
  30. double R[100][2];               // вращательное сечение
  31. double e;                        // передаваемое значение энергии  
  32. char type;                      // тип сечения
  33. int a;
  34.  
  35. void init() {
  36.  
  37.     FILE *transp; transp = fopen("C:\\Users\\superior\\Documents\\cross_section\\transfer.txt", "r");
  38.     FILE *rot; rot = fopen("C:\\Users\\superior\\Documents\\cross_section\\rotat.txt", "r");
  39.  
  40.     for (int i = 0; i<100; i++) {
  41.         for (int j = 0; j<2; j++) {
  42.             T[i][j] = 0;
  43.             R[i][j] = 0;
  44.         }
  45.     }
  46.  
  47.     for (int i = 0; i<100; i++) {
  48.         for (int j = 0; j<2; j++) {
  49.             fscanf(transp, "%lf", &T[i][j]);
  50.             fscanf(rot, "%lf", &R[i][j]);
  51.         }
  52.     }
  53.  
  54.     fclose(transp);
  55.     fclose(rot);
  56. }
  57.  
  58. double cs(double e, char type) {
  59.     double sigma;
  60.  
  61.     if (type == 'r') {
  62.         for (int i = 0; i < 45; i++) {
  63.             if (R[i][0] >= e) {
  64.                 sigma = (R[i - 1][1] + (R[i][1] - R[i - 1][1])*(e - R[i - 1][0]) / (R[i][0] - R[i - 1][0]))*1e-16;
  65.                 break;
  66.             }
  67.  
  68.         }
  69.         if (R[44][0] < e) {
  70.             sigma = (R[43][1] + (R[44][1] - R[43][1])*(e - R[43][0]) / (R[44][0] - R[43][0]))*1e-16;
  71.         }
  72.         if (R[0][0] > e) {
  73.             sigma = (R[0][1] + (R[1][1] - R[0][1])*(e - R[0][0]) / (R[1][0] - R[0][0]))*1e-16;
  74.         }
  75.     }
  76.     else if (type == 't') {
  77.         for (int i = 0; i < 64; i++) {
  78.             if (T[i][0] >= e) {
  79.                 sigma = (T[i - 1][1] + (T[i][1] - T[i - 1][1])*(e - T[i - 1][0]) / (T[i][0] - T[i - 1][0]))*1e-16;
  80.                 break;
  81.             }
  82.  
  83.         }
  84.         if (T[63][0] < e) {
  85.             sigma = (T[62][1] + (T[63][1] - T[62][1])*(e - T[62][0]) / (T[63][0] - T[62][0]))*1e-16;
  86.         }
  87.         if (T[0][0] > e) {
  88.             sigma = (T[0][1] + (T[1][1] - T[0][1])*(e - T[0][0]) / (T[1][0] - T[0][0]))*1e-16;
  89.         }
  90.     }
  91.  
  92.     return sigma;
  93. }
  94.  
  95. void main() {
  96.  
  97.     FILE *FREE; FREE = fopen("C:\\FREE.txt", "w");
  98.  
  99.     double A, B, C, D, E;           // константы в изначальной разностной схеме
  100.     double C1, C2, C3, C4;     // контанты в конечной разностной схеме
  101.     double I = 0;             // нормировочный интеграл
  102.  
  103.  
  104.     init();
  105.  
  106.     A = (1 / n0)*sqrt(m / 2)*sqrt(eps0);
  107.     B = ((q*En*1e-19) / 3)*((q*En*1e-19) / 3) / (3 * eps0);
  108.     C = d*T0*eps0;
  109.     D = d*eps0;
  110.     E = 4 * B0*eps0;
  111.  
  112.     double Fp[M], Fn[M]; // Fp - предыдуший шаг по времени, Fn - следующий шаг по времени
  113.  
  114. /*  double **F = new double*[3]; // 3 столбцов (время), M строк (энергия)
  115.     for (int i = 0; i < 3; i++) {       // массив для шагов по времени 10,50,100,500,1000.........
  116.         F[i] = new double[M];
  117.     }*/
  118.  
  119.     double F[6][M];
  120.    
  121.     for (int j = 0; j < M; j++) {   //начальное условие
  122.         Fp[j] = exp(-h*j / T0);
  123.     }
  124.    
  125. //  Fp[M - 1];                          // ГУ справа
  126. //  Fp[0] = Fp[1];                      // ГУ слева
  127.    
  128.     for (int i = 0; i < N; i++) {
  129.         for (int j = 1; j < M - 1; j++) {
  130.  
  131.             C1 = B*(h*j) / cs(h*j, 't') + C*(h*j)*(h*j)*cs(h*j, 't');
  132.             C2 = D*(h*j)*(h*j)*cs(h*j, 't') + E*(h*j)*cs(h*j, 'r');
  133.             C3 = B*(cs(h*j, 't') - j*(cs(h*j + 0.5*h, 't') - cs(h*j - 0.5*h, 't'))) / (cs(h*j, 't')*cs(h*j, 't')) +
  134.                 +2 * C*(h*j)*cs(h*j, 't') + C*(h*j)*(j)*(cs(h*j + 0.5*h, 't') - cs(h*j - 0.5*h, 't')) + C2;
  135.             C4 = 2 * D*(h*j)*cs(h*j, 't') + D*(h*j)*(j)*(cs(h*j + 0.5*h, 't') - cs(h*j - 0.5*h, 't')) + E*cs(h*j, 'r') +
  136.                 +E*(h*j)*(cs(h*j + 0.5*h, 'r') - cs(h*j - 0.5*h, 'r'));
  137.  
  138.             Fn[j] = (1 / (A*sqrt(h*j))) * (Fp[j + 1] * t* (C1 / (h*h) + C3 / h) +
  139.                 +Fp[j] * (A*sqrt(h*j) - 2 * t*C1 / (h*h) - t*C3 / h + t*C4) + Fp[j - 1] * (t*C1 / (h*h)));
  140.         }
  141.             Fn[M - 1] = 0;
  142.             Fn[0] = Fn[1];
  143.  
  144.             for (int j = 0; j < M; j++) {
  145.                 Fp[j] = Fn[j];
  146.                 if (i == 10) F[0][j] = Fn[j];
  147.                 if (i == 50) F[1][j] = Fn[j];
  148.                 if (i == 100) F[2][j] = Fn[j];
  149.                 if (i == 1000) F[3][j] = Fn[j];
  150.                 if (i == 10000) F[4][j] = Fn[j];
  151.                 if (i == 100000) F[5][j] = Fn[j];
  152. //              printf("%e\n", F[0][j]);
  153. //              Sleep(15);
  154.             }
  155. //          printf("\n");
  156.  
  157.     }
  158.  
  159.     for (int j = 0; j < M; j++) {
  160.         for (int i = 0; i < 6; i = i++) {
  161.  
  162.             fprintf(FREE, "%e\t", F[i][j]);
  163.         }
  164.         fprintf(FREE, "\n");
  165.     }
  166.  
  167.  
  168.     fclose(FREE);
  169.  
  170.        
  171.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement