基于Modelingtoolkit的管网组件(Julia)
ModelingToolKit
ModelingToolkit.jl 是一种用于科学计算和科学机器学习中的高性能符号数字计算的建模语言。然后,它将符号计算代数系统的思想与基于因果和非因果方程的建模框架相结合,以提供可扩展的并行建模系统。它允许用户对模型进行高级描述,以进行符号预处理以分析和增强模型。自动转换,例如索引缩减,可以在求解之前应用于模型,以使其易于处理在没有符号干预的情况下建模时无法求解的方程。
管网模型组件
接口函数
每个组件包含的接口,由接口函数定义。
一般为进口和出口。
@parameters t
@connector function Pin(;name)@variables Pressure(t),Flow(t)ODESystem(Equation[], t, [Pressure, Flow], [], name=name, defaults=[Pressure=>1.0, Flow=>1.0])
end
连接函数
连接相关组件的接口,如一个组件的出口口和与之相连的组件入口相连
组件的接口流量之和为0,压力相等(类似于节点电压电流法)
function ModelingToolkit.connect(::Type{Pin}, ps...)eqs = [0 ~ sum(p->p.Flow, ps) # KCL]for i in 1:length(ps)-1push!(eqs, ps[i].Pressure ~ ps[i+1].Pressure)endreturn eqs
end
组件:Sink
水箱压力采用标压,恒定值为大气压标压,即标压0
该储水箱,可以作为源和汇的集合,存在两个接口
function Sink(;name)@named input = Pin()@named output = Pin()@variables Pressure(t)D = Differential(t)eqs = [output.Pressure ~ 0input.Pressure ~ 0D(Pressure)~00 ~ input.Flow + output.Flow]ODESystem(eqs, t, [Pressure], [], systems=[input, output], name=name)
end
组件:Source
Source压力采用标压,恒定值为大气压标压,即标压0
source可以作为无限水源的源,只定义了一个接口
function Source(;name)@named port = Pin()@variables Pressure(t)D = Differential(t)eqs = [port.Pressure ~ 0D(Pressure)~0]ODESystem(eqs, t, [Pressure], [], systems=[port], name=name)
end
组件:OutletPort
OutletPort为管网末端,在出口处有出口的局部损失,可以作为无限水源的汇
OutletPort压力采用标压,一个出口,出口压力为出口的出口损失
function OutletPort(;name, D = 25E-3, ρ = 1.0E3)val = 8*ρ /(D^4*π^2)@named port = Pin()@variables Pressure(t)@parameters RD = Differential(t)eqs = [port.Pressure ~ port.Flow^2 * RD(Pressure)~0]ODESystem(eqs, t, [Pressure], [R], systems=[port],defaults=Dict(R =>val), name=name)
end
组件:Pump
Pump为水泵,水泵工作的理论曲线为:H=a−b∗QH = a - b * QH=a−b∗Q
其中:
流量 Q ~ m³/s
扬程 H ~ m
流体密度 ρ ~kg/m³
function Pump(;name, a=30.0,b=1500,ρ=1.0E3) @named input = Pin()@named output = Pin()@variables ΔP(t)eqs = [ΔP ~ output.Pressure - input.Pressureoutput.Pressure ~ (a - b * input.Flow)*9.8*ρ0 ~ input.Flow + output.Flow]ODESystem(eqs, t, [ΔP],[],systems=[input, output], name=name)
end
组件:PotentialEnergy
PotentialEnergy为为高度差提供的势能组件
function PotentialEnergy(;name, H=30.0,ρ=1.0E3) @named input = Pin()@named output = Pin()@variables ΔP(t)eqs = [ΔP ~ output.Pressure - input.Pressureoutput.Pressure ~ H*9.8*ρ0 ~ input.Flow + output.Flow]ODESystem(eqs, t, [ΔP],[],systems=[input, output], name=name)
end
组件:SimplePipe
SimplePipe为固定摩擦因数管道组件
# 管道长 L ~ m
# 管道内径 D ~ m
# 管道摩擦因数f
# 压降ΔP
# 流体密度 ρ ~kg/m³
function SimplePipe(;name, L = 100.0, D = 25E-3, f = 0.01, ρ = 1.0E3)val = f*L*ρ*8/(D^5*π^2)@named input = Pin()@named output = Pin()@variables ΔP(t)@parameters Reqs = [ΔP ~ input.Pressure - output.Pressure0 ~ input.Flow + output.FlowΔP ~ input.Flow^2 * R]ODESystem(eqs, t, [ΔP], [R], systems=[input, output],defaults=Dict(R =>val), name=name)
end
组件:Pipe_Colebrook
Pipe_Colebrook 为采用科尔布鲁克方法(工程上普遍采用的湍流计算式)计算管道摩擦因数的管道组件
# 管道长 L ~ m
# 管道内径 D ~ m
# 管道粗糙度ϵ ~ m
# 流体粘度 μ ~ Pa·s
# 压降 ΔP ~ Pa
# 雷诺数 Re
# 流体密度 ρ ~kg/m³
function Pipe_Colebrook(;name, L = 100.0, D = 25E-3, ρ = 1.0E3,ϵ=0.2E-3,μ=1.0E-3)val = L*ρ*8/(D^5*π^2)@named input = Pin()@named output = Pin()@variables ΔP(t),f(t),Re(t)@parameters Reqs = [ΔP ~ input.Pressure - output.Pressure0 ~ input.Flow + output.FlowΔP ~ input.Flow^2 * R * fRe ~ 4*ρ*input.Flow/(π*D*μ)1/f^0.5 ~ -2.0*log10(ϵ/(D*3.7)+2.51*π*D*μ/(4*ρ*input.Flow*f^0.5))]ODESystem(eqs, t, [ΔP,f,Re], [R], systems=[input, output],defaults=Dict([R =>val]), name=name)
end
组件:Pipe_Haaland
Pipe_Haaland 为采用哈兰德方法(在4000<Re<1.0E8范围内误差小于1.5%,1983年提出)计算管道摩擦因数的管道组件
# 管道长 L ~ m
# 管道内径 D ~ m
# 管道粗糙度ϵ ~ m
# 流体粘度 μ ~ Pa·s
# 压降 ΔP ~ Pa
# 雷诺数 Re
# 流体密度 ρ ~kg/m³
function Pipe_Haaland(;name, L = 100.0, D = 25E-3, ρ = 1.0E3,ϵ=0.2E-3,μ=1.0E-3)val = L*ρ*8/(D^5*π^2)@named input = Pin()@named output = Pin()@variables ΔP(t),f(t),Re(t)@parameters Reqs = [ΔP ~ input.Pressure - output.Pressure0 ~ input.Flow + output.FlowΔP ~ input.Flow^2 * R * fRe ~ 4*ρ*input.Flow/(π*D*μ)f ~ (-1/(1.8*log10((ϵ/(D*3.7))^1.11+6.9/Re)))^2]ODESystem(eqs, t, [ΔP,f,Re], [R], systems=[input, output],defaults=Dict([R =>val]), name=name)
end
组件:Valve
Valve为阀门组件
# 局部阻力系数 K
# 管道内径 D ~ m
# 流体密度 ρ ~kg/m³
function Valve(;name, K = 20.0, D = 25E-3,ρ=1.0E3)val = 8*K*ρ /(D^4*π^2)@named input = Pin()@named output = Pin()@variables ΔP(t)@parameters Reqs = [ΔP ~ input.Pressure - output.Pressure0 ~ input.Flow + output.FlowΔP ~ input.Flow^2 * R]ODESystem(eqs, t, [ΔP], [R], systems=[input, output],defaults=Dict(R =>val), name=name)
end
组件:Reservior
Reservior为管网中的储水箱,可以进出水
# 底面积S ~ m²
# 流体密度 ρ ~kg/m³
# 出口开关 isout, 1为开,0为关
function Reservior(;name,S = 1.0,ρ=1.0E3,isout = 0)@named input = Pin()@named output = Pin()@variables P(t),Volume(t)D = Differential(t)if isout==1eqs = [input.Pressure ~ output.Pressureinput.Pressure ~ PP ~ Volume * ρ * 9.8/SD(Volume) ~ input.Flow + output.Flow]ODESystem(eqs, t, [P,Volume], [], systems=[input,output],name=name)elseeqs = [output.Flow ~ 0input.Pressure ~ output.Pressureinput.Pressure ~ PD(Volume) ~ input.Flow D(P) ~ D(Volume) * ρ * 9.8 / S]ODESystem(eqs, t, [P,Volume], [], systems=[input,output],name=name)end
end
基于Modelingtoolkit的管网组件(Julia)相关推荐
- Visifire Silverlight Charts (基于SilverLight的Chart组件)
偶然发现了这个东东,一个基于SilverLight的Chart组件,遵循GPL v3,支持的Chart类型挺多的(支持饼图,柱状图,圈图,区图等等). Visifire 有比较完善的文档, 而且还有一 ...
- 如何开发一个基于 Vue 的 ui 组件库
如何开发一个基于 Vue 的 ui 组件库 开发模式 预览 demo 在开发一个 ui 组件库时,肯定需要一边预览 demo,一边修改代码. 常见的解决方案是像开发一般项目一样使用 webpack-d ...
- 基于Java Swing JFream 组件的趣味推箱子小游戏
一 需求分析 设计一个经典的推箱子小游戏,在窗体里有墙,箱子,胜利的标志,和工人,用户可以通过键盘上的"上"."下"."左"."右 ...
- [源码和文档分享]基于Java Swing JFream 组件的趣味推箱子小游戏
一 需求分析 设计一个经典的推箱子小游戏,在窗体里有墙,箱子,胜利的标志,和工人,用户可以通过键盘上的"上"."下"."左"."右 ...
- 基于Vue结合Vant组件库的仿电影APP
Vue综合案例 Vue综合案例 一.项目概要 1.效果前瞻 2.开发流程 3.开发环境 二.初始化及必要知识点 1.初始化远程仓库 2.创建项目 3.路由规划 4.反向代理配置 5.网络请求封装 6. ...
- 基于log4net的日志组件扩展封装,实现自动记录交互日志 XYH.Log4Net.Extend(微服务监控)...
背景: 随着公司的项目不断的完善,功能越来越复杂,服务也越来越多(微服务),公司迫切需要对整个系统的每一个程序的运行情况进行监控,并且能够实现对自动记录不同服务间的程序调用的交互日志,以及通一个服务或 ...
- vue 文字上下循环滚动_基于 Vue 无缝滚动组件Vue-Seamless-Scroll
今天给小伙伴们推荐一款超棒的Vue无缝滚动组件VueSeamlessScroll. vue-seamless-scroll 基于 vue.js 构建的简单实用的无缝滚动组件.满足丰富的配置需求,支持上 ...
- 设计一个基于svg的涂鸦组件(一)
基于svg写了一个涂鸦组件,说项目之前先附上几张效果图: 项目地址:https://github.com/linmingdao/SVGraffiti 效果预览: 功能演示: 由于篇幅问题,本文先总体介 ...
- 基于Android的浮动组件,可以用于应用中的新功能展示等等。
前言 在开发Android应用时,加新功能是必不可少的,我们加入了新的功能,有的一看界面就可以看出来,但是有的新功能就比较隐蔽,也就是用户很难知道你添加了这个新功能,这个时候就需要用户在打开我们的应用 ...
- vue html5 picker,基于vue的picker组件
概述 基于vue.js选择器组新直能分支调二浏页器朋代说件 DEMO 安装 npm install vue-3d-picker --save import picker from 'vue-3d-pi ...
最新文章
- 常见的计算机视觉任务综述
- 用c语言合并两个链表,合并两个链表.
- 树莓派应用实例5:测量土壤湿度
- 阶乘的精确值大数阶乘
- java怎么把大小写转换_JAVA 如何将String进行大小写转换
- python3鄙视python2_Python3 正在毁灭 Python的原因分析
- python中迭代器有哪些_Python迭代器:什么是Python中的迭代器以及如何使用它?
- 普通人创业做生意,送你三千万
- 小程序切换账户拉取仓库文件的appid提示
- 1034. 有理数四则运算(20)-PAT乙级真题
- 【前端】数字媒体技术专业主要课程及就业方向
- HTML CSS 兼容所有浏览器的自定义鼠标样式
- c语言 背包算法,c语言背包问题(背包最大容量c语言算法)
- 在有向图中找出所有简单环--Johnson算法
- 嵌入式高速串行并行技术_推荐(张锋)
- word 2010中页码从任意页开始
- react中使用less
- 第六章-2 CS创建监听与payload
- 浅谈AI绘图工具Midjourney
- c语言万能编程模板_8051单片机C语言通用万能编程模板