Zastosowanie MES do
modelowania procesów odkształcenia materiałów 
z nieliniowymi warunkami
brzegowymi
1. Wykorzystać zasadę wariacyjną: 
 (1)
                                 (1)
gdzie  - krzywa umocnienia
materiału (rys. 1);
 - krzywa umocnienia
materiału (rys. 1);  - naprężenie tarcia;
- naprężenie tarcia;  - przemieszenie
poślizgu;
 - przemieszenie
poślizgu;  - objętość ciała.
 - objętość ciała.
 .
.
 (dla zadania
płaskiego).
 (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)
,                                                            (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.
, 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,
, 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