Flowmaster自定义元件_第1页
Flowmaster自定义元件_第2页
Flowmaster自定义元件_第3页
Flowmaster自定义元件_第4页
Flowmaster自定义元件_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、flowmaster自定义元件,代码通信模块的创建与定义,控制方程的线性化,cam介绍及创建,代码编译及元件生成,报告内容,什么是cam,什么是cam? cam(component analytical model)是flowmaster分析的基石,是流体元件的核心,包括用来解算流量、压力、流速、温度等系统参数的所有控制方程都被编译成代码并存储于cam的代码通信模块中。任何新元件的创建都以cam为基础,而每一个cam创建的时候都会被指向唯一的一个guid(全局唯一标识符),在计算过程中,通过该标识符识别cam代码,进而对流体的流动与换热进行解算。 cam描述些什么? 元件的接口数量以及类型 元

2、件的信号端口数量以及类型 元件的特征参数及必要性 元件的控制方程代码 元件图标,创建cam,1.cam名称 2.接口数量以及类型,位置设置 3.信号发生端口数量,参数类型以及位置设置 4.对该组件分析模型的描述 5.元件的特征参数,输入和输出 6.参数的必要性设置,特征参数的种类: 实数、曲线或方程、曲面、整数、下拉选项、脚本、工质选择以及下拉表格,特征参数的必要性: 必须输入、可选输入、文字说明、不需输入,端口类型: 信号输入、信号输出、 测量输入、测量输出,生成代码通信模块,代码通信模块的创建与定义,控制方程的线性化,cam介绍及创建,代码编译及元件生成,报告内容,线性化系数,获取线性化系

3、数 flowmaster并不是在流体元件中直接求解流动方程,而是首先将这些流动方程做线性化处理,得到一个线性方程组,通过求解该线性方程组来求解该元件的压力、流量、流速等参数。如对于一个只有两个接口的元件,它的线性方程组包含有两个方程,分别是进出口质量流量随进出口压力变化的等效方程,系数矩阵,系数矩阵 该线性方程组中的系数矩阵为 其中,b1与b2是用来描述非压力变化引起的那部分流量的,如果没有外部功的输入,那质量流量只与压力相关,没有压差就没有流量,b1=b2=0,但如果有功输入,如泵,那么质量流量除了由压差引起之外,还与外部功有关,b1与b2不为零,控制方程线性化,离散损失元件 以离散损失元件

4、为例,流体流经它之后的压力损失与损失系数、流体密度、流体流速相关。 此处, 为流体流经该元件的压力损失 k 为元件的损失系数 v 为流体流速 为流体密度 那么,对于该损失元件,必须输入的参数有损失系数以及流动面积,控制方程线性化,离散损失元件 现在,我们要把该方程转换为质量流量跟进出口压力的函数组。根据 与 可得, 与 进一步可得, 与,控制方程线性化,离散损失元件 最终,得到系数矩阵: 因为进出口质量流量绝对值相等,所以,该系数矩阵也等于,控制方程线性化,对于其他非二接口元件,线性化方程组格式如下,代码通信模块的创建与定义,控制方程的线性化,cam介绍及创建,代码编译及元件生成,报告内容,什

5、么是代码通信模块,代码通信模块 代码通信模块是cam的基本模板,通过它读取元件的输入参数,在自动生成的分析代码模板中进行分析代码的编辑,然后进行运算,并输出计算结果,创建代码通信模块,代码通信模块的创建,1.命名空间,定义了一组相关的类。 2. 类名,用来对自定义的组件分析模型进行分类,包含具有通用属性的对象。 3.接口选择,用来定义在flowmaster 分析过程中用到的功能和方法。如读取元件的输入参数,获取流体属性,输出计算结果等等。 4.模块保存路径。 5.存储代码通信模块.cs格式的c#文件名,选择继承接口,继承接口 在程序设计中,继承纯粹是为了分类服务的,它是类/接口之间的一种关系。

6、在flowmaster数据库中,为了对自定义元件创建通信代码模块,共提供了几十种接口,不同的接口有不同的功能,如元件的输入参数需要通过icformdataconsumer 来体现,计算结果通过iresultprovider读取,如果需要考虑换热,那么则需添加iheattransfer接口。 有些接口是有共性的,如icanalysispluginconsumer 与 ilinearcoeffs都是从mandatory interfaces中继承,都是必须选择的接口,这是它们共同的属性。而包括mandatory interfaces, advisable interfaces, controlle

7、r interfaces等在内的接口都是从flowmaster接口类的动态链接库(即flowmaster.interfaces.dll)中继承。 根据模拟类型和要求的不同,可以选择不同的继承接口组合。在生成的代码通信模块中会自动产生分析代码的模板,该模板中包含了已选择的所有接口功能,代码通信模块的创建与定义,控制方程的线性化,cam介绍及创建,代码编译及元件生成,报告内容,创建c#项目文件,必须是xxx.flowmastermodels.xxx的格式,选择“类库,导入代码通信模块,导入已创建的代码通信模块 对该项目文件导入已创建的code stub(代码通信模块),代码通信模块已经被保存在了一

8、个.cs格式的文件中,并查看已创建的代码模板。 添加flowmaster引用 因为代码通信模块中选择的所有接口均从flowmaster接口库中继承,此处应该引用flowmaster接口的动态链接库,实现接口,实现接口 通过创建通信代码模块时建立的类来实现所选择的所有接口,这些接口中引用的所有非system.object类和方法都来自flowmaster.interface.dll文件,并且这些类和方法中包含的代码都是封装好的,无法看到,我们只需了解这些类和方法的功能。代码的主体结构就是一个类,这个类就是我们所创建的元件。 所有接口中都包含有元件识别代码: private int m_ncomp

9、onentnumber = 0; public classname(int ncomponentnumber) m_ncomponentnumber = ncomponentnumber; 该代码块包含两部分内容:字段声明以及类的重载构造函数,是通过读取自定义元件在网络中的编号来识别该元件,进而调用该元件的方法的。该代码段不需要修改,实现接口,实现接口 所有接口中还包含有元件全特征参数识别代码: private featureid ff(key k) return m_features.findfullfeatureid(short)k); private key fk(feature id

10、fullid) return (key)m_features.findshortfeatureid(fullid); 该代码段完成了对所有接口都包含的两个方法的实现,通过两个return语句可以识别枚举类型或者短整型的特征参数。此代码段也不需要修改,icanalysispluginconsumer接口的实现,该接口中除了包含之前提到的两个代码段之外,还包含两个属性以及一个方法: public string pluginname getreturn “mymodelname”; 该代码段声明了一个属性,取值时返回的“mymodelname”应该改为元件的名称,该名称字符串将出现在计算错误或警告报

11、告之中。 public plugintype pluginclasstype getreturn plugintype.component; 该代码段也声明了一个只读属性,用来读取元件的类型,此处不必修改,icanalysispluginconsumer接口的实现,该代码段需要修改,首先,需要把成员变量添加到方法的主体当中,其次,需要初始化它们。 该接口中还包含了一个方法,是为了初始化计算服务端的,通过引用指定的静态变量,可以获取计算状态、是否收敛等信息。 public void initialisepluginconsumer(ianalysisglblservices services)

12、/static private ianalysisglblservices m_ services = null; /static private iganalysisstatusprovider m_ analysisstatus = null; /static private igconvergencecriteriaprovider m_convergencecriteria = null; /static private igerrorhandlerprovider m_errhandler = null; / private ifluidpropertyprovider m_flui

13、dprops = null; /m_services = services; /m_analysisstatus = services.analysisstatus; /m_convergencecriteria = services.convergencecriteria; /m_errhandler = services.errorhandler;,icanalysispluginconsumer接口的实现,此处需要在方法主体中添加需要的“服务”,并在调用方法之前初始化它们为“null”。如下所示: static private ianalysisglblservices m_ servi

14、ces = null; static private iganalysisstatusprovider m_ analysisstatus = null; static private igconvergencecriteriaprovider m_convergencecriteria = null; static private igerrorhandlerprovider m_errhandler = null; public void initialisepluginconsumer(ianalysisglblservices services) m_services = servic

15、es; /推荐 m_analysisstatus = services.analysisstatus; /推荐 m_convergencecriteria = services.convergencecriteria; m_errhandler = services.errorhandler; /推荐,icformdataconsumer接口的实现,该接口定义了一个guid(全局唯一标识符),该值是系统自动生成的 private static guid m_guidmodel = new guid(“”) 紧接着,声明了一个只读属性,将该标识符声明为元件的识别代码 public guid cl

16、assreference getreturn m_guidmodel; 此外,该接口中还声明了一个featurelookup类型的变量m_features,以及iformdataprovider类型的变量m_dp,并把它们初始化为“null”。并声明了一个主体方法initialiseformdataconsumer,因为元件的特征参数也会有与之相对应的全局标识符,通过在该方法中创建一个类似于数组的类型的实例,将元件的特征参数输入框与全局标识符关联起来,从而实现参数查找。 以上代码均采用系统生成的代码,不需要修改。 接下来,声明一个公开的枚举类型,直接量类型为短整型,该枚举类型包含的直接量为元件

17、的特征参数,此处需要将代码段中各直接量的名称修改,以方便理解,icformdataconsumer接口的实现,public enum key : short l1_1 = 1, / cross-sectional area real;input;repeats=1 l1_2 = 2, / loss coefficient real;input;repeats=1 l1_3 = 3, / pressure drop real;output;repeats=1 l1_4 = 4, / loss coefficient result real;output;repeats=1 lastitem =

18、32767 更新这段代码为: public enum key : short area = 1, / cross-sectional area real;input;repeats=1 k = 2, / loss coefficient real;input;repeats=1 deltap = 3, / pressure drop real;output;repeats=1 calc_k = 4, / loss coefficient result real;output;repeats=1 lastitem = 32767,该接口中包含有四个专有方法,首先,为了允许用户从元件进出口获取压力

19、、流量、密度、温度等参数,需要引用initialisebranchresultconsumer方法。该方法声明了用来获取元件进出口参数的成员变量iibranchresultprovider,并初始化它为“null”。此处,需要将下列代码段升级, public void initialisebranchresultconsumer(iibranchresultproviderbrprovider) /todo: typically define a member variable to provide access to the branch provider. /private iibranc

20、hresultprovider m_brp = null; /m_brp = brprovider; 升级为下列代码段, private iibranchresultprovider m_brp = null; public void initialisebranchresultconsumer(iibranchresultprovider brprovider) m_brp = brprovider;,icbranchresultconsumer接口的实现,第二个方法是hasflowarea,用来判定元件的指定进出口是否设置了流通面积。 public bool hasflowarea(int

21、 narmno) return true; / todo: amend to false if area is not known. 此段代码不需修改,icbranchresultconsumer接口的实现,第三个方法是getflowarea,用来获取元件进出口的流通面积,系统生成的代码中,返回值是0, public double getflowarea(int narmno) return 0.0; / todo: return branch areas if known. 实际上该值应该从元件的参数表中获取, public double getflowarea(int narmno) bo

22、ol bisset; return m_dp.getreal(short)key.area,out bisset); 首先,声明一个bool变量bisset,然后引用之前声明的iformdataprovider类型的对象m_dp,并对该对象引用getreal方法,目的是为了从元件的参数表中获取参数值,此处也可用索引1来表示流通面积,out bisset是用来测试流通面积是否已设置,icbranchresultconsumer接口的实现,最后一个方法是getflowhydraulicdiameter,用来设置元件进出口的水力直径。 public deferstatus getflowhydrau

23、licdiameter(int narmno, out double dhyddiam) / todo: update if non-circular branch and hydraulic diameter is known. dhyddiam = 0.0; return deferstatus.notimplemented; 如果元件的进出口是圆形的,那么此段代码不需修改,icbranchresultconsumer接口的实现,该接口中也包含有 四个专有方法,首先使用ispressurespecifier来判断元件的进出口是否指定了压力,一般情况下,进出口压力是要计算得到的,不是指定的,

24、所以,此处默认为false,不需要修改。 public bool ispressurespecifier(int narm) return false; / todo: update as appropriate 同理,使用isflowspecifier来判断元件的进出口是否指定了流量,一般情况下,进出口压力也是求解值,此处默认也是false,不需要修改。 public bool isflowspecifier(int narm) return false; / todo: update as appropriate,ilinearcoeffs接口的实现,ilinearcoeffs接口最重要的

25、一个功能便是生成控制方程的线性化系数矩阵,此处调用的方法是populatematrixsteady以及populatematrixtransient,分别用来在进行稳态和瞬态分析时调用。以之前提到的离散损失元件为例,populatematrixsteady方法升级后的代码为,ilinearcoeffs接口的实现,public void populatematrixsteady(ref imatrix matrix, ref ivector vector) bool bisset; double darea = m_dp.getreal(short)key.area, out bisset);

26、double dk = m_dp.getreal(short)key.k, out bisset); double dmdot = m_brp.getbranchresult(1,branchresulttype.massflowrate).value; double ddensity = m_brp.getbranchresult(1,branchresulttype.density).value; double a1 = dk * dmdot / (2 * ddensity * darea * darea); a1 = -1.0 / a1; matrix.set_element(0, 0,

27、 a1); matrix.set_element(0, 1, -a1); matrix.set_element(1, 0, -a1); matrix.set_element(1, 1, a1); vector.set_element(0, 0); vector.set_element(1, 0);,ilinearcoeffs接口的实现,在以上代码中,首先对m_dp引用getreal方法,即从参数表格中获取输入的参数,包括截面面积area,以及损失系数k。然后,对m_brp引用getbranchresult方法,即从元件的进出口读取参数值,此处,读取的参数值包括质量流量以及密度。getbranc

28、hresult方法中的索引是基于0的,即0代表arm1,1代表arm2。之后根据已知计算公式定义a1,最后确定系数矩阵,a系数用matrix.set_element方法给定,索引是基于(0,0)的,(0,0)代表a1,(0,1)代表a2,(1,0)代表a3,(1,1)代表a4,方法中的第三个参数就是系数a。b系数是用vector.set_element方法给定的,索引是基于0的,0代表b1,1代表b2,方法中的第二个参数就是系数b。 由于在瞬态的模拟中,损失元件具有稳态模拟中相同的特性,因此,populatematrixtransient的主体引用populatematrixsteady方法即

29、可。 public void populatematrixtransient(ref imatrix matrix, ref ivector vector) populatematrixsteady( ref matrix, ref vector);,ilinearcoeffs接口的实现,iresultprovider接口是在结果后处理中实现的,首先声明了一个名为areresultssuppressed的只读属性,用来检查自定义元件中是否包含计算结果,此段代码不必修改。 public bool areresultssuppressed / todo: update as appropriate

30、 get return false; 然后,需要将参数列表中的pressure drop-deltap,以及loss coefficient result- calc_k作为结果输出。此处,通过方法writeresults来实现,代码更新为,iresultprovider接口的实现,public void writeresults(icomponentresultwriter writer) /calculation and output of pressure drop result double dp1 = m_brp.getbranchresult(0, branchresulttype

31、.totalpressure).value; double dp2 = m_brp.getbranchresult(1, branchresulttype.totalpressure).value; double ddp = dp2 - dp1; writer.writeresult(ff(key.deltap), m_ncomponentnumber, new double ddp , false); / calculate k double dvelocity = m_brp.getbranchresult(1, branchresulttype.velocity).value; doub

32、le ddensity = m_brp.getbranchresult(1, branchresulttype.density).value; double dk = (2*ddp)/(ddensity*math.pow(dvelocity,2); writer.writeresult(ff(key.calc_k),m_ncomponentnumber,new double dk,false);,iresultprovider接口的实现,首先,对m_brp引用getbranchresult方法读取元件进出口的总压,出口的流速以及密度,并计算相应的压力损失以及损失系数,最后引用writeresu

33、lt方法输出结果,方法中包含有四个参数,第一个为参数索引值,第二个是系统中元件的编号,第三个是包含有输出参数的一元数组,最后是以个bool值false。 需要注意的是,输出结果是采用的是new double dk的结构,这是因为flowmaster将结果输出为数组格式的(如管道内部节点的结果),所以需要将结果由double转换为double array,iresultprovider接口的实现,如果元件含有信号接口,那么可以通过应用getresultforsinal方法来获取相应的信号值。 该接口还有一个功能,就是动态色显指定参数的计算结果,通过hasdynamiccolourationres

34、ult方法来实现,该方法返回值为bool类型,如果返回true,就说明元件的输出参数包含该色显参数,那么在计算中动态色显对该元件有效,该段代码不需要编译,iresultprovider接口的实现,该接口中包含有如下方法 initialiseanalysissteady initialiseanalysistransient initialiseaftersteadystate initialisebeforetimestep timestepchangenotification 这些方法是用来做初始化的,包括在稳态计算之前、瞬态计算之前、稳态计算之后、每个时间步计算之前以及时间步改变之后等情况

35、下,对参数的初始化。此处可以不做更改,iinitialisemodel接口的实现,该接口中包含有七个专有方法,只需更新其中的三个,istemperaturespecifier,specifiedbranchtemperature,以及updatebranchtemperature。 其中,istemperaturespecifier 与specifiedbranchtemperature是同时实现的,istemperautrespecifier返回的是一个bool变量,默认为 false,如果一个元件的出口的温度需要定义(如压力或者流量边界条件),则需要将该代码段返回值更改为true。 pub

36、lic bool istemperaturespecifier(int narm) return false; / todo: update as appropriate 更新为 public bool istemperaturespecifier(int narm) return true; / istemperature specifier enabled,iheattransfer接口的实现,当istemperaturespecifier返回值为true时,specifiedbranchtemperature方法可以实现。它用来覆盖与指定出口温度的元件相连接的节点的温度,并把该温度值更新为用户给定的温度。 例如, public deferstatus specifiedbranchtemperature(int narm, out double dtemperature) / todo: update as appropriate dtemperature = 0.0; return deferstatus.notimplemented; 更新为 public deferstatus specifiedbranchtemperatu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论