Теоретические основы расчета промежутков
Для того, чтобы найти узлы сетки КЭ, находящиеся близко линии или на линии, необходимо рассчитать промежуток от узла до линии. При этом нам дана линия с начальной и конечной точкой (N0 и N1), а также точка P, отступ которой от линии необходимо определить. Распространенным способом расчета данного промежутка является создание плоскости, которая проходит через точку P и перпендикулярна прямой. Для этого необходимо сначала составить подходящее уравнение линии. В этом случае рекомендуется применить параметрическую форму, которая содержит направляющий вектор v. Затем его можно применить для составления уравнения плоскости.
Для опорного вектора A используется начальная точка (радиусный вектор) линии, а для направляющего вектора v - разность двух радиусных векторов. В качестве уравнения плоскости будет применена нормальная форма по указанной выше причине.
Опорный вектор P в данном случае - это результативная точка Pres, подлежащая анализу. Вектор нормали является направляющим вектором прямой, поскольку плоскость перпендикулярна прямой. Прежде чем рассчитать отступ, необходимо определить коэффициент s прямой, по которой плоскость пересекает прямую. Для этого радиусный вектор X в уравнении плоскости заменяется уравнением прямой.
Скорректировано в соответствии с s и
Таким образом, теперь можно с помощью уравнения 1 определить точку пересечения S.
Промежуток d между S и Pres определяется посредством величины вектора, соответствующей разности между ними.
На рисунке 01 схематически показаны все перечисленные элементы. Синяя поверхность - это анализируемая поверхность, а красная поверхность представляет собой плоскость сечения, которая была задана с помощью точки Pres и направляющего вектора
Выполнение расчета промежутка в программе
После составления формул можно создать соответствующую программу. Для перевода применяется EXCEL VBA. На рисунке 02 показана нумерация элементов.
Сначала необходимо подключится к программе RFEM. Затем выберем интерфейс для данных модели. Поскольку этот алгоритм уже был пояснен в различных статьях (см. ссылки), не будем на нем останавливаться подробно. Ниже приведен исходный код для запуска программы.
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
Перед запуском программы сначала необходимо задать переменные параметры. К ним относятся номер строки line_no, в которой требуется выполнить поиск результатов, и, конечно, номер поверхности surface_no, на которой расположена линия. Кроме того, необходимо задать номер нагружения loadcase_no, к которому относятся результаты. Поскольку выполняется численное вычисление с ограниченной точностью, требуется задать допуск d_tol, который определяет максимальное расстояние между линией и узлом. В данном примере применен допуск, равный один миллиметр.
Так как теперь у нас имеется интерфейс для данных модели (IModelData), то можно сначала выполнить поиск линии, и тем самым ее начальной и конечной точки.
' get line
Dim ILin As RFEM5.ILine
Set ILin = iModelData.GetLine(line_no, AtNo)
Dim lin As RFEM5.RfLine
lin = ILin.GetData
' get nodes from line
Dim n(0 To 1) As RFEM5.Node
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
Set iNd = Nothing
Выберем узлы и линии по отдельности прямо через их интерфейс (INode или ILine). Чтобы извлечь номера узлов из строки символов (RfLine.NodeList), применяется функция strToIntArr, описанная в другой статье (см. ссылки). Она преобразует строку символов в цифровое поле.
Dim v As RFEM5.Point3D
v.X = N(1).X - N(0).X
v.Y = N(1).Y - N(0).Y
v.Z = N(1).Z - N(0).Z
Dim A As RFEM5.Point3D
A.X = N(0).X
A.Y = N(0).Y
A.Z = N(0).Z
Dim v2 As Double
v2 = v.X ^ 2 + v.Y ^ 2 + v.Z ^ 2
Dim P_res As RFEM5.Point3D
Dim s As Double
Dim d As Double
Рассчитываются или подготавливаются направляющий вектор
Расчет промежутка с помощью цикла
В данном примере была выбрана обработка результатов на основе узлов сетки КЭ. Проверка промежутка происходит с помощью цикла над полем результатов. Сначала необходимо открыть данные результаты через интерфейс ICalculation2, а затем - IResults. Внутри цикла а первую очередь определяется точка Pres с помощью координат конечного значения (для наглядности). Затем мы можем выполнить прямой расчет уравнения (4). После вычисления s можно проверить, является ли значение меньше нуля или больше единицы, так как эти значения лежат вне прямой или до и после прямой. Если значение находится в данном интервале, то промежуток рассчитывается по уравнению (6).
' get results in fe-nodes
Dim iCalc As ICalculation2
Set iCalc = iModel.GetCalculation
Dim iRes As RFEM5.IResults
Set iRes = iCalc.GetResultsInFeNodes(LoadCaseType, loadcase_no)
Dim surfBaStr() As RFEM5.SurfaceBasicStresses
surfBaStr = iRes.GetSurfaceBasicStresses(surface_no, AtNo)
' loop through stresses and calculate distance to line
Dim i As Integer
For 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
' calculate factor for line equation of intersection
s = ((P_res.X-A.X)*v.X + (P_res.Y-A.Y)*v.Y + (P_res.Z-A.Z)*v.Z) / v2
If s <= 1 + d_tol And s >= 0 - d_tol Then
' calculate distance of intersection point and fe-node
d = ((P_res.X-(A.X+s*v.X))^2
+(P_res.Y-(A.Y+s*v.Y))^2
+(P_res.Z-(A.Z+s*v.Z))^2)^0.5
If (d < d_tol) Then
' here you can process the found result point
End If
End If
Next i
Для проверки коэффициента s и промежутка d применяется допустимое отклонение, для того, чтобы небольшие неточности не приводили к исключению результата.
Результаты программы
Найденные программой значения отображаются в таблице с округлением до двух десятичных знаков.
σy+ [Н/мм²] | Коэффициент 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 |
Для сравнения, значения диаграммы результатов на соответствующей линии показаны на рисунке 03.
Очевидно, что значения одинаковы и получено совпадение на 100%, то есть все значения были найдены на линии.
Заключение
С помощью векторного вычисления была создана программа, которая дает возможность найти узлы, расположенные вдоль линии. На основе данного алгоритма можно производить не только поиск полученных результатов, но и любых других геометрических элементов. Это особенно ценно, так как объективно невозможный в интерфейсе COM визуальный выбор таким образом становится возможным иным способом через функцию. Например, у программ, которые полностью работают в фоновом режиме, можно таким образом выполнить автоматическую оценку результатов.