科学计算框架
科学计算框架是对科学研究领域(如空气动力学)中的理论计算过程进行文件管理、图形处理、数据库构建等可视化开发和集成的软件平台具有强大的实用功能 。
基本信息
- 中文名
科学计算框架
- 外文名
Scientific computing framework
- 作用
科学计算
简介
在软件工程领域,许多科学计算软件的开发延用着传统的开发技术。传统的软件开发方法具有编写容易、目的明确等优点,运算速度基本能满足需要,但其主要不足是:(1)开发的软件规模较小,功能单一,重复利用率低;(2)较难进行多语言联合开发及二次开发;(3)由于FOrtran自身及其所使用的应用框架的局限性,使之可视化界面粗糙,且不能充分发挥现有操作系统及各种应用服务器的先进功能来进行网络化的分布式管理。当不仅仅把计算程序作为一种公式计算器时,我们需要一种新的开发方法来进行软件开发,而运用这种方法开发需要达到以下要求:(1)软件的通用性较强,具有高度的集成性和复杂度,二次开发较为方便,在WindOws下具有友好的人机界面,能充分利用网络进行分布式管理;(2)能有效地区分科学计算内核和其他管理功能的开发任务,使负责编写科学计算程序的工程师与负责其它设计任务的程序员的工作能够清楚地分开,让计算功能尽可能地从具体问题中抽象出来,计算工程师可用与原来相似的方法编写计算内核程序,甚至原有的程序被稍加改动既可变为计算框架的新内核,从而大大提高了原有计算程序的利用率,而对外围程序可利用与计算内核无关的最先进的开发手段进行开发。
进行科学计算软件开发的主要问题是如何使应用程序框架高效、合理、安全地操作计算程序内核,使之能正常工作并能返回正确的运行结果。主要的实现方法有6种:(1)利用文件作为接口传递参数;(2)编写共享内存接口库使内核与主框架通讯;(3)利用数据库作为参数控制管理核心的方式;(4)将计算内核改写为FOrtran动态链接库的形式由主框架直接调用;(5)将计算内核部署为COM/DCOM/ActiVeX组件;(6)部署为Web形式的B/S结构。
设计与实现
方法一
该方法利用文件作为接口传递参数与计算内核进行通信。主程序框架将内核所需的参数以文件的形式写入指定路径,然后启动内核进程,将参数从文件中读取出来进行运算。这种方法简单快捷,容易开发,持久保持在硬盘中的参数记录下计算过程,使计算内核进程在重新启动后能继续执行计算工作,无需从头再来,这符合大多数计算程序读取参数的方式,计算程序做很小改动,甚至不做改动就可无缝地融合到整个框架之中。该方法最符合开发科学计算软件的程序员的习惯。
方法二
该方法编写共享内存接口库使内核与主框架通讯。在Win32环境下,每一个进程都有独立的进程空间,其它进程不能访问,要想利用内存进行公共数据交换,可选择建立内存映像文件的方法来实现。利用内存映像文件与计算内核进程通讯具有I/O开销小,数据传输效率高"操作灵活的优点,其速度优势在处理较大量数据传输的问题时非常明显,十分适合传递网格、图像之类的大型数组数据,不必生成中间文件"在一定程度上避免了中间状态数据的泄漏。由于编程语言的限制和程序分工的不同,让Fortan程序员直接调用Win32的API函数实现上述功能既不方便编写,又不利于Fortran程序作为计算内核的抽象性,所以建议把要使用的API函数封装到一个用其它语言编写的动态链接库中,供Fortran程序调用,使其源程序相对简化。
方法三
该方法利用数据库作为参数控制管理核心。这种方式使数据的保存、更新、删除等工作更加方便,对参数的检索方式更为灵活,在一些实际的工程中已经出现了这种带数据库接口的工程计算程序:利用数据库接口,将计算过程中的信息以及计算结果进行存取,再在计算结果数据库之上建立管理信息系统,从而对计算数据进行查询和分析。虽然此模式有一些成功案例,但它的问题是:在计算程序中使用数据库接口进行大量繁杂的数据操作,破坏了计算程序作为内核的单纯性,使其编写的复杂性大大增加。同时由于Fortan语言和VisualFortanFramework的限制,它的数据库性能无法与VC++/Delphi相比,用这种方法编写的程序的数据库性能和稳定性相对较差。同时将数据库的接口封装在不同计算内核中既可能占用更多的资源,又会产生数据同步性差的隐患,还不利于整个框架的部署,建议将数据库的工作交给框架平台,而用于计算的内核进程应专注于计算本身,将必要的计算过程和计算结果数据的存取修改以消息的方式通知框架平台,由它进行处理。
方法四
该方法将计算内核改写为Fortran动态链接库(DLL)的形式由主框架直接调。当应用程序调用动态链接库函数时,会将这个DLL映射到自身进程的内存空间内(BFFFFFFF-80000000)。DLL将利用调用它的进程来堆栈,故调用DLL中的函数就像调用本身的函数一样方便不存在多进程通讯的复杂处理过程。由于DLL在内存中只存在一份,调用程序仅是将它的内存地址映射到自己的内存地址空间,所以当有多个进程调用同一个DLL时,操作系统只会将这个DLL的副本复制到进程,而不会像开辟独立进程那样再开辟内存,使用DLL的效率比使用进程要高。
将计算内核改写为Fortran动态链接库以供主框架调用是一种高效快捷的方法,但它的优势有时也会转换为劣势。由于它需要注入别的进程,所以DLL不能单独运行,例如为了快捷方便,用户可能直接启动一些计算模块,但DLL却做不到这一点(运行rundll32.exe可以执行某个DLL但是不够灵活而且在显示表达上也不够丰富),另外当它所注入的进程因为错误(也有可能是该进程引用的其他DLL的错误)导致本进程无法继续运行时,这个进程相关联的所有DLL也都会在进程空间里失效,这种失效有可能会使一个计算了几天的工作结果付之东流,相对前面所提到的基于多进程的结构,这种基于DLL的多线程结构的稳定性比较差(ORACLE数据库就是基于多进程的而微软的SOLSERVER是基于多线程的),所以在涉及到长时间、大强度、关键性运算时使用动态链接库框架要慎重。
方法五
该方法将计算内核部署为COM/DCOM/ActiveX组件的形式。COM(ComponentObjectModel)即组建对象模型时Windows系统的核心,也可以说Windows就是建立在COM模型之上的。编写COM对象不但可以实现二进制级别上的代码复用,还可以深入到系统的核心。任何支持接口(Interface)的编程语言都可以调用COM对象的接口方法,而COM对象接口如果继承自Idispatch那该接口的方法可以被脚本语言调用,这将大大丰富COM对象的使用面。在网络上部署的COM组件被称为DCOM,DCOM需要部署为进程外服务器或部署在MTS之类的应用服务器之上,供使用者在网络上进行分布式调用。这样做的好处是可以充分发挥网络资源的优势,根据每台机器的特点部署不同计算强度的组件,使计算力量合理分配。而这一切对使用者来说又几乎是透明的,操作起来就像操作本地电脑一样方便。当然,这样的做法较复杂,不太适合负责计算模块的程序员编写。可先用C++/ObjectPascal之类的语言编写COM对象,再用前文的方法1~4将对象与底层核心组合起来,由COM负责与核心的通信,访问程序只和COM对象打交道。
方法六
该方法将开发框架部署为Web形式的B/S结构。将计算程序和管理它的WebApplication安装在服务器上的优势是:客户端无需再安装任何软件和进行复杂的系统配置,就可在任何地方使用任何系统进行计算。不仅可以在局域网内使用这种B/S结构的计算框架,在Internet上同样可以让浏览器操作防火墙后的计算程序,当然这种操作可以是集成了安全认证的。用这种方式构建的远程计算框架可以为我们带来一种较为流行的软件提供形式,即ApplicationSerVice交付给客户的不再是光盘中的软件和复杂的使用说明书,而可能仅仅是一张写有服务器网址和用户名密码的卡片,甚至是限制计算次数的充值卡。这种框架不太适合用ASPActiVeXSerVerPage实现,因为这里涉及到本地代码的调用问题,可以考虑使用Jsp+JaVaBean/EJB或VC++/Delphi编写的ISAPI来实现。ISAPI即InternetSerVerApplicationProgramInterface是微软提供的一套面向Internet服务的API接口。SAPI的工作原理是通过交互式主页取得用户输入信息,然后交服务器后台处理。在ISAPI下建立的应用程序是以动态链接库的形式存在的,ISAPI应用的DLL不仅可以象CGI(即通用网关接口CommonGatewayInterface)程序一样被用户请求激活,还可以被系统预先激活来监视用户输入。被用户激活的DLL在处理完一个用户请求后将继续驻留在内存中等待处理别的用户输入,直到过了一段无用户输入时间后才消失。一个ISAPI的DLL可在被用户请求激活后长驻内存,等待用户的另一个请求,还可在一个DLL里设置多个用户请求处理函数,此外ISAPI的DLL应用程序和WWW服务器处于同一个进程中,效率要显著高于CGI。