fixed Euler's step and number of iteration for dx = 5

This commit is contained in:
mejjete 2024-03-12 21:34:40 +01:00
parent 5807ba4b64
commit 6a4ded9ca7

View file

@ -1,39 +1,29 @@
#include <iostream> #include <iostream>
#include <vector> #include <vector>
#include <iomanip>
#include <math.h> #include <math.h>
#include <iomanip>
using namespace std; using namespace std;
int main() int main()
{ {
// Length int l = 1925; // Edge length
int l = 1925; int dx = 40; // Spatial step
// Spatial step int dt = 100000; // Euler's step
int dx = 40; int kmax = l / dx; // Number of spatial steps
// Temporal step
int dt = 2500;
// Number of spatial steps
int kmax = l / dx;
// Initializing parameters
vector<double> list(dt);
// Arrays to store data
double Q[kmax][dt];
double P[kmax][dt];
int i;
// Parameters // Parameters
double alpha = 0.093; double alpha = 0.093;
double beta = 0.004; double beta = 0.004;
double gamma = 728.6; double gamma = 728.6;
double h = 0.05; double h = 0.007;
double sum_of_h = 0;
// Arrays to store data
double Q[kmax][dt];
double P[kmax][dt];
// Loop over time steps // Loop over time steps
for (i = 0; i < dt; i++) for (int i = 0; i < dt; i++)
{ {
// Loop over spatial steps // Loop over spatial steps
for (int k = 0; k < kmax; k++) for (int k = 0; k < kmax; k++)
@ -42,7 +32,7 @@ int main()
if (k == kmax - 1) if (k == kmax - 1)
{ {
Q[k][i] = 0; Q[k][i] = 0;
P[k][i] = -202.0; // P = -202 when Q = 10 P[k][i] = -202.0; // P = -202 when Q = 10
} else } else
{ {
Q[k][i] = 0; Q[k][i] = 0;
@ -52,31 +42,20 @@ int main()
} }
// Main calculation loop // Main calculation loop
for (i = 2; i < dt - 2; i++) for (int i = 2; i < dt; i++)
{ {
// Add current time step to the list
sum_of_h = sum_of_h + h;
list.push_back(sum_of_h);
std::cout << "Q at step " << i;
// Loop over spatial steps // Loop over spatial steps
for (int k = 1; k < kmax; k++) for (int k = 1; k < kmax; k++)
{ {
// Boundary condition for the last spatial step Q[k][i + 1] = Q[k][i] + h * (alpha * (P[k - 1][i] - P[k][i]) - beta * Q[k][i] * abs(Q[k][i]));
if (k == kmax - 1)
{ // DO NOT calculate pressure for the last element such as it is given by default
Q[k][i + 1] = Q[k][i] + h * (alpha * (P[k - 1][i] - P[k][i]) - beta * Q[k][i] * abs(Q[k][i])); if (k != kmax - 1)
} else
{
// Calculate Q and P for non-boundary spatial steps
Q[k][i + 1] = Q[k][i] + h * (alpha * (P[k - 1][i] - P[k][i]) - beta * Q[k][i] * abs(Q[k][i]));
P[k][i + 1] = P[k][i - 2] + h * (gamma * (Q[k][i] - Q[k + 1][i])); P[k][i + 1] = P[k][i - 2] + h * (gamma * (Q[k][i] - Q[k + 1][i]));
}
} }
} }
// Print out the first 10 values of the timestemp // Print out the first 10 of Q for each spatial step
std::cout << "FIRST 10 VALUES\n"; std::cout << "FIRST 10 VALUES\n";
for(int i = 0; i < kmax; i++) for(int i = 0; i < kmax; i++)
{ {
@ -89,18 +68,19 @@ int main()
std::cout << std::endl; std::cout << std::endl;
} }
// Print out the last 10 values of the timestemp // Print out the first 10 of Q for each spatial step
std::cout << "LAST 10 VALUES\n"; std::cout << "LAST 10 VALUES:\n";
for(int i = 0; i < kmax; i++) for(int i = 1; i < kmax; i++)
{ {
std::cout.width(5); std::cout.width(5);
std::cout.flags(std::ios::left); std::cout.flags(std::ios::left);
std::cout << i << ": "; std::cout << i << ": ";
for(int k = 0; k < 10; k++) for(int k = 0; k < 10; k++)
std::cout << std::setw(10) << Q[i][2489 + k]; std::cout << std::setw(10) << Q[i][dt - 10 + k];
std::cout << std::endl; std::cout << std::endl;
} }
return 0; return 0;
} }