Introducción teórica para el cálculo de la distancia
Para encontrar los nudos de elementos finitos que están cerca de la línea o en ella, se debe calcular la distancia del nudo a la línea. Se proporciona la línea con el punto inicial y final (N0 y N1) y el punto P cuya distancia a la línea será determinada. Una forma común de calcular esta distancia es extender un plano que atraviesa el punto P y es perpendicular a la línea recta. Para este propósito, primero se debe establecer una ecuación lineal adecuada. En este caso, se recomienda utilizar la forma del parámetro, que contiene un vector de dirección v. Puede usarlo para configurar la ecuación del plano.
Para el vector de apoyo A, se usa el punto de partida (vector de posición) de la línea y para el vector de dirección v, se usa la diferencia de los dos vectores de posición. La forma normal se usa como la ecuación plana por la razón ya mencionada.
El vector de apoyo P es el punto de resultado Pres a analizar. El vector normal es el vector de dirección de la línea recta porque el plano es ortogonal a esa línea. Antes de calcular la distancia, es necesario determinar el factor s de la línea donde el plano se cruza con la línea. Para este propósito, se reemplaza el vector de ubicación X en la ecuación del plano por la ecuación de la línea recta.
Convertido a s y comenzando con
Por lo tanto, es posible determinar el punto de intersección S utilizando la ecuación 1.
La distancia d entre S y Pres se determina por medio de la cantidad vectorial de la diferencia entre los dos.
La figura 01 muestra la representación esquemática de todos los elementos enumerados. La superficie azul es la superficie a analizar y la superficie roja representa el plano de la sección, que está definido por el punto Pres y el vector de dirección
Implementación del cálculo de la distancia en un programa
Una vez que las fórmulas estén disponibles, puede crear el programa correspondiente. Para la conversión se utiliza VBA en Excel. La figura 02 muestra la numeración de los elementos.
Primero, es necesaria una conexión con RFEM. Luego, obtenga la interfaz para los datos del modelo. Dado que este procedimiento ya se ha descrito en otros varios artículos (ver enlaces), no se describirá en detalle aquí. A continuación se muestra el código fuente para iniciar el programa.
- código.vb#
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
- Establecer iModelData = iModel.GetModelData
Antes de iniciar el programa, defina primero los parámetros variables. Estos incluyen el número de línea line_no de la línea donde quiera buscar resultados y, por supuesto, el número de superficie surface_no de la superficie donde se encuentra la línea. Además, necesita el número del caso de carga loadcase_no al que pertenecen los resultados. Dado que este es un cálculo numérico con precisión limitada, se requiere una tolerancia d_tol que especifique la distancia máxima entre la línea y el nudo. En este ejemplo, se usa una tolerancia de un milímetro.
Ya que la interfaz para los datos del modelo (IModelData) ahora está disponible, puede buscar primero la línea y, por tanto, también su punto inicial y final.
- código.vb#
- ' obtener línea
- Dim ILin As RFEM5.ILínea
- Establecer ILin = iModelData.GetLine(line_no, AtNo)
- Dim lin As RFEM5.RfLine
- lin = ILin.GetData
- ' obtener nudos de la línea
- Dim n(0 a 1) As RFEM5.Node
- Dim ints() como entero
- 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
- Establecer iNd = Nada
Se obtienen tanto los nudos como la línea por separado directamente a través de su interfaz (INode o ILine). Para extraer los números de los nudos de la cadena (RfLine.NodeList), use la función strToIntArr descrita en otro artículo (ver enlaces). Convierte la cadena en un campo entero.
Con los puntos dados ahora de la línea
- código.vb#
- Dim vAs 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 como doble
- v2 = vX^2 + vY^2 + vZ^2
- Dim P_res As RFEM5.Point3D
- Dim s As Double
- Dim d como doble
Se convierte en el vector de dirección
Cálculo de la distancia en un bucle
En este ejemplo, se ha seleccionado el procesamiento de los resultados sobre la base de los nudos de elementos finitos. La comprobación de la distancia se realiza en un bucle sobre el campo de estos resultados. Primero, se deben obtener estos resultados a través de la interfaz ICalculation2 y luego en IResults. Dentro del bucle, el punto Pres se describe primero con las coordenadas del valor del resultado (para mayor claridad). Luego, puede realizar el cálculo directo de la ecuación (4). Después de calcular s, es posible verificar si el valor es menor que 0 o mayor que 1 porque estos valores se encuentran o bien fuera, o bien antes y después de la línea recta. Si un valor está dentro de este intervalo, la distancia se calcula con la ecuación (6).
- código.vb#
- ' obtener resultados en nudos fe
- Dim iCalc As ICalculation2
- Set iCalc = iModel.GetCalculation
- Dim iRes As RFEM5.IResults
- Establecer iRes = iCalc.GetResultsInFeNodes(LoadCaseType, loadcase_no)
- Dim surfBaStr() As RFEM5.SurfaceBasicStresses
- surfBaStr = iRes.GetSurfaceBasicStresses(surface_no, AtNo)
- ' bucle a través de las tensiones y cálculo de la distancia a la línea
- Dim i como entero
- Para i = 0 Para UBound(superficieBaStr, 1)
- P_res.X = surfBaStr(i).Coordinates.X
- P_res.Y = surfBaStr(i).Coordinates.Y
- P_res.Z = surfBaStr(i).Coordinates.Z
- ' calcula el factor para la ecuación de la línea de intersección
- s = ((P_res.XA.X)*vX + (P_res.YA.Y)*vY + (P_res.ZA.Z)*vZ)/v2
- Si s <= 1 + d_tol y s >= 0 - d_tol Entonces
- ' calcular la distancia del punto de intersección y el nudo fe
- 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
- Si (d < d_tol) Entonces
- ' aquí puede procesar el punto de resultados encontrado
- End If
- End If
- Siguiente i
La tolerancia se aplica tanto a la comprobación del factor s como a la distancia d para que cualquier pequeña inexactitud no conduzca a la exclusión de un resultado.
Resultados del programa
Los valores encontrados por el programa se muestran en la tabla, con los valores redondeados con dos decimales.
σy+ [N/mm²] | Factor 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 |
Como comparación, los valores del diagrama de resultados en la línea correspondiente se muestran en la Figura 03.
Es claramente evidente que los valores son los mismos y que hay una coincidencia del 100% o que todos los valores se encontraron en la línea.
Conclusión
Con la ayuda del cálculo vectorial, se ha creado un programa que puede encontrar nudos a lo largo de una línea. Con este algoritmo, también es posible buscar no solo los resultados, sino también todos los demás elementos geométricos. Esto es especialmente útil porque, por supuesto, la selección visual no es posible a través de la interfaz COM, pero sí es posible de otra manera a través de una función. Especialmente para los programas que se ejecutan completamente en segundo plano, es posible realizar una evaluación automática de resultados.