首页/文章/ 详情

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

2年前浏览2774

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

    我们有时候会遇到这样一个问题,我们一个工况要算几天或者十几天,但是中间某天突然断电了,自己算的东西全都没了,还得从头开始算。这样如果中间我们保存了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
          获赞 837粉丝 4645文章 83课程 21
          点赞
          收藏
          作者推荐
          未登录
          2条评论
          Eliauk
          签名征集中
          2年前
          第一个命令框少了加号吧?
          回复
          2年前
          谢谢博主分享
          回复
          课程
          培训
          服务
          行家
          VIP会员 学习 福利任务 兑换礼品
          下载APP
          联系我们
          帮助与反馈