Google Groups Home Help | Sign in
Message from discussion A Faster/Better way?
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
Infinity77  
View profile
 More options May 5, 12:54 pm
Newsgroups: comp.lang.fortran
From: Infinity77 <andrea.gav...@gmail.com>
Date: Mon, 5 May 2008 09:54:58 -0700 (PDT)
Local: Mon, May 5 2008 12:54 pm
Subject: A Faster/Better way?
Hi All,

    I have an unformatted file, and I open it for reading in big
endian mode. The file has a repetitive structure (is a time step
report for a simulation): at the beginning of every time step, there
is this pseudo-declaration:

'PARAMS'
keyword number kind

where "keyword" is an 8 character string, "number" is an integer which
tells me how much data this time step contains, and "kind" is a 4
character string which tells me the data type (i.e., 'CHAR', 'REAL'
and so on). After this declaration, the data for the current time step
follows. As an example:

'PARAMS  '  4200 'REAL'
0.5372 3.7393 0.3273 .... (4200 real numbers)

With the file I am working on, this 4200 stays constant for every time
step in the simulation.
The numerical arrays are divided into blocks of up to 1000 items each:
so, in my previous example, I suppose I can not read the whole 4200
real numbers in one shot, I have to loop 4 times and read 1000 items
every time, plus read the remaining 200 as last step.

I have written the following routine to read and store the data from
this file. Is there anything I could do to speed up the reading/
storing of the data?

Thank you very much for your suggestions and comments. I apologize for
the long post.

Andrea.

! Begin Code

subroutine ReadSMSPEC(fileName, miniSteps, dimens, matrix)

        ! PARAMETERS:
        ! fileName: the file containing the data
        ! miniSteps: the number of time steps in the simulation
        ! dimens: the number of data in each time step
        ! matrix: a dimens x miniStep 2D array of real data

        character*1000, intent(in) :: fileName
        integer, intent(in) :: miniSteps, dimens
        real(4), intent(out) :: matrix(dimens, miniSteps)

        integer keywordNumber, internalCount, readBuffer, matrixIndex

        character*8 keywordName
        character*4 keyworType

        logical feof

        ! Open the file
        open(unit=1, file=fileName, form='UNFORMATTED', convert='BIG_ENDIAN')

        feof = .false.

        ! The numerical arrays are divided into blocks of up to 1000 items
each
        readBuffer = int(dimens/1000)

        do while (.not.feof)

                ! Read the keyword, number and kind
            read(1, end=40) keywordName, keywordNumber, keywordType

                ! I look for the 'PARAMS' keyword
            if (keywordName == 'PARAMS') then

                        ! A new time step has been found
                        ! Increase the index in the matrix
                        matrixIndex = matrixIndex + 1

                    internalCount = 0

                        ! Loop by reading a block of 1000 items
                        ! at a time

                        do while (internalCount <= readBuffer)

                                ! Read a block of 1000 items until
                                ! you reach the end of this time step

                                if (internalCount < readBuffer) then

                                        ! We are still far from the last block,
                                        ! Read 1000 items of data

                            read(1, end=40) matrix(1000*internalCount
+1:1000*(internalCount+1), matrixIndex)

                        else

                                        ! We reached the last block of data:
                                        ! Read the remaining data, which can be
                                        ! less than 1000 items.

                                        read(1, end=40) matrix(1000*internalCount+1:dimens, matrixIndex)

                                endif

                                internalCount = internalCount + 1

                        enddo

                endif

        enddo

40      continue

        close(1)
        return

end subroutine readSMSPEC

! End Code


    Reply    Reply to author    Forward  
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.

Create a group - Google Groups - Google Home - Terms of Service - Privacy Policy
©2008 Google