Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >两个不同方程上一项依赖于两个变量的FiPy输运反应

两个不同方程上一项依赖于两个变量的FiPy输运反应
EN

Stack Overflow用户
提问于 2021-02-23 10:28:42
回答 1查看 63关注 0票数 0

我正在尝试解决一个运输反应问题,但根据方法的不同,我有不同的解决方案。我认为,如果我试图求解耦合方程,问题就会出现。

以下是PDE:

我假设恒定的温度(方程式中的T),以及恒定的速度场(vx,vy)。

正如你所看到的,在反应项中有一个元素依赖于两个变量,并且存在于两个不同的变量中( CBOD的降解取决于氧CDO的浓度,氧的浓度取决于CBOD的降解量)。

这是我的代码:

代码语言:javascript
运行
AI代码解释
复制
# Geometry
Lx = 2  # meters
Ly = 2  # meters
nx = 41 # nodes
ny = 41 # nodes

# Build the mesh:
mesh = Grid2D(Lx=Lx, Ly = Ly, nx=nx, ny=ny)
X,Y = mesh.cellCenters


# Main variable and initial conditions

#Velocity field (constant):
Vf = CellVariable(name='velocity_field',
                 mesh = mesh,
                 value = [vx, vy])

# Dissolved oxygen concentration:
C_DO = CellVariable(name="concentration_DO", 
                 mesh=mesh, 
                 value=0.,
                 hasOld=True)
C_DO.setValue(9.5, where=(Y >= Ly - 0.5))
C_DO.setValue(9.25, where=(Y < Ly - 0.5) & (Y >= Ly - 1.0))
C_DO.setValue(8.9, where=(Y < Ly - 1.0) & (Y >= Ly - 1.5) )
C_DO.setValue(8.8, where=(Y < Ly - 1.5) & (Y >= Ly - 2.0))

# Biochemical Oxygen Demand by Carbonaceous Organic Matter
C_CBOD = CellVariable(name="concentration_CBOD", 
                 mesh=mesh, 
                 value=10.,
                 hasOld=True)

# Biochemical Oxygen Demand by Nitrogenous Organic Matter
C_NBOD = CellVariable(name="concentration_NBOD", 
                 mesh=mesh, 
                 value=10.,
                 hasOld=True)

# Temperature (constant)
T = CellVariable(name="temperature", 
                 mesh=mesh,
                 value=14.4,
                 hasOld=True)


# Transport parameters
D_DO = FaceVariable(name='DO_diff', mesh=mesh, value=1.)
D_DO.constrain(0., mesh.exteriorFaces)

D_CBOD = 1.
D_NBOD = 1.


## Reaction & source terms

# DO
O_r = 1.025
K_r = 1.

# CBOD:
O_CBOD = 1.047
K_CBOD_0 = 0.2
K_CBOD = K_CBOD_0 / DOsat
CBOD_reaction_coeff = K_CBOD * (O_CBOD ** (T - 20))

# NBOD:
O_NBOD = 1.047
K_NBOD_0 = 0.2
K_NBOD = K_NBOD_0 / DOsat
NBOD_reaction_coeff = K_NBOD * (O_NBOD ** (T - 20))

# Boundary conditions
### fixed flux, atmospheric exchange, included in the main equation.

# Equations definition:

# DO transport-reaction
eqDO = (TransientTerm(var = C_DO) == 
        DiffusionTerm(coeff=D_DO, var = C_DO) 
        - ConvectionTerm(coeff=Vf, var=C_DO)
        + ImplicitSourceTerm(coeff= -1 * CBOD_reaction_coeff * C_CBOD, var=C_DO) 
        + ImplicitSourceTerm(coeff= -1 * NBOD_reaction_coeff * C_NBOD, var=C_DO) 
        + (mesh.facesTop * (K_r * (O_r ** (T.faceValue - 20)) * ((14.652 - 0.41022 * T.faceValue + 0.007991 * T.faceValue ** 2 - 0.000077774 * T.faceValue ** 3) - C_DO.faceValue))).divergence))
    
# CBOD transport-reaction
eqCBOD = (TransientTerm(var = C_CBOD) == 
          DiffusionTerm(coeff=D_CBOD, var = C_CBOD) 
          - ConvectionTerm(coeff=Vf, var=C_CBOD) 
          + ImplicitSourceTerm(coeff= -1 * CBOD_reaction_coeff * C_DO, var=C_CBOD))

# NBOD transport-reaction
eqNBOD = (TransientTerm(var = C_NBOD) == 
          DiffusionTerm(coeff=D_NBOD, var = C_NBOD) 
          - ConvectionTerm(coeff=Vf, var=C_NBOD) 
          + ImplicitSourceTerm(coeff= -1 * NBOD_reaction_coeff * C_DO, var=C_NBOD))

eqQ = eqDO & eqCBOD & eqNBOD

# PDESolver hyperparameters
steps = 230 
dt = 1e-2

for step in range(steps):
  C_DO.updateOld()
  C_CBOD.updateOld()
  C_NBOD.updateOld()

  eqQ.solve(dt=dt)

根据我是单独求解这三个方程(eqDO.solve(dt=dt),eqCBOD.solve(dt=dt),eqNBOD.solve(dt=dt))还是耦合在一个系统(eqQ.solve(dt=dt))中,我会得到不同的结果(网格中的分布相同,但值不同)。我不知道我是否可以在两个不同的方程中使用具有不同变量的项;例如:

代码语言:javascript
运行
AI代码解释
复制
eqDO = ... + ImplicitSourceTerm(coeff= -1 * CBOD_reaction_coeff * C_CBOD, var=C_DO) <--- Is this OK?
eqCBOD = ... + ImplicitSourceTerm(coeff= -1 * CBOD_reaction_coeff * C_DO, var=C_CBOD) <--- Is this OK?

我想一起解决CBOD,NBOD和DO的浓度问题。在一起求解方程时,我可以这样定义前面的元素吗?或者,如果我有这些项,逐个求解方程更好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-23 15:38:12

  • 如果它们各自的控制方程之间的反应项完全相同,守恒性质可能会更好,但如果你扫一扫(你应该这样做),这可能无关紧要。
  • 你需要扫描..。方程式之间存在非线性依赖关系。无论你是作为一个耦合的系统求解,还是连续地求解这些方程,这都无关紧要。任何显示为Term,它可能会因解决方案而改变,因此必须清除。
  • 当每个var=?在每个Term在方程式中指定相同的变量,则方程式之间不存在耦合,因此使用&符号。你只是使用了更多的内存,可能在解决三个独立的方程方面做得更差。
  • 即使你调整了一些你的var=?在引入耦合的任务中,您通常会通过一开始不耦合来更容易地获得解决方案。耦合可以有助于收敛,但它经常对稳定性造成严重破坏。
  • 同样,明智地使用ImplicitSourceTerm可以有助于收敛,但当您尝试求解一组方程时,通常只会使事情变得混乱。我会明确地写下这些源码,例如,- CBOD_reaction_coeff * C_CBOD * C_DO直到你知道一切正常。

描述了一个梯度约束,但是(mesh.facesTop * blahblah).divergence强加边界流量..。对于您的方程式,通量为

..。你应该使用C_DO.faceGrad.constrain(...)..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66331362

复制
相关文章
java – 为什么InputStream#read()返回一个int而不是一个字节?
首先字节正好是8位,所以使用8位的char类型数据来与字节数据相互一一对应是最好的选择?但是为何方法InputStream#read()需要返回int类型值呢?
Fisherman渔夫
2020/02/19
1.2K0
springcloud 返回的数据为XML 而不是JSON
本人的原因是因为引入了jackson-dataformat-xml依赖导致的,下面查看自己项目是否包含此依赖,如果包含的话,可以去掉。 有的人添加了下面注解后可以解决,不过我这里没有解决。还是依靠上图
qubianzhong
2019/04/01
2.3K0
springcloud 返回的数据为XML 而不是JSON
为什么 useState 返回的是 array 而不是 object?
这里可以看到 useState 返回的是一个数组,那么为什么是返回数组而不是返回对象呢?我们在自定义 hook 时应该返回什么类型呢?
小鑫
2022/04/26
2.3K0
js如何返回异步函数结果
假设您有这样一个问题:您正在进行一个异步调用,并且需要从原始函数返回该调用的结果。
IT工作者
2022/01/01
6.4K0
DevOps是一个接口,而不是一个类
职位通常定义一个人需要执行的任务。“软件开发人员”开发软件,“系统管理员”管理系统,“团队负责人”领导团队。他们执行任务的质量可以用来评估他们的绩效。
DevOps云学堂
2021/05/11
1.1K0
DevOps是一个接口,而不是一个类
JS如何返回异步调用的结果?
这个问题作者认为是所有从后端转向前端开发的程序员,都会遇到的第一问题。JS前端编程与后端编程最大的不同,就是它的异步机制,同时这也是它的核心机制。
LIYI
2023/03/06
5.6K0
JS如何返回异步调用的结果?
去解决更多的问题,而不是如何最好地解决一个问题
有些人非常勤奋,别人休息和娱乐的时候,都在工作学习。但是努力了一辈子,人生也没有显著的提升,就像报道里经常说的:"某某在平凡的岗位上,勤勤恳恳工作了一辈子"。
春哥大魔王
2018/09/21
7570
去解决更多的问题,而不是如何最好地解决一个问题
mybatis返回结果处理
当查询的记录条数是多条的时候,必须使用集合接收。如果使用单个实体类接收会出现异常。如果返回的是一条记录可以用集合接收
一个风轻云淡
2023/10/15
2500
mybatis返回结果处理
C++核心准则编译边学-F.20 输出结果时更应该使用返回值而不是输出参数
A return value is self-documenting, whereas a & could be either in-out or out-only and is liable to be misused.
面向对象思考
2020/03/25
1.4K0
Java 日期类型比较没有返回正确的结果
最近在数据库处理的时候发现日期对比的时候没有返回正确的结果。 但是保存的时间实际上是相同的。 代码如下: if (!mlsPhoto.getDateUpdate().equals(photo.getDateUpdate())) { } 因为这里使用了 equals 方法。 问题解决 经过 Debug 后,这 2 个日期的纳秒数是不同的,查看下对象如下。 我们会发现其中一个对象有纳秒,一个对象没有。 但是 fastTime 是相同的。 如果使用 equals 那么这个方法比较的是毫秒,所以是不相等的。
HoneyMoose
2021/12/21
3.5K0
java 查看进程状态_java执行shell命令并返回结果
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172503.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
8990
java 查看进程状态_java执行shell命令并返回结果
【说站】Python如何用下标取得列表的单个值
1、使用的下标超出了列表中值的个数,Python 将给出 IndexError 出错信息。
很酷的站长
2022/11/24
1.3K0
【说站】Python如何用下标取得列表的单个值
一文读懂《Effective Java》第43条:返回零长度的数组或集合,而不是null
对于一个返回null 而不是零长度数组或者集合的方法,客户端几乎每次用到该方法都可能会忘记写专门处理null 返回值的代码,进而导致NPE。
后台技术汇
2022/05/28
1.6K0
Feign配置微服务间调用返回XML而不是Json的解决方案
springcloud中的微服务之间通过网关的api调用时,返回的是xml格式,而不是相应的json串,如果想要返回json格式如何处理呢
在水一方
2022/06/14
1.6K0
Feign配置微服务间调用返回XML而不是Json的解决方案
2022-12-15:寻找用户推荐人。写一个查询语句,返回一个客户列表,列表中客户的推荐人的编号都 不是 2。对于示例数据,结果
2022-12-15:寻找用户推荐人。写一个查询语句,返回一个客户列表,列表中客户的推荐人的编号都 不是 2。
福大大架构师每日一题
2023/02/01
8020
更聪明地学习,而不是苦读——《如何高效学习》
所以,需要持续大量学习的童鞋,比方说我等程序员们,除了要从知识的海洋中精挑细选出我们想要的内容,挑完了还得高效学习,不然成长的速度可能远远赶不上脱发的速度,沦落到「他变秃了,也没变强」的尴尬境地。
mzlogin
2020/05/21
6710
mybatis返回结果类型(resulttype返回list)
这样设置返回类型为resultClass=”java.util.HashMap”,查询时执行queryForList
全栈程序员站长
2022/08/01
5.7K0
何时使用MongoDB而不是MySql
MySQL 和 MongoDB 是两个可用于存储和管理数据的数据库管理系统。MySQL 是一个关系数据库系统,以结构化表格格式存储数据。相比之下,MongoDB 以更灵活的格式将数据存储为 JSON 文档。两者都提供性能和可扩展性,但它们为不同的应用场景提供了更好的性能。
wayn
2023/08/09
1.1K0
何时使用MongoDB而不是MySql
SpringBoot统一返回结果
在后台开发时,控制台得到的数据格式会有不同,这时我们需要设置统一返回结果,方便我们分析数据以及对数据进行管理。
算法与编程之美
2022/05/23
9480
SpringBoot统一返回结果
何时使用Kafka而不是RabbitMQ
Kafka 和 RabbitMQ 都是流行的开源消息系统,它们可以在分布式系统中实现数据的可靠传输和处理。Kafka 和 RabbitMQ 有各自的优势和特点,它们适用于不同的场景和需求。本文将比较 Kafka 和 RabbitMQ 的主要区别,并分析何时使用 Kafka 而不是 RabbitMQ。
wayn
2023/06/26
3940
何时使用Kafka而不是RabbitMQ

相似问题

Java XPath返回单个结果而不是NodeSet

11

findById返回文档列表,而不是单个结果

21

Java LDAP总是返回单个值,而不是列表

10

获取列表中的结果,而不是单个列表

129

Swift NSPredicate正在返回所有结果,而不是单个结果。

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档