Teoretické základy výpočtu vzdálenosti
Pro nalezení uzlů sítě KP, které se nacházejí v blízkosti linie nebo případně na ní, je třeba spočítat vzdálenost uzlu od linie. Je přitom dána linie s počátečním a koncovým bodem (N0 a N1) a bod P, jehož vzdálenost od linie se má určit. Při výpočtu vzdálenosti se běžně postupuje tak, že se vytvoří rovina, která prochází bodem P a je kolmá na přímku. K tomu je nejdříve třeba sestavit vhodnou rovnici pro přímku. V tomto případě se nabízí parametrické vyjádření, v jehož tvaru je obsažen směrový vektor v. Můžeme ho následně použít při sestavování rovnice pro rovinu.
Pro podpůrný vektor A se použije počáteční bod (polohový vektor) linie a pro směrový vektor v se použije rozdíl obou polohových vektorů. Rovnice pro rovinu bude mít z již uvedeného důvodu normálový tvar.
Podpůrný vektor P je zde hledaný výsledný bod Pres. Normálový vektor je směrový vektor přímky, protože rovina je kolmá k přímce. Před výpočtem vzdálenosti je třeba ještě stanovit faktor s přímky, v níž rovina přímku protíná. Pro tento účel se rovnicí přímky nahradí polohový vektor X v rovinné rovnici.
Zkonvertováno na s a začíná na
Lze tak nyní stanovit průsečík S pomocí rovnice 1.
Vzdálenost d mezi S a Pres se stanoví na základě velikosti vektoru odpovídající rozdílu mezi nimi.
Na obr. 01 jsou schematicky znázorněny veškeré uvedené složky. Modrá plocha je analyzovaná plocha a červená plocha představuje rovinu řezu, která je definována bodem Pres a směrovým vektorem
Výpočet vzdálenosti v programu
Po sestavení rovnic můžeme vytvořit příslušný program. Pro převod se používá EXCEL VBA. Na obr. 02 je znázorněno číslování prvků.
Prvním krokem je připojení k programu RFEM. Následně vyvoláme rozhraní k údajům o modelu. Vzhledem k tomu, že tento postup jsme již popsali v jiných příspěvcích (viz odkazy), nyní ho přeskočíme. Přejdeme ke zdrojovému kódu pro spuštění programu.
Sub selection_test2()
Dim line_no As Integer
Dim surface_no As Integer
Dim loadcase_no As Integer
Dim d_tol As Double
line_no = 11
surface_no = 1
loadcase_no = 1
d_tol = 0,001
' get interface from the opened model and lock the licence/program
Dim iModel As RFEM5.IModel2
Set iModel = GetObject(, "RFEM5.Model")
iModel.GetApplication.LockLicense
On Error GoTo e
Dim iModelData As RFEM5.IModelData2
Set iModelData = iModel.GetModelData
Před spuštěním programu je třeba nejdříve zadat proměnné parametry. Patří k nim číslo linie line_no, na které se mají hledat výsledky, a samozřejmě číslo plochy surface_no, na které se linie nachází. Dále je třeba zadat číslo zatěžovacího stavu loadcase_no, ke kterému výsledky náleží. Vzhledem k tomu, že se jedná o numerický výpočet s omezenou přesností, je nutné stanovit toleranci d_tol, která udává maximální vzdálenost mezi linií a uzlem. V tomto příkladu se uvažuje tolerance 1 mm.
Protože nyní máme k dispozici rozhraní pro údaje o modelu (IModelData), může se nejdříve vyhledat linie, a tedy i její počáteční a koncový bod.
' získat linii
Dim ILin As RFEM5.ILine
Set ILin = iModelData.GetLine(line_no, AtNo)
Dim lin As RFEM5.RfLine
lin = ILin.GetData
' získat uzly z linie
Dim n(0 To 1) Jako RFEM5.Uzel
Dim ints() As Integer
ints = strToIntArr(lin.NodeList)
Dim iNd As RFEM5.INode
Set iNd = iModelData.GetNode(ints(0), AtNo)
n(0) = iNd.GetData
Set iNd = iModelData.GetNode(ints(UBound(ints, 1)), AtNo)
n(1) = iNd.GetData
Nastavíme iNd = nic
Uzly i linie vyvoláme jednotlivě přímo přes jejich rozhraní (INode nebo ILine). Pro vypsání čísel uzlů ze znakového řetězce (RfLine.NodeList) se použije funkce strToIntArr, kterou popisujeme v jiném příspěvku (viz odkazy). Konvertuje znakový řetězec do číselného pole.
S nyní danými body linie
Dim v As RFEM5.Point3D
vX = N(1).X - N(0).X
vY = N(1).Y - N(0).Y
vZ = N(1).Z - N(0).Z
Dim A As RFEM5.Point3D
AX = N(0).X
AY = N(0).Y
AZ = N(0).Z
Dim v2 As Double
v2 = vX ^ 2 + vY ^ 2 + vZ ^ 2
Dim P_res As RFEM5.Point3D
Dim s As Double
Dim d As Double
Stane se vektorem směru
Výpočet vzdálenosti ve smyčce
V našem příkladu jsme se rozhodli zpracovat výsledky na základě uzlů sítě konečných prvků. Kontrola vzdálenosti probíhá ve smyčce nad polem těchto výsledků. Nejdříve je třeba výsledky vyvolat pomocí rozhraní ICalculation2 a následně IResults. Ve smyčce je nejdříve popsán bod Pres pomocí souřadnic výsledné hodnoty (pro přehlednost). Poté lze provést přímý výpočet rovnice (4). Po výpočtu s je možné zkontrolovat, zda je hodnota menší než nula nebo větší než jedna, protože tyto hodnoty leží mimo přímku, respektive před a za přímkou. Pokud se hodnota nachází v tomto rozmezí, vypočítá se vzdálenost pomocí rovnice (6).
' získat výsledky v uzlech fe-uzlů
Dim iCalc As ICalculation2
Set iCalc = iModel.GetCalculation
Dim iRes As RFEM5.IResults
Set iRes = iCalc.GetResultsInFeNodes(LoadCaseType, loadcase_no)
Dim surfBaStr() As RFEM5.SurfaceBasicNapětí
surfBaStr = iRes.GetSurfaceBasicStresses(surface_no, AtNo)
' procházet napětími a vypočítat vzdálenost k linii
Dim i As Integer
Pro i = 0 To UBound(surfBaStr, 1)
P_res.X = surfBaStr(i).Coordinates.X
P_res.Y = surfBaStr(i).Coordinates.Y
P_res.Z = surfBaStr(i).Coordinates.Z
' výpočet součinitele pro liniovou rovnici průniku
s = ((P_res.XA.X)*vX + (P_res.YA.Y)*vY + (P_res.ZA.Z)*vZ)/v2
Pokud s <= 1 + d_tol A s >= 0 - d_tol Pak
' vypočítat vzdálenost průsečíku a uzlu fe-uzlu
d = ((P_res.X-(A.X+s*vX))^2
+(P_res.Y-(A.Y+s*vY))^2
+(P_res.Z-(A.Z+s*vZ))^2)^0,5
If (d < d_tol) Pak
' zde lze zpracovat nalezený výsledkový bod
End If
End If
Další i
Pro kontrolu faktoru s a také vzdálenosti d se nastaví určitá tolerance, aby případné drobné nepřesnosti nevedly k vyloučení výsledku.
Výsledky programu
Hodnoty nalezené programem jsou zobrazeny v tabulce se zaokrouhlením na dvě desetinná místa.
σy+ [N/mm²] | Faktor s [-] |
---|---|
21,90 | 0,0 |
17,28 | 0,1 |
12,79 | 0,2 |
8,43 | 0,3 |
4,17 | 0,4 |
-0,04 | 0,5 |
-4,25 | 0,6 |
-8,51 | 0,7 |
-12,87 | 0,8 |
-17,36 | 0,9 |
-21,98 | 1,0 |
Pro srovnání jsou k dispozici hodnoty z průběhu výsledků na příslušné linii, které vidíme na obr. 03.
Je zřejmé, že hodnoty si odpovídají a že byla dosažena 100% shoda, respektive byly nalezeny všechny hodnoty na linii.
Závěr a výhled
Na základě vektorového výpočtu byl vytvořen program, který umožňuje najít uzly podél linie. Pomocí tohoto algoritmu lze kromě výsledků vyhledávat i všechny ostatní geometrické prvky. Tento postup je velmi užitečný, protože vizuální výběr není přes rozhraní COM samozřejmě možný. Výběr lze ovšem provést jiným způsobem pomocí funkce. U programů, které běží zcela na pozadí, může takto probíhat automatické vyhodnocení výsledků.