Eng-Tips is the largest engineering community on the Internet

Intelligent Work Forums for Engineering Professionals

How to calculate area of each element for homogenization?

Status
Not open for further replies.

elysium95

Materials
May 22, 2023
3
0
0
DE
Hello every body,
I am quite new in python scripting of abaqus. Recently I am writing a script to loop over all steps and then all frames in my odb file. And then extract stress and strain components for each element in each frame and at the end homogenize over all elements in that frame.Since my elements does not have the same size, I thought to multiply each component with volume of that element and then divide it by whole volume. My model is in 2D and for calculating volume I am using EVOL as field output for calculating volume.However, when I run the script I get volume as zero!I think it is due to the fact that my model is in 2D and elements do not have any volume!so basically I need to calculate the area of elements rather than volume, but I don't know how to bring area in abaqus.Below is my python script to calculate the stress and strain components.Would be appreciated if you help me out!
def write_res():
global a
a = np.array([])
odb = openOdb(abq_job+'.odb', readOnly=True)
ubc = np.zeros(2)
elementset=odb.rootAssembly.instances['PART-1-1'].elements
n_elements=len(elementset)
V=0
volume= np.zeros(n_elements)
s11 = np.zeros(n_elements)
s22 = np.zeros(n_elements)
s33 = np.zeros(n_elements)
s12 = np.zeros(n_elements)

Le11 = np.zeros(n_elements)
Le22 = np.zeros(n_elements)
Le33 = np.zeros(n_elements)
Le12 = np.zeros(n_elements)

ep11 = np.zeros(n_elements)
ep22 = np.zeros(n_elements)
ep33 = np.zeros(n_elements)
ep12 = np.zeros(n_elements)
peeq = np.zeros(n_elements)
sdeg = np.zeros(n_elements)
duct_crt = np.zeros(n_elements)
with open(path_r+f_name,'a') as f:
for step in odb.steps.values(): # iterate through all the steps in the ODB
for frame in step.frames:
# iterate through all the frames in the step
field_stress = frame.fieldOutputs['S']
field_strain = frame.fieldOutputs['LE']
field_plastic_strain =frame.fieldOutputs['PE']
field_peeq = frame.fieldOutputs['PEEQ']
field_sdeg = frame.fieldOutputs['SDEG']
field_duc = frame.fieldOutputs['DUCTCRT']
field_volume = frame.fieldOutputs['EVOL']
# Get the subset of the stress and strain field data for the element set
subfield_stress = field_stress.getSubset(CENTROID)
subfield_strain = field_strain.getSubset(CENTROID)
subfield_plastic_strain=field_plastic_strain.getSubset(CENTROID)
subfield_peeq=field_peeq.getSubset(CENTROID)
subfield_sdeg=field_sdeg.getSubset(CENTROID)
subfield_duc =field_duc.getSubset(CENTROID)
subfield_volume=field_Volume.getSubset(CENTROID)
ubc[0] = xload
ubc[1] = yload


# Loop over all stress and strain field data in the subset
for i in range(len(subfield_volume.values)):
volume =subfield_volume.values.data
s11 = subfield_stress.values.data[0]*volume
s22 = subfield_stress.values.data[1]*volume
s33 = subfield_stress.values.data[2]*volume
s12 = subfield_stress.values.data[3]*volume

Le11 = subfield_strain.values.data[0]*volume
Le22 = subfield_strain.values.data[1]*volume
Le33 = subfield_strain.values.data[2]*volume
Le12 = subfield_strain.values.data[3]*volume

ep11 = subfield_plastic_strain.values.data[0]*volume
ep22 = subfield_plastic_strain.values.data[1]*volume
ep33 = subfield_plastic_strain.values.data[2]*volume
ep12 = subfield_plastic_strain.values.data[3]*volume
peeq = subfield_peeq.values.data*volume
sdeg = subfield_sdeg.values.data*volume
duct_crt=subfield_duc.values.data*volume
# Calculate the average stress components for each element for the current frame
V= sum (volume)
s11_avg = sum(s11)/V
s22_avg = sum(s22)/V
s33_avg = sum(s33)/V
s12_avg = sum(s12)/V
Le11_avg = sum(Le11)V
Le22_avg = sum(Le22)/V
Le33_avg = sum(Le33)/V
Le12_avg = sum(Le12)V
ep11_avg = sum(ep11)V
ep22_avg= sum(ep22)/V
ep33_avg= sum(ep33)/V
ep12_avg= sum(ep12)/V
peeq_avg = sum(peeq)/V
sdeg_avg= sum(sdeg)/V
duc_crt_avg= sum(duct_crt)/V
# Append the results to the row variable
row = np.array([s11_avg, s22_avg, s33_avg, s12_avg, Le11_avg, Le22_avg, Le33_avg, Le12_avg, ep11_avg, ep22_avg, ep33_avg, ep12_avg,peeq_avg,sdeg_avg,duc_crt_avg,ubc[0],ubc[1]])
#a=np.append(a,row)
row.tofile(f, sep=';', format='%12.5e')
f.write('\n')

return None
 
Replies continue below

Recommended for you

Maybe something is wrong with the script. EVOL should work for 2D elements as well and show their area (at least when the thickness is 1).
 
Status
Not open for further replies.
Back
Top