Hi everybody,
I would like to perform a convergence study computing the difference in
L2 and H1 norm between the solution on a coarser grid and another one on
a finer grid, obtained using uniformly_refine().
To do this, I saved the two meshes and solutions in .xdr. Then I took
the meshdiff.C implementation in the src/apps folder, and made a
simplification of it. The code uses the ExactSolution class and looks
like this:
int main(int argc, char ** argv)
{
LibMeshInit init(argc, argv);
Mesh coarse_mesh(init.comm(), dim), fine_mesh(init.comm(), dim);
EquationSystems coarse_es(coarse_mesh), fine_es(fine_mesh);
libMesh::out << "Usage: " << argv[0]
<< " coarsemesh coarsesolution finemesh finesolution
[outputdiff]" << std::endl;
if (argc < 5)
libmesh_error();
coarse_mesh.read(argv[1]);
libMesh::out << "Loaded coarse mesh " << argv[1] << std::endl;
coarse_es.read(argv[2]);
libMesh::out << "Loaded coarse solution " << argv[2] << std::endl;
fine_mesh.read(argv[3]);
libMesh::out << "Loaded fine mesh " << argv[3] << std::endl;
fine_es.read(argv[4]);
libMesh::out << "Loaded fine solution " << argv[4] << std::endl;
ExactSolution exact_sol(coarse_es);
exact_sol.attach_reference_solution(&fine_es);
exact_sol.compute_error("S0_Tum", "v0_tum");
const System & coarse_sys = coarse_es.get_system("S0_Tum");
const System & fine_sys = fine_es.get_system("S0_Tum");
libMesh::out << "Errors in system " << "S0_Tum" << ", variable " <<
"v0_tum" << ":" << std::endl;
libMesh::out << "L2 error: " << exact_sol.l2_error("S0_Tum", "v0_tum")
<< ", coarse norm: " <<
coarse_sys.calculate_norm(*coarse_sys.solution, 0, L2)
<< ", fine norm: " <<
fine_sys.calculate_norm(*fine_sys.solution, 0, L2) << std::endl;
libMesh::out << "H1 error: " << exact_sol.h1_error("S0_Tum", "v0_tum")
<< ", coarse norm: " <<
coarse_sys.calculate_norm(*coarse_sys.solution, 0, H1)
<< ", fine norm: " <<
fine_sys.calculate_norm(*fine_sys.solution, 0, H1) << std::endl;
return 0;
}
Then I launch it, for example, with
./main cvg_study/mesh_0refs_b.xdr cvg_study/solution_0refs_b.xdr
cvg_study/mesh_1refs_b.xdr cvg_study/solution_1refs_b.xdr
However, when the L2 and H1 errors are printed on screen, they are the
very same as the norm of the solution on the fine mesh. It seems like
the solution on the coarse mesh gets not subtracted. I tried printing on
screen the solution from the system on the coarse grid, and it looked ok
(nonzero), and looking at the previous discussion
https://sourceforge.net/p/libmesh/mailman/message/25861781/, it seems I
am in the right direction, so I cannot really understand what is going
wrong. Could anyone help me understanding what is the problem with my
code?
Thank you,
Laura.
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Libmesh-users mailing list
Libmesh-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libmesh-users