Fortran:在两个不同的程序

时间:2015-08-29 08:44:11

标签: fortran

我需要在两个不同的fortran程序之间交换数据,不幸的是需要分开(两个不同的.exe),一个用f90编写,另一个用f77编写。
目前这是我的解决方案:
- f90(.exe)在f77(master)的开头启动,并使用do while('true')等待来自f77的数据并查询 - 当数据写入某个文件(file_in)时,f90读取,详细说明并将结果写入新文件(file_out) - f77使用do while('true')等待来自f90的数据并查询 - 继续 这是f77中程序的示例代码:

   C Write data for f90
   open(210, file=file_in, action='write', status='replace', form='unformatted')
   write(210) data
   close(210)
   do while (.true.)
       inquire(file=KDTree_out, exist=file_exist)
       if (file_exist) then
           call sleepqq(2)
           exit
       endif
   enddo
   open(220, file=KDTree_out, action='read', status='old', form='unformatted')
   read(220) value
   close(220, status='delete')

这是f90中程序的示例代码:

do while(.true.)
    inquire(file=KDTree_in, exist=file_exist)
    if (file_exist) then
          call sleepqq(2)
          ! Read data
          open(100, file=file_in, action='read', status='old', form='unformatted')
          read(100) data
          close(100, status='delete')

          ! Elaborate data

          ! Write data     
          open(150, file=file_out, action='write', status='replace', form='unformatted')
          write(150) value
          close(150)

      endif
enddo

这个解决方案似乎工作得很好,但是你可以看到有一些sleepqq(2)(微秒)来避免文件结束错误,但如果你有和ssd或硬盘,这个等待时间可能会有所不同不是完美的解决方案。 你有什么想法吗?

由于

1 个答案:

答案 0 :(得分:0)

感谢agentp,这解决了我的问题:

考虑使用第二个文件作为在关闭/刷新数据文件后写入的标志,这应该有助于解决一些时序问题

[编辑] 我有一些问题,我用来标记数据文件已准备好。我并不总是能删除这个文件。

这是我的解决方案,在数据文件准备就绪后,我在一个程序上写道:

do while (.true.)
   inquire(file=chk_file2, exist=file_exist)
   if (file_exist) then
102   continue
      do while (.true.)
          open(400, file=chk_file2, iostat=istat, err=102)
          if (istat.eq.0) then
              close(400, status='delete', err=102)
              exit
          endif
      enddo
      exit
   endif
enddo

在另一个程序中,我有这个代码来获取标志并删除文件,因为我需要多次交换数据:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.imageName = @"goldencoaster";

    [self.view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"table"]]];

    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%@", self.imageName]];
    CGRect screen = [[UIScreen mainScreen] bounds];
    CGRect bounds = CGRectMake(screen.origin.x+10,
                  screen.origin.y+10,
                  screen.size.width-20,
                  screen.size.height-20);

    self.coasterImage.center = self.coasterImage.superview.center;
    self.coasterImage.frame = bounds;
    self.coasterImage.image = image;
}

或者:

{{1}}

由于