#!/user/bin/python
#-*-coding:UTF-8-*-
#读取inp文件
import sys
File_path='C:/Users/administrator/Desktop/PY-COH/'
Inp_name='Test.inp'
NEW_INPNAME='TestNew.inp'
#CO_SET startswith
COSTARTS='*Elset, elset=CO_SET, instance=Part-1-1, generate'
Ori_inp=open(File_path+Inp_name,'r')
#读取节点编号及坐标信息
Node_dic={}
Inp_line=Ori_inp.readlines()
#Inp_val辅助判断
#结点存储为字典格式,结点号为索引,其索引内容为结点坐标
Inp_value=0
Inp_value=0
for i in range(len(Inp_line)):
if Inp_line[i].startswith('*Node'):
Inp_value+=1
if Inp_line[i].startswith('*Element'):
Inp_value+=1
break
if Inp_value==1:
try:
Node1=[float(cor) for cor in Inp_line[i+1].split(',')]
Node1[0]=int(Node1[0])
Node_dic[Node1[0]]=[]
Node_dic[Node1[0]].append(Node1[1])
Node_dic[Node1[0]].append(Node1[2])
except:pass
#此程序默认需要添加cohesive单元的区域为三角形单元
Nodel=[]
Inp_value=0
#读取单元结点编号
Element_dic={}
EL_FOUR=[]
EL_THR=[]
for i in range(len(Inp_line)):
if Inp_line[i].startswith('*Element'):
Inp_value+=1
if Inp_value==1:
try:
Node1=[int(cor) for cor in Inp_line[i+1].split(',')]
Element_dic[Node1[0]]=[]
if len(Node1)==5:
EL_FOUR.append(Node1[0])
Element_dic[Node1[0]].extend(Node1[1:5])
elif len(Node1)==4:
EL_THR.append(Node1[0])
Element_dic[Node1[0]].extend(Node1[1:4]) #此处用extend更好
except:
Inp_value=0
EL_FOUR.sort()
EL_THR.sort()
#读取需添加cohesive单元的单元集合
#此处需定义单元的结点编号
#CO_ELSET为在inp之前建立的单元集合
#CO_SET为新生成的cohesive单元(命名不清)
Node1=[]
Inp_value=0
ESET_value=0
CO_ELSET=[]
for i in range(len(Inp_line)):
if Inp_line[i].startswith(COSTARTS):
Inp_value+=1
ESET_value=1
if Inp_line[i].startswith('*Elset, elset=CO_SET\n'):
Inp_value+=1
ESET_value=0
if Inp_value :
if ESET_value:
try:
Node1=[int(cor) for cor in Inp_line[i+1].split(',')]
Num=Node1[1]-Node1[0]+1
for k in range(Num):
S=Node1[0]+k
CO_ELSET.append(S)
except:
Inp_value=0
break
else:
try:
Node1=[int(cor) for cor in Inp_line[i+1].split(',')]
for NODE in Node1:
CO_ELSET.append(NODE)
except:
Inp_value=0
Node1=0
k=0
break
#添加cohesive单元的步骤
#(1)形成cohesive单元结点集,并找出其重复次数
#(2)找出重复单元变数,并根据边数形成cohesive单元
#此处可修改使其适用于四节点单元
CO_NODE=[]
for i in range(len(CO_ELSET)):
CO_NODE.extend(Element_dic[CO_ELSET[i]])
#寻找重复节点数
CO_NODE_SORT=sorted(CO_NODE)
NODECO=[]
NODECO_DIC={}
for i in CO_NODE_SORT:
if i not in NODECO_DIC.keys():
NODECO_DIC[i]=[]
if CO_NODE_SORT.count(i)>1:
NODECO.append(i)
NODECO_DIC[i].append(CO_NODE_SORT.count(i))
#获得重复节点数对应的单元信息,并生成新的结点
NEWNODE=max(Node_dic.keys())
NODECO_NEW_DIC={}
for i in NODECO:
NODERE=NODECO_DIC[i][0]
EL_RE=[]
NEW_NODE=[]
for EL in CO_ELSET:
if i in Element_dic[EL]:
EL_RE.append(EL)
EL_RE.sort()
NODECO_DIC[i].append(EL_RE)
NODECO_NEW_DIC[i]={}
NODECO_NEW_DIC[i].update({EL_RE[0]:[i,Element_dic[EL_RE[0]].index(i)]})
for LS in range(len(EL_RE)-1):
NEWNODE= NEWNODE+1
NODECO_NEW_DIC[i].update({EL_RE[LS+1]:[NEWNODE,Element_dic[EL_RE[LS+1]].index(i)]})
Node_dic[NEWNODE]=[]
Node_dic[NEWNODE]=Node_dic[i]
#获取重复边数数并记录
#(1)生成边数
#(2)寻找重复边数
#(1)
#CO_EDGE=()
EDGEINEL={}
for k in range(len(CO_ELSET)):
if CO_ELSET[k] in Element_dic:
if len(Element_dic[CO_ELSET[k]])==3:
a=(Element_dic[CO_ELSET[k]][0],Element_dic[CO_ELSET[k]][1])
b=(Element_dic[CO_ELSET[k]][1],Element_dic[CO_ELSET[k]][2])
c=(Element_dic[CO_ELSET[k]][2],Element_dic[CO_ELSET[k]][0])
#CO_EDGE=CO_EDGE+(a,)+(b,)+(c,)
EDGEINEL[CO_ELSET[k]]=()
EDGEINEL[CO_ELSET[k]]=(a,)+(b,)+(c,)
if len(Element_dic[CO_ELSET[k]])==4:
a=(Element_dic[CO_ELSET[k]][0],Element_dic[CO_ELSET[k]][1])
b=(Element_dic[CO_ELSET[k]][1],Element_dic[CO_ELSET[k]][2])
c=(Element_dic[CO_ELSET[k]][2],Element_dic[CO_ELSET[k]][3])
d=(Element_dic[CO_ELSET[k]][3],Element_dic[CO_ELSET[k]][0])
#CO_EDGE=CO_EDGE+(a,)+(b,)+(c,)+(d,)
EDGEINEL[CO_ELSET[k]]=()
EDGEINEL[CO_ELSET[k]]=(a,)+(b,)+(c,)+(d,)
#(2)
#寻找CO_EDGE中重复的元组,其即为需要添加单元的边
#用求法线的方法形成四边形
#如果为四边形此处需要修改
k=0
ELEMENT_CO=max(Element_dic.keys())
#存储cohesive element单元集合
CO_SET=[]
for EL in range(len(CO_ELSET)-1):
k=EL+1
for k in range(k,len(CO_ELSET)):
EDGE1=EDGEINEL[CO_ELSET[EL]]
EDGE2=EDGEINEL[CO_ELSET[k]]
for ED1 in EDGE1:
for ED2 in EDGE2:
if sum(ED1)==sum(ED2)and abs(ED1[0]-ED1[1])==abs(ED2[0]-ED2[1]):
#完成新单元创建和旧单元中坐标的替换
NODE1=ED1[0]
NODE2=ED1[1]
#CO_ELSET[EL]
NODE3=ED2[0]
NODE4=ED2[1]
#CO_ELSET[k]
#CO_ELSET[EL]
#if NODE1 in Element_dic[CO_ELSET[EL]]:
#LOC位置的放置
Loc=NODECO_NEW_DIC[NODE1][CO_ELSET[EL]][1]
#if CO_ELSET[EL] in NODECO_NEW_DIC[NODE1].keys():
Element_dic[CO_ELSET[EL]][Loc]=NODECO_NEW_DIC[NODE1][CO_ELSET[EL]][0]
NODE1=NODECO_NEW_DIC[NODE1][CO_ELSET[EL]][0]
#if NODE2 in Element_dic[CO_ELSET[EL]]:
Loc=NODECO_NEW_DIC[NODE2][CO_ELSET[EL]][1]
#if CO_ELSET[EL] in NODECO_NEW_DIC[NODE2].keys():
Element_dic[CO_ELSET[EL]][Loc]=NODECO_NEW_DIC[NODE2][CO_ELSET[EL]][0]
NODE2=NODECO_NEW_DIC[NODE2][CO_ELSET[EL]][0]
##CO_ELSET[k]
#if NODE3 in Element_dic[CO_ELSET[k]]:
Loc=NODECO_NEW_DIC[NODE3][CO_ELSET[k]][1]
#if CO_ELSET[k] in NODECO_NEW_DIC[NODE3].keys():
Element_dic[CO_ELSET[k]][Loc]=NODECO_NEW_DIC[NODE3][CO_ELSET[k]][0]
NODE3=NODECO_NEW_DIC[NODE3][CO_ELSET[k]][0]
#if NODE4 in Element_dic[CO_ELSET[k]]:
Loc=NODECO_NEW_DIC[NODE4][CO_ELSET[k]][1]
#if CO_ELSET[k] in NODECO_NEW_DIC[NODE4].keys():
Element_dic[CO_ELSET[k]][Loc]=NODECO_NEW_DIC[NODE4][CO_ELSET[k]][0]
NODE4=NODECO_NEW_DIC[NODE4][CO_ELSET[k]][0]
ELEMENT_CO=ELEMENT_CO+1
Element_dic[ELEMENT_CO]=[NODE2,NODE1,NODE4,NODE3]
CO_SET.append(ELEMENT_CO)
#######生成新的inp文件
File_path='C:/Users/administrator/Desktop/PY-COH/'
outfile=open(File_path+NEW_INPNAME,'w+')
outfile.close()
outfile=open(File_path+NEW_INPNAME,'a+')
#文件头的书写
Heading=[]
Heading.append('*He
评论11