2014-02-12 40 views
0

我使用一个小型内部集群(约31台机器)来帮助完成数值地下水模型的平行运行。在地下水模型完成后,一个短后处理器操作一些数据,供正在收集平行运行输出的代码使用。它曾经是后处理器,用Fortran编写,并使用Vis内部的英特尔Visual Fortran编译。 Studio 2010是可分发的,这意味着我可以将.exe放入群集中分发的其他文件中,并在各种机器上运行。但是,如果我使用Visual Studio 2012与Intel Fortran XE 2013编译完全相同的Fortran,则在群集计算机上出现错误消息:“程序无法启动,因为MSVCRR110.dll从计算机中丢失。请尝试重新安装解决这个问题的计划。“Fortran .exe不再是“独立的”吗?

我喜欢使用Fortran的原因之一是它曾经是独立的。换句话说,如果我编写了一些小程序来用另一种语言(比如说R或者Python)来完成一些短小精悍的任务,那么我必须在所有集群机器上安装这些程序,或者用我的分布式文件“沙箱”安装这些程序。忘记试图使用C#或VB等,因为那么群集机器需要安装.NET框架。目前我可以回去使用VS2010进行编译,但是我不希望这个选项对我来说可用时间更长。在VS2012中保持Fortran程序“独立”还有另一种选择吗?正如你可以在下面的代码,没有什么复杂的,没有理由看它不会是一个自包含可执行文件:

program Calc_Seep 

implicit none 

! Variables 
integer  reason 
real   wp,time,ft,fts,fr,fo,fst,fro,loss1,loss2,loss3 
character (len=120) line 
character*50 txt 
character*20 fmt 

wp = 9.38    !a needed constant value 
!read(*,*) txt 
open(5,file='balance.out') 
read(5,'(A)') line 

do while (.NOT.line.EQ.'') 
    read(5,'(A)',IOSTAT=Reason) line 
    if (Reason < 0) exit 
end do 

read(line,*) time,ft,fts,fr,fo,fst,fro 

!acre-ft/mi/yr 
loss1 = (ft/time)*0.3048*5280*208*24/(0.3048**3)/43560.17 
!ft/day 
loss2 = (ft/time)*24/(0.3048**2)/wp 
!cfs/mi 
loss3 = (ft/time)*24/(0.3048**2)*5280/86400 

close(5) 

!now write the processed values to a file 
open(5,file="Seepage.out") 
write(5,'(A)') "acre-ft/mi/yr  ft/day  cfs/mi" 
write(5,100) loss1, loss2, loss3 
100 format(3f13.6) 
close(5) 

end program Calc_Seep 
+0

在每台机器上安装visual C运行库并不难。但很可能你不再编译“静态”应用程序,这会将任何“外部”库直接放入exe。 –

+3

只需将程序运行时库复制或使用'-static'或'-static-intel'编译即可。 –

+0

请参阅http://msdn.microsoft.com/en-us/library/2kzt1wy3%28v=vs.110%29.aspx – steabert

回答

2

这简直是对新创建的项目中,缺省项目属性的变化。从英特尔Visual Fortran Composer XE 2013 SP1(编译器版本14)开始,缺省情况下将链接到DLL库,并匹配MS Visual C++的功能。现有项目不受影响,您仍然可以将库设置(Fortran> Libraries> Runtime Library)从“Multithreaded DLL”更改为“Multithreaded”。如果你这样做,那么它将再次链接到静态库,尽管有一些库仅以DLL形式提供(OpenMP和coarray支持)。