读取输入,然后写入文件

reading input, then writing to file

我正在尝试使用 4 个模块将矩阵写入 .txt 文件,这些模块是:

  1. input.f90 从 .txt 文件读取输入
  2. navierstokes_loser.f90 创建矩阵(我将在此处添加一些 do 循环但是,首先我只需要它来打印)
  3. resultatplot.f90 从 navierstokes_loser 获取矩阵,然后将其打印到 .txt 文件
  4. main.f90 结合了所有模块和 运行程序

当我 运行 程序时,我收到程序接收信号 SIGSEGV:分段错误 - 内存引用无效。

我做错了什么?

input.f90

 module input

implicit none

contains


subroutine lesinput(n,omega)

!Output
integer :: n
real(8) :: omega


!Åpner fil og gir variable verdier
open(1, file='input.txt',status='old',action='read')

read(1,*), n
read(1,*), omega


close(1)

end subroutine lesinput



end module input

navierstokes_loser.f90

module navierstokes_loser


implicit none

contains


subroutine los_navier(n,omega,u)

!input
integer :: n
real(8) :: omega


!lokal
real(8) :: u(n+1,n+1)
integer :: i,j


u(n+1,n+1)=0.0d0


end subroutine los_navier

end module navierstokes_loser

resultatplot.f90

module resultatplot

implicit none

contains


subroutine vektorplot(n,u)

!input
integer :: n
real(8) :: u(n+1,n+1)

!lokale
integer :: i,j
real(8) :: vek_x


!Skriver vektor verdier til fil som gnuplot skal bruke
open(2,access='sequential',file='vekdata.txt',status='unknown')

write(2,*)'# x y vx vy'

 do i=1,n+1
    do j=1,n+1

    vek_x=u(j,i)


    write(2,*) i, j, vek_x

    end do
write(2,*)''
end do

close(2,status='keep')


end subroutine vektorplot


end module resultatplot

main.f90

program main

use input
use navierstokes_loser
use resultatplot

implicit none

integer :: n
real(8) :: omega
real(8), dimension (:,:), allocatable :: u

call lesinput(n,omega)

allocate(u(n+1,n+1))

call los_navier(n,omega,u)


call vektorplot(n,u)


end program main

好的,我在这里看到了很多东西:

  1. 小于 10 的单位 -- 这总是很危险的。 Best:open读文件时,先用newunit=<somevar>,再用这个<somevar>作为读、写、关闭的单位。但至少使用大于 10 的数字,而不是 1 和 2。
  2. 让我们谈谈u
    1. main.f90 中,它是一个可分配的一维数组,但在 los_navier 中,它是一个二维数组。
    2. 它从未真正分配过。
  3. 在子例程中清楚地指示 intent 有助于编译器及早发现错误。

所以,事不宜迟,这是我的建议:

module input
    implicit none
contains
    subroutine lesinput(n,omega)
        integer :: n
        real(8) :: omega
        integer :: read_unit
        open(newunit=read_unit, file='input.txt',status='old',action='read')
        read(read_unit,*), n
        read(read_unit,*), omega
        close(read_unit)
    end subroutine lesinput
end module input

module navierstokes_loser
    implicit none
contains
    subroutine los_navier(n,omega,u)
        integer, intent(in) :: n
        real(8), intent(in) :: omega
        real(8), allocatable, intent(out) :: u(:,:)
        integer :: i,j
        if (allocated(u)) deallocate(u)
        allocate(u(n+1, n+1))
        u=0.0d0
    end subroutine los_navier
end module navierstokes_loser

module resultatplot
    implicit none
contains
    subroutine vektorplot(n,u)
        integer, intent(in) :: n
        real(8), intent(in) :: u(n+1,n+1)
        integer :: i,j
        integer :: write_unit
        open(newunit=write_unit,access='sequential',file='vekdata.txt',status='unknown')
        write(write_unit,*)'# x y vx vy'
        do i=1,n+1
            do j=1,n+1
                write(write_unit,*) i, j, u(j, i)
            end do
            write(write_unit,*)''
        end do
        close(write_unit,status='keep')
    end subroutine vektorplot
end module resultatplot

program main
    use input
    use navierstokes_loser
    use resultatplot
    implicit none
    integer :: n
    real(8) :: omega
    real(8), dimension (:, :), allocatable :: u
    call lesinput(n,omega)
    call los_navier(n,omega,u)
    call vektorplot(n,u)
end program main