FreeFem 用户定义函数

计算科学 有限元 pde 数值分析 椭圆pde
2021-12-26 07:41:01

我试图在 FreeFem 中求解具有空间相关热扩散率的稳态热方程。 我希望从扩散率变化所以,为了这个例子,你可能会想到形式 所以我would like 会是类似的东西(这显然不会编译,因为我还没有声明所有变量等。我只是在概述)

(κ(x,y)T)=0
(xi,yi)
κ(x,y)=i1(x,y)(xi,yi)

func real kappa() {
   for (i=0;i<n;++i)
      k += 1/sqrt((x-x(i)) + (y-y(i))^2);
   return k;
}

problem heat(uh,vh,solver=GMRES) =
   int2d(Th)( (dx(uh)*dx(vh) + dy(uh)*dy(vh)) * kappa ) // * kappa doesn't work!
   + on(1,uh=1) + on(2,uh=0);

我在一侧取 Dirichlet bc 为 1,在其他地方取为 0。问题是我不能在一行上写这个函数(因为它需要一个循环),而且 FreeFem 不允许我像这样在问题定义中调用用户定义的函数。所以要么我错过了一些东西,要么我需要另一种方法来做到这一点。指针?

编辑

好吧,我认为原因是对象dx(uh)和合作。是类型的Vh,所以我需要一个相同类型的对象。这意味着我必须在该类型上构建我的函数值。

1个回答

是的,我记错类型了。这是可能的,但该函数需要在相同类型的对象上进行评估。例如,

mesh Th=buildmesh(...);
fespace Vh(Th,P1);
Vh uh, vh;

Vh kappa = 0;
for(int i = 0; i < n; ++i) {
   kappa += 1/sqrt((x - c(i,0))^2 + (y - c(i,1))^2);
}

problem heat(uh,vh) =
int2d(Th)((dx(uh) * dx(vh) + dy(uh) * dy(vh)) * kappa)
+ on(1,uh=1) + on(2,uh=0);