Hey guys,
is it possible to compute the error between two numerical solutions in freefem?
Say I have a problem without an exact solution, but I can do a reference one using a refined mesh, can a compute the error (L2, H1,…)?
Hey guys,
is it possible to compute the error between two numerical solutions in freefem?
Say I have a problem without an exact solution, but I can do a reference one using a refined mesh, can a compute the error (L2, H1,…)?
Yes, you can
FreeFEM can do the interpolation for you from mesh 1 onto mesh 2 simply by writing
u_mesh2 = u_mesh1
Hey, thanks for the reply.
I tried that. I compile a reference solution and saved in a file. Then, I want read from that file and use as an exact solution to compare to results in a coarse mesh, like this
ifstream fileR(filename);
fileR >> u[];
but I’m getting the following error:
length on the array 6 != 153 length in file
current line = 523
Exec error : Fatal Error: incompatible length in read array (Op_ReadKN)
-- number :1
Exec error : Fatal Error: incompatible length in read array (Op_ReadKN)
-- number :1
err code 8 , mpirank 0
do you have an ideia of what might be?
Hi,
you have to declare u
in the fespace
used to save the reference solution (the fespace
on the fine mesh).
Then fileR >> u[];
recovers the reference solution on the fine mesh
You can afterwards declare v
in the fespace
on the coarse mesh, and write
v=u;
so that v will contain the interpolation of u
on the coarse mesh.
At end you can compute for example
real error=sqrt(int2d(Th)((ucomp-v)^2));
where ucomp
is your computed solution on the coarse mesh Th
.
An important point is that you need to have both meshes at hand in order to do it. Hence you need to save not only the reference solution, but also the (fine) mesh that comes with it.
I use triangulate and a text file with (x,y,value) lines.
I guess you could put this table mesh in a scoped block and
assign the result to a target fespace. This code appears to work
although it could be cleaned up a bit
macro mmloadds(u,Th,fn,nthings,nentry)
{
Th =triangulate(fn);
/* this needs to be a P1 space */
fespace Vhxxx(Th,P1);
Vhxxx data;
real[int] mdata(Th.nv);
try{
ifstream ifs(fn);
real xass;
for (int i=0; i<Th.nv; ++i)
{
for (int j=0; j<nthings; ++j)
{ if (j==nentry) ifs>> mdata[i];
else ifs>> xass;
}
}
} catch (...) { cout<<" throw during load of "<<fn<<endl; cout.flush; }
data=0;
data[]=mdata;
u=0;
u=data;
} // EOM mmloadds