我正在实现一个有限元代码(从一个工作的 MATLAB 版本翻译,所以我有结果可以比较),出于某种奇怪的原因,我的一些计算只精确到小数点后 6 位。
我正在使用双打和 PetscScalars,我已经对我的代码进行了双重和四重检查,并且相当确定我的实现没有任何问题。我回去并确保我所有的乘法都使用双打或 PetscScalars,但我不确定这是否会改变任何东西。
我测试了一个我应该得到机器精度误差的精确解决方案。在细化研究中,最粗的网格(上的二元三角形网格)我得到机器精度误差,但之后的每一次细化,误差都会上升到大约和那里完全平坦。对于不能用函数空间精确表达的精确解,我正在获得基础度数 1 和 2 的适当收敛速度,然后对于任何高度数,收敛速度都会迅速下降。
我一直在尝试寻找错误一段时间。这是我第一次用 C 编写这么大的项目,所以我确信有一些我不知道的细微差别,尽管我认为我对 C 有足够的经验,在翻译工作时没有犯任何错误代码。我是否必须指定 PetscScalar 是双精度的?我重新配置--with-precision=double
,但它没有改变结果。