Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Fortran Help: Matching Data and writing values

  1. Sep 12, 2012 #1
    hi

    i have two file with following data

    file-1 (named: xyxp.dat)

    6
    1 1 0 10
    3 2 1 5
    3 5 4 8
    0 0 0 11
    1 2 5 4
    5 6 4 12

    file-2 (named: xyzn.dat)

    6
    1 0 0 0
    2 1 1 0
    3 3 2 1
    4 1 2 5
    5 3 5 4
    6 5 6 4

    now i want to match each value of the first three columns of file -1 with the corresponding values in the last three columns of file-2. for example first three values form file-1 are
    1 1 0 now the program should search 1 1 0 in last three columns of file 2, and then write 2 10 as output
    the result similar to this is required as output

    1 11
    2 10
    3 5
    4 4
    5 8
    6 12

    till now i have written the following program, but really got confused with matching data

    program main
    implicit none

    integer :: pn,nn
    integer :: i
    real ,allocatable, dimension (:,:) :: x , ix

    open (11,file='xyxp.dat')
    read (11,*) pn
    allocate (x(pn,4))
    do i=1,pn
    read (11,*) x(i,:)
    end do
    close (11)
    c write(*,*) x

    open (12,file='xyzn.dat')
    read (12,*) nn
    allocate (ix(nn,4))
    do i=1,nn
    read (12,*) ix(i,:)
    end do
    close (12)
    c write(*,*) ix

    do i=1,nn
    if (x(:,1)==ix(:,2).and.x(:,2)==ix(:,3).and.x(:,3)==ix(:,4)) then
    ix(i,1)=x(i,4)
    write(*,*) ix(i,1)
    end if
    end do

    end program

    kindly help me in this matter
     
  2. jcsd
  3. Sep 12, 2012 #2
    You'd better declare those arrays INTEGERs, by the way, comparison of REALs with "==" may fail any time.

    You need a double loop to compare each x row to all ix rows.

    How about something like this:
    Code (Text):

    do i=1, pn
      do j = 1, nn
        if (x(i,1)==ix(j,2).and.x(i,2)==ix(j,3).and.x(i,3)==ix(j,4)) then
          write(*,*) ix(j,1), x(i,4)
        end if 
      end do
    end do
     
     
  4. Sep 16, 2012 #3
    yup real number fail with "==" .... any suggesstion for real numbers
     
  5. Sep 16, 2012 #4
    just compare the absolute difference to the accuracy desired:
    Code (Text):

    if  ( abs( x(i,1) - ix(j,2) ) < 0.0005  ) then
       ! whatever
    end if
     
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: Fortran Help: Matching Data and writing values
Loading...