#include <vector>
// #include <cmath>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <time.h>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;
// Function to compute source term q
double sourceTerm(double x, double y) {
return -(x * x + y * y);
}
// Function to initialize phi grid
void initializePhi(vector<vector<double > >& phi, int n) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
phi[i][j] = 0.0;
}
}
}
// Main function
int main(int argc, char** argv) {
const int N = 401; // Total points in each direction
const double deltaX = 0.005, deltaY = 0.005;
const double tol = 1e-4;
vector<vector<double > > phi(N, vector<double>(N, 0.0)); // Including halo rows
vector<vector<double > > phi_new(N, vector<double>(N, 0.0));
initializePhi(phi, N);
initializePhi(phi_new, N);
double maxError;
int iterations = 0;
do {
for (int i=1; i < N - 1; i++)
{
double y = i*deltaY;
phi_new
[i
][0] = sin(2 * M_PI
* y
); }
for (int i = 1; i < N - 1; ++i) {
for (int j = 1; j < N - 1; ++j) {
if((i+j)%2==0)
phi_new[i][j] = 0.25 * (phi[i + 1][j] + phi[i - 1][j] + phi[i][j + 1] + phi[i][j - 1] +
deltaX * deltaY * sourceTerm(i * deltaX, j * deltaY));
}
}
for (int i = 1; i < N - 1; ++i) {
for (int j = 1; j < N - 1; ++j) {
if((i+j)%2==1)
phi_new[i][j] = 0.25 * (phi_new[i + 1][j] + phi_new[i - 1][j] + phi_new[i][j + 1] + phi_new[i][j - 1] +
deltaX * deltaY * sourceTerm(i * deltaX, j * deltaY));
}
}
for (int i=1; i < N - 1; i++)
{
phi_new[i][N-1] = (4 * phi_new[i][N-2] - phi_new[i][N-3])/3.0;
}
maxError = 0.0;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
maxError
= max
(maxError
, fabs(phi_new
[i
][j
] - phi
[i
][j
])/phi
[i
][j
]); phi[i][j] = phi_new[i][j];
}
}
iterations++;
} while (maxError > tol);
double time_spent=(double) (end-start)/CLOCKS_PER_SEC;
cout<<"time taken "<<time_spent<<endl;
string filename = "que_2d_serial.txt";
FILE *outputFile;
outputFile
= fopen(filename.
c_str(), "w");
fprintf(outputFile
, "Convergence reached after %d iterations \n \n", iterations
); cout << "Convergence reached after " << iterations << " iterations." << endl;
fprintf(outputFile
, "Total 201 points \n"); // cout<<"Total 201 points"<<endl;
for(int i = 0; i < N; i++)
{
fprintf(outputFile
, "%f, ", (-1 + i
* deltaX
)); // cout<< (i * deltaX) <<" ";
}
fprintf(outputFile
, "Numerical Solution when x = %f \n", -1 + (N
/2)*deltaX
); // cout<<"Numerical Solution when x = "<< (N/2)*deltaX <<endl;
for(int j = 0; j < N; j++)
{
fprintf(outputFile
, "%f, ", phi
[N
/2][j
]); // cout<<phi[N/2][j]<<" ";
}
fprintf(outputFile
, "Numerical Solution when y = %f \n", -1 + (N
/2)*deltaY
); // cout<<"Numerical Solution when x = "<< (N/2)*deltaX <<endl;
for(int i = 0; i < N; i++)
{
fprintf(outputFile
, "%f, ", phi
[i
][N
/2]); // cout<<phi[i][N/2]<<" ";
}
return 0;
}
CiNpbmNsdWRlIDx2ZWN0b3I+Ci8vICNpbmNsdWRlIDxjbWF0aD4KI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDx0aW1lLmg+CiNkZWZpbmUgX1VTRV9NQVRIX0RFRklORVMKI2luY2x1ZGUgPG1hdGguaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBGdW5jdGlvbiB0byBjb21wdXRlIHNvdXJjZSB0ZXJtIHEKZG91YmxlIHNvdXJjZVRlcm0oZG91YmxlIHgsIGRvdWJsZSB5KSB7CiAgICByZXR1cm4gLSh4ICogeCArIHkgKiB5KTsKfQoKLy8gRnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBwaGkgZ3JpZAp2b2lkIGluaXRpYWxpemVQaGkodmVjdG9yPHZlY3Rvcjxkb3VibGUgPiA+JiBwaGksIGludCBuKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgKytqKSB7CiAgICAgICAgICAgIHBoaVtpXVtqXSA9IDAuMDsKICAgICAgICB9CiAgICB9Cn0KCgovLyBNYWluIGZ1bmN0aW9uCmludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewoKICAgIGNvbnN0IGludCBOID0gNDAxOyAgLy8gVG90YWwgcG9pbnRzIGluIGVhY2ggZGlyZWN0aW9uCiAgICBjb25zdCBkb3VibGUgZGVsdGFYID0gMC4wMDUsIGRlbHRhWSA9IDAuMDA1OwogICAgY29uc3QgZG91YmxlIHRvbCA9IDFlLTQ7CgogICAgY2xvY2tfdCBzdGFydD1jbG9jaygpOwoKICAgIHZlY3Rvcjx2ZWN0b3I8ZG91YmxlID4gPiBwaGkoTiwgdmVjdG9yPGRvdWJsZT4oTiwgMC4wKSk7IC8vIEluY2x1ZGluZyBoYWxvIHJvd3MKICAgIHZlY3Rvcjx2ZWN0b3I8ZG91YmxlID4gPiBwaGlfbmV3KE4sIHZlY3Rvcjxkb3VibGU+KE4sIDAuMCkpOwogICAgaW5pdGlhbGl6ZVBoaShwaGksIE4pOwogICAgaW5pdGlhbGl6ZVBoaShwaGlfbmV3LCBOKTsKCiAgICBkb3VibGUgbWF4RXJyb3I7CiAgICBpbnQgaXRlcmF0aW9ucyA9IDA7CgogICAgCiAgICBkbyB7CiAgICAgICAgZm9yIChpbnQgaT0xOyBpIDwgTiAtIDE7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGRvdWJsZSB5ID0gaSpkZWx0YVk7CiAgICAgICAgICAgIHBoaV9uZXdbaV1bMF0gPSBzaW4oMiAqIE1fUEkgKiB5KTsKICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgTiAtIDE7ICsraSkgewogICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8IE4gLSAxOyArK2opIHsKICAgICAgICAgICAgICAgIGlmKChpK2opJTI9PTApCiAgICAgICAgICAgICAgICAgICAgcGhpX25ld1tpXVtqXSA9IDAuMjUgKiAocGhpW2kgKyAxXVtqXSArIHBoaVtpIC0gMV1bal0gKyBwaGlbaV1baiArIDFdICsgcGhpW2ldW2ogLSAxXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVggKiBkZWx0YVkgKiBzb3VyY2VUZXJtKGkgKiBkZWx0YVgsIGogKiBkZWx0YVkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOIC0gMTsgKytpKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgTiAtIDE7ICsraikgewogICAgICAgICAgICAgICAgaWYoKGkraiklMj09MSkKICAgICAgICAgICAgICAgICAgICBwaGlfbmV3W2ldW2pdID0gMC4yNSAqIChwaGlfbmV3W2kgKyAxXVtqXSArIHBoaV9uZXdbaSAtIDFdW2pdICsgcGhpX25ld1tpXVtqICsgMV0gKyBwaGlfbmV3W2ldW2ogLSAxXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVggKiBkZWx0YVkgKiBzb3VyY2VUZXJtKGkgKiBkZWx0YVgsIGogKiBkZWx0YVkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKCiAgICAgICAgZm9yIChpbnQgaT0xOyBpIDwgTiAtIDE7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHBoaV9uZXdbaV1bTi0xXSA9ICg0ICogcGhpX25ld1tpXVtOLTJdIC0gcGhpX25ld1tpXVtOLTNdKS8zLjA7CiAgICAgICAgfQoKICAgICAgICBtYXhFcnJvciA9IDAuMDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47ICsraSkgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47ICsraikgewogICAgICAgICAgICAgICAgbWF4RXJyb3IgPSBtYXgobWF4RXJyb3IsIGZhYnMocGhpX25ld1tpXVtqXSAtIHBoaVtpXVtqXSkvcGhpW2ldW2pdKTsKICAgICAgICAgICAgICAgIHBoaVtpXVtqXSA9IHBoaV9uZXdbaV1bal07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGl0ZXJhdGlvbnMrKzsKICAgIH0gd2hpbGUgKG1heEVycm9yID4gdG9sKTsKCiAgICBjbG9ja190IGVuZD1jbG9jaygpOwoKICAgIGRvdWJsZSB0aW1lX3NwZW50PShkb3VibGUpIChlbmQtc3RhcnQpL0NMT0NLU19QRVJfU0VDOwoKICAgIGNvdXQ8PCJ0aW1lIHRha2VuICI8PHRpbWVfc3BlbnQ8PGVuZGw7CiAgICBzdHJpbmcgZmlsZW5hbWUgPSAicXVlXzJkX3NlcmlhbC50eHQiOwogICAgRklMRSAqb3V0cHV0RmlsZTsKICAgIG91dHB1dEZpbGUgPSBmb3BlbihmaWxlbmFtZS5jX3N0cigpLCAidyIpOwoKICAgIGZwcmludGYob3V0cHV0RmlsZSwgIkNvbnZlcmdlbmNlIHJlYWNoZWQgYWZ0ZXIgJWQgaXRlcmF0aW9ucyBcbiBcbiIsIGl0ZXJhdGlvbnMpOwogICAgY291dCA8PCAiQ29udmVyZ2VuY2UgcmVhY2hlZCBhZnRlciAiIDw8IGl0ZXJhdGlvbnMgPDwgIiBpdGVyYXRpb25zLiIgPDwgZW5kbDsKCiAgICBmcHJpbnRmKG91dHB1dEZpbGUsICJUb3RhbCAyMDEgcG9pbnRzIFxuIik7CiAgICAvLyBjb3V0PDwiVG90YWwgMjAxIHBvaW50cyI8PGVuZGw7CiAgICBmcHJpbnRmKG91dHB1dEZpbGUsICJbIik7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQogICAgewogICAgICAgIGZwcmludGYob3V0cHV0RmlsZSwgIiVmLCAiLCAoLTEgKyBpICogZGVsdGFYKSk7CiAgICAgICAgLy8gY291dDw8IChpICogZGVsdGFYKSA8PCIgIjsKICAgIH0KICAgIGZwcmludGYob3V0cHV0RmlsZSwgIl0gXG4gXG4iKTsKCiAgICBmcHJpbnRmKG91dHB1dEZpbGUsICJOdW1lcmljYWwgU29sdXRpb24gd2hlbiB4ID0gJWYgXG4iLCAtMSArIChOLzIpKmRlbHRhWCk7CiAgICAvLyBjb3V0PDwiTnVtZXJpY2FsIFNvbHV0aW9uIHdoZW4geCA9ICI8PCAoTi8yKSpkZWx0YVggPDxlbmRsOwogICAgZnByaW50ZihvdXRwdXRGaWxlLCAiWyIpOwogICAgZm9yKGludCBqID0gMDsgaiA8IE47IGorKykKICAgIHsKICAgICAgICBmcHJpbnRmKG91dHB1dEZpbGUsICIlZiwgIiwgcGhpW04vMl1bal0pOwogICAgICAgIC8vIGNvdXQ8PHBoaVtOLzJdW2pdPDwiICI7CiAgICB9CiAgICBmcHJpbnRmKG91dHB1dEZpbGUsICJdIFxuIFxuIik7CgogICAgZnByaW50ZihvdXRwdXRGaWxlLCAiTnVtZXJpY2FsIFNvbHV0aW9uIHdoZW4geSA9ICVmIFxuIiwgLTEgKyAoTi8yKSpkZWx0YVkpOwogICAgLy8gY291dDw8Ik51bWVyaWNhbCBTb2x1dGlvbiB3aGVuIHggPSAiPDwgKE4vMikqZGVsdGFYIDw8ZW5kbDsKICAgIGZwcmludGYob3V0cHV0RmlsZSwgIlsiKTsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBOOyBpKyspCiAgICB7CiAgICAgICAgZnByaW50ZihvdXRwdXRGaWxlLCAiJWYsICIsIHBoaVtpXVtOLzJdKTsKICAgICAgICAvLyBjb3V0PDxwaGlbaV1bTi8yXTw8IiAiOwogICAgfQogICAgZnByaW50ZihvdXRwdXRGaWxlLCAiXSBcbiBcbiIpOwoKICAgIGZjbG9zZShvdXRwdXRGaWxlKTsKCiAgICByZXR1cm4gMDsKfQoK