Advertisement
Guest User

VALEK

a guest
Mar 22nd, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.21 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 70           //в Td    
  14. #define d 0.3918e-4
  15. #define T0 0.26 //300K 1K = 1.3806*10^-16 erg
  16. #define eps0 1.6e-12 //перевод энергии
  17. #define B0 2.4668e-4
  18. #define hw 0.29299 // для вычисление колебательного уровня, гармоническая контанства в Эв
  19. #define Tk 0.3  //3000K
  20.  
  21.  
  22. #define N 10000 //кол-во шагов по времени
  23. #define M 150 //кол-во шагов по энергии
  24. #define t 1e-12 //шаг по времени
  25. #define h 0.1 //шаг по энергии  эВ
  26.  
  27.  
  28.  
  29. double T[100][2];                // объявил глобальный массив
  30. double R[100][2];
  31. double VL[100][2];
  32. double e;                        // передаваемое значение энергии   
  33. char type;                      // тип сечения
  34. int a;
  35.  
  36. void init() {
  37.  
  38.     FILE *transp; transp = fopen("C:\\Users\\superior\\Documents\\cross_section\\transfer.txt", "r");
  39.     FILE *rot; rot = fopen("C:\\Users\\superior\\Documents\\cross_section\\rotat.txt", "r");
  40.     FILE *vl; vl = fopen("C:\\Users\\superior\\Documents\\cross_section\\vl.txt", "r");
  41.  
  42.     for (int i = 0; i<100; i++) {
  43.         for (int j = 0; j<2; j++) {
  44.             T[i][j] = 0;
  45.             R[i][j] = 0;
  46.             VL[i][j] = 0;
  47.         }
  48.     }
  49.  
  50.     for (int i = 0; i<100; i++) {
  51.         for (int j = 0; j<2; j++) {
  52.             fscanf(transp, "%lf", &T[i][j]);
  53.             fscanf(rot, "%lf", &R[i][j]);
  54.             fscanf(vl, "%lf", &VL[i][j]);
  55.         }
  56.     }
  57.  
  58.     fclose(transp);
  59.     fclose(rot);
  60.     fclose(vl);
  61. }
  62.  
  63. double cs(double e, char type) {
  64.     double sigma;
  65.  
  66.     if (type == 'r') {
  67.         for (int i = 0; i < 45; i++) {
  68.             if (R[i][0] >= e) {
  69.                 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;
  70.                 break;
  71.             }
  72.         }
  73.  
  74.         if (R[44][0] < e) {
  75.             sigma = (R[43][1] + (R[44][1] - R[43][1])*(e - R[43][0]) / (R[44][0] - R[43][0]))*1e-16;
  76.         }
  77.         if (R[0][0] > e) {
  78.             sigma = (R[0][1] + (R[1][1] - R[0][1])*(e - R[0][0]) / (R[1][0] - R[0][0]))*1e-16;
  79.         }
  80.     }
  81.  
  82.     else if (type == 't') {
  83.         for (int i = 0; i < 64; i++) {
  84.             if (T[i][0] >= e) {
  85.                 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;
  86.                 break;
  87.             }
  88.  
  89.         }
  90.         if (T[63][0] < e) {
  91.             sigma = (T[62][1] + (T[63][1] - T[62][1])*(e - T[62][0]) / (T[63][0] - T[62][0]))*1e-16;
  92.         }
  93.         if (T[0][0] > e) {
  94.             sigma = (T[0][1] + (T[1][1] - T[0][1])*(e - T[0][0]) / (T[1][0] - T[0][0]))*1e-16;
  95.         }
  96.     }
  97.     else if (type == 'l') {
  98.             for (int i = 0; i < 68; i++) {
  99.                 if (VL[i][0] >= e) {
  100.                     sigma = (VL[i - 1][1] + (VL[i][1] - VL[i - 1][1])*(e - VL[i - 1][0]) / (VL[i][0] - VL[i - 1][0]))*1e-16;
  101.                     break;
  102.                 }
  103.  
  104.             }
  105.             if (VL[67][0] < e) {
  106.                 sigma = (VL[66][1] + (VL[67][1] - VL[66][1])*(e - VL[66][0]) / (VL[67][0] - VL[66][0]))*1e-16;
  107.             }
  108.             if (VL[0][0] > e) {
  109.                 sigma = (VL[0][1] + (VL[1][1] - VL[0][1])*(e - VL[0][0]) / (VL[1][0] - VL[0][0]))*1e-16;
  110.             }
  111.  
  112.         }
  113.  
  114.         return sigma;
  115.     }
  116.  
  117.  
  118.  
  119.  
  120. void main() {
  121.     FILE *FREE; FREE = fopen("C:\\FREE.txt", "w");
  122.  
  123.     double A,B,C,D,E, G;            // константы в изначальной разностной схеме
  124.     double H;                   // член с электронным возбуждением
  125.     double C1,C2,C3,C4;     // контанты в конечной разностной схеме
  126.     double I=0;             // нормировочный интеграл
  127.  
  128.     init();
  129.    
  130.     A = (1 / n0)*sqrt(m / 2)*sqrt(eps0);
  131.     B = ((q*En*1e-19)/3)*((q*En*1e-19)/3)/(3*eps0) ;
  132.     C = d*T0*eps0;
  133.     D = d*eps0;
  134.     E = 4 * B0*eps0;
  135.     G = exp(-hw / (2 * Tk))*eps0;
  136.  
  137.  
  138.     double **F = new double*[N]; //N строк (время), M столбцов (энергия)
  139.     for (int i = 0; i < N; i++) {
  140.         F[i] = new double[M];
  141.     }
  142.     double **F0 = new double*[N]; //N строк (время), M столбцов (энергия)
  143.     for (int i = 0; i < N; i++) {   // нормированная функция распределения
  144.         F0[i] = new double[M];
  145.     }
  146.  
  147.  
  148.     for (int j = 0; j < M; j++) {   //начальное условие
  149.         F[0][j] = exp(-h*j / T0);
  150.     }
  151.     for (int i = 0; i < N; i++) {   // граничное условие справа
  152.         F[i][M-1] = 0;
  153.     }
  154.  
  155.     int Evl;
  156.    
  157.     Evl = round(7.65/h);
  158.  
  159.     for (int i = 0; i < N-1 ; i++) {
  160.         for (int j = 1; j < M-1; j++) {
  161.  
  162.            
  163.             C1 = B*(h*j) / cs(h*j, 't') + C*(h*j)*(h*j)*cs(h*j, 't');
  164.             C2 = D*(h*j)*(h*j)*cs(h*j, 't') + E*(h*j)*cs(h*j, 'r');   // !!!!!!!!!!!!!! тут второе сечение должно быть вращательным
  165.             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')) +
  166.                 + 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;
  167.             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') +
  168.                 + E*(h*j)*(cs(h*j + 0.5*h, 'r') - cs(h*j - 0.5*h, 'r')); // внимание - два последих сечения - вращательные!!!
  169.            
  170.             if (j + Evl < M) {
  171.                 H = (1 / A)*(1 / sqrt(h*j))*t*G*(h*j + Evl*h)*cs(h*j + h*Evl, 'l');
  172.             }
  173.             else H = 0;
  174.  
  175.             F[i + 1][j] = (1 / (A*sqrt(h*j))) * (F[i][j + 1] * t* (C1 / (h*h) + C3 / h) +
  176.                 +F[i][j] * (A*sqrt(h*j) - 2 * t*C1 / (h*h) - t*C3 / h + t*C4 - t*G*(h*j)*cs(h*j, 'l')) + F[i][j - 1] * (t*C1 / (h*h))) + H*F[i][j + Evl];
  177.            
  178. //          printf("%e\n", H);
  179.            
  180. //          Sleep(100);
  181.            
  182.  
  183.  
  184.         }
  185. //      printf("\n");
  186.         F[i+1][0] = F[i+1][1];                                  //ГУ слева
  187.         F[0][0] = F[0][1];
  188.     }
  189. // нормировка
  190.     for (int i = 0; i < N; i++) {
  191.         for (int j = 1; j < M; j++) {
  192.             I = I + (F[i][j - 1] + F[i][j])*h / 2;
  193.         }
  194.         for (int L = 0; L < M; L++) {
  195.             F0[i][L] = F[i][L] / I;
  196.         }
  197. //      printf("%e\n", Evl);
  198. //      Sleep(1500);
  199.  
  200.         I = 0;
  201.     }
  202.  
  203. //
  204.     for (int j = 0; j < M; j++) {
  205.  
  206.         for (int i = 1; i < N; i++) {
  207.  
  208. //      for (int i = 0; i < 5; i++) {
  209.                 fprintf(FREE, "%e\t", F0[i][j]);
  210.             }
  211.            
  212.         }
  213.         fprintf(FREE, "\n");
  214.     }
  215.    
  216.  
  217.  
  218. /*
  219. типы сечений:
  220. Транспортное = t;
  221. Вращательное = r;
  222. электронное = l;
  223. колебательное = w;
  224. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement