чтение выбранных данных из нескольких файлов - PullRequest
0 голосов
/ 31 июля 2011

Мне нужна техническая помощь в модификации моего кода на Фортране. Я искал в Интернете, но я не могу найти тот, который может удовлетворить мои потребности.

В основном я анализирую данные моделирования с помощью программы FORTRAN. Во-первых, я объясню формат моих данных, чтобы облегчить понимание того, что я хочу. У меня есть 10 файлов. Каждый файл содержит x, y z, данные для 1000 кадров, и каждый кадр содержит 20736 (x, y, z) данных. Поскольку общий размер всех данных составляет около 10 ГБ для всех 10 000 кадров, я должен разбить их на небольшие куски (10 файлов), чтобы избежать сбоев во время вычислений. В начале каждого файла (первая строка) есть текст, которым можно пренебречь, и каждый кадр заканчивается информацией о размере блока (bx, by, bz). Это формат моих файлов данных.

Я приложил код, который я использовал для анализа.

Текущее кодирование будет выполнять файл расчета за файлом и кадр за кадром в последовательном порядке. Но теперь я хочу сделать расчет только для выбранных кадров, переходя кадр за кадром с определенным рисунком. Например, я выбираю кадры 1, 4, 8, 12, 16 .... и т. Д. До последнего кадра (10000).

Я понятия не имею, как выбрать кадры, которые больше 1000, которые попадают во второй или третий файлы.

Я показал мой код ниже:


module all_parameter
integer,parameter :: MAXATOM=20736
integer,parameter :: nat = 20736                    
integer, parameter :: startFiles=31
integer, parameter :: endFiles=40
integer,parameter :: NO_OF_FILES=10
integer,parameter :: FRAMES_IN=1000
integer, parameter :: totalFrames = ( NO_OF_FILES * FRAMES_IN )
integer :: i, j, k, IFram, nhb, nlipid, jjj
integer :: BIN, iat, jat
!real :: DELR, fnid, GNRM, RCUT, rlower, rupper
real :: junk, dR, bx, by, bz, bbx
real :: only_head, only_tail, only_water
real :: mass_head, mass_tail, mass_water
character*4 at(MAXATOM)
real,dimension(MAXATOM) :: x, y, z
real,dimension(3) :: rcm
real,dimension(MAXATOM) :: rx, ry, rz 
real,dimension(MAXATOM) :: mass

integer, parameter :: startlipid=1
integer, parameter :: endlipid=64
integer, parameter :: lipidNo=64

real, parameter :: PI = (22.0/7.0)
real, dimension(startlipid:endlipid) :: array_UniVekLx, array_UniVekLy, array_UniVekLz
integer ::  no, no2, c71, c72, c80, c81
real        ::  p1x, p1y, p1z, p2x, p2y, p2z, vekx, veky, vekz
real        ::  mag_vekp1p2,  unit_vekx, unit_veky, unit_vekz
real        ::  sum_UniVekLx, sum_UniVekLy, sum_UniVekLz
real        ::  avg_frame_vekx, avg_frame_veky, avg_frame_vekz
real        ::  xx, yy, zz, frame_MagLipVek, theta,theta2, uni_frame_Vekx, uni_frame_Veky, uni_frame_Vekz
real        ::  xxx, yyy, zzz,UniVekLx, UniVekLy, UniVekLz, FrameAvgUniVekMag
real        ::  avg_UniVekLx, avg_UniVekLy,avg_UniVekLz, MagLipVek

end module all_parameter



PROGRAM order_parameter
use all_parameter
implicit none
!=========================================================================
! Open files to be read and to write on
!=========================================================================
!
    ! Topology file     !CHANGE

open(unit=31,status="old",file="../malto_thermoNEW_Ori_50ns-set1.traj ")
open(unit=32,status="old",file="../malto_thermoNEW_Ori_50ns-set2.traj ")
open(unit=33,status="old",file="../malto_thermoNEW_Ori_50ns-set3.traj ")
open(unit=34,status="old",file="../malto_thermoNEW_Ori_50ns-set4.traj ")
open(unit=35,status="old",file="../malto_thermoNEW_Ori_50ns-set5.traj ")
open(unit=36,status="old",file="../malto_thermoNEW_Ori_50ns-set6.traj ")
open(unit=37,status="old",file="../malto_thermoNEW_Ori_50ns-set7.traj ")
open(unit=38,status="old",file="../malto_thermoNEW_Ori_50ns-set8.traj ")
open(unit=39,status="old",file="../malto_thermoNEW_Ori_50ns-set9.traj ")
open(unit=40,status="old",file="../malto_thermoNEW_Ori_50ns-set10.traj ")

! Open New Files
open(unit=51,status="unknown",file="BOXinfo.dat ")
open(unit=75,status="unknown",file="magnitude_theta_lipid-thermo-malto.dat")

do k = startlipid, endlipid
array_UniVekLx(k) =0.0
array_UniVekLy(k) =0.0
array_UniVekLz(k) =0.0
end  do


 ! READ COORDINATES IN FRAMES FROM TRAJ file

INPUTFILES: do jjj = startFiles, endFiles
! LOOP OVER FRAMES
IFram = 1
read(jjj,'(a)') junk

!&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
        !IFram = 1
WHOLE: do while ( IFram <= FRAMES_IN)   
read(jjj,'(10F8.3)') (x(i),y(i),z(i),i = 1,nat)  ! reading TRAJ file 

        read(jjj,'(3F8.3)') bx,by,bz   
        write(51,'(a,3F8.3)') 'BOXINFO', bx,by,bz


        ! LOOP OVER ATOMS

        loop1: do j = startlipid, endlipid !nat in lipids
            loop2: do i = 45, 45 !,3    !atoms in a lipid

                no= i + (j-1)*81
                !no2= (no + 18)

                c71=no
                c72=(no+3)
                    p1x=((x(c71) + x(c72))/2.0 )
                    p1y=((y(c71) + y(c72))/2.0 )
                    p1z=((z(c71) + z(c72))/2.0 )
                    .       
                    .
                    .
                    .

            enddo loop2 ! going to next lipid
        !CLOSE LOOP OVER ATOMS
        enddo loop1  ! going to next frame , before that



!CLOSE LOOP OVER A FRAME
IFram = IFram + 1

enddo WHOLE


!CLOSE LOOP OVER ALL FILES
  enddo INPUTFILES

 end program order_parameter

Я очень ценю вашу помощь заранее.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 31 июля 2011

Очевидно, что программе нужно знать, какой файл она читает, 1, 2 ... 10. Назовите этот ifile.Затем кадр с файлом, скажем frame_in_file.Тогда у вас есть frame = (ifile-1) * frame_in_file.У вас есть правило, чтобы решить, хотите ли вы обрабатывать «кадр»?Если правило состоит в том, чтобы обрабатывать каждый четвертый, используйте мод и цикл, как предложено @janneb.В противном случае, я не уверен, что вы спрашиваете.

С десятью файлами было бы проще записать имя файла в строку и обработать их с помощью цикла, открывая каждый файл по очереди с тем же номером единицыи закрытие в конце цикла.Это было бы немного проще, если бы вы использовали соглашение, согласно которому число в имени файла всегда было двумя цифрами, с начальным нулем, если меньше 10:

do ifile=1, 10
   write (filename, '( "myfile_number", I2.2, ".data" )' ) ifile
   open (unit=30, file=filename, ...)
   loop: read from the file...
      calculate overall frame number ...
      cycle out of read loop if unsuitable frame...
      process the frame...
   end read loop
   close (unit=30)
end do
0 голосов
/ 31 июля 2011

Ну, в цикле, если mod(framenumber, 4) == 0 не перейти к следующей итерации (оператор CYCLE делает это в Fortran). Таким образом, вы будете обрабатывать только каждый четвертый кадр.

Кроме того, вы хотите использовать несколько более точное значение для PI. 22/7, WTF?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...