首页/文章/ 详情

间断保存sav文件以及设置收敛条件

2年前浏览2965

首先感谢西安科技大学魏博对于本文的指导

    我们有时候会遇到这样一个问题,我们一个工况要算几天或者十几天,但是中间某天突然断电了,自己算的东西全都没了,还得从头开始算。这样如果中间我们保存了sav文件,比如每隔一定时间保存一个sav,那哪怕断电了还能续算。


    我们制作动图的时候需要在计算过程中进行截图,这个需要用plot bitmap命令,但是这个需要在plot中将视图全部打开,这样就会使得计算速度超级无敌慢(慢的不是一星半点,大家可以对比一下)。如果我们中间保存了sav的话,就不需要打开Plot,直接后处理的时候批量调用就可以了。


    下面为魏博提供的间断保存文件和设置收敛条件的代码:


























[num1 = 0][num2 = 1][nstep =1000]def loadhalt_wall    loadhalt_wall = 0    num1 = num1 1    if num1 = nstep then        file_name='result' string(num2) '.sav'        num1 = 0        num2 = num2 1        command            save @file_name        endcommand    endif    local abs_stress = math.abs(axial_stress_wall)    global peak_stress = math.max(abs_stress,peak_stress)    if abs_stress < peak_stress*peak_fraction       loadhalt_wall = 1    end_ifend[peak_fraction = 0.01]solve fishhalt @loadhalt_wall


这个函数的功能包括两个部分:

1)每隔nstep个时间步保存一个sav文件;

2)当峰后应力小于峰值应力的0.01时停止计算。


为了方便讲解,我们将函数分成两部分来看。


一、间断保存文件

















[num1 = 0][num2 = 1][nstep =1000]def loadhalt_wall    loadhalt_wall = 0    num1 = num1 1    if num1 = nstep then        file_name='result' string(num2) '.sav'        num1 = 0        num2 = num2 1        command            save @file_name        endcommand    endif


    第一个功能是采用间断跳跃的结构,逻辑是使用两个变量num1和nstep,num1随着计算步不停的累加,当达到nstep值时执行保存文件的函数部分,并且又变成0,重新进行累加。将nstep看做是num1的目标值会好理解一点,num2是统计文件序号的整数,每次保存文件时都会 1,并且当做变量构造文件名字file_name。

    这个结构其实我也经常会用到,这里是按时间步数进行保存文件的,当然也可以按照应变量进行保存:


















[baocunpinlv=-0.1][time_record=weyy 1][count=0]def savefile        if weyy-time_record <= baocunpinlv then        filename=string.build("jieguo%1",count)        command            save @filename        endcommand        time_record=weyy        count =1    endif    end                        set fish callback -1.0 @savefile

    这里的weyy就是应变,单位是%,这个功能是每隔0.1%应变保存一个sav文件。

    当然在基坑等边值问题时候,没有应变这个概念,也可以用时间去表示:














[time_record=mech.age][baocunpinlv=1]def savefile        if mech.age-time_record > baocunpinlv then        filename=string.build("jieguo%1",count)        command            save @filename                    endcommand        time_record=mech.age        count  =1    endif    endset fish callback -1.0 @savefile

结构思路其实都一样的,读者可以按照自己的需求,按照自己所需要的变量去保存sav文件。


、设置收敛条件

image.png

     solve fishhalt命令是可以自己进行收敛条件设定的,后面接的函数返回值是0的话就继续运行,如果是1的话就停止运行。

   这里每次都监测轴向应力值(axial_stress_wall),并且每次都通过math.max得到目前为止的峰值应力(peak_stress)。当进入峰后的时候,测出的轴向应力值<峰值应力*peak_fraction的时候,函数值返回1,计算结束。    这里主要的知识点有两个,一个是solve fishhalt命令的运用,一个是峰值应力的计算方法,还是非常有借鉴意义的。


    当然读者也可以根据自己的需要进行开发,比如我常用于单元试验的收敛结构为:


这个道理差不多,就是计算到1.4%应变时截止计算

image.png

这两个功能在模拟中都是非常实用的,读者可以根据自己需要,进行开发应用。


    最后分享一个可以生成批量调用结果文件并截图代码的小程序,也是我自己写的。


链接:https://pan.baidu.com/s/1hcxTkrkjpK3q2skc7C3TPA
提取码:dvav
复制这段内容后打开百度网盘手机App,操作更方便哦


程序界面很简单:


image.png


    输入sav名字,序号,点击生成,就会在下面对话框生成,直接复制粘贴到自己程序里面就可以进行调用了,当然也可以自己定义一自处理方法,这里后面有机会再说。

科普代码&命令结构基础PFC
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-07-18
最近编辑:2年前
lobby
硕士 |擅长颗粒流PFC
获赞 851粉丝 4868文章 83课程 21
点赞
收藏
作者推荐
未登录
2条评论
Eliauk
签名征集中
2年前
第一个命令框少了加号吧?
回复
2年前
谢谢博主分享
回复
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈