void makeStokesMatrix (Ref<MatrixXd> stokesMatrix, const int M, const int N, const double h, const double * viscosityData) { #ifdef DEBUG cout << "<Creating " << 3 * M * N - M - N << "x" << 3 * M * N - M - N << " stokesMatrix>" << endl << endl; #endif stokesMatrix = MatrixXd::Zero (3 * M * N - M - N, 3 * M * N - M - N); makeLaplacianXBlock (stokesMatrix.block (0, 0, M * (N - 1), M * (N - 1)), M, N, h, viscosityData); makeLaplacianYBlock (stokesMatrix.block (M * (N - 1), M * (N - 1), (M - 1) * N, (M - 1) * N), M, N, h, viscosityData); makeGradXBlock (stokesMatrix.block (0, 2 * M * N - M - N, M * (N - 1), M * N), M, N, h); makeGradYBlock (stokesMatrix.block (M * (N - 1), 2 * M * N - M - N, (M - 1) * N, M * N), M, N, h); makeDivXBlock (stokesMatrix.block (2 * M * N - M - N, 0, M * N, M * (N - 1)), M, N, h); makeDivYBlock (stokesMatrix.block (2 * M * N - M - N, M * (N - 1), M * N, (M - 1) * N), M, N, h); #ifdef DEBUG cout << endl; #endif }
void makeStokesMatrix (SparseMatrix<double>& stokesMatrix, const int M, const int N, const double h, const double * viscosityData) { #ifdef DEBUG cout << "<Creating " << 3 * M * N - M - N << "x" << 3 * M * N - M - N << " stokesMatrix>" << endl; #endif vector<Triplet<double> > tripletList; makeLaplacianXBlock (tripletList, 0, 0, M, N, h, viscosityData); makeLaplacianYBlock (tripletList, M * (N - 1), M * (N - 1), M, N, h, viscosityData); makeGradXBlock (tripletList, 0, 2 * M * N - M - N, M, N, h); makeGradYBlock (tripletList, M * (N - 1), 2 * M * N - M - N, M, N, h); makeDivXBlock (tripletList, 2 * M * N - M - N, 0, M, N, h); makeDivYBlock (tripletList, 2 * M * N - M - N, M * (N - 1), M, N, h); stokesMatrix.setFromTriplets (tripletList.begin(), tripletList.end()); #ifdef DEBUG cout << endl; #endif }