1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
int main()
{
const long xsize = 1000000,ysize = 1500000; //Horizontal and Vertical size (m)
const int xnum = 36,ynum = 36; // Horizontal and Vertical resolution
const double vx0 = 1.0e-9 * xsize / 2 / ysize,vy0 = 1.0e-9,pi = 3.14159; //Scale for Horizontal and Vertical Velocity (m/s)
const double xstp = xsize/(xnum-1),ystp = ysize/(ynum-1); // Horizontal and Vertical grid step
double vx[xnum][ynum],vy[xnum][ynum],dvxdx[ynum][xnum],dvydy[ynum][xnum],divv[ynum][xnum]; // Declaration of the Horizontal and Vertical velocity component and Partial DerivativesdVx/dx and dVy/dy
double x[xnum]={0.0}, y[ynum]={0.0}; // Declaration of x and y variables (Coordinates m)
int n=0; //counter for the first "for" loop
//Generate x and y coordinates of the nodal point (Grid 36x36)
for ( n = 0; n < xnum; n++)
{
x[n] = n * xstp;
y[n] = n * ystp;
}
/*for ( m = 0; m < ynum; m++)
{
y[m] = y[m-1] + ystp;
cout << "y " << m << " equal to : " << y[m] <<"\n" << endl;
}*/
// Create and test files to stock results
ofstream velox;
velox.open("./vx.xy", ios::out); //on ouvrre le fichier en ecriture
if (velox.bad()) //permet de tester si le fichier s'est ouvert sans probleme
return 1;
ofstream veloy;
veloy.open("./vy.xy", ios::out); //on ouvrre le fichier en ecriture
if (veloy.bad()) //permet de tester si le fichier s'est ouvert sans probleme
return 1;
ofstream velodvdy;
velodvdy.open("./dvdy.xy", ios::out); //on ouvrre le fichier en ecriture
if (velodvdy.bad()) //permet de tester si le fichier s'est ouvert sans probleme
return 1;
ofstream velodvdx;
velodvdx.open("./dvdx.xy", ios::out); //on ouvrre le fichier en ecriture
if (velodvdx.bad()) //permet de tester si le fichier s'est ouvert sans probleme
return 1;
ofstream velodivv;
velodivv.open("./divv.xy", ios::out); //on ouvrre le fichier en ecriture
if (velodivv.bad()) //permet de tester si le fichier s'est ouvert sans probleme
return 1;
int i(0),j(0); //counters for the two followings loops
for (i = 0; i < ynum; i++)
{
for(j = 0; j < xnum; j++)
{
//Computing Velocity Fields Vx and Vy of the convecting mantle (Horizontal and Vertical component)
vx[i][j] = - vx0 * sin(2*pi*(x[j]/xsize)) * cos(pi*(y[i]/ysize));
vy[i][j]= vy0 * cos(2*pi*(x[j]/xsize)) * sin(pi*(y[i]/ysize));
// Computing partial derivatives
dvxdx[i][j]=-vx0*pi/xsize*2*cos(pi*x[j]/xsize*2)*cos(pi*y[i]/ysize);
dvydy[i][j]=vy0*pi/ysize*cos(pi*y[i]/ysize)*cos(pi*x[j]/xsize*2);
//Computing div(v)=dVx/dx+Dvy/dy
divv[i][j]=dvxdx[i][j]+dvydy[i][j];
//Write results in files
velox << vx[i][j] << "\t";
veloy << vy[i][j] << "\t";
velodvdx << dvxdx[i][j] << "\t";
velodvdy << dvydy[i][j] << "\t";
velodivv << divv[i][j] << "\t";
}
velox << vx[i][j] << endl;
veloy << vy[i][j] << endl;
velodvdx << dvxdx[i][j] << endl;
velodvdy << dvydy[i][j] << endl;
velodivv << divv[i][j] << endl;
}
// Close files
velox.close(); //on ferme le fichier pour liberer la mémoire
veloy.close(); //on ferme le fichier pour liberer la mémoire
velodvdx.close(); //on ferme le fichier pour liberer la mémoire
velodvdy.close(); //on ferme le fichier pour liberer la mémoire
velodivv.close(); //on ferme le fichier pour liberer la mémoire
return 0;
} |
Partager