Fortran 在Gnuplot中绘制代数生成的二维网格的最佳方法是什么?
我已经生成了一个x值的2d数组和一个y值数组。每个i,j索引对应一个x,y点。我想从这些点创建一个网格,但我不知道如何进行。我想使用fortran/GNUPLOT创建此图。输出应如下所示:Fortran 在Gnuplot中绘制代数生成的二维网格的最佳方法是什么?,fortran,grid,gnuplot,Fortran,Grid,Gnuplot,我已经生成了一个x值的2d数组和一个y值数组。每个i,j索引对应一个x,y点。我想从这些点创建一个网格,但我不知道如何进行。我想使用fortran/GNUPLOT创建此图。输出应如下所示: 这是在matlab中创建的,我在其中分别绘制了每条垂直线和水平线。我认为这个子程序应该满足您的需要: subroutine gnuplot_output(filename,ni,nj,x,y) character(len=*), intent(in) :: filename
这是在matlab中创建的,我在其中分别绘制了每条垂直线和水平线。我认为这个子程序应该满足您的需要:
subroutine gnuplot_output(filename,ni,nj,x,y)
character(len=*), intent(in) :: filename
integer, intent(in) :: ni, nj
real(wp), intent(in) :: x(ni,nj), y(ni,nj)
integer :: unit, i, j
open(newunit=unit,file=filename)
do i = 1, ni-1
do j = 1, nj-1
write(unit,*) x(i,j), y(i,j)
write(unit,*) x(i+1,j), y(i+1,j)
write(unit,*) x(i+1,j+1), y(i+1,j+1)
write(unit,*) x(i,j+1), y(i,j+1)
write(unit,*) x(i,j), y(i,j)
write(unit,*)
end do
end do
close(unit)
end subroutine
请随意使用所需的代码(任何许可证)
为了生成闭合单元,您需要输出4个单元角点坐标,并重复第一个角点坐标,以使gnuplot绘制闭合线。对子例程的调用可能如下所示:
real(wp), allocatable :: x(:,:), y(:,:)
integer :: ni, nj
! ... allocate x and y and generate grids ...
! ... the shape(x) == [ni,nj], and shape(y) == [ni,nj]
call gnuplot_output("grid_cells.txt",ni,nj,x,y)
在gnuplot中,您需要做的就是
plot "grid_cells.txt" w l
下面的图片是在gnuplot中使用函数创建的:
这是一个仅适用于gnuplot的版本。您的数据是否已经存在于数据文件中?然后请显示一些示例数据行。代码需要一些更改 代码:
### draw grid
reset session
# create some test data
set print $Data
N=50. # decimal point! otherwise gnuplot would do integer division
base(x) = x<1 || x>2 ? 0 : -0.8*(x-1.5)**2+0.2
do for [y=0:N] {
y0=y/N
do for [x=0:N] {
x0=x/N*3
y1=(1-base(x0))*y0+base(x0)
print sprintf("%g %g",x0,y1)
}
print "\n" # add empty line
}
set print
set view map
splot $Data u 1:2:0 w l notitle
### end of code
###绘制网格
重置会话
#创建一些测试数据
设置打印$Data
N=50.#小数点!否则,gnuplot将执行整数除法
基数(x)=x2?0:-0.8*(x-1.5)**2+0.2
[y=0:N]的do{
y0=是/否
[x=0:N]的do{
x0=x/N*3
y1=(1-基(x0))*y0+基(x0)
打印sprintf(“%g%g”,x0,y1)
}
打印“\n”#添加空行
}
套印
设置视图地图
splot$Data u 1:2:0 w l notitle
###代码结束
结果:
### draw grid
reset session
# create some test data
set print $Data
N=50. # decimal point! otherwise gnuplot would do integer division
base(x) = x<1 || x>2 ? 0 : -0.8*(x-1.5)**2+0.2
do for [y=0:N] {
y0=y/N
do for [x=0:N] {
x0=x/N*3
y1=(1-base(x0))*y0+base(x0)
print sprintf("%g %g",x0,y1)
}
print "\n" # add empty line
}
set print
set view map
splot $Data u 1:2:0 w l notitle
### end of code
将数据写入一个文件,在其中的各个水平线和垂直线之间放置一个空行。然后用gnuplot读取文件。wp在这里做什么?
wp
是种类参数(工作精度的缩写)。您可以将wp
替换为kind(1.0d0)
以获得双精度。通常,将子程序放在一个模块中是一个好主意,该模块将包含wp
的声明,并且可以被不同的过程重用。