获取scipy的resolve_ivp函数以执行中间任务

问题描述

我正在解决流体与结构的相互作用问题,需要修改solve_ivp,以便在每个时间步骤之后执行中间任务。该算法应如下所示:

for t in time:
    for i in maxiter:
        1 - Solve one time step of the fluid nonlinear equation keeping the solid fixed (RK45). 
        2 - Solve a nonlinear equation for the solid (Radau or user defined). 
        3 - Update the fluid geometry
        if converge: 
            break 

面临的挑战是如何耦合两个集成器实例。使用solve_ivp时,我无法控制时间步长,算法选择时间步长来提高稳定性。我可以接受这一点,因为流体的时间尺度比固体的时间尺度快得多。因此1中的时间步将固定2中的时间。我看到的两个选项是:

选项1:

  1. 实例化流体积分器对象并将其运行一个小的固定增量T(积分器将执行子步骤,可能不会很多)。
  2. 存储流体力信息。
  3. 实例化具有相同增量T的固体积分器对象,并使用先前计算的流体力求解。
  4. 检查收敛性,然后回到1)。

选项2):

  1. 实例化一个流体积分器对象,将最终时间设置为模拟的总时间。
  2. 在每个(自动)积分步骤之后,从INSIDE的solve_ivp函数调用用户定义的固态积分器(需要修改solve_ivp。
  3. 检查Solve_ivp内部的收敛性,如果为False,则在相同的时间步执行新的积分,但要更新几何形状(可能不容易)。

选项1的缺点是我需要实例化并丢弃大量的积分器对象(可能超过1000万个)。尽管选项2)的缺点是我需要将resolve_ivp修改为:a)执行中间任务(该函数本身不允许执行中间任务,仅允许存储事件信息),并且b)与相同的增量重新集成如果收敛为False,则为T(可能吗?)。

我想知道是否有人看到这种集成循环的更好方法?预先谢谢你。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)