示例#1
0
void setKnownXi_ReduceSizeOfEQS(vector<IndexValue> &list_dirichlet_bc, MathLib::CRSMatrix<double, INDEX_TYPE> &eqsA, double* org_eqsRHS, double* org_eqsX, double** eqsRHS, double** eqsX, map<INDEX_TYPE,INDEX_TYPE> &map_solved_orgEqs)
{
    const size_t n_org_rows = eqsA.getNRows();
    vector<INDEX_TYPE> removed_rows(list_dirichlet_bc.size());
    for (size_t i=0; i<list_dirichlet_bc.size(); i++) {
        IndexValue &bc = list_dirichlet_bc.at(i);
        const size_t id = bc.id;
        const double val = bc.val;
        removed_rows.at(i) = id;

        //b_i -= A(i,k)*val, i!=k
        for (size_t j=0; j<eqsA.getNCols(); j++)
            org_eqsRHS[j] -= eqsA.getValue(j, id)*val;
        //b_k = A_kk*val
        org_eqsRHS[id] = val; //=eqsA(id, id)*val;
        org_eqsX[id] = val; //=eqsA(id, id)*val;
    }

    //remove rows and columns
    eqsA.eraseEntries(removed_rows.size(), &removed_rows[0]);

    //remove X,RHS
    (*eqsX) = new double[n_org_rows-removed_rows.size()];
    (*eqsRHS) = new double[n_org_rows-removed_rows.size()];
    size_t new_id = 0;
    for (size_t i=0; i<n_org_rows; i++) {
        if (find(removed_rows.begin(), removed_rows.end(), i)!=removed_rows.end()) continue;
        (*eqsRHS)[new_id] = org_eqsRHS[i];
        (*eqsX)[new_id] = org_eqsX[i];
        map_solved_orgEqs[new_id] = i;
        new_id++;
    }
}
int main(int argc, char *argv[])
{
	if (argc < 3) {
		std::cout << "Usage: " << argv[0] << " input-matrix output-matrix" << std::endl;
		return 1;
	}

	std::string fname_mat (argv[1]);
	bool verbose (true);

	// *** reading matrix in crs format from file
	std::ifstream in(fname_mat.c_str(), std::ios::in | std::ios::binary);
	double *A(NULL);
	unsigned *iA(NULL), *jA(NULL), n;
	if (in) {
		if (verbose) {
			std::cout << "reading matrix from " << fname_mat << " ... " << std::flush;
		}
		BaseLib::RunTime timer;
		timer.start();
		CS_read(in, n, iA, jA, A);
		in.close();
		timer.stop();
		if (verbose) {
			std::cout << "ok, " << timer.elapsed() << " s" << std::endl;
		}
	} else {
		std::cout << "error reading matrix from " << fname_mat << std::endl;
	}
	unsigned nnz(iA[n]);
	if (verbose) {
		std::cout << "Parameters read: n=" << n << ", nnz=" << nnz << std::endl;
	}

	MathLib::CRSMatrix<double, unsigned> *mat (new MathLib::CRSMatrix<double, unsigned>(n, iA, jA, A));

	const unsigned n_rows_cols_to_erase(300);
	unsigned *rows_cols_to_erase(new unsigned[n_rows_cols_to_erase]);

	for (unsigned k(0); k<n_rows_cols_to_erase; k++) {
		rows_cols_to_erase[k] = (k+1)*2;
	}

	BaseLib::RunTime timer;
	std::cout << "erasing " << n_rows_cols_to_erase << " rows and columns ... " << std::flush;
	timer.start();
	mat->eraseEntries(n_rows_cols_to_erase, rows_cols_to_erase);
	timer.stop();
	std::cout << "ok, " << timer.elapsed() << " s" << std::endl;
	delete[] rows_cols_to_erase;

	fname_mat = argv[2];
	std::ofstream out (fname_mat.c_str(), std::ios::binary);
	CS_write (out, mat->getNRows(), mat->getRowPtrArray(), mat->getColIdxArray(), mat->getEntryArray());
	out.close();

	std::cout << "wrote " << fname_mat << " with " << mat->getNRows() << " rows and " << mat->getRowPtrArray()[mat->getNRows()] << " entries" << std::endl;

	delete mat;
}
void setKnownXi_ReduceSizeOfEQS(std::vector<IndexValue> &list_dirichlet_bc, MathLib::CRSMatrix<
				double, INDEX_TYPE> &eqsA, double* org_eqsRHS, double* org_eqsX, double** eqsRHS,
				double** eqsX, std::map<INDEX_TYPE, INDEX_TYPE> &map_solved_orgEqs)
{
	const size_t n_org_rows = eqsA.getNRows();
	std::vector<INDEX_TYPE> removed_rows(list_dirichlet_bc.size());
	std::cout << "[BC] (transpose matrix) ... " << std::flush;
	RunTimeTimer run_trans;
	run_trans.start();
	MathLib::CRSMatrix<double, INDEX_TYPE>* transpose_mat (eqsA.getTranspose());
	run_trans.stop();
	std::cout << run_trans.elapsed() << " s" << std::endl;

	INDEX_TYPE const*const row_ptr (transpose_mat->getRowPtrArray());
	INDEX_TYPE const*const col_idx (transpose_mat->getColIdxArray());
	double const*const data (transpose_mat->getEntryArray());

	for (size_t i = 0; i < list_dirichlet_bc.size(); i++) {
		IndexValue &bc = list_dirichlet_bc.at(i);
		const size_t id = bc.id;
		const double val = bc.val;
		removed_rows.at(i) = id;

		//b_i -= A(i,k)*val, i!=k
//		for (size_t j = 0; j < eqsA.getNCols(); j++)
//			org_eqsRHS[j] -= eqsA.getValue(j, id) * val;

		const INDEX_TYPE end(row_ptr[id+1]);
		for (INDEX_TYPE k(row_ptr[id]); k<end; k++) {
			const INDEX_TYPE j(col_idx[k]);
			org_eqsRHS[j] -= data[j] * val;
		}

		//b_k = A_kk*val
		org_eqsRHS[id] = val; //=eqsA(id, id)*val;
		org_eqsX[id] = val; //=eqsA(id, id)*val;
	}
	delete transpose_mat;

	//remove rows and columns
	eqsA.eraseEntries(removed_rows.size(), &removed_rows[0]);

	//remove X,RHS
	(*eqsX) = new double[n_org_rows - removed_rows.size()];
    (*eqsRHS) = new double[n_org_rows-removed_rows.size()];
    size_t new_id = 0;
    for (size_t i=0; i<n_org_rows; i++) {
        if (std::find(removed_rows.begin(), removed_rows.end(), static_cast<unsigned>(i))!=removed_rows.end()) continue;
        (*eqsRHS)[new_id] = org_eqsRHS[i];
        (*eqsX)[new_id] = org_eqsX[i];
        map_solved_orgEqs[new_id] = i;
        new_id++;
    }
}