Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <random>
- #include <fstream>
- #include <assert.h>
- #include <math.h>
- #include <iomanip> // For std::fixed and std::setprecision
- #include <vector>
- #include <cmath>
- int main() {
- // double D = 1.55986;
- double D = 0.0;
- double dx = 0.000523438;
- double L = 0.067;
- int N_G = 129;
- double dt = 1.0e-2;
- double alpha = dt*D/(dx*dx);
- std::cout << "alpha stability: " << alpha << "\n";
- std::cout << "max dt for the diffusion: " << 0.5*dx*dx/D << "\n";
- double T_diff = L*L/(M_PI*M_PI*D); std::cout << T_diff << "\n";
- int max_iter = 5000000;
- double GAS_DENSITY = 9.64e+20;
- double R = sqrt(1.6e-4/M_PI);
- double nu_loss = D/(R*R);
- double accuracy = 1.0E-4;
- double cycle = 0; // to sace the moment of iteraion
- double S0, S1, S2;
- double cylindric_diff1 = 0.0, cylindric_diff2 = 0.0;
- std::vector<double> e1_density_fw(N_G, 0);
- std::vector<double> e1_density_bw(N_G, 0);
- std::vector<double> e2_density_fw(N_G, 0);
- std::vector<double> e2_density_bw(N_G, 0);
- std::vector<double> gas_dens_local(N_G, GAS_DENSITY);
- std::ofstream file0("initial.dat");
- file0 << std::scientific << std::setprecision(6);
- std::ofstream file1("final.dat");
- file1 << std::scientific << std::setprecision(6);
- std::ifstream infile("dat/rates.dat");
- std::vector<double> avg_rate1f; std::vector<double> avg_rate1b;
- std::vector<double> avg_rate2f; std::vector<double> avg_rate2b;
- double a, b, c, d;
- while (infile >> a >> b >> c >> d){
- avg_rate1f.push_back(a); avg_rate1b.push_back(b);
- avg_rate2f.push_back(c); avg_rate2b.push_back(d);
- }
- // initial condition:
- for (int j = 0; j < N_G; j++){
- e1_density_bw[j] = 0.0;
- e2_density_bw[j] = 0.0;
- }
- for (int k = 0; k < max_iter; k++){
- e1_density_bw[0] = e1_density_bw[1]; e1_density_bw[N_G-1] = e1_density_bw[N_G-2];
- e2_density_bw[0] = e2_density_bw[1]; e2_density_bw[N_G-1] = e2_density_bw[N_G-2];
- gas_dens_local[0] = gas_dens_local[1]; gas_dens_local[N_G-1] = gas_dens_local[N_G-2];
- for (int j = 1; j < N_G-1; j++){
- S0 = dt*(-(avg_rate1f[j]+avg_rate2f[j])*gas_dens_local[j] + avg_rate1b[j]*e1_density_bw[j] + avg_rate2b[j]*e2_density_bw[j]);
- S1 = dt*(avg_rate1f[j]*gas_dens_local[j] - avg_rate1b[j]*e1_density_bw[j]);
- S2 = dt*(avg_rate2f[j]*gas_dens_local[j] - avg_rate2b[j]*e2_density_bw[j]);
- e1_density_fw[j] = e1_density_bw[j]*(1.0 - 2*alpha) + alpha*(e1_density_bw[j+1] + e1_density_bw[j-1]) + S1; // step of calculation
- e2_density_fw[j] = e2_density_bw[j]*(1.0 - 2*alpha) + alpha*(e2_density_bw[j+1] + e2_density_bw[j-1]) + S2;
- gas_dens_local[j] += S0;
- }
- // boundary conditions:
- e1_density_fw[0] = e1_density_fw[1]; e1_density_fw[N_G-1] = e1_density_fw[N_G-2];
- e2_density_fw[0] = e2_density_fw[1]; e2_density_fw[N_G-1] = e2_density_fw[N_G-2];
- double err1 = 0.0, err2 = 0.0;
- for(int j = 1; j < N_G-1; ++j) {
- err1 = std::max(err1, std::abs(e1_density_fw[j] - e1_density_bw[j])/dt);
- err2 = std::max(err2, std::abs(e2_density_fw[j] - e2_density_bw[j])/dt);
- }
- if(err1 < accuracy && err2 < accuracy) {
- cycle = k;
- std::cout << "Converged in " << k << " iterations" << "\n";
- break;
- }
- for (int j = 0; j < N_G; j++){
- e1_density_bw[j] = e1_density_fw[j]; // swap of arrays each step
- e2_density_bw[j] = e2_density_fw[j];
- }
- }
- for (int j = 0; j < N_G; j++){
- double x = j*dx;
- file1 << x << " " << e1_density_bw[j] << " " << e2_density_bw[j] << " " << gas_dens_local[j]<< "\n";
- }
- file0.close();
- file1.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement