python如何处理inp文件_Matlab-python修改ABAQUS的inp计算文件

python修改ABAQUS的inp计算文件

这里的函数可以与上一个博客Matlab-python-ABAQUS数据交互及联合使用的函数接口相互配合和集成,实现matlab与Abaqus进行联合仿真计算,大体思路如下图所示。

因此这里matlab和python各写一个接口函数,实现对数据的处理。

matlab函数

function modify(Path,InpFile,NewData,ModifyStr,num)

%modify.m

%libing403,2017-05-09

fid=fopen('modify.txt','wt');

%把需要修改的inp文件和新数据文件的文件名、路径写入modify.txt

fprintf(fid,'%s,%s.inp,%s,%s,%d',Path,InpFile,NewData,ModifyStr,num);

fclose(fid);

system('abaqus cae noGUI=inpmodify.py');%调用python脚本修改inp数据

end

(Path,InpFile,NewData,ModifyStr,num)参数列表含义分别如下:

1)Path:inp计算文件的绝对路径。

2)InpFile:inp计算文件的文件名。

3)NewData:新数据的文件名,存储了用于替换旧数据的新数据。可事前准备或matlab其他程序生成。

4)ModifyStr:需要修改的数据行的关键字,inp计算文件的数据均由关键字开头,然后指定数据。

5)num:需要修改的数据的行数

这里的参数(Path,InpFile,NewData)可以由matlab主程序传递过来,语句

system('abaqus cae noGUI=inpmodify.py')

实现调用修改inp文件的python脚本,脚本文件名为inpmodify.py。下面给出该脚本的实现。

python脚本

首先说明要如何修改inp中的具体什么数据。我这里inp文件abaqus-inpfile.inp包含以下一段数据,其中关键字”*Permeability, specific=1.\n”,包括换行符‘\n’。这是指定材料的渗透系数以及比重,关键字后面的28行数据指定了渗透系数随孔隙比的变化,需要替换为新的数据,共有28行数据。而且我准备了新的28数据,保存在NewData.txt文件中。

abaqus-inpfile.inp文件内容

...

101200., 0.149577, , 19.7647

28977.5, 0.147995, , 24.2025

*Permeability, specific=1.

1.605e-12, 1.

5.24399e-12, 1.5

1.21474e-11, 2.

2.33056e-11, 2.5

3.96889e-11, 3.

6.22521e-11, 3.5

9.1937e-11, 4.

1.29675e-10, 4.5

1.76387e-10, 5.

2.32988e-10, 5.5

3.00384e-10, 6.

3.79474e-10, 6.5

4.71152e-10, 7.

5.76307e-10, 7.5

6.95821e-10, 8.

8.30574e-10, 8.5

9.81439e-10, 9.

1.14929e-09, 9.5

1.33498e-09, 10.

1.53939e-09, 10.5

1.76336e-09, 11.

2.00776e-09, 11.5

2.27344e-09, 12.

2.56125e-09, 12.5

2.87203e-09, 13.

3.20664e-09, 13.5

3.5659e-09, 14.

3.95066e-09, 14.5

*User Defined Field

*Material, name=Material-2

*Elastic

...

NewData.txt的数据:

1.605e-12, 1.

1.24399e-12, 1.5

1.21474e-11, 2.

1.33056e-11, 2.5

1.96889e-11, 3.

1.22521e-11, 3.5

1.1937e-11, 4.

1.29675e-10, 4.5

1.76387e-10, 5.

1.32988e-10, 5.5

1.00384e-10, 6.

1.79474e-10, 6.5

1.71152e-10, 7.

1.76307e-10, 7.5

1.95821e-10, 8.

1.30574e-10, 8.5

1.81439e-10, 9.

1.14929e-09, 9.5

1.33498e-09, 10.

1.53939e-09, 10.5

1.76336e-09, 11.

1.00776e-09, 11.5

1.27344e-09, 12.

1.56125e-09, 12.5

1.87203e-09, 13.

1.20664e-09, 13.5

1.5659e-09, 14.

1.95066e-09, 14.5

根据要求,编写的python脚本如下

#! /user/bin/python

#- -coding: UTF-8-*-

# 本脚本的功能是修改ABAQUS inp文件

#libing403,2017-5-7

import time

#读取inp文件的路径及文件名内容

f=open('modify.txt','r')

req=f.readline()

f.close()

req=req.split(',')

InpFile=req[0]+'/'+req[1]

NewData=req[0]+'/'+req[2]

modifystr=req[3]

num=req[4]

#读取inp文件内容

fid=open(InpFile,"r")

lines=fid.readlines()

fid.close()

#找出原来的数据行

startstr=modifystr

startIndex=lines.index(startstr)+1

#28个行数据需要替换

endIndex=startIndex+num

#读入新数据

fid=open(NewData,"r")

newInp=fid.readlines()

fid.close()

print("%s"%newInp)

#替换原来的数据行

i=0

for Index in range(startIndex,endIndex):

lines[Index]=newInp[i]

i=i+1

#写入新数据,替换原来的数据

fid=open(InpFile,"w")

fid.writelines(lines)

fid.close()

#写入操作日志

meg="inpmodify message:\n inp file modify successfully\n"

fid=open("pylog.txt","a")

fid.write('%s\n'%meg)

fid.close()

应用例子

有了上面的matlab函数modify.m和python脚本inpmodify.py,那么就可以在matlab主程序中调用它们来修改inp文件了。下面是一个例子,修改之前准备好的数据。

%example.m

%libing403,2017-07-09

clc

Path='F:\security folder\ABAQUS WORKING\inversion_per';

%原来的inp文件名,不需要后缀名inp

InpFile='abaqus-inpfile';

%新数据的文件名

NewData='NewData.txt';%需要后缀名txt

ModifyStr='*Permeability, specific=1.\n';

num=28;

modify(Path,InpFile,NewData,ModifyStr,num);%修改inp文件

showlogfile('pylog.txt');%显示python脚本运行的输出信息

这是一个python程序,是modify接口函数的功能的实现程序,被modify接口函数调用。其功能是根据modify.txt指定参数和新数据文件修改inp文件,并生成新的inp文件,覆盖掉旧的inp文件。inp计算文件可供runabaqus函数提交给ABAQUS求解器进行计算。

其中showlogfile()在我的另外一个博客Matlab目录操作及fgetl函数已有介绍。运行程序后,matlab窗口显示如下消息,表明inp文件修改成功了。

修改的inp文件中,渗透系数换成了新的数据,其他数据保持不变,如下

...

101200., 0.149577, , 19.7647

28977.5, 0.147995, , 24.2025

*Permeability, specific=1.

1.605e-12, 1.

1.24399e-12, 1.5

1.21474e-11, 2.

1.33056e-11, 2.5

1.96889e-11, 3.

1.22521e-11, 3.5

1.1937e-11, 4.

1.29675e-10, 4.5

1.76387e-10, 5.

1.32988e-10, 5.5

1.00384e-10, 6.

1.79474e-10, 6.5

1.71152e-10, 7.

1.76307e-10, 7.5

1.95821e-10, 8.

1.30574e-10, 8.5

1.81439e-10, 9.

1.14929e-09, 9.5

1.33498e-09, 10.

1.53939e-09, 10.5

1.76336e-09, 11.

1.00776e-09, 11.5

1.27344e-09, 12.

1.56125e-09, 12.5

1.87203e-09, 13.

1.20664e-09, 13.5

1.5659e-09, 14.

1.95066e-09, 14.5

*User Defined Field

*Material, name=Material-2

*Elastic

...

小结

这里的接口函数具有一定的通用性,只需修改相关的参数可以适用于类似的情况。其中inpmodify.py脚本则要根据不同的关键字以及需要替换的数据行进行修改,通用性没那么强。这里的函数以及之前两篇博客(Matlab目录操作及fgetl函数,Matlab-python-ABAQUS数据交互及联合使用)的函数,可以用来实现Abaqus与matlab之间的数据交换,可以在matlab方便使用一些优化算法,同时利用ABAQUS的有限元建模和计算的强大功能,实现参数反演估计,结构迭代,优化等研究。

当然实现matlab与ABAQUS的数据交互还有很多其他方法。例如一个国外学者George Papazafeiropoulos编写了matlab工具箱Abaqus2Matlab,可以读取ABAQUS的各种输出结果,还是很不错的。不过需要花一定时间去掌握如何使用,也有可能不符合自己的期待的功能,好像没有通过matlab进行修改inp文件或者操控ABAQUS的功能。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值