Hello,
I have a very simple question related to the freefem language.
I have many (up to 1000) thermal conductivities for each region, i’d like to still use in the weak form the following expression
int2d(Th)(lambda * (dx(u) * dx(v) + dy(u) * dy(v)))
As far as i know lambda must be defined using a func, unfortunately “func” must be an inline definition, so i can’t use the += operator to iterate like this
func lambda=0;
for (int i=0;i<N;i++)
{
lambda+= lambdaVal[i]*(region == i)
}
Where lambdaVal is a real[int] object
An other idea would be to iterate in the weak formulation to get something like :
problem therm(u, v,solver=UMFPACK,eps=1e-5)
=
for (int i=0;i<N;i++)
{
int2d(Th)(lambda * (dx(u) * dx(v) + dy(u) * dy(v)));
};
But it’s not correct.
Any idea ?
No, this never works, because a func variable is not a real variable but just the pointeur to the code with defined the variable, so it is impossible to change.
To solve you problem, if you have constant thermal conductivities per region,
and if you region numbering are less (stricly) than the nxregion;
just defined a array of
real[int] lambda(nxregion);
// set the value of lambda
lambda = 1 ; // default value
for(int i=0; i< nxregion; ++i)
lambda[i] ..;
solve Pb(u,v) =int2d(Th)(lambda[region] * (dx(u) * dx(v) + dy(u) * dy(v))) - int2d(Th)( v);
And the way is to defined a function lambda as a finite element function (P0 / triangle)
fespace Ph'Th,P0);
Ph lambdah=1. ; // default value
for(int k=0; k<Th.nt; ++k)
lambdah[][k] = 1+k; // you value ..... in triangle k..
plot(lambdah,wailt=1,fill=1);
solve Pb2(u,v) =int2d(Th)(lambdak * (dx(u) * dx(v) + dy(u) * dy(v))) - int2d(Th)( v);