我正在尝试为有限体积网格上的电子能量方程 是电子电流密度,是电场。在以顶点为中心的网格上,我知道在每个单元格的中心(其中)并且我还有一个计算的函数每个细胞的每个面。
使用值,我可以轻松计算。问题是这两个法向分量相乘会忽略切向分量。在面上取最大值会导致 10-20% 的误差,并且对它们进行体积平均是完全不正确的(有几个因素)。我正在使用的当前解决方案是我也碰巧知道的方向,尽管我并不完全相信它。从物理学来看,在大多数情况下,在方向上接近是一个公平的假设,所以我假设它们在同一方向上,并除以 by垂直的 30 度以内的面,但它让我很接近。
我还找到了一个可行的解决方案,但使用了大量的三角函数,这可能太慢,无法在不稳定 FV 求解的每次迭代中在每个单元格处完成。该解决方案的工作原理是:
给定,,和
v = 2*rand(1,2) - 1; % Original vector we want to reproduce
n_1 = 2*rand(1,2) - 1; % unit normal vectors
n_1 = n_1/norm(n_1);
n_2 = 2*rand(1,2) - 1;
n_2 = n_2/norm(n_2);
vn_1 = v.'*n_1; % dot products
vn_2 = v.'*n_2;
thetaN1 = atan2(n_1(2), n_1(1)); % Calculate angle of first normal to x-axis
phi = thetaN1 - atan2(n_2(2),n_2(1)); % Difference in angle between normals
theta1 = atan((vn_1*cos(phi) - vn_2)/(vn_1*sin(phi))); %Use both dot products to back out angle between first normal and v
v_mag = vn_1/cos(theta1); % Back out magnitude of v
v_out(1) = v_mag*cos(thetaN1 + theta1); % Calculate components of v
v_out(2) = v_mag*sin(thetaN1 + theta1);
v以上精确再现几乎双精度。即使我为每个点积在原始 v 中引入了大约 1% 的少量噪声(表示域在空间中从一个面的中心到另一个面的中心发生变化),它大多数情况下仍然精确到小数点后几位。正如我所说,这样做的成本比我想要的要高。我需要在每个时间步进行几百万次上述计算。
我觉得我有点重新发明了轮子,想知道当只知道面的正常分量时,是否有更有效和更通用的方法来计算两个字段的点积。