找回密码
 注册
Simdroid-非首页
查看: 7246|回复: 91

[二次开发] 加分帖:python学习初级篇

[复制链接]
发表于 2011-6-9 21:12:15 | 显示全部楼层 |阅读模式 来自 上海
本帖最后由 JingheSu 于 2011-6-15 09:05 编辑

自从被池总诱惑入门以后,python已经成为我的工作语言了。本人是个注重实用的人,虽然也想能系统地学习python,可是一是没有那么多的时间;二是也下不了那么大的恒心,所以我的python也就仅仅限于简单的工作应用罢了,如果处理数据,abaqus前后处理等等。下面就从入门的角度利用工作中常用的几个小程序再现一下的我python历程,希望可以帮助那些想在短期内学会使用python的人们.
首先推荐一下python环境:
当然你不装python也可以,因为abaqus610内置了python2.6abaqus69内置的是python2.4,目录一般是C:\SIMULIA\Abaqus\6.X-1\Python),但是我还是推荐另外单独安装一个python,方便利用Editplus调试程序。推荐Editplus做编辑器(功能和Ultraedit不相上下打开70M的文本文件也就是2s不到的延迟),具体配置可以看看这个文章,可以实现语法高亮以及简单的自动补全功能,关键是界面比较清秀!

http://www.cnblogs.com/dkblog/archive/2011/04/02/2003714.html


秀一张我的python in editplus


更新一下楼下几位pythoner提到的常用的几个程序包:
xlwt/xlrd:excel 读写操作
pyExcelerator:excel 读写操作
sciDavis:开源绘图软件,类似于origin,但是可以用python脚本的。
scipy和numpy:科学计算包,类似matlab
matplotlib:python绘图包

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

3

查看全部评分

发表于 2011-8-11 09:12:32 | 显示全部楼层 来自 山东临沂
Simdroid开发平台
回复 28# JingheSu
jing大~ 都是眼泪啊~,我之前不是不知道嘛
算东西一直都是用批处理来提交,结果一直拿我8核的机器当单核的来用
后来知道了肠子都悔青了~之前要算好几天的东西现在不到一天就结束了

评分

1

查看全部评分

回复 1 不支持 0

使用道具 举报

发表于 2011-6-10 18:10:21 | 显示全部楼层 来自 山东临沂
呵~这么好的帖子刚看见,出去开个会 回来黄花菜都凉了
我也来一个吧,这个是用来转化string的
在abaqus中给梁单元赋属性的时候,必须先把梁单元转换成string
再把set转换成string的set才能附上属性,转成string的set局限就比较多
比如如果要合并模型,压缩了以后只会留下模型和set,string就没有了
写个小PY可以把string的set重新更换成edge的set

from part import *
mypart=mdb.models['Model-1'].parts['Part-1']
mylist=mypart.sets.keys()
for myS in mylist:
   try:
      mypart.Set(edges=mypart.stringers[myS].edges,name=myS)
   except:
      print 'Wrong-Set.. please check!!! :' + myS

评分

1

查看全部评分

回复 1 不支持 0

使用道具 举报

 楼主| 发表于 2011-6-9 21:12:54 | 显示全部楼层 来自 上海
本帖最后由 JingheSu 于 2011-6-9 21:53 编辑

Python基础


温馨提示:Python是靠每行的文本缩进来标示程序执行流程的,如果你发现你的程序算出来的结果和你预先的不同那么还是用python自带的IDLE打开你的程序,看看是不是有缩进不对的问题。


  1. from math import *
  2. print pi
  3. import math
  4. print math.pi
复制代码

Import 其实就是告诉计算机:我下面要用来自math这个包里面的东西了。两种import方法都可以,不过得注意调用包里面函数或者对象时候的区别(如pimath.pi)。

  1. a=11
  2. c=2
  3. b=2.0
  4. d='char'
  5. ab=a+b
  6. ac=a+c
  7. a_b=a/b
  8. a_c=a/c
  9. dd=d+d
  10. f=[1.0,2.0,3.0]
  11. print d
  12. print a
  13. print f[0]
  14. print dd
  15. print 'a and b is '+str(ab)
  16. print 'a and c is '+str(ac)
  17. print 'a divided by b is '+str(a_b)
  18. print 'a divided by c is '+str(a_c)
复制代码

数据基本上可以分为整数(a, c),浮点数(b),列表(f),字符串(d, 实际上也是种列表),其他高级货如字典等等用的时候再看书。

+操作符除了数学里面的加法外,还可以将两个字符串连接成一个字符串,注意一下数值类型是不能和字符串类型直接“相加”,但是可以通过str函数将数字转化为一个字符串再加。
  1. alist=range(4)
  2. flen=len(alist)
  3. print alist[0]
  4. print flen
复制代码

alist=range(4)从零开始生成一个具有指定个正整数的列表
flen=len(f)返回指定列表f的元素数目


  1. for i in range(len(alist)):
  2.     print alist
  3. i=0
  4. while i<len(alist):
  5.     print alist
  6.     i=i+1
  7. if i<10:
  8.     print i
  9.     i=i+2
复制代码
这是常用的循环和判断语句

最后再贴一个自己刚开始用python时做的很简单的很简单的插值函数

功能:给出四个列表x,y1,y2,y3x已经排好顺序了)和一个数值z,程序会根据zx里面的位置,返回相应的y1,y2,y3列表中对应的插值。
运行方式:interp放在你的python安装目录下,就可以用import命令在你的程序中使用了。

  1. def interp(x,y1,y2,y3,z):
  2.     n=len(x)
  3.     n1=len(y1)
  4.     n2=len(y2)
  5.     n3=len(y3)
  6.     if (n!=n1)&(n!=n2)&(n!=n3):
  7.         print 'Incorrect input parameters: list not matched with eachother'
  8.         return None
  9.     else:
  10.         temp=0
  11.         for i in range(n-1):
  12.             if (z>=x)&(z<=x[i+1]):
  13.                 temp=i
  14.                 k=(z-x[temp])/(x[temp+1]-x[temp])
  15.                 break
  16.         y1p=y1[temp]+(y1[temp+1]-y1[temp])*k
  17.         y2p=y2[temp]+(y2[temp+1]-y2[temp])*k
  18.         y3p=y3[temp]+(y3[temp+1]-y3[temp])*k
  19.     return y1p,y2p,y3p
  20. if __name__ == '__main__':
  21.     x=(1,2)
  22.     y=(3,4)
  23.     print "interp between x(1,2)y(3,4) at 2 is", interp(x,y,y,y,2)
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

点评

第13行有个错误,应该是x[i],而不是x  发表于 2013-5-1 12:25
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-9 21:13:23 | 显示全部楼层 来自 上海
本帖最后由 JingheSu 于 2011-6-9 21:32 编辑

文件读取和修改:INP中cae不支持的关键字的处理


Abaqus中有许多关键字都不支持CAE操作比如我这几天一直在弄得map solution import,所以如果想自动完成前处理并提交就必须先建模输出原始INP在修改原是INP得到完整的INP,这里的程序就是用来给原有的INP添加关键字Map solution的。
基本的思想就是读入原始INP查找是不是到了该加的地方了,如果是就加入Map solution数据行,over

  1. from sys import *
  2. from math import *
  3. from re import *
  4. inpName='Tensile'
  5. inpName1=inpName+'.inp'
  6. f1=open(inpName1,'r')
  7. newName='Map_'+inpName1
  8. f2=open(newName,'w')
  9. s1=f1.readlines()
  10. for s in s1:
  11. f2.write(s)
  12. ss=s.split()
  13. if len(ss)>=2:
  14.   if (ss[0]=='*End')&(ss[1]=='Assembly'):
  15.    translate_Y=12.0
  16.    translate_vector='0.0,'+str(translate_Y)+',0.0'+'\n'
  17.    f2.write('*Map solution\n')
  18.    f2.write(translate_vector)
  19. f1.close()
  20. f2.close()
  21. #os.remove(inpName1)
复制代码



注意:最后如果os.remove(inpName1)不注释那么原来的INP就会被删掉。


文件读取和修改:INP中节点信息的修改
利用上面相同的思路可以给单轴拉伸试件上做一个预凹痕。

  1. from sys import *
  2. from math import *
  3. from re import *
  4. inpName='Tensile'
  5. inpName1=inpName+'.inp'
  6. f1=open(inpName1,'r')
  7. newName='Nock_'+inpName1
  8. f2=open(newName,'w')
  9. s1=f1.readlines()
  10. meshSize=0.0015
  11. for s in s1:
  12. cord_s=s
  13. cord_modify=sub(',',' ',cord_s)
  14. cord_modify=split(' +',cord_modify)
  15. if len(cord_modify)==4:
  16.   nodeLable=cord_modify[1]
  17.   if nodeLable=='1373':
  18.    cord_mod_x=float(cord_modify[2])-0.4*meshSize
  19.    f2.write('   1373,  '+str(cord_mod_x)+',  '+cord_modify[3])
  20.   elif nodeLable=='1374':
  21.    cord_mod_x=float(cord_modify[2])-0.8*meshSize
  22.    f2.write('   1374,  '+str(cord_mod_x)+',  '+cord_modify[3])
  23.   elif nodeLable=='1375':
  24.    cord_mod_x=float(cord_modify[2])-1.2*meshSize
  25.    f2.write('   1375,  '+str(cord_mod_x)+',  '+cord_modify[3])
  26.   elif nodeLable=='1376':
  27.    cord_mod_x=float(cord_modify[2])-1.6*meshSize
  28.    f2.write('   1376,  '+str(cord_mod_x)+',  '+cord_modify[3])
  29.   elif nodeLable=='1377':
  30.    cord_mod_x=float(cord_modify[2])-2.0*meshSize
  31.    f2.write('   1377,  '+str(cord_mod_x)+',  '+cord_modify[3])
  32.   else:
  33.    f2.write(s)
  34. else:
  35.    f2.write(s)
  36. f1.close()
  37. f2.close()
  38. #os.remove(new1_testINP)
复制代码

其中1376等等就是你要修改的节点编号
效果如下:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-9 21:13:34 | 显示全部楼层 来自 上海
本帖最后由 JingheSu 于 2011-6-9 21:50 编辑

PythonExcel
目前处理数据离不开excel,所以pythoner必须学会用python操作excel表格。Pythonexcel交互方法也比较多,我一开始就接触的xlrd/xlwt包。直到现在也没有发现什么bug或者缺点,而且上次从ujs505那里知道Win32Com的方法64bit系统下无效了,但是xlrd/xlwt方法依然好用,我欣喜万分。具体的用法我有一个帖子里面有说明:
http://forum.simwe.com/thread-978057-1-1.html
这里给出我一个从材料单轴拉伸数据TRA文件中处理得到拉伸过程中各种应力应变量并记录到excel中的例子,其实这个例子比较乱,但是实在没有时间给弄个明了的版本了。大家将就看看。。
重点看看其中
1 读取一行文本后如何分割出自己想要的数据(就是re包里面几个函数的应用)

  1. myfile='tensile-'+str(i+1)
  2. f=open(myfile+'.TRA','r')
  3. while state:
  4.   s=f.readline()
  5.   s=re.sub(';',' ',s)
  6.   s=re.split(' +',s)
  7. #  print s
  8. #  print s0
  9.   if (s=="EOF")|(s==s0):
  10.    state=False
  11.   else:
  12.    force=float(s[1])
  13.    eee=float(s[0])/100.0
  14.    sss=force/area
  15.    test_force.append(force)
  16.    engineer_strain.append(eee)
  17.    engineer_stress.append(sss)
  18.    true_strain.append(log(1.0+eee))
  19.    true_stress.append(sss*(1.0+eee))
  20.    plastic_strain.append(log(1.0+eee)-sss*(1.0+eee)/E_modulus)
  21. f.close()
复制代码



2 python怎么读写excel那几行就行了。




  1. from xlwt import Workbook
  2. book=Workbook()
  3. sheet=book.add_sheet('test_NT',cell_overwrite_ok=True)
  4. sheet.write(0,nclown,'sample')
  5. sheet.write(0,nclown+2,name)
  6. sheet.write(1,nclown,"area")
  7. sheet.write(1,nclown+2,area)
  8. sheet.write(1,nclown+1,diameter)
  9. sheet.write(1,nclown+3,"E_modulus")
  10. sheet.write(1,nclown+4,E_modulus)
  11. sheet.write(2,nclown,"E_strain")
  12. sheet.write(2,nclown+1,"E_stress")
  13. sheet.write(2,nclown+2,"T_strain")
  14. sheet.write(2,nclown+3,"T_stress")
  15. sheet.write(2,nclown+4,"PL_strain")
复制代码




  1. import xlrd
  2. bk=xlrd.open_workbook('Static report.xls')
  3. sh=bk.sheet_by_name("Stat")
  4. E_modulus=sh.cell_value(i+2,7)
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-9 21:13:49 | 显示全部楼层 来自 上海
本帖最后由 JingheSu 于 2011-6-10 13:32 编辑

Python后处理解析

鉴于这一部分的重要性,把它单独列出来了
http://forum.simwe.com/thread-988907-1-1.html
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-9 21:14:14 | 显示全部楼层 来自 上海
本来这个里面应该在弄上一个前处理的部分就算是完整了,但是前处理部分我真是心有余而力不足,虽然自己也用但是就是不知道怎么讲出来。大家还是好好看cdstudio斑竹精品:Python二次开发程序详解
http://forum.simwe.com/viewthrea ... mp;highlight=python



最后了在给出一个比较综合的例子,用python来做简单的优化:详见http://forum.simwe.com/thread-980162-1-1.html

这是集前处理(建模并提交计算)后处理(提取odb数据)文件读写等于一身的例子。取这个例子只是想说明abaqus中python是个很好的工具可以利用它完成许多个性化的问题,只要你有想法就试着用python+abaqus来解决,这样才能学好python学好aba,而且乐在其中。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

发表于 2011-6-9 21:50:04 | 显示全部楼层 来自 广东广州
本帖最后由 北鹰南飞 于 2011-6-9 21:51 编辑

6# JingheSu
SU总攻城略地连下六城啊 ,这楼在下先帮你占着,恭候佳作~~~
------------------------------------------------------------------------------------------------------------
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-9 21:51:54 | 显示全部楼层 来自 上海
本帖最后由 JingheSu 于 2011-6-9 22:34 编辑

我们得定期交作业的。。。
————————————————————————————————————
此楼下各种有意义的回复和讨论都会加分

如果能贡献自己平时积攒的有用的代码或心得,技术分伺候!
回复 不支持

使用道具 举报

发表于 2011-6-10 10:51:59 | 显示全部楼层 来自 上海
顶..呵呵,这个帖子仔细拜读一下
回复 不支持

使用道具 举报

发表于 2011-6-10 11:09:35 | 显示全部楼层 来自 上海
本帖最后由 nbiao 于 2011-6-10 11:11 编辑

python现在也是我平常辅助数据处理的主要工具。接触python完全是因为abaqus,后来慢慢发现python的强大和便捷。以前一直是用matlab做数据处理,但有了免费的python之后,就很少打开matlab了,何况python在文本处理方面的功能比matlab强大很多。

这里是最近写的一个python脚本。功能就是对一个简单的热传导的模型提取每个step中每个frame中的节点的温度信息,做一些计算,算出来平均温度然后输出到一个csv文件中。后面可以用excel打开。
和版主不同,我把结果文件保存成csv,这样excel也可以打开,而且语法也很方便。csv就是一个文本格式的文件,大量数据的时候,应该速度比操作excel会快一些吧。
画图的话最近在尝试一个叫sciDavis的开源软件,和origin很像,支持python做脚本,好像还不错.
  1. import csv
  2. from odbAccess import *
  3. from abaqusConstants import *

  4. filename=getInput('Please input the ODB file name')
  5. #下面这样都是我定义的字典或list,用来存保存提取数据的
  6. elementArea={}  
  7. elementConn={}
  8. nodeArea   ={}
  9. timeTP     =[]
  10. #下面可以看做一般的从odb文件中提取结果的步骤
  11. #打开指定的odb文件
  12. odb=openOdb(path=filename)
  13. #得到assembly中所有的instance
  14. inst=odb.rootAssembly.instances
  15. #或取第一个instance中的所有单元,因为我这个odb里面只有一个instance
  16. #.keys()方法可以获得一个list有所有的instance名字
  17. elments=inst[inst.keys()[0]].elements
  18. #下面一段对单元循环,得到每个单元的几个结点,然后记录下来
  19. for el in elments:
  20.     label=el.label
  21.     nodes=el.connectivity
  22.     elementConn[label]=nodes

  23. #节点
  24. nodes=inst[inst.keys()[0]].nodes
  25. for nd in nodes:
  26.     label=nd.label
  27.     nodeArea[label]=0

  28. #打开指定的step
  29. st=odb.steps[odb.steps.keys()[0]]
  30. #对指定step的某个特定场变量做循环
  31. for v in st.frames[-1].fieldOutputs['EVOL'].values:
  32.     label=v.elementLabel
  33.     data =v.data
  34.     elementArea[label]=data

  35. for k,v in elementArea.iteritems():
  36.     nds=elementConn[k]
  37.     for nd in nds:
  38.         nodeArea[nd]+=0.25*v

  39.     #下面是提取每个frame中每个节点的NT11值
  40. frames=st.frames   
  41. for fr in frames:
  42.     nt11=fr.fieldOutputs['NT11'].values
  43.     time=fr.frameValue
  44.     sumTp=0
  45.     sumAr=0
  46.     for va in nt11:
  47.         label=va.nodeLabel
  48.         data=va.data
  49.         if data<0:
  50.             area=nodeArea[label]
  51.             sumTp+=data*area
  52.             sumAr+=area
  53.     try:
  54.         mean=float(sumTp)/float(sumAr)
  55.         timeTP.append( (time,mean))
  56.     except:
  57.         print fr.frameId
  58. filename=getInput('pleae input the csv file \n name to save')
  59. wr=csv.writer(file(filename ,'wb'))
  60. #这个把结果写进csv文件,只要一句,很简单,也可以在这一句之前写个表头
  61. wr.writerows(timeTP)
复制代码


python还是挺有意思的,我在我博客上有一个批量翻译英文单词的脚本。就是自己平常看文献攒下的一些单词调用google批量翻译一下.

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-6-10 11:42:59 | 显示全部楼层 来自 广东广州
1# JingheSu
因为从未用过python,请问如果我想开发一个新的算法(类似于buckle的改进型),该怎么用python在ABA中实现呢,这会不会是个较大的系统工程?
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-10 12:13:26 | 显示全部楼层 来自 上海
10# nbiao

sciDavis,开源软件!赞美,回去试试。

的确,存为csv会更快一点,不过为了省去再多进行一步数据倒入操作,所以我基本上都直接写入excel的,如果数据量很大的话可能就必须csv了
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-10 12:20:06 | 显示全部楼层 来自 上海
11# 北鹰南飞
buckle的改进型?你说的是计算程序么?
回复 不支持

使用道具 举报

发表于 2011-6-10 12:32:36 | 显示全部楼层 来自 黑龙江哈尔滨
佩服Jinghe Su兄,这么好的东西也拿来分享。以前我用python来修改inp做参数敏感性分析,可是写好了程序以后就舍不得放在论坛上,惭愧ing。
既然大家都提到了真么多python的包比如xlrd,我就再提两个,而这两个与abaqus联合基本可是实现matlab的一些优化和参数辨识的功能。
scipy和numpy。

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-6-10 12:34:57 | 显示全部楼层 来自 广东广州
13# JingheSu
是啊,这个能实现么?
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-10 12:45:18 | 显示全部楼层 来自 上海
汗,敦总给我们分享还少么。。
scipy和numpy这两个包是不是很大?我下了一个怎么200M+
回复 不支持

使用道具 举报

发表于 2011-6-10 14:37:18 | 显示全部楼层 来自 江苏南京
scipy和numpy好像没这么大,版主下的是Python(x,y)吧?这个大了一点,貌似500多M,包含了比较全的python工具箱

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-10 14:43:51 | 显示全部楼层 来自 上海
15# 北鹰南飞
python也就只是做做前后处理,具体的计算,得用fortran吧,子程序不知道可不可以实现?
回复 不支持

使用道具 举报

发表于 2011-6-10 15:15:24 | 显示全部楼层 来自 山东潍坊
JingheSu都优秀斑竹了啊?牛撒。
顺便再问一下,那个池总是谁?哈哈
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-10 15:29:44 | 显示全部楼层 来自 上海
楼上这位撒,真骚情呀
回复 不支持

使用道具 举报

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

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-19 14:15 , Processed in 0.059483 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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