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

下载本文档

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

文档简介

Flowmaster自定义元件,北京海基科技发展有限责任公司,代码通信模块的创建与定义,控制方程的线性化,CAM介绍及创建,代码编译及元件生成,报告内容,什么是CAM,什么是CAM?CAM(ComponentAnalyticalModel)是Flowmaster分析的基石,是流体元件的核心,包括用来解算流量、压力、流速、温度等系统参数的所有控制方程都被编译成代码并存储于CAM的代码通信模块中。任何新元件的创建都以CAM为基础,而每一个CAM创建的时候都会被指向唯一的一个GUID(全局唯一标识符),在计算过程中,通过该标识符识别CAM代码,进而对流体的流动与换热进行解算。CAM描述些什么?元件的接口数量以及类型元件的信号端口数量以及类型元件的特征参数及必要性元件的控制方程代码元件图标,创建CAM,1.CAM名称2.接口数量以及类型,位置设置3.信号发生端口数量,参数类型以及位置设置4.对该组件分析模型的描述5.元件的特征参数,输入和输出6.参数的必要性设置,特征参数的种类:实数、曲线或方程、曲面、整数、下拉选项、脚本、工质选择以及下拉表格,特征参数的必要性:必须输入、可选输入、文字说明、不需输入,端口类型:信号输入、信号输出、测量输入、测量输出,生成代码通信模块,代码通信模块的创建与定义,控制方程的线性化,CAM介绍及创建,代码编译及元件生成,报告内容,线性化系数,获取线性化系数Flowmaster并不是在流体元件中直接求解流动方程,而是首先将这些流动方程做线性化处理,得到一个线性方程组,通过求解该线性方程组来求解该元件的压力、流量、流速等参数。如对于一个只有两个接口的元件,它的线性方程组包含有两个方程,分别是进出口质量流量随进出口压力变化的等效方程。,系数矩阵,系数矩阵该线性方程组中的系数矩阵为其中,B1与B2是用来描述非压力变化引起的那部分流量的,如果没有外部功的输入,那质量流量只与压力相关,没有压差就没有流量,B1=B2=0,但如果有功输入,如泵,那么质量流量除了由压差引起之外,还与外部功有关,B1与B2不为零。,控制方程线性化,离散损失元件以离散损失元件为例,流体流经它之后的压力损失与损失系数、流体密度、流体流速相关。此处,为流体流经该元件的压力损失K为元件的损失系数V为流体流速为流体密度那么,对于该损失元件,必须输入的参数有损失系数以及流动面积。,控制方程线性化,离散损失元件现在,我们要把该方程转换为质量流量跟进出口压力的函数组。根据与可得,与进一步可得,与,控制方程线性化,离散损失元件最终,得到系数矩阵:因为进出口质量流量绝对值相等,所以,该系数矩阵也等于,控制方程线性化,对于其他非二接口元件,线性化方程组格式如下:,代码通信模块的创建与定义,控制方程的线性化,CAM介绍及创建,代码编译及元件生成,报告内容,什么是代码通信模块,代码通信模块代码通信模块是CAM的基本模板,通过它读取元件的输入参数,在自动生成的分析代码模板中进行分析代码的编辑,然后进行运算,并输出计算结果。,创建代码通信模块,代码通信模块的创建,1.命名空间,定义了一组相关的类。2.类名,用来对自定义的组件分析模型进行分类,包含具有通用属性的对象。3.接口选择,用来定义在Flowmaster分析过程中用到的功能和方法。如读取元件的输入参数,获取流体属性,输出计算结果等等。4.模块保存路径。5.存储代码通信模块.CS格式的C#文件名,选择继承接口,继承接口在程序设计中,继承纯粹是为了分类服务的,它是类/接口之间的一种关系。在Flowmaster数据库中,为了对自定义元件创建通信代码模块,共提供了几十种接口,不同的接口有不同的功能,如元件的输入参数需要通过IcFormDataConsumer来体现,计算结果通过IResultProvider读取,如果需要考虑换热,那么则需添加IHeatTransfer接口。有些接口是有共性的,如IcAnalysisPlugInConsumer与ILinearCoeffs都是从MandatoryInterfaces中继承,都是必须选择的接口,这是它们共同的属性。而包括MandatoryInterfaces,AdvisableInterfaces,ControllerInterfaces等在内的接口都是从Flowmaster接口类的动态链接库(即Flowmaster.Interfaces.dll)中继承。根据模拟类型和要求的不同,可以选择不同的继承接口组合。在生成的代码通信模块中会自动产生分析代码的模板,该模板中包含了已选择的所有接口功能。,代码通信模块的创建与定义,控制方程的线性化,CAM介绍及创建,代码编译及元件生成,报告内容,创建C#项目文件,必须是XXX.FlowmasterModels.XXX的格式,选择“类库”,导入代码通信模块,导入已创建的代码通信模块对该项目文件导入已创建的Codestub(代码通信模块),代码通信模块已经被保存在了一个.CS格式的文件中,并查看已创建的代码模板。添加Flowmaster引用因为代码通信模块中选择的所有接口均从Flowmaster接口库中继承,此处应该引用Flowmaster接口的动态链接库。,实现接口,实现接口通过创建通信代码模块时建立的类来实现所选择的所有接口,这些接口中引用的所有非System.Object类和方法都来自Flowmaster.Interface.dll文件,并且这些类和方法中包含的代码都是封装好的,无法看到,我们只需了解这些类和方法的功能。代码的主体结构就是一个类,这个类就是我们所创建的元件。所有接口中都包含有元件识别代码:privateintm_nComponentNumber=0;publicclassname(intnComponentNumber)m_nComponentNumber=nComponentNumber;该代码块包含两部分内容:字段声明以及类的重载构造函数,是通过读取自定义元件在网络中的编号来识别该元件,进而调用该元件的方法的。该代码段不需要修改。,实现接口,实现接口所有接口中还包含有元件全特征参数识别代码:privateFeatureIDFF(Keyk)returnm_Features.FindFullFeatureID(short)k);privateKeyFK(FeatureIDfullID)return(Key)m_Features.FindShortFeatureID(fullID);该代码段完成了对所有接口都包含的两个方法的实现,通过两个return语句可以识别枚举类型或者短整型的特征参数。此代码段也不需要修改。,IcAnalysisPlugInConsumer接口的实现,该接口中除了包含之前提到的两个代码段之外,还包含两个属性以及一个方法:publicstringPlugInNamegetreturn“MyModelName”;该代码段声明了一个属性,取值时返回的“MyModelName”应该改为元件的名称,该名称字符串将出现在计算错误或警告报告之中。publicPlugInTypePlugInClassTypegetreturnPlugInType.Component;该代码段也声明了一个只读属性,用来读取元件的类型,此处不必修改。,IcAnalysisPlugInConsumer接口的实现,该代码段需要修改,首先,需要把成员变量添加到方法的主体当中,其次,需要初始化它们。该接口中还包含了一个方法,是为了初始化计算服务端的,通过引用指定的静态变量,可以获取计算状态、是否收敛等信息。publicvoidInitialisePlugInConsumer(IAnalysisGlblServicesservices)/staticprivateIAnalysisGlblServicesm_Services=null;/staticprivateIgAnalysisStatusProviderm_AnalysisStatus=null;/staticprivateIgConvergenceCriteriaProviderm_ConvergenceCriteria=null;/staticprivateIgErrorHandlerProviderm_ErrHandler=null;/privateIFluidPropertyProviderm_FluidProps=null;/m_Services=services;/m_AnalysisStatus=services.AnalysisStatus;/m_ConvergenceCriteria=services.ConvergenceCriteria;/m_ErrHandler=services.ErrorHandler;,IcAnalysisPlugInConsumer接口的实现,此处需要在方法主体中添加需要的“服务”,并在调用方法之前初始化它们为“null”。如下所示:staticprivateIAnalysisGlblServicesm_Services=null;staticprivateIgAnalysisStatusProviderm_AnalysisStatus=null;staticprivateIgConvergenceCriteriaProviderm_ConvergenceCriteria=null;staticprivateIgErrorHandlerProviderm_ErrHandler=null;publicvoidInitialisePlugInConsumer(IAnalysisGlblServicesservices)m_Services=services;/推荐m_AnalysisStatus=services.AnalysisStatus;/推荐m_ConvergenceCriteria=services.ConvergenceCriteria;m_ErrHandler=services.ErrorHandler;/推荐,IcFormDataConsumer接口的实现,该接口定义了一个Guid(全局唯一标识符),该值是系统自动生成的privatestaticGuidm_guidModel=newGuid(“”)紧接着,声明了一个只读属性,将该标识符声明为元件的识别代码publicGuidClassReferencegetreturnm_guidModel;此外,该接口中还声明了一个FeatureLookup类型的变量m_Features,以及IFormDataProvider类型的变量m_DP,并把它们初始化为“null”。并声明了一个主体方法InitialiseFormDataConsumer,因为元件的特征参数也会有与之相对应的全局标识符,通过在该方法中创建一个类似于数组的类型的实例,将元件的特征参数输入框与全局标识符关联起来,从而实现参数查找。以上代码均采用系统生成的代码,不需要修改。接下来,声明一个公开的枚举类型,直接量类型为短整型,该枚举类型包含的直接量为元件的特征参数,此处需要将代码段中各直接量的名称修改,以方便理解。,IcFormDataConsumer接口的实现,publicenumKey:shortL1_1=1,/Cross-sectionalAreaReal;Input;Repeats=1L1_2=2,/LossCoefficientReal;Input;Repeats=1L1_3=3,/PressureDropReal;Output;Repeats=1L1_4=4,/LossCoefficientResultReal;Output;Repeats=1LastItem=32767更新这段代码为:publicenumKey:shortArea=1,/Cross-sectionalAreaReal;Input;Repeats=1K=2,/LossCoefficientReal;Input;Repeats=1DeltaP=3,/PressureDropReal;Output;Repeats=1Calc_K=4,/LossCoefficientResultReal;Output;Repeats=1LastItem=32767,该接口中包含有四个专有方法,首先,为了允许用户从元件进出口获取压力、流量、密度、温度等参数,需要引用InitialiseBranchResultConsumer方法。该方法声明了用来获取元件进出口参数的成员变量IiBranchResultProvider,并初始化它为“null”。此处,需要将下列代码段升级,publicvoidInitialiseBranchResultConsumer(IiBranchResultProviderbrProvider)/TODO:Typicallydefineamembervariabletoprovideaccesstothebranchprovider./privateIiBranchResultProviderm_BrP=null;/m_BrP=brProvider;升级为下列代码段,privateIiBranchResultProviderm_BrP=null;publicvoidInitialiseBranchResultConsumer(IiBranchResultProviderbrProvider)m_BrP=brProvider;,IcBranchResultConsumer接口的实现,第二个方法是HasFlowArea,用来判定元件的指定进出口是否设置了流通面积。publicboolHasFlowArea(intnArmNo)returntrue;/TODO:Amendtofalseifareaisnotknown.此段代码不需修改。,IcBranchResultConsumer接口的实现,第三个方法是GetFlowArea,用来获取元件进出口的流通面积,系统生成的代码中,返回值是0,publicdoubleGetFlowArea(intnArmNo)return0.0;/TODO:Returnbranchareasifknown.实际上该值应该从元件的参数表中获取,publicdoubleGetFlowArea(intnArmNo)boolbIsSet;returnm_DP.GetReal(short)Key.Area,outbIsSet);首先,声明一个bool变量bIsSet,然后引用之前声明的IFormDataProvider类型的对象m_DP,并对该对象引用GetReal方法,目的是为了从元件的参数表中获取参数值,此处也可用索引1来表示流通面积,outbIsSet是用来测试流通面积是否已设置。,IcBranchResultConsumer接口的实现,最后一个方法是GetFlowHydraulicDiameter,用来设置元件进出口的水力直径。publicDeferStatusGetFlowHydraulicDiameter(intnArmNo,outdoubledHydDiam)/TODO:Updateifnon-circularbranchandhydraulicdiameterisknown.dHydDiam=0.0;returnDeferStatus.NotImplemented;如果元件的进出口是圆形的,那么此段代码不需修改。,IcBranchResultConsumer接口的实现,该接口中也包含有四个专有方法,首先使用IsPressureSpecifier来判断元件的进出口是否指定了压力,一般情况下,进出口压力是要计算得到的,不是指定的,所以,此处默认为false,不需要修改。publicboolIsPressureSpecifier(intnArm)returnfalse;/TODO:Updateasappropriate同理,使用IsFlowSpecifier来判断元件的进出口是否指定了流量,一般情况下,进出口压力也是求解值,此处默认也是false,不需要修改。publicboolIsFlowSpecifier(intnArm)returnfalse;/TODO:Updateasappropriate,ILinearCoeffs接口的实现,ILinearCoeffs接口最重要的一个功能便是生成控制方程的线性化系数矩阵,此处调用的方法是PopulateMatrixSteady以及PopulateMatrixTransient,分别用来在进行稳态和瞬态分析时调用。以之前提到的离散损失元件为例,PopulateMatrixSteady方法升级后的代码为:,ILinearCoeffs接口的实现,publicvoidPopulateMatrixSteady(refIMatrixmatrix,refIVectorvector)boolbIsSet;doubledArea=m_DP.GetReal(short)Key.Area,outbIsSet);doubledK=m_DP.GetReal(short)Key.K,outbIsSet);doubledMdot=m_BrP.GetBranchResult(1,BranchResultType.MassFlowrate).Value;doubledDensity=m_BrP.GetBranchResult(1,BranchResultType.Density).Value;doubleA1=dK*dMdot/(2*dDensity*dArea*dArea);A1=-1.0/A1;matrix.Set_Element(0,0,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方法,即从元件的进出口读取参数值,此处,读取的参数值包括质量流量以及密度。GetBranchResult方法中的索引是基于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方法即可。publicvoidPopulateMatrixTransient(refIMatrixmatrix,refIVectorvector)PopulateMatrixSteady(refmatrix,refvector);,ILinearCoeffs接口的实现,IResultProvider接口是在结果后处理中实现的,首先声明了一个名为AreResultsSuppressed的只读属性,用来检查自定义元件中是否包含计算结果,此段代码不必修改。publicboolAreResultsSuppressed/TODO:Updateasappropriategetreturnfalse;然后,需要将参数列表中的Pressuredrop-DeltaP,以及Losscoefficientresult-Calc_K作为结果输出。此处,通过方法WriteResults来实现,代码更新为:,IResultProvider接口的实现,publicvoidWriteResults(IComponentResultWriterwriter)/calculationandoutputofpressuredropresultdoubledP1=m_BrP.GetBranchResult(0,BranchResultType.TotalPressure).Value;doubledP2=m_BrP.GetBranchResult(1,BranchResultType.TotalPressure).Value;doubledDP=dP2-dP1;writer.WriteResult(FF(Key.DeltaP),m_nComponentNumber,newdoubledDP,false);/calculateKdoubledVelocity=m_BrP.GetBranchResult(1,BranchResultType.Velocity).Value;doubledDensity=m_BrP.GetBranchResult(1,BranchResultType.Density).Value;doubledK=(2*dDP)/(dDensity*Math.Pow(dVelocity,2);writer.WriteResult(FF(Key.Calc_K),m_nComponentNumber,newdoubledK,false);,IResultProvider接口的实现,首先,对m_BrP引用GetBranchResult方法读取元件进出口的总压,出口的流速以及密度,并计算相应的压力损失以及损失系数,最后引用WriteResult方法输出结果,方法中包含有四个参数,第一个为参数索引值,第二个是系统中元件的编号,第三个是包含有输出参数的一元数组,最后是以个bool值false。需要注意的是,输出结果是采用的是newdoubledK的结构,这是因为Flowmaster将结果输出为数组格式的(如管道内部节点的结果),所以需要将结果由double转换为doublearray。,IResultProvider接口的实现,如果元件含有信号接口,那么可以通过应用GetResultForSinal方法来获取相应的信号值。该接口还有一个功能,就是动态色显指定参数的计算结果,通过HasDynamicColourationResult方法来实现,该方法返回值为bool类型,如果返回true,就说明元件的输出参数包含该色显参数,那么在计算中动态色显对该元件有效,该段代码不需要编译。,IResultProvider接口的实现,该接口中包含有如下方法InitialiseAnalysisSteadyInitialiseAnalysisTransientInitialiseAfterSteadyStateInitialiseBeforeTimeStepTimestepChangeNotification这些方法是用来做初始化的,包括在稳态计算之前、瞬态计算之前、稳态计算之后、每个时间步计算之前以及时间步改变之后等情况下,对参数的初始化。此处可以不做更改。,IInitialiseModel接口的实现,该接口中包含有七个专有方法,只需更新其中的三个,IsTemperatureSpecifier,SpecifiedBranchTemperature,以及UpdateBranchTemperature。其中,IsTemperatureSpecifier与SpecifiedBranchTemperature是同时实现的,IsTemperautreSpecifier返回的是一个bool变量,默认为false,如果一个元件的出口的温度需要定义(如压力或者流量边界条件),则需要将该代码段返回值更改为true。publicboolIsTemperatureSpecifier(intnArm)returnfalse;/TODO:Updateasappropriate更新为publicboolIsTemperatureSpecifier(intnArm)returntrue;/IsTemperatureSpecifierenabled,IHeatTransfer接口的实现,当IsTemperatureSpecifier返回值为True时,SpecifiedBranchTemperature方法可以实现。它用来覆盖与指定出口温度的元件相连接的节点的温度,并把该温度值更新为用户给定的温度。例如,publicDeferStatusSpecifiedBranchTemperature(intnArm,outdoubledTemperature)/TODO:UpdateasappropriatedTemperature=0.0;returnDeferStatus.NotImplemented;更新为publicDeferStatusSpecifiedBranch

温馨提示

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

评论

0/150

提交评论