2

I have wrote down Fortran code to calculate the distance and then sorting, but there is some problem in calling executable command.

Here is the code

 program sort
  implicit none
  character CN*8,O*7
  integer j,iconf,nconf
  integer i,m
  integer n,nmax,num
  parameter (n=5)
  double precision xbox,rq
  parameter (nmax=3091,nconf=1)
  double precision atom(nmax),id(nmax),ox(nmax),oy(nmax),oz(nmax)
  double precision xij,yij,zij,rij,t
  double precision r(n,n)
  open(unit=1,status='unknown',file='a.gro')

  do iconf= 1,nconf
    read(1,*)
     read(1,*)
   do i=1,n
     read(1,'(A8,A7,1i5,3f8.3)')CN,O,num,ox(i),oy(i),oz(i)
   enddo
   read(1,*)xbox  

  open(unit=3,file='dist.txt')
    do i=1,n
    do j=1,n
   if(i .ne. j) then
   xij=ox(i)-ox(j)
   yij=oy(i)-oy(j)
   zij=oz(i)-oz(j)
   xij=xij - nint(xij/xbox)*xbox
   yij=yij - nint(yij/xbox)*xbox
   zij=zij - nint(zij/xbox)*xbox
   r(i,j)=dsqrt(xij**2 + yij**2 + zij**2)
    write(3,'(i3,2x,i3,4x,f17.15)') i,j, r(i,j)
    call execute_command_line(sort -t, -k1 -g  r(i,j))
    write(*,*)
    endif
    enddo
    enddo

    enddo
    END program

The input file is a.gro

Generated by trjconv : 360 water t= 1000.00000
  216
    1water  OW1    1   0.764   0.617   0.582
    2water  OW1    2   0.865   1.469   1.696
    3water  OW1    3   0.423   1.400   1.324
    4water  OW1    4   0.381   1.464   0.392
    5water  OW1    5   1.279   0.872   0.131
   1.87759   1.87759   1.87759

outfile file 3, dist.txt

  1    2    1.148553302245917
  1    3    1.131341681367747
  1    4    0.948787647474397
  1    5    0.730514202462895
  2    1    1.148553302245917
  2    3    0.581815262776768
  2    4    0.750524142249935
  2    5    0.790896648178509
  3    1    1.131341681367747
  3    2    0.581815262776768
  3    4    0.935138492417032
  3    5    1.216627908647504
  4    1    0.948787647474397
  4    2    0.750524142249935
  4    3    0.935138492417032
  4    5    1.106792211754311
  5    1    0.730514202462895
  5    2    0.790896648178509
  5    3    1.216627908647504
  5    4    1.106792211754311

so, I want to sort r(i,j), keeping i same j different.but call line is not working in fortran code.

error that is coming

 tetra.f(48): error #6413: This global name is invalid in this context.   [SORT]
        call execute_command_line(sort -t, -k1 -g  r(i,j))
----------------------------------^
tetra.f(48): error #6404: This name does not have a type, and must have an explicit type.   [K1]
        call execute_command_line(sort -t, -k1 -g  r(i,j))
--------------------------------------------^
tetra.f(48): error #6404: This name does not have a type, and must have an explicit type.   [GR]
        call execute_command_line(sort -t, -k1 -g  r(i,j))
------------------------------------------------^
tetra.f(48): error #6362: The data types of the argument(s) are invalid.   [EXECUTE_COMMAND_LINE]
        call execute_command_line(sort -t, -k1 -g  r(i,j))
---------------------------------------^
tetra.f(48): error #6362: The data types of the argument(s) are invalid.   [EXECUTE_COMMAND_LINE]
        call execute_command_line(sort -t, -k1 -g  r(i,j))
-----------------------------------------------^
compilation aborted for tetra.f (code 1)

Please let me know how can I execute shell command in Fortran code.

5
  • 2
    The argument of execute_command_line must be a string. But I don't actually understand, what you are trying to do. Sorting a Fortran array using bash? That is a very bad idea. Commented Aug 24, 2018 at 9:52
  • yes....I am trying to sorting as fortran array using bash. I want sorting keeping i same j different.But this type of sorting I am not able to do. Commented Aug 24, 2018 at 10:12
  • Do not try to do that. Commented Aug 24, 2018 at 12:40
  • @claudiasmith You can have a look at the Numerical Recipes in Fortran book by William Press et al. The best routines for sorting can still be found in this book, and the book is very well written. The book also comes with a CD containing all source codes of these algorithms. Most libraries should give you access to both the book and the source codes for free. As Vladimir F said, you do not need to call external applications for such trivial tasks in Fortran. Otherwise, you will be in trouble as soon as your problem size goes out of control or your platform changes. Commented Aug 24, 2018 at 20:11
  • 1
    I just noticed that the authors of numerical recipes have made the Fortran and C versions of their book available for free online here . If I remember correctly from years ago, the source codes were also available on the same website for free, but I cannot find them anywhere now. Commented Aug 25, 2018 at 6:17

1 Answer 1

1

I understand that what you are trying to do is order the four values of r(i,j) for each possible value of i (which I call irow in the following). If that is the case, and if you need a fortran answer (rather than a Linux answer), then the following should work. Sorting is a central concern in computer science, and there are many algorithms. I chose bubble sort because it is fairly easy to understand, and very well documented eg https://en.wikipedia.org/wiki/Bubble_sort. It is definitely not very fast. Please note that the ordered results have the smallest value first, the order is ascending.

Module BSort
  use, intrinsic :: iso_c_binding
contains
  Subroutine f_Bubble_Sort(a,order)
    implicit none
    integer (c_int),intent(out) :: order(:)
    integer (c_int) :: kx,ky,length,otemp
    real (c_float),intent(in) :: a(:)
    real (c_float),allocatable :: locala(:)
    real (c_float) :: temp
    logical(c_bool)  :: swapped

    length=size(a)
    allocate(locala(length));order=(/(kx,kx=1,length)/);locala=a

    do kx = length-1, 1, -1       !from top -> down
       swapped = .false.
       do ky = 1, kx
          if (locala(ky) > locala(ky+1)) then
             temp = locala(ky)
             locala(ky) = locala(ky+1)
             locala(ky+1) = temp
             otemp=order(ky)
             order(ky)=order(ky+1)
             order(ky+1)=otemp
             swapped = .true.
          end if
       end do
       if (.not. swapped) exit
    end do
  End Subroutine f_Bubble_Sort
End Module BSort

Program Q52001740
  use, intrinsic :: iso_c_binding
  use BSort
    implicit none
    real(kind=c_float) :: r(5,4)
    integer(c_int) :: out(4),irow,jcol,column(5,4),order(5,4)

    open(unit=3,file='Q52001740.dist.txt')
    !  note no diagonal values in r
    do irow=1,5
       do jcol=1,4
          read(3,'(5x,i3,4x,f17.15)') column(irow,jcol), r(irow,jcol)
       end do
       call f_Bubble_Sort(r(irow,:),out)
       order(irow,:)=out
       write(*,fmt='("irow= ",i2)')irow
       write(*,fmt='(i2,4f8.5,4i3)')irow,r(irow,:),out
       write(*,fmt='(a10,i2,4f8.5)')"sorted r:",irow,r(irow,out)
       write(*,fmt='(a16,4i4)')"sorted columns:",column(irow,out)
    end do
End Program Q52001740

The output is:

irow=  1
 1 1.14855 1.13134 0.94879 0.73051  4  3  2  1
 sorted r: 1 0.73051 0.94879 1.13134 1.14855
 sorted columns:   5   4   3   2
irow=  2
 2 1.14855 0.58182 0.75052 0.79090  2  3  4  1
 sorted r: 2 0.58182 0.75052 0.79090 1.14855
 sorted columns:   3   4   5   1
irow=  3
 3 1.13134 0.58182 0.93514 1.21663  2  3  1  4
 sorted r: 3 0.58182 0.93514 1.13134 1.21663
 sorted columns:   2   4   1   5
irow=  4
 4 0.94879 0.75052 0.93514 1.10679  2  3  1  4
 sorted r: 4 0.75052 0.93514 0.94879 1.10679
 sorted columns:   2   3   1   5
irow=  5
 5 0.73051 0.79090 1.21663 1.10679  1  2  4  3
 sorted r: 5 0.73051 0.79090 1.10679 1.21663
 sorted columns:   1   2   4   3
Sign up to request clarification or add additional context in comments.

2 Comments

For short lists, it's reasonable to use bubble sort; efficiency is much less important than correctness. For sorting longer data I generate or read, I like using insertion sort and a temporary tree. The logic is fairly simple, performance is better than bubble sort, I can track the number of insertions to create a properly-sized dynamic array, and I conserve memory by freeing up the tree once I'm done with it. Unfortunately Fortran still doesn't have generics or a standard library; we really shouldn't be coding sort routines ourselves.
Here is an excerpt from the bible of Numerical Recipes by William Press on Bubble Sort algorithm: "On balance, we recommend Quicksort because of its speed... The resultant waste of computer time is so awesome, that we were tempted not to include any N^2 routine at all. We will draw the line, however, at the inefficient N^2 algorithm, beloved of elementary computer science texts, called bubble sort. If you know what bubble sort is, wipe it from your mind; if you don’t know, make a point of never finding out!"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.