Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在Fortran代码中执行execute_命令_line()时出错_Linux_Shell_Fortran_System Calls_Intel Fortran - Fatal编程技术网

Linux 在Fortran代码中执行execute_命令_line()时出错

Linux 在Fortran代码中执行execute_命令_line()时出错,linux,shell,fortran,system-calls,intel-fortran,Linux,Shell,Fortran,System Calls,Intel Fortran,我已经写下了Fortran代码来计算距离,然后进行排序,但是在调用可执行命令时出现了一些问题 这是密码 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 pr

我已经写下了Fortran代码来计算距离,然后进行排序,但是在调用可执行命令时出现了一些问题

这是密码

 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
输入文件是
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
输出文件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
所以,我想排序
r(I,j)
,保持I相同j不同。但调用行在fortran代码中不起作用

即将到来的错误

 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)

请让我知道如何在Fortran代码中执行shell命令。

我知道您试图做的是为I的每个可能值(我在下面称为irow)排序r(I,j)的四个值。如果是这种情况,并且如果您需要fortran答案(而不是Linux答案),那么下面的方法应该可以工作。排序是计算机科学的一个中心问题,有许多算法。我选择冒泡排序是因为它相当容易理解,并且有很好的文档记录。绝对不是很快。请注意,排序结果首先具有最小值,顺序为升序

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
输出为:

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

execute\u command\u line
的参数必须是字符串。但我真的不明白,你想做什么。使用bash对Fortran数组进行排序?这是一个非常糟糕的主意。是的……我正在尝试使用bash作为fortran数组进行排序。我希望排序保持相同j不同。但这种类型的排序我做不到。不要尝试这样做。@claudiasmith你可以看看William Press等人的Fortran书中的数字公式。最好的排序例程仍然可以在这本书中找到,而且这本书写得很好。这本书还附带了一张CD,里面包含了这些算法的所有源代码。大多数图书馆应该让你免费阅读这本书和源代码。正如Vladimir F所说,您不需要为Fortran中的这些琐碎任务调用外部应用程序。否则,一旦你的问题规模失控或平台发生变化,你就会陷入麻烦。我刚刚注意到,数字配方的作者已经在网上免费提供了他们书的Fortran和C版本。如果我几年前没有记错的话,这些源代码也可以在同一个网站上免费获得,但现在我在任何地方都找不到它们;效率远不如正确重要。为了对生成或读取的较长数据进行排序,我喜欢使用插入排序和临时树。逻辑相当简单,性能优于冒泡排序,我可以跟踪插入的数量以创建大小合适的动态数组,并且在处理完树后释放它以节省内存。不幸的是,Fortran仍然没有泛型或标准库;我们真的不应该自己编写排序例程。以下是William Press关于气泡排序算法的《数字配方圣经》的摘录:“总的来说,我们建议快速排序,因为它的速度。。。由此造成的计算机时间浪费是如此可怕,以至于我们试图不包含任何N^2例程。然而,我们将以效率低下的N^2算法为界限,该算法被称为冒泡排序,深受初级计算机科学文本的喜爱。如果你知道什么是泡泡排序,把它从你的脑海中抹去;如果你不知道,一定要永远不知道!"