static void test_hmatrix_system(const char *apprxtype, pcamatrix Vfull, pcamatrix KMfull, pblock block, pbem2d bem_slp, phmatrix V, pbem2d bem_dlp, phmatrix KM, bool exterior) { pavector x, b; real errorV, errorKM, error_solve, eps_solve; uint steps; eps_solve = 1.0e-12; steps = 1000; printf("Testing: %s Hmatrix %s\n" "====================================\n\n", (exterior == true ? "exterior" : "interior"), apprxtype); assemble_bem2d_hmatrix(bem_slp, block, V); assemble_bem2d_hmatrix(bem_dlp, block, KM); errorV = norm2diff_amatrix_hmatrix(V, Vfull) / norm2_amatrix(Vfull); printf("rel. error V : %.5e\n", errorV); errorKM = norm2diff_amatrix_hmatrix(KM, KMfull) / norm2_amatrix(KMfull); printf("rel. error K%c0.5*M : %.5e\n", (exterior == true ? '-' : '+'), errorKM); x = new_avector(Vfull->rows); b = new_avector(KMfull->cols); printf("Solving Dirichlet problem:\n"); projectl2_bem2d_const_avector(bem_dlp, eval_dirichlet_quadratic_laplacebem2d, x); clear_avector(b); addeval_hmatrix_avector(1.0, KM, x, b); solve_cg_bem2d(HMATRIX, V, b, x, eps_solve, steps); if (exterior == true) { scale_avector(-1.0, x); } error_solve = L2gamma_c_diff_norm2(bem_slp, x, eval_neumann_quadratic_laplacebem2d); clear_avector(x); error_solve = error_solve / L2gamma_c_diff_norm2(bem_slp, x, eval_neumann_quadratic_laplacebem2d); printf("rel. error neumann : %.5e %s\n", error_solve, (IS_IN_RANGE(3.0e-3, error_solve, 4.0e-3) ? " okay" : "NOT okay")); if (!IS_IN_RANGE(3.0e-3, error_solve, 4.0e-3)) problems++; printf("\n"); del_avector(x); del_avector(b); }
real norm2chol_sparsematrix(pchmatrix LU, pcsparsematrix sp) { avector tmp1, tmp2; uint rows = LU->rc->size; uint cols = LU->cc->size; pavector x, y; real norm; uint j; assert(sp->rows == rows); assert(sp->cols == cols); x = init_avector(&tmp1, cols); y = init_avector(&tmp2, rows); random_avector(x); norm = norm2_avector(x); scale_avector(1.0 / norm, x); for (j = 0; j < NORM_STEPS; j++) { // printf("norm = %g \n", sqrt( norm)); clear_avector(y); mvm_sparsematrix_avector(1.0, false, sp, x, y); triangularsolve_hmatrix_avector(true, false, false, LU, y); triangularsolve_hmatrix_avector(true, false, true, LU, y); add_avector(-1.0, y, x); copy_avector(x, y); triangularsolve_hmatrix_avector(true, false, false, LU, y); triangularsolve_hmatrix_avector(true, false, true, LU, y); mvm_sparsematrix_avector(-1.0, true, sp, y, x); norm = norm2_avector(x); scale_avector(1.0 / norm, x); } uninit_avector(y); uninit_avector(x); return REAL_SQRT(norm); }