Zastosowanie MES do
modelowania procesów odkształcenia materiałów
z nieliniowymi warunkami
brzegowymi
1. Wykorzystać zasadę wariacyjną:
(1)
gdzie - krzywa umocnienia
materiału (rys. 1); - naprężenie tarcia; - przemieszenie
poślizgu; - objętość ciała.
.
(dla zadania
płaskiego).
2. Przyjąć, ze kierunek t odpowiada kierunkowi osi X, czyli .
Wtedy ostatni członek
funkcjonału (1) można zapisać następująco:
, (2)
Gdzie Lij – długość strony elementu (rys.1); f – współczynnik tarcia;
Naprężenia można obliczyć za
pomocą formuł:
,
i po wykorzystaniu liniowych
funkcji kształtu:
.
Do formuły (2) potrzebujemy
tylko , ale obliczymy pozostałe komponenty tensora naprężeń jako
wyniki.
Rys. 1.
3. Zmodyfikować program
4. Zadanie:
Podany są
- wymiary próbki (2
warianty);
- formuła do wyznaczenia , wartości E, .
- współczynnik tarcia (2
warianty);
Wyznaczyć
- wykresy naprężeń na
kontakcie dla rozpatrywanych wariantów;
- wykresy Ux na kontakcie dla
rozpatrywanych wariantów;
- przeanalizować wyniki,
przedstawić interpretacje fizyczne uzyskanych zależności.
Uwaga!!!
W ramach pomocy studentom
publikuje rozwiązanie (przykładowe) w postaci kodu:
'***************************************************
'
Program do modelowania spęczania
'
za pomocą MES
'
Milenin A.
'
milenin@agh.edu.pl
'***************************************************
' Constants
Const g_nh = 500, g_ne = 1000
Type node
x As Double
y As Double
Ux As Double
Uy As Double
Ex As Double
Ey As Double
Exy As Double
Sx As Double
Sy As Double
Sxy As Double
Ei As Double
Si As Double
status As Integer
LOK(0 To 8) As Integer
End Type
Type element
nop(1 To 3) As Integer
End Type
Type dataFEM
nh As Integer
ne As Integer
dVel As Double
Gs As Double
k As Double
Uup As Double
Udown As Double
H0 As Double
B0 As Double
nhB As Integer
nhH As Integer
ND(1 To g_nh) As node
EL(1 To g_ne) As element
End Type
Dim gr As dataFEM
'***********************************************
'
Program glowny
'***********************************************
Sub mainFEM()
Call DataIni
'
Call DataGen
Call DataGenAuto
Call GetLOK
Call VisualData(0)
Call StatusCorr ' Tarcie
Call solve
Call VisualData(1)
End Sub
'*************************************************
Sub StatusCorr()
Dim ih As Integer
For ih = 1 To gr.nh
If (gr.ND(ih).status = 1) Then
gr.ND(ih).status = 2
End If
Next ih
End Sub
Sub solve()
Dim ih As Integer
Dim iter As Integer
Dim F0 As Double
Dim Fplus As Double
Dim dF As Double
For iter = 1 To 2800
For ih = 1 To gr.nh
If (gr.ND(ih).status = 0) Then
F0 = GetFunNode(ih)
gr.ND(ih).Ux = gr.ND(ih).Ux +
gr.dVel
Fplus = GetFunNode(ih)
If (Fplus > F0) Then
gr.ND(ih).Ux = gr.ND(ih).Ux
- 2 * gr.dVel
End If
gr.ND(ih).Uy = gr.ND(ih).Uy +
gr.dVel
Fplus = GetFunNode(ih)
If (Fplus > F0) Then
gr.ND(ih).Uy = gr.ND(ih).Uy -
2 * gr.dVel
End If
If (Abs(F0) <
0.000000001) Then F0 = 0.000000001
dF = Abs((Fplus - F0) / F0)
End If
If (gr.ND(ih).status = 2) Then
F0 = GetFunNode(ih)
gr.ND(ih).Ux = gr.ND(ih).Ux +
gr.dVel
Fplus = GetFunNode(ih)
If (Fplus > F0) Then
gr.ND(ih).Ux = gr.ND(ih).Ux
- 2 * gr.dVel
End If
End If
Next ih
Next iter
For ih = 1 To gr.nh
gr.ND(ih).x = gr.ND(ih).x + gr.ND(ih).Ux
gr.ND(ih).y = gr.ND(ih).y + gr.ND(ih).Uy
Next ih
End Sub
Function GetFunNode(ih As Integer)
Dim i As Integer
Dim ie As Integer
Dim Je As Double
GetFunNode = 0
For i = 1 To gr.ND(ih).LOK(0)
ie = gr.ND(ih).LOK(i)
Je =
clcFunkconal(ie)
GetFunNode = GetFunNode + Je
Next i
End Function
Sub GetLOK()
Dim ih As Integer
Dim ie As Integer
Dim j As Integer
For ih = 1 To gr.nh
gr.ND(ih).LOK(0) = 0
For ie = 1 To gr.ne
For j = 1 To 3
id = gr.EL(ie).nop(j)
If (id = ih) Then
gr.ND(ih).LOK(0)
= gr.ND(ih).LOK(0) + 1
gr.ND(ih).LOK(gr.ND(ih).LOK(0))
= ie
End
If
Next j
Next ie
Next ih
End Sub
Function clcFunkconal(ie As Integer)
Dim x(1 To 3) As Double
Dim y(1 To 3) As Double
Dim Ux(1 To 3) As Double
Dim Uy(1 To 3) As Double
Dim Ex As Double
Dim Ey As Double
Dim Exy As Double
Dim Ei As Double
Dim E0 As Double
Dim Si As Double
Dim E As Double
Dim k As Double
Dim Sx As Double
Dim Sy As Double
Dim Sxy As Double
Dim i(1 To 3) As Integer
Dim bi As Double
Dim bj As Double
Dim bk As Double
Dim ci As Double
Dim cj As Double
Dim ck As Double
Dim Ae As Double
Dim a As Double
Dim b As Double
Dim Je As Double
Dim L As Double
Dim St(1 To 3) As Integer
Dim Uposl As Double
Dim Jt As Double
x(1) = gr.ND(gr.EL(ie).nop(1)).x
x(2) = gr.ND(gr.EL(ie).nop(2)).x
x(3) = gr.ND(gr.EL(ie).nop(3)).x
y(1) = gr.ND(gr.EL(ie).nop(1)).y
y(2) = gr.ND(gr.EL(ie).nop(2)).y
y(3) = gr.ND(gr.EL(ie).nop(3)).y
Ux(1) = gr.ND(gr.EL(ie).nop(1)).Ux
Ux(2) = gr.ND(gr.EL(ie).nop(2)).Ux
Ux(3) = gr.ND(gr.EL(ie).nop(3)).Ux
Uy(1) = gr.ND(gr.EL(ie).nop(1)).Uy
Uy(2) = gr.ND(gr.EL(ie).nop(2)).Uy
Uy(3) = gr.ND(gr.EL(ie).nop(3)).Uy
St(1) = gr.ND(gr.EL(ie).nop(1)).status
St(2) = gr.ND(gr.EL(ie).nop(2)).status
St(3) = gr.ND(gr.EL(ie).nop(3)).status
L = 0
Uposl = 0
If (St(1) = 2) Then
If (St(2) = 2) Then
L = Abs(x(2) - x(1))
Uposl = (Ux(2) + Ux(1)) / 2
End If
End If
If (St(2) = 2) Then
If (St(3) = 2) Then
L = Abs(x(2) - x(3))
Uposl = (Ux(2) + Ux(3)) / 2
End If
End If
If (St(1) = 2) Then
If (St(3) = 2) Then
L = Abs(x(1) - x(3))
Uposl = (Ux(1) + Ux(3)) / 2
End If
End If
'
Jt = L * Uposl * 0.1
Jt = 0.1 * L * Uposl ^ 2
bi = y(2) - y(3)
ci =
x(3) - x(2)
bj = y(3) - y(1)
cj = x(1) - x(3)
bk = y(1) - y(2)
ck = x(2) - x(1)
Ae = x(2) * y(3) + x(1) * y(2) + y(1) *
x(3) - y(1) * x(2) - y(2) * x(3) - x(1) * y(3)
Ex = (bi * Ux(1) + bj * Ux(2) + bk * Ux(3))
/ (2 * Ae)
Ey = (ci * Uy(1) + cj * Uy(2) + ck * Uy(3))
/ (2 * Ae)
Exy = (bi * Uy(1) + bj * Uy(2) + bk * Uy(3)
+ ci * Ux(1) + cj * Ux(2) + ck * Ux(3)) / (4 * Ae)
Ei = (((2) ^ 0.5)
/ 3) * ((Ex - Ey) ^ 2 + Ex ^ 2 + Ey ^ 2 + 6 * Exy ^ 2)
E0 = (Ex + Ey) / 3
'
Sx
'
Sy
' Sz
a = 2000
b = 0.18
Si = a * Ei ^ b ' krzywa umocnienia
E = 1 ' debug
k
= 10 ' debug
' Je = a * Ei ^ (b + 1) / (b + 1) * Ae + k *
E0 ^ 2 * Ae
Je = E * Ei ^ 2 * Ae + k * E0 ^ 2 * Ae + Jt
clcFunkconal = Je
End Function
Sub DataIni()
Dim i As Integer
For i = 1 To g_nh
gr.ND(i).x = 0
gr.ND(i).y = 0
gr.ND(i).x = 0
gr.ND(i).y = 0
gr.ND(i).Sy = 0
gr.ND(i).Sxy = 0
gr.ND(i).Sx = 0
gr.ND(i).Si = 0
gr.ND(i).Ei = 0
gr.ND(i).Ex = 0
gr.ND(i).Exy = 0
gr.ND(i).Ey = 0
gr.ND(i).status = 0
Next i
End Sub
Sub DataGenAuto()
Dim x As Double
Dim y As Double
Dim dx As Double
Dim dy As Double
Dim i As Integer
Dim j As Integer
Dim id As Integer
Dim n1 As Integer
Dim n2 As Integer
Dim n3 As Integer
Dim n4 As Integer
'
Dane podstawowe
gr.dVel = 0.0005
gr.Uup = -1
gr.Udown = 1
gr.B0 = 10 'mm
gr.H0 = 10 'mm
gr.nhB = 6
gr.nhH = 6
gr.nh = gr.nhB * gr.nhH
gr.ne = (gr.nhB - 1) * (gr.nhH - 1) * 2
dx = gr.B0 / (gr.nhB - 1)
dy =
gr.H0 / (gr.nhH - 1)
y = 0
id = 1
For j = 1 To gr.nhH
x = 0
For i = 1 To gr.nhB
gr.ND(id).x = x
gr.ND(id).y = y
gr.ND(id).status = 0
If (j = 1) Then
gr.ND(id).status = 1
gr.ND(id).Ux = 0
gr.ND(id).Uy = gr.Udown
End If
If (j = gr.nhH) Then
gr.ND(id).status = 1
gr.ND(id).Ux = 0
gr.ND(id).Uy = gr.Uup
End If
x = x + dx
id = id + 1
Next i
y = y + dy
Next j
id = 1
For j = 1 To gr.nhH - 1
For i = 1 To gr.nhB - 1
ih = j + (i - 1) * (gr.nhH - 1)
'
'
n4 *---------* n1
'
I !
'
I !
'
I !
' I !
' n3 *---------* n2
'
n1 = j + (i - 1) * gr.nhH + gr.nhH + 1
n2 = j + (i - 1) * gr.nhH + 1
n3 = j + (i - 1) * gr.nhH
n4 = j + (i - 1) * gr.nhH + gr.nhH
gr.EL(id).nop(1) = n1
gr.EL(id).nop(2) = n3
gr.EL(id).nop(3) = n2
gr.EL(id + 1).nop(1) = n1
gr.EL(id
+ 1).nop(2) = n4
gr.EL(id + 1).nop(3) = n3
id = id + 2
Next i
y = y + dy
Next j
End Sub
Sub DataGen()
gr.dVel = 0.001
gr.Gs = 1
gr.k = 100
gr.Uup = -0.1
gr.Udown = 0.1
gr.nh = 7
gr.ne
= 6
gr.ND(1).x = -10
gr.ND(1).y = 10
gr.ND(1).status = 1
gr.ND(1).Ux = 0
gr.ND(1).Uy = gr.Uup
gr.ND(2).x = 10
gr.ND(2).y = 10
gr.ND(2).status = 1
gr.ND(2).Ux = 0
gr.ND(2).Uy = gr.Uup
gr.ND(3).x = 10
gr.ND(3).y = 0
gr.ND(3).status = 0
gr.ND(3).Ux = 0
gr.ND(3).Uy = 0
gr.ND(4).x = 10
gr.ND(4).y = -10
gr.ND(4).status = 1
gr.ND(4).Ux = 0
gr.ND(4).Uy = gr.Udown
gr.ND(5).x = -10
gr.ND(5).y = -10
gr.ND(5).status = 1
gr.ND(5).Ux = 0
gr.ND(5).Uy = gr.Udown
gr.ND(6).x = -10
gr.ND(6).y = 0
gr.ND(6).status = 0
gr.ND(6).Ux = 0
gr.ND(6).Uy = 0
gr.ND(7).x = 0
gr.ND(7).y = 0
gr.ND(7).status = 0
gr.ND(7).Ux = 0
gr.ND(7).Uy = 0
gr.EL(1).nop(1) = 1
gr.EL(1).nop(2) = 7
gr.EL(1).nop(3) = 2
gr.EL(2).nop(1)
= 7
gr.EL(2).nop(2) = 3
gr.EL(2).nop(3)
= 2
gr.EL(3).nop(1) = 3
gr.EL(3).nop(2)
= 7
gr.EL(3).nop(3) = 4
gr.EL(4).nop(1)
= 7
gr.EL(4).nop(2) = 5
gr.EL(4).nop(3)
= 4
gr.EL(5).nop(1) = 7
gr.EL(5).nop(2)
= 6
gr.EL(5).nop(3)
= 5
gr.EL(6).nop(1)
= 6
gr.EL(6).nop(2) = 7
gr.EL(6).nop(3) = 1
End Sub
Sub VisualData(kod As Integer)
Dim i As Integer
Dim pnt1(0 To 2) As Double
Dim
pnt2(0 To 2) As Double
Dim pnt3(0 To 2) As Double
Dim color As AcadAcCmColor
Dim myGrid As Acad3DFace
For i = 1 To gr.ne Step 1
pnt1(0)
= gr.ND(gr.EL(i).nop(1)).x
pnt1(1) = gr.ND(gr.EL(i).nop(1)).y
pnt1(2) = 0
pnt2(0) = gr.ND(gr.EL(i).nop(2)).x
pnt2(1) = gr.ND(gr.EL(i).nop(2)).y
pnt2(2) = 0
pnt3(0) = gr.ND(gr.EL(i).nop(3)).x
pnt3(1) = gr.ND(gr.EL(i).nop(3)).y
pnt3(2) = 0
Set myGrid = ThisDrawing.ModelSpace.Add3DFace(pnt1, pnt2, pnt3, pnt3)
Set color =
AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.16")
If (kod = 0) Then
Call color.SetRGB(80, 100, 244)
Else
Call color.SetRGB(128, 100,
128)
End If
myGrid.TrueColor = color
Next i
End Sub
Rys. Wyniki modelowania