2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 fortran 90 read in array from binary
Сообщение15.04.2011, 21:14 
Привет,

у меня есть бинарный файл, который я хочу записать в массив, делаю я это так:

код: [ скачать ] [ спрятать ]
Используется синтаксис Fortran
module double
        ! number precision control
        integer, parameter :: dp = selected_real_kind(12)
end module double

module dynamic
        use double
        real(kind=dp), dimension(:,:), allocatable :: array
        integer :: nx = 11! x-nodes
        integer :: ny = 11! y-nodes
        integer :: nz = 11 ! z-nodes
end module dynamic

module field_in_mod
        interface field_in_inter
                subroutine field_in(i,field)
                        use dynamic
                        implicit none
                        integer :: i, k
                        character(7) :: field
                end subroutine field_in
        end interface field_in_inter
end module field_in_mod

program test
        use field_in_mod
        use double
        use dynamic    
        implicit none

        allocate(array(6,nx*ny*nz))
       
        call field_in(nx*ny*nz,"in01.bi") ! in01.bi - binary, in01.in - ascii
       
        write(*,*) array(:,1)
        write(*,*) array(:,2)
       
        deallocate(array)      

end program test

subroutine field_in(i, field)
        use dynamic
        implicit none
        ! i - number of steps/element in e-field file
        ! k - do-loop var
        integer :: i, k
        character(7) :: field
        ! open file with e-field data
        ! file layout is assumed
        ! x y z Ex Ey Ez
        if (field=='in01.bi') then
                open(unit=10, file=field, recl=nx*ny*nz, &
                        access='direct', form='unformatted')
                ! filling array
                do k=1,i,1
                        read(10, rec=1) array(1,k), & ! x
                                        array(2,k), & ! y
                                        array(3,k), & ! z
                                        array(4,k), & ! Ex
                                        array(5,k), & ! Ey
                                        array(6,k)    ! Ez
                end do
                ! close file
                close(10)
        else
                open(unit=10, file=field, form='formatted')
                ! filling array
                do k=1,i,1
                        read(10, fmt=*) array(1,k), & ! x
                                        array(2,k), & ! y
                                        array(3,k), & ! z
                                        array(4,k), & ! Ex
                                        array(5,k), & ! Ey
                                        array(6,k)    ! Ez
                end do
                ! close file
                close(10)
        end if
end subroutine field_in
 


когда я использую ascii файл, то write дает
-5.0000000000000000 -5.0000000000000000 -5.0000000000000000 25.000000000000000 0.0000000000000000 0.0000000000000000
-5.0000000000000000 -5.0000000000000000 -4.0000000000000000 25.000000000000000 0.0000000000000000 0.0000000000000000
как и должно быть, но в случае binary
-5.0000000000000000 -5.0000000000000000 -5.0000000000000000 25.000000000000000 0.0000000000000000 0.0000000000000000
-5.0000000000000000 -5.0000000000000000 -5.0000000000000000 25.000000000000000 0.0000000000000000 0.0000000000000000
мне не понятно почему так происходит.
Но думаю что проблема в open или read для случая binary. Не совсем понятно как работают recl, rec.
Может быть проблема в организации самого файла binary?

-- Пт апр 15, 2011 21:15:24 --

инпут файлы по ссылке
http://www.filedude.com/download/CyWZxS8gBu2509dc2a8f

 
 
 [ 1 сообщение ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group