Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 在Gnuplot中绘制代数生成的二维网格的最佳方法是什么?_Fortran_Grid_Gnuplot - Fatal编程技术网

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

我已经生成了一个x值的2d数组和一个y值数组。每个i,j索引对应一个x,y点。我想从这些点创建一个网格,但我不知道如何进行。我想使用fortran/GNUPLOT创建此图。输出应如下所示:


这是在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
的声明,并且可以被不同的过程重用。