void arrayops() { double nx = 10; double ny = 10; double nt = 100; double c = 1; double dx = 2/(nx-1); double dy = 2/(ny-1); double sigma = .2; double dt = sigma*dx; Eigen::ArrayXd x; // Array containing our x values x.setLinSpaced(nx,0,2); Eigen::ArrayXd y; // Array containing our x values y.setLinSpaced(ny,0,2); Eigen::ArrayXXd u; u.setOnes(ny,nx); Eigen::ArrayXXd un; un.setOnes(ny,nx); u.block(.5/dy,.5/dx,(1/dy+1)-.5/dy,(1/dx+1)-.5/dx) = Eigen::ArrayXXd::Constant((1/dy+1)-.5/dy,(1/dx+1)-.5/dx,2); int count; for(int i=0;i<nt;i++) { un << u; u.block(1,1,ny-1,nx-1) = un.block(1,1,ny-1,nx-1)-(c*dt/dx*(un.block(1,1,ny-1,nx-1)-un.block(0,1,ny-1,nx-1)))-(c*dt/dy*(un.block(1,1,ny-1,nx-1)-un.block(1,0,ny-1,nx-1))); } std::cout << u << std::endl; }
void nonlin2d() { double nx = 101; double ny = 101; double nt = 80; double c = 1; double dx = 2/(nx-1); double dy = 2/(ny-1); double sigma = .2; double dt = sigma*dx; // Make an output folder std::string dir = "step6/"; Eigen::ArrayXd x; // Array containing our x values x.setLinSpaced(nx,0,2); Eigen::ArrayXd y; // Array containing our x values y.setLinSpaced(ny,0,2); Eigen::ArrayXXd u; u.setOnes(ny,nx); Eigen::ArrayXXd v; v.setOnes(ny,nx); Eigen::ArrayXXd un; un.setOnes(ny,nx); Eigen::ArrayXXd vn; vn.setOnes(ny,nx); u.block(.5/dy, .5/dx, 1/dy+1-.5/dy, 1/dx+1-.5/dx) = Eigen::ArrayXXd::Constant(1/dy+1-.5/dy,1/dx+1-.5/dx,2); v.block(.5/dy, .5/dx, 1/dy+1-.5/dy, 1/dx+1-.5/dx) = Eigen::ArrayXXd::Constant(1/dy+1-.5/dy,1/dx+1-.5/dx,2); for(int i=0;i<nt+1;i++) { un << u; vn << v; u.block(1,1,ny-1,nx-1) = un.block(1,1,ny-1,nx-1)-(un.block(1,1,ny-1,nx-1)*dt/dx*(un.block(1,1,ny-1,nx-1)-un.block(0,1,ny-1,nx-1)))-(vn.block(1,1,ny-1,nx-1)*dt/dy*(un.block(1,1,ny-1,nx-1)-un.block(1,0,ny-1,nx-1))); v.block(1,1,ny-1,nx-1) = vn.block(1,1,ny-1,nx-1)-(un.block(1,1,ny-1,nx-1)*dt/dx*(vn.block(1,1,ny-1,nx-1)-vn.block(0,1,ny-1,nx-1)))-(vn.block(1,1,ny-1,nx-1)*dt/dy*(vn.block(1,1,ny-1,nx-1)-vn.block(1,0,ny-1,nx-1))); u.block(0,0,1,nx-1) = Eigen::ArrayXXd::Constant(1,nx-1,1); u.block(ny-1,0,1,nx-1) = Eigen::ArrayXXd::Constant(1,nx-1,1); u.block(0,0,ny-1,1) = Eigen::ArrayXXd::Constant(ny-1,1,1); u.block(0,nx-1,ny-1,1) = Eigen::ArrayXXd::Constant(ny-1,1,1); v.block(0,0,1,nx-1) = Eigen::ArrayXXd::Constant(1,nx-1,1); v.block(ny-1,0,1,nx-1) = Eigen::ArrayXXd::Constant(1,nx-1,1); v.block(0,0,ny-1,1) = Eigen::ArrayXXd::Constant(ny-1,1,1); v.block(0,nx-1,ny-1,1) = Eigen::ArrayXXd::Constant(ny-1,1,1); } ofstream writexdata((dir + "output.dat").c_str(), ios::out | ios::trunc); writexdata << u << endl; writexdata.close(); }
void laplace2d() { double nx = 31; double ny = 31; double c = 1; double dx = 2/(nx-1); double dy = 2/(ny-1); double linorm_target = .01; double linorm = 1; // Make an output folder std::string dir = "step9/"; Eigen::ArrayXd x; // Array containing our x values x.setLinSpaced(nx,0,2); // Array is linearly spaced values from 0 to 2 Eigen::ArrayXd y; // Array containing our x values y.setLinSpaced(ny,0,1); // Arrays containing our calculated values Eigen::ArrayXXd p; Eigen::ArrayXXd pn; // Initial Conditions p.setZero(ny,nx); pn.setZero(ny,nx); //Set Boundary Conditions p.block(0,0,ny,1) = Eigen::ArrayXXd::Constant(ny,1,0); p.block(0,nx-1,ny,1) = y.block(0,0,ny,1); p.block(0,0,1,nx) = p.block(1,0,1,nx); p.block(ny-1,0,1,nx) = p.block(ny-2,0,1,nx); while(linorm>linorm_target) { pn << p; p.block(1,1,ny-2,nx-2) = (pow(dy,2)*(pn.block(2,1,ny-2,nx-2)+pn.block(0,1,ny-2,nx-2))+pow(dx,2)*(pn.block(1,2,ny-2,nx-2)+pn.block(1,0,ny-2,nx-2)))/(2*(pow(dx,2)+pow(dy,2))); p(0,0) = (pow(dy,2)*(pn(1,0)+pn(ny-1,0))+pow(dx,2)*(pn(0,1)+pn(0,nx-1)))/(2*(pow(dx,2)+pow(dy,2))); p(ny-1,nx-1) = (pow(dy,2)*(pn(0,nx-1)+pn(ny-2,nx-1))+pow(dx,2)*(pn(ny-1,0)+pn(ny-1,nx-2)))/(2*(pow(dx,2)+pow(dy,2))); //Set Boundary Conditions p.block(0,0,ny,1) = Eigen::ArrayXXd::Constant(ny,1,0); p.block(0,nx-1,ny,1) = y.block(0,0,ny,1); p.block(0,0,1,nx) = p.block(1,0,1,nx); p.block(ny-1,0,1,nx) = p.block(ny-2,0,1,nx); linorm = (p.cwiseAbs()-pn.cwiseAbs()).sum()/(pn.cwiseAbs()).sum(); } ofstream writexdata((dir + "output.dat").c_str(), ios::out | ios::trunc); writexdata << p << endl; writexdata.close(); }
void channelns() { double nx = 41; double ny = 41; double nt = 10; double nit = 50; double c = 1; double dx = 2/(nx-1); double dy = 2/(ny-1); double rho = 1; double nu =.1; double F = 1; double dt = .01; std::string dir = "step11/"; Eigen::ArrayXd x; // Array containing our x values x.setLinSpaced(nx,0,2); // Array is linearly spaced values from 0 to 2 Eigen::ArrayXd y; // Array containing our x values y.setLinSpaced(ny,0,2); Eigen::ArrayXXd X; Eigen::ArrayXXd Y; X = x.transpose().replicate(nx,1); // Need to transpose this because the type we declared, ArrayXd, is row-major (and we need column-major for a proper meshgrid) Y = y.replicate(1,ny); Eigen::ArrayXXd u; u.setZero(ny,nx); Eigen::ArrayXXd un; un.setZero(ny,nx); Eigen::ArrayXXd v; v.setZero(ny,nx); Eigen::ArrayXXd vn; vn.setZero(ny,nx); Eigen::ArrayXXd b; b.setZero(ny,nx); Eigen::ArrayXXd p; p.setZero(ny,nx); Eigen::ArrayXXd pn; pn.setZero(ny,nx); }