一种分布式fortran模块间的通信方法

文档序号:6598867阅读:248来源:国知局

专利名称::一种分布式fortran模块间的通信方法
技术领域
:本发明涉及一种分布式FORTRAN模块间的通信方法,属于计算机软件
技术领域

背景技术
:FORTRAN语言诞生于20世纪50年代,由于其语法结构简单、科学计算功能强大特别是在复数运算上独一无二的优势,被广泛应用于数学与工程计算领域。很多早期的工程应用计算程序、软件都是用FORTRAN语言编写的。但是FORTRAN程序又有其明显的缺点用户界面不友好,可视化性很差。如何继续使用大量的FORTRAN遗留代码,减少浪费;同时如何使应用程序又具有像C++、VB、Delphi这些语言的友好人机界面呢?一般的策略是利用混合语言编程,对FORTRAN代码用C/C++、VB、Delphi语言封装起来。这种策略将封装的级别停留在语言级别,在可视化性,易用性方面得到了不错的提高,但是按照这种策略拆分和封装后的FORTRAN遗留程序只能部署在一台机器上,还达不到分布式、跨平台的程度,造成对FORTRAN代码的可重用性实质上并不高。从上面的分析可知,对于FORTRAN遗留程序中,现有的方法是部署在同一台机器上,所以各个模块之间的通信可通过共享内存变量来实现,但是在分布式的环境中,这种通信机制是不行的。另外对于模块内部的读取文件的问题,文件指针的定位也是分布式环境中必须考虑和解决的。
发明内容本发明的目的在于提供了一种分布式FORTRAN模块间的通信方法,本发明的方法不仅能够实现现有方法的可视化、可用性的效果,而且针对分布式的环境,提供了创造性的解决方案,实现了将拆分和封装后的模块部署在分布式的机器上执行效果和原来的完全相同。本发明的技术方案为—种分布式FORTRAN模块间的通信方法,其步骤为1)将拆分后分布在各主机上的FORTRAN模块依次进行C语言、Java语言封装,生成WebService模±央;所述WebService模块内包含有一利用FORTRAN语言编写的FORTRAN模块适配器,用于解析传入的全局变量文件和生成输出的全局变量文件;所述全局变量文件包括内部读取文件名、文件指针和全局变量参数;2)发起请求主机A上FORTRAN模块的适配器生成发往目标主机B的全局变量文件A,并通过主机A的WebService模块发送给主机B的WebService模块;3)主机B上FORTRAN模块的适配器解析主机B的WebService模块传入的该全局变量文件A,并对相应参数进行赋值;4)主机B上FORTRAN模块的适配器调用该FORTRAN模块执行运算,并利用该适配器生成全局变量文件B;45)主机B上FORTRAN模块的适配器通过主机B上的WebService模块将生成的全局变量文件B发送给主机A的WebService模块;6)主机A上FORTRAN模块的适配器解析主机A的WebService模块传入的该全局变量文件B,并对相应参数进行赋值后传给该FORTRAN模块。进一步的,所述WebService模块的生成方法为1)利用FORTRAN语言编写主机上FORTRAN模块的适配器;2)利用C语言编写一个封装程序,负责和该适配器通信;3)利用Java语言编写一个封装程序,负责调用该C语言封装程序;4)将该Java封装程序封装成一个WebService模块。进一步的,所述Java语言封装程序利用Java语言的getRuntime方法获取当前Runtime类运行时对象的引用,然后调用相应的exec方法访问所述C语言封装程序。进一步的,所述C语言封装程序利用C语言的system函数访问所述Java语言封装程序。进一步的,如权利要求1所述的方法,其特征在于所述全局变量文件的格式为XML文件格式。进一步的,所述文件指针为FORTRAN命令语言的行号。进一步的,所述主机A的WebService模块将所述全局变量文件A发送给主机B的WebService模块的方法为1)所述主机A上FORTRAN模块的适配器将该全局变量文件A传给该WebService模块的C语言封装程序;2)该C语言封装程序将该全局变量文件A传给该WebService模块的Java语言封装程序;3)该WebService模块的Java语言封装程序调用主机B的WebService模块,将全局变量文件A发送给主机B的WebService模块。进一步的,所述主机B的WebService模块传入所述全局变量文件A给主机上FORTRAN模块的适配器的方法为1)所述主机B的WebService模块的Java语言封装程序将该全局变量文件A传给该WebService模块的C语言封装程序;2)该C语言封装程序将该全局变量文件A传给所述主机B上FORTRAN模块的适配器。FORTRAN是一种结构化的程序语言,其开发的应用软件的各个模块之间耦合性很强,由于其独特的应用场景,所以FORTRAN源代码存在以下两个重要的特点1)各个模块之间的通信采用全局变量的方式(运行的时候共享内存),并且全局变量的数量很多;2)模块内部会存在读取文件的情况,这些文件很可能是应用数据文件,一般是有格式的,周期很长,数据量很大。为了实现能将拆分和封装后的模块实现在分布式环境中,我们进行了一系列积极而又有意义的探索,并对这些探索做了总结,从而找到了一个有效的方法。在实际探索的过程中,我们引入了以下两个概念參数据适配器5FORTRAN遗留程序的模块在运行前有时需要整理所需的数据和参数,在运行后需要整理模块的运行结果以及保存状态等。参考SOA(Service-OrientedArchitecture)中的服务适配思想,我们设计了数据适配器功能。数据适配器实现了FORTRAN遗留程序模块运行时刻的数据调用适配功能,并成为了拆分封装后的模块集成过程中不同模块之间的结合部。參封装程序不同的编程语言之间的通信需要遵循一定的方式,而这些方式的具体实现就是封装程序,在实现的过程中,这些封装程序仅仅起到了通信,传递参数的作用,不涉及到具体的业务逻辑的处理。本方法主要包括以下几部分技术内容(1)模块之间的通信机制的建立拆分封装成WebService的模块有可能会被部署到不同的机器上,原有的模块间通过共享内存中的全局变量的值的通信方式是行不通的。可以有两种策略来解决这个问题。其一是通过参数,但是模块之间的通信的全局变量的数量很多,而且类型也不一样,所以会造成通信函数很复杂,难于控制。其二是通过文件。我们采用了第二种方式。将这些需要在模块间交互的全局变量的值写入到文件中,模块之间通过传输文件的方式,实现通信。所以要对源代码添加数据适配器,用来在执行该模块的逻辑代码前,解析传过来的全局变量的文件作为输入;同时在执行该模块的逻辑代码后,将全局变量的值按一定的格式输出到文件中,作为输出。(2)文件指针的处理在原有的环境中,程序在运行的过程,所有的变量共用一个全局空间,读取应用数据文件的时候,打开的文件句柄会被保留着,方便下次读取,直到整个程序执行完毕。而拆分封装后,部署在分布式的环境中的模块,每次调用,需要重新打开文件,这时候如何定位读取位置很关键,实现方法是通过保存上一次的读取位置的信息。通过分析FORTRAN语言中关于读取文件的特点可知FORTRAN中读取文件的方式不同于C语言中,Read命令对于顺序文件的读取的时候,操作的范围为当前一行,每次读完后,会自动将读取位置移动到下一行;而下次读数据的时候,是从当前行的开始位置开始的。所以可以将行号作为文件读取位置的标志。每次调用该封装后的WebService,我们传入要读取的文件以及要读取文件的位置作为参数,从而实现文件的正确读取。(3)将FORTRAN模土央封装成WebServiceFORTRAN语言不能直接生成WebService。而Java语言是一种简单的、跨平台的、面向对象的、分布式的、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的语言。基于此,我们选择Java语言作为本发明运行环境的开发语言。Java语言与FORTRAN之间不能直接交互,需要引入C语言作为中介,实现Java与FORTRAN之间互操作,到达Java一层后,利用当前很成熟的技术直接可生成WebService(如图l所示)。Java与C之间的通信方式可有两种一种是Java原生接口(JNI),一种是通过在一种语言中调用可执行的模块(Java调用C的exe;C调用Java的可执行类)。我们对两种方式都尝试了下,最终选择了后者。原因主要是从C里面访问Java的时候,需要在C里面多次循环来加载和卸载JVM,来生成Java代码的编译和执行环境。但是现有的JNI做不到这点。Java访问C方法如下利用到了Runtime类,该类封装了运行时的环境。每个Java应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接。可以通过getRuntime方法获取当前Runtime运行时对象的引用,然后调用相应的exec方法就已可以访问相应的exe程序。C中访问Java的方法如下利用C语言库中的system函数,该函数传入的参数是一个可执行类的命令。FORTRAN语言和C语言都属于编译型语言,编译后都形成汇编语言,可通过汇编语言作为中介进行通信,利用加载DLL动态库的方式来实现。(4)数据格式封装过程中要传输的数据包括全局变量的数据和文件指针参数数据,我们采用XML文件的方式进行传输,其Schema定义如图2所示图2是数据Schema在XMLSpy中的图形显示方式,我们可以看到,所有的数据都封装在〈Data〉元素中,〈Data〉下面包含基本的变量类型〈var〉,数组类型〈arrvar〉,结构类型〈structure〉以及文件指针〈fil印ointer〉。基本类型〈var〉包含属性name和类型type,其中name表示变量名,type是枚举类型,其值域为{integer,real,logic,character},由于SWAT中不包含Complex类型,所以在type的值域不包含Complex类型,〈var〉可以出现一次或多次。〈arrvar>是数组类型,它包含属性name,类型type以及维度dimension。其中name禾口type同基本类型〈var〉中的name和type是一样的,dimension是该数组的维度值,一维数组值为l,二维数组值为2,依此类推。〈arrvar〉包含子元素〈dim〉,如果是多维数组,则〈dim〉中又包含子元素〈dim〉。〈dim〉有一个长度属性len,是整型的,表示该维度包含多少个值或子的〈dim〉元素。〈dim〉在〈arrvar〉中可以出现0次或多次,〈arrvar〉在〈Data〉中可以出现0次或多次。〈Data〉有一个子元素〈structure〉,对应于FORTRAN中的结构类型,它是由基本类型或数组类型构成的。〈Data〉最后一种子元素是文件指针参数〈fil印ointer〉,其下面有子元素〈filename〉和〈position〉,分别表示要读取的文件名和数据在文件中的开始位置。与现有技术相比,本发明的有益效果是本发明的优点是对拆分和封装后形成的WebService模块可部署在分布式环境中,并且在分布式环境上执行效果和原来的完全相同。下面我们将通过一个实际的拆分和封装实验来说明这个优势。SWAT(SoilandWaterAssessmentTool)是美国农业部(USDA)农业研究局(ARS)开发的流域尺度模型,用于模拟地表水和地下水的水质和水量。SWAT可以长期预测土地管理措施对具有多种土壤、土地利用和管理条件的大面积复杂流域的水文、泥沙和农业化学物质产量的影响。SWAT用FORTRAN语言编写,是典型的结构化程序,各个模块通过全局变量共享数据,模块之间耦合度很高。SWAT可被划分为输入、气象模拟器、陆相水文循环、产沙、杀虫剂、农业耕作、养分迁移、植被、结果输出等几个模块。目前,许多中国地理学家都针对SWAT模型提出了改进意见,令其更适应中国地理条件的模拟,如气象模拟器和陆相水文循环模块的更改等。但是,在现有情况下,想要实现对SWAT中的任何一个模块修改或替换,是一件非常困难的工作。本发明为此类工作提供了一种便捷的解决方法。采用本发明方法,我们把SWAT的气象模拟器模块(也称Clicon模块)从目前的SWAT模型中拆分出来成为一个独立的、可被复用的WebService模块,将该模块部署在一台物理的实验机器上,而将SWAT中其余部分作为另一个模块部署在另一台物理的实验机器上,进行测试。具体架构如图3所示运行结点A上部署的Swatl.exe就是SWAT中除去Clicon部分的剩余部分;通过C,Java封装后,可以调用WebService模块。參agentc.exe是一个C语言编写的封装程序,实现Fortran和C间的交互;參agentj.Java是Java语言编写的封装程序,实现了C语言和Java语言之间的交互,同时将被封装的模块封装成WebService。运行结点B上部署的Clicon.exe就是气象模拟器模块。通过C,Java封装后,对外表现的是WebService形式。參serve,exe是一个C语言编写的封装程序,实现Fortran和C间的交互;參而servj.Java是Java语言编写的封装程序,实现了C语言和Java语言之间的交互,同时将被封装模块封装成WebService。SOAP(SimpleObjectAccessProtocol)是一种轻量的、简单的、基于XML的简单对象访问协议,在这里用作WebService模块之间的通信方式。在物理部署中,我们利用三台物理主机搭建实验的局域网环境,其中两台用于运行结点,另一台安装模型控制结点程序。三台机器的配置均为2.4GHzCPU,1.5GMemory,Windows平台。其中,运行结点B需要安装Tomcat5.5、Axis2以及VS2005。模型控制结点需要安装Mysql5服务器。整个测试将统一使用江西省兴国县一年的地理数据进行测试,数据文件一共有1205个,Clicon模块需要其中的3个地理数据文件。从运行性能和结果正确性的角度分析实验用例的实验结果,用例做重复实验10次,结果如表l所示表1拆分前后SWAT的运行情况<table>tableseeoriginaldocumentpage8</column></row><table>测试的案例在运行环境中可以顺利发布和运行,证明了本专利中的对FORTRAN遗留程序的拆分和封装方法的正确性。从表中我们可看到拆分后运行时间增长了很多倍,但是带来了遗留程序的可替换性,以及能部署在分布式的环境中运行,这极大的提高了FORTRAN遗留程序的可重用性。在分布式的地理模型构建中,我们可以用不同方式实现的气象模拟器Service来替换SWAT自带的气象模拟器模块,从而获得一个新的SWAT模型。图1Fortran程序服务化封装;图2传输数据格式的Schema;图3运行环境的物理部署;图4气象模拟器封装流程。具体实施例方式下面结合附图和具体实施方式对本发明作进一步详细描述气象模拟器由FORTRAN语言编写,为了将其封装为WebService,我们采用文件的方式来传递大量的全局变量数据,具体步骤如下8.1将气象模拟器模块封装成WebService,其具体步骤如下1)用FORTRAN语言编写一个原气象模拟器模块的适配器,负责解析传入的全局变量文件和生成输出的全局变量文件,输入和输出文件的格式事先定义。其中输入的全局变量文件包括两部分读取的地理数据文件名和相应的文件指针,全局变量的数据。2)用C语言编写一个封装程序,负责和适配器通信,并传给适配器相应的输入全局变量文件,返回输出的全局变量文件。3)用Java语言编写一个封装程序,负责调用上一步的C语言封装程序,并传给该程序相应的输入全局变量文件,返回输出的全局变量文件。4)将上一步的Java程序封装成一个WebService。8.2将除去气象模拟器模块的SWAT部分封装到Java层,用来调用封装好的WebService模块,其具体步骤如下l)用FORTRAN语言编写一个SWAT剩余部分模块的适配器,负责生成气象模拟器所需要的输入的全局变量值的文件,以及解析气象模拟器WebService模块执行完毕后返回的全局变量的值的输出文件。输入的全局变量文件包括两部分读取的地理数据文件名和相应的文件指针,全局变量的数据。2)用C语言编写一个封装程序,负责和适配器通信,从适配器获得相应的输入全局变量文件,返回输出的全局变量文件。3)用Java语言编写一个封装程序,负责和上一步的C语言程序通信,并负责调用WebService模块。8.3在8.1和8.2的基础上,实现拆分和封装的两个新模块之间的通信。其中,8.1中拆分和封装的WebService模块作为服务器端,而8.2中的拆分和封装后的模块作为客户端。整个调用流程如图4所示客户端(1)去除气象模拟器模块的SWAT要调用气象模拟器模块(Clicon)时,改为调用一个Fortran适配器,该适配器负责将需要用到的Clicon中运行时的全局变量数据和读取的地理数据文件名及其相应的文件指针数据写入一个XML文件中。(这里的XML文件就是上面提到的全局变量文件)(2)Fortran适配器调用一段C封装程序,并将生成的XML数据文件传给该程序。(3)在C封装程序中,调用一段Java外壳程序,并将该文件传给Java外壳程序;(4)在Java外壳程序中,调用外部B节点上的Clicon服务,并将数据文件传给该服务。服务器端(5)Clicon的Web服务被调用,获得传递过来的数据文件,该服务本质上是一个Java程序,其内部会调用一段C封装程序,并将数据文件传给C封装程序。(6)在C封装程序中,调用Clicon的Fortran适配器,并将数据文件传给Fortran适配器。(7)Fortran适配器解析该数据文件,并给相应的全局变量和文件指针赋值。服务器端的适配器和客户端的适配器的解析全局变量的顺序是一致的;这个顺序可在编写适配器的时候预先设定。(8)Fortran适配器调用Clicon的Fortran源程序。(9)Clicon模块执行完毕之后,该Fortran适配器再将全局变量和文件指针数据按设计的格式写入一个XML文件,返回给C封装程序。(10)C封装程序得到Fortran适配器返回的数据文件,于是将该数据文件返回给调用它的Java程序,即WebService。(11)该WebService将文件作为执行结果返回给客户端的Java程序。客户端(12)客户端的Java外壳程序获得调用的CliconWebService返回的数据文件,将其作为结果返回给调用它的C程序。(13)C程序将返回的数据文件作为运行结果返回给调用它的Fortran适配器。(14)Fortran适配器获得返回的数据文件,以及外部调用Clicon的数据结果,然后Fortran适配器解析该返回的数据文件,为相应全局变量和文件指针赋值,之后再返回到SWAT的执行流程。本发明提出了一种分布式FORTRAN模块间的通信方法,其主要技术特征是将FORTRAN模块通过C,JAVA两层封装,形成WebService,这些WebService模块可部署在分布式的环境中,同时针对这些模块重新建立了一套通信机制,解决了模块内部读取大规模的应用数据文件的难题。凡是对FORTRAN遗留程序进行拆分并封装成WebService的策略、实现并部署在分布式的环境中皆在本专利的保护的范围之内。权利要求一种分布式FORTRAN模块间的通信方法,其步骤为1)将拆分后分布在各主机上的FORTRAN模块依次进行C语言、Java语言封装,生成WebService模块;所述WebService模块内包含有一利用FORTRAN语言编写的FORTRAN模块适配器,用于解析传入的全局变量文件和生成输出的全局变量文件;所述全局变量文件包括内部读取文件名、文件指针和全局变量参数;2)发起请求主机A上FORTRAN模块的适配器生成发往目标主机B的全局变量文件A,并通过主机A的WebService模块发送给主机B的WebService模块;3)主机B上FORTRAN模块的适配器解析主机B的WebService模块传入的该全局变量文件A,并对相应参数进行赋值;4)主机B上FORTRAN模块的适配器调用该FORTRAN模块执行运算,并利用该适配器生成全局变量文件B;5)主机B上FORTRAN模块的适配器通过主机B上的WebService模块将生成的全局变量文件B发送给主机A的WebService模块;6)主机A上FORTRAN模块的适配器解析主机A的WebService模块传入的该全局变量文件B,并对相应参数进行赋值后传给该FORTRAN模块。2.如权利要求l所述的方法,其特征在于所述WebService模块的生成方法为1)利用FORTRAN语言编写主机上FORTRAN模块的适配器;2)利用C语言编写一个封装程序,负责和该适配器通信;3)利用Java语言编写一个封装程序,负责调用该C语言封装程序;4)将该Java封装程序封装成一个WebService模块。3.如权利要求2所述的方法,其特征在于所述Java语言封装程序利用Java语言的getRuntime方法获取当前Runtime类运行时对象的引用,然后调用相应的exec方法访问所述C语言封装程序。4.如权利要求2所述的方法,其特征在于所述C语言封装程序利用C语言的system函数访问所述Java语言封装程序。5.如权利要求1所述的方法,其特征在于所述全局变量文件的格式为XML文件格式。6.如权利要求1所述的方法,其特征在于所述文件指针为FORTRAN命令语言的行号。7.如权利要求1或2或3或4所述的方法,其特征在于所述主机A的WebService模块将所述全局变量文件A发送给主机B的WebService模块的方法为1)所述主机A上FORTRAN模块的适配器将该全局变量文件A传给该WebService模块的C语言封装程序;2)该C语言封装程序将该全局变量文件A传给该WebService模块的Java语言封装程序;3)该WebService模块的Java语言封装程序调用主机B的WebService模块,将全局变量文件A发送给主机B的WebService模块。8.如权利要求1或2或3或4所述的方法,其特征在于所述主机B的WebService模块传入所述全局变量文件A给主机上FORTRAN模块的适配器的方法为1)所述主机B的WebService模块的Java语言封装程序将该全局变量文件A传给该WebService模块的C语言封装程序;2)该C语言封装程序将该全局变量文件A传给所述主机B上FORTRAN模块的适配器:全文摘要本发明公开了一种分布式FORTRAN模块间的通信方法,属于软件
技术领域
。本方法为1)将分布在各主机上的FORTRAN模块依次进行C语言、Java语言封装,生成WebService模块,其内包含一适配器;2)主机A的适配器生成发往主机B的全局变量文件A,主机A与主机B通过WebService模块通信;3)主机B的适配器解析该文件A,并对参数赋值;4)主机B的适配器调用该FORTRAN模块执行运算,并利用该适配器生成全局变量文件B;5)主机B的适配器将生成的文件B发给主机A;6)主机A的适配器解析该文件B,并对参数赋值后传给该FORTRAN模块。本发明极大提高了FORTRAN遗留程序的可重用性。文档编号G06F9/54GK101788923SQ201010119458公开日2010年7月28日申请日期2010年3月5日优先权日2010年3月5日发明者汪小林,王海波,罗英伟,邓浩申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1