微信一键登录

科吉思石油论坛

搜索
查看: 2034|回复: 1
打印 上一主题 下一主题

关于Python in schudule中几点总结和建议

[复制链接]

0

主题

6

帖子

6

积分

微信会员

Rank: 3Rank: 3

积分
6
跳转到指定楼层
楼主
发表于 2021-4-13 16:58:03 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 JoyLin 于 2021-4-14 13:27 编辑

最近有个课题,用到了Python in schudule,感觉还是很强大的,这里提出几个应用建议。
水平有限,还请斧正。
1、关于ARR自定义静态属性
arithmetic中是不能读取使用ARR的,但是python in schedule 的grid_arithmetic函数却可以。
不知道是bug,还是有意为之,总之很好用,点个赞,希望不是bug,以后能继续使用。
如果可以创建自定义动态属性,那就厉害了,可惜现在不能。
2、关于grid_arithmetic中可修改属性
还是太少,如果覆盖相渗端点、启动压力梯度等属性,就更加强大了。
这里python修改grid属性,还需要借用arithmetic公式,开始不理解,不过后来觉得应该是处于性能考虑吧。
希望后期能有python语言原生的修改功能,这样,像cell(i)-cell(i-1)的编辑功能就能实现了,同时像numpy等库也可以应用于grid属性的计算了。
3、关于__init_script__函数
这个函数的运行时机,手册中只是说在脚本初始化里,可以里边的print函数、全局变量都无效
开始以为有问题,分析认为其初始化时机是data加载时,data加载时运行__init_script__函数后,脚本关闭,全局变量会失效。
为什么create_graph函数会生效,因为其操作的是tnav内部变量,变量的生命周期大于脚本的生命周期。

4、关于脚本的全局变量
函数体外的全局变量,不管你加不加global,都是无法正常访问的,原因分析:
其实python的global不是严格意义上的全局变量,类似C++中的文件static变量或者const变量,应该叫文件作用域变量
分析认为,tnav每个时间步都是重新载入py文件,运行完毕后再关闭,所以全部文件作用域在每个时间步都会重新初始化(见附图)

强烈建议增加set_global、get_global函数,可以设置、读取真正的全局变量,感觉很有用
比如在脚本运行前,我要加载一个保存数据的xlsx,并保存在全局变量里,每个时间步脚本运行时,读取全局变量
5、tnav的API是不能出现在自定义模块中的
可能表达不清,比如我写了一个模块,里边用了tnav的api,再在schedule的python脚本中调用这个模块
模拟器会提示,某块中的API是不存在的,也就是tnav的api只能出现在你的APPLYSCRIPT中py文件内
猜测,tnav的api采用运行时注入依赖的方式运行,自定义模块无法注入依赖,所以Python找不到api
6、关于Graph值计算的问题
Graph计算时,只要表达式中有graph类型的变量,那么结果就是graph类型,而不是数值类型,
比如 a = wbhp[well] + 10 , 这里的a也成为graph类型,而graph类型没有实现__format__,
所以在格式化format中直接使用变量a 会报错,应该进行显示转换float(a),或者str(a)。

7、关于部署发布的问题
建议将私有算法编译为pyd模块,提供用户接口py文件,同时可以将pyd模块加入到python解释器的嵌入版里,一起提供给用户
直接在tnav加入python路径,应用接口py文件即可。
8、未来展望
希望能将python in schedule发展成一个插件系统,可以将插件系统做成一个标准的pip包
利用面向对象的多态性,可以在不同的阶段调用插件算法,比如加载data时,读取grid结束后,甚至读取到某个关键时
同时有利于调试,现在的调试基本靠print,有点难受
希望tnav成为自定义程度最高的模拟器,不管在科研还是矿场中都是一把无双利器!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|服务支持:DZ动力|科吉思石油技术咨询有限公司 ( 京ICP备15057753号

GMT+8, 2024-5-7 05:40 , Processed in 0.187035 second(s), 31 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表