Fortran Fortran Help: Matching Data and writing values

AI Thread Summary
The discussion revolves around matching data from two files, xyxp.dat and xyzn.dat, using a Fortran program. The goal is to compare the first three columns of data in xyxp.dat with the last three columns of data in xyzn.dat, and output corresponding values based on matches. The initial program structure is provided, but issues arise with data comparison, particularly with floating-point values. Suggestions include using integer arrays instead of real numbers for comparisons, implementing a double loop to compare each row from both files, and using absolute differences for real number comparisons to avoid inaccuracies. The output format should display the matched values correctly, ensuring that the program functions as intended.
timewilltell
Messages
13
Reaction score
0
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
 
Technology news on Phys.org
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:
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
 
yup real number fail with "==" ... any suggesstion for real numbers
 
just compare the absolute difference to the accuracy desired:
Code:
if  ( abs( x(i,1) - ix(j,2) ) < 0.0005  ) then
   ! whatever
end if
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I have a quick questions. I am going through a book on C programming on my own. Afterwards, I plan to go through something call data structures and algorithms on my own also in C. I also need to learn C++, Matlab and for personal interest Haskell. For the two topic of data structures and algorithms, I understand there are standard ones across all programming languages. After learning it through C, what would be the biggest issue when trying to implement the same data...

Similar threads

Replies
12
Views
3K
Replies
34
Views
3K
Replies
4
Views
2K
Replies
5
Views
2K
Replies
6
Views
2K
Replies
5
Views
5K
Replies
16
Views
3K
Replies
2
Views
1K
Back
Top