gnuplot 上带有 u 和 v 分量的矢量场
vector field on gnuplot with u and v components
我正在求解不可压缩流体流过带障碍物的方形区域的纳维-斯托克斯方程。作为输出,我将速度的 X
和 Y
分量分别作为 NxN
矩阵。如何在 gnuplot 中为其绘制矢量场。
我找到了 this answer,但我不明白要为 x, y, dx, dy
设置什么值。
谁能解释一下如何使用我的输出来绘制矢量场?
更新
我尝试按照@LutzL 所说的进行操作,但我的代码似乎有问题。这段代码一切正常吗?
int main() {
ifstream finu("U"), finv("V");
int N = 41, M = 41;
auto
**u = new double *[N],
**v = new double *[N];
for (int i = 0; i < N; i++) {
u[i] = new double[M];
v[i] = new double[M];
}
double
dx = 1.0 / (N - 1),
dy = 1.0 / (M - 1);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
finu >> u[i][j];
finv >> v[i][j];
}
}
ofstream foutvec("vec");
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
foutvec << dx * i << "\t" << dy * j << "\t" << u[i][j] << "\t" << v[i][j] << endl;
}
}
ofstream plt("graph.plt");
plt << "set term pngcairo"
"\nset title 'Navier-Stokes Equation'"
"\nset output 'vec.png'"
"\nplot 'vec' w vec";
plt.close();
system("gnuplot graph.plt");
return 0;
}
作为输出,我得到了一个有点奇怪的字段。
您需要将结果保存在包含第
行的文本文件中
x[i] y[j] X[i,j] Y[i,j]
所有对 i,j
。然后使用带有 "traditional" 矢量场命令的 gnuplot。
如果您将其他列放入该文件,则只需使用 using
,并且要显示的向量不是(简单地)第 3 列和第 4 列。一种用途可能是计算比例因子 R[i,j]
以显示 X/R, Y/R
。将其排在第 5 位
x[i] y[j] X[i,j] Y[i,j] R[i,j]
并使用 using 1:2:(/):(/)
调用以在 gnuplot 中执行缩放。
在 更新 的代码和生成的图像中,可以看到矢量场太大而无法绘制。使用 dt
缩放一些合理的时间步长,在 gnuplot 命令中这可以通过
完成
dt = 0.01
plot 'vec' u 1:2:(dt*):(dt*) w vec
不完整的绘图提示磁盘上的数据文件不完整。刷新或关闭矢量数据的输出流。
我正在求解不可压缩流体流过带障碍物的方形区域的纳维-斯托克斯方程。作为输出,我将速度的 X
和 Y
分量分别作为 NxN
矩阵。如何在 gnuplot 中为其绘制矢量场。
我找到了 this answer,但我不明白要为 x, y, dx, dy
设置什么值。
谁能解释一下如何使用我的输出来绘制矢量场?
更新
我尝试按照@LutzL 所说的进行操作,但我的代码似乎有问题。这段代码一切正常吗?
int main() {
ifstream finu("U"), finv("V");
int N = 41, M = 41;
auto
**u = new double *[N],
**v = new double *[N];
for (int i = 0; i < N; i++) {
u[i] = new double[M];
v[i] = new double[M];
}
double
dx = 1.0 / (N - 1),
dy = 1.0 / (M - 1);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
finu >> u[i][j];
finv >> v[i][j];
}
}
ofstream foutvec("vec");
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
foutvec << dx * i << "\t" << dy * j << "\t" << u[i][j] << "\t" << v[i][j] << endl;
}
}
ofstream plt("graph.plt");
plt << "set term pngcairo"
"\nset title 'Navier-Stokes Equation'"
"\nset output 'vec.png'"
"\nplot 'vec' w vec";
plt.close();
system("gnuplot graph.plt");
return 0;
}
作为输出,我得到了一个有点奇怪的字段。
您需要将结果保存在包含第
行的文本文件中x[i] y[j] X[i,j] Y[i,j]
所有对 i,j
。然后使用带有 "traditional" 矢量场命令的 gnuplot。
如果您将其他列放入该文件,则只需使用 using
,并且要显示的向量不是(简单地)第 3 列和第 4 列。一种用途可能是计算比例因子 R[i,j]
以显示 X/R, Y/R
。将其排在第 5 位
x[i] y[j] X[i,j] Y[i,j] R[i,j]
并使用 using 1:2:(/):(/)
调用以在 gnuplot 中执行缩放。
在 更新 的代码和生成的图像中,可以看到矢量场太大而无法绘制。使用 dt
缩放一些合理的时间步长,在 gnuplot 命令中这可以通过
dt = 0.01
plot 'vec' u 1:2:(dt*):(dt*) w vec
不完整的绘图提示磁盘上的数据文件不完整。刷新或关闭矢量数据的输出流。