Metodología FEM para la evaluación de fiabilidad mecánica
Abstract
145 p. – Bibliogr.: p. 77-78
Full text
Curso: 2024-2025 Fecha: Vitoria-Gasteiz, 11-07-2025 Alumno: Alonso García, Iván Director: Carrascal Lecumberri, Edorta (UPV/EHU) Instructora de Empresa: Lahidalga Fernández De Arroyabe, Leire (IKERLAN S.COOP) GRADO EN INGENIERÍA EN AUTOMOCIÓN TRABAJO FIN DE GRADO METODOLOGÍA FEM PARA LA EVALUACIÓN DE FIABILIDAD MECÁNICA
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 2 AGRADECIMIENTOS Quiero expresar mi sincero agradecimiento a mi tutora de prácticas, Leire, por su inquebrantable apoyo desde el primer día. Su orientación en el desarrollo del proyecto y su invaluable conocimiento en el campo de la fiabilidad mecánica han sido fundamentales. También quiero agradecer a todos mis compañeros en Ikerlan, quienes día tras día compartieron momentos durante el café y en las comidas en Garaia, alegrando mis jornadas y contribuyendo significativamente en las reuniones de equipo y más allá. Agradezco especialmente a mi pareja por su paciencia y apoyo durante los cambios de último momento en el documento, incluso en vacaciones, y a Edorta por su colaboración en la redacción del mismo.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 3 ABSTRACT Currently, the assessment of the structural reliability of mechanical components is based on deterministic procedures that use safety factors. These factors conservatively account for the uncertainties inherent in the assumptions made during the design phase, such as loads, simplifications, and material properties. As structural complexity increases, it becomes essential to identify and limit these assumptions. To optimize reliability assessment, deterministic analyses are increasingly being replaced by probabilistic approaches that account for the variability of the most relevant parameters. In this context, this work develops a methodology based on failure probability analysis applied to Finite Element Models (FEM). An integrated process is proposed to evaluate mechanical components, focusing on identifying failure probabilities in critical failure modes and nodes. To achieve this, Bayesian uncertainty characterization techniques using MCMC are applied, and two different tools are compared for implementing the FORM method: OptiSLang, integrated with Ansys, and UQLab combined with pyMechanical via Python scripts. The methodology is implemented on a real use case, which remains confidential as it involves an IKERLAN client. The probabilistic analysis reveals a 100% failure probability in the initial design, prompting a redesign study based on alternative materials and surface treatments. Finally, a Pareto front is generated to evaluate the best combinations of parameters to minimize the probability of failure, considering cost and manufacturing constraints, demonstrating the methodology’s potential for robust structural design under uncertainty.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 4 RESUMEN En la actualidad, la determinación de la fiabilidad estructural de componentes mecánicos se basa en procedimientos deterministas que emplean coeficientes de seguridad. Estos coeficientes consideran de manera conservadora las incertidumbres inherentes a las suposiciones realizadas durante la etapa de diseño, tales como cargas, simplificaciones y propiedades de los materiales. Con el aumento de la complejidad estructural, se hace imprescindible identificar y limitar las suposiciones adoptadas en el diseño. Para optimizar la evaluación de la fiabilidad, los análisis deterministas están siendo reemplazados por enfoques probabilísticos que contemplan la variabilidad de los parámetros más relevantes. En este contexto, el presente trabajo desarrolla una metodología basada en el análisis de probabilidad de fallo aplicada a Modelos de Elementos Finitos (MEF). Se propone un proceso integral para evaluar componentes mecánicos, con énfasis en la determinación de la probabilidad de fallo en los modos y zonas críticas. Para ello, se utilizan técnicas bayesianas de caracterización de incertidumbre mediante MCMC, y se comparan dos herramientas diferentes para la implementación del método FORM: OptiSLang, integrado con Ansys, y UQLab combinado con pyMechanical mediante scripts en Python. Se implementa la metodología en un caso de uso real confidencial al ser de un cliente de IKERLAN. El análisis probabilístico revela una probabilidad de fallo del 100 % en el diseño inicial, lo que motiva un estudio de rediseño basado en alternativas de material y tratamiento térmico. Finalmente, se genera un frente de Pareto que permite evaluar las mejores combinaciones de parámetros para minimizar la probabilidad de fallo, considerando restricciones de coste y fabricación.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 5 LABURPENA Gaur egun, estruktura mekanikoen fidagarritasuna zehazteko prozedura deterministak erabiltzen dira, segurtasun-koefizienteetan oinarrituak. Koefiziente horiek diseinu-fasean egindako aurreikuspenetan (kargak, sinplifikazioak eta materialen propietateak) dauden ziurgabetasunak kontserbatiboki kontuan hartzen dituzte. Egitura-konplexutasuna handitzen den heinean, ezinbestekoa da diseinuan hartutako aurreikuspen horiek identifikatzea eta mugatzea. Fidagarritasuna ebaluatzeko, gero eta gehiago erabiltzen dira ikuspegi probabilistikoak, parametro garrantzitsuenen aldakortasuna kontuan hartzen dutenak. Testuinguru horretan, lan honek Finite Elementuen Ereduetan (FEM) oinarritutako hutsegiteprobabilitatearen analisian oinarritutako metodologia bat garatzen du. Prozesu integrala proposatzen da osagai mekanikoak ebaluatzeko, modu eta gune kritikoetan hutsegiteprobabilitatea zehazteko arreta bereziz. Horretarako, MCMC bidezko Bayestar ziurgabetasun-karakterizazioaren teknikak erabiltzen dira, eta FORM metodoaren inplementaziorako bi tresna desberdin alderatzen dira: Ansys-ekin integratutako OptiSLang eta Python bidez pyMechanical erabiliz UQLab. Metodologia benetako erabilera-kasu batean ezartzen da, IKERLAN bezero batekin lotura duelako konfidentziala dena. Analisia probabilistikoak %100eko hutsegite-probabilitatea erakusten du hasierako diseinuan, eta horrek material eta tratamendu alternatiboetan oinarritutako berrdiseinu azterketa bat motibatzen du. Azkenik, Pareto fronte bat sortzen da, kostu eta fabrikazio-murrizketak kontuan hartuta, hutsegite-probabilitatea minimizatzeko parametro-konbinazio onenak ebaluatzeko. Horrela, ziurgabetasunpeko diseinu egiturazko sendo baterako metodologia honen potentziala erakusten da.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 6 ÍNDICE Abstract ......................................................................................................................................... 2 Resumen ........................................................................................................................................ 4 Laburpena ..................................................................................................................................... 5 Agradecimientos ........................................................................................................................... 2 Índice ............................................................................................................................................. 6 Índice de Figuras ........................................................................................................................... 9 Índice de Tablas ........................................................................................................................... 12 Nomenclatura.............................................................................................................................. 13 Introducción ................................................................................................................................ 15 Objetivos y Alcance ..................................................................................................................... 17 Planificación y Ejecución de Tareas ............................................................................................. 18 Estructura del Documento .......................................................................................................... 19 1. Revisión de la Normativa ................................................................................................ 20 1.1. Métodos de Estimación de la Fiabilidad ............................................................ 21 1.2. Función Límite ................................................................................................... 22 1.3. Incertidumbres .................................................................................................. 23 1.3.1. Métodos Frecuentistas ......................................................................... 24 1.3.2. Métodos Bayesianos............................................................................. 25 1.3.3. Markov Chain Monte Carlo .................................................................. 26 1.4. Modos de Fallo .................................................................................................. 26 1.5. Enfoque Semi Probabilista ................................................................................. 27 1.6. Enfoque Probabilista ......................................................................................... 29 1.6.1. Monte Carlo .......................................................................................... 29 1.6.2. First Order Reliability Method .............................................................. 30 2. Estado del arte................................................................................................................ 33 3. Desarrollo ....................................................................................................................... 35 3.1. OptiSLang ........................................................................................................... 35 3.2. UQLab ................................................................................................................ 36 3.3. Comparativa ...................................................................................................... 38 3.3.1. Configuración FEM ............................................................................... 39 3.3.2. FORM y Resultados ............................................................................... 42
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 7 3.4. Conclusiones de la Comparativa........................................................................ 44 4. Caso de Uso .................................................................................................................... 45 4.1. Caracterización de Incertidumbres ................................................................... 46 4.1.1. Cargas: Tensiones Residuales ............................................................... 47 4.1.2. Material: Curva SN / Ecuación de Basquin ........................................... 50 4.2. Modelado .......................................................................................................... 54 4.3. Mallado .............................................................................................................. 57 4.4. Ciclos de Tensión de Nodos Críticos .................................................................. 60 4.5. Configuración OptiSLang ................................................................................... 66 5. Resultados ...................................................................................................................... 69 Conclusiones y Lineas de Desarrollo Futuro ............................................................................... 73 Objetivos de Desarrollo Sostenible ............................................................................................. 75 Presupuesto ................................................................................................................................ 76 Referencias .................................................................................................................................. 77 Anexo - Código ............................................................................................................................ 79 Metodologías .................................................................................................................. 79 Metodología 1 ................................................................................................... 79 Metodología 2 (workflow) ................................................................................. 80 Metodología 2 (modelo) .................................................................................... 82 Caracterización ............................................................................................................... 85 Procesamiento de imagen ................................................................................. 85 MCMC (curva sn) ............................................................................................... 90 MCMC (tensiones residuales) ............................................................................ 99 Análisis Global Mallado ................................................................................................ 104 1_1_EliminarNodos ......................................................................................... 104 2_1_ObtenerMinMax ...................................................................................... 105 2_2_EvaluarMinMax ........................................................................................ 106 2_3_ObtenerNodos ......................................................................................... 109 Análisis Mallado Zonas ................................................................................................. 111 3_1_FiltrarNodosZonas ................................................................................... 111 3_2_ObtenerMinMaxZonas............................................................................. 113 3_3_EvaluarMinMaxZonas .............................................................................. 116
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 8 3_4_OrdenarZonasGeometricamente ............................................................ 118 3_5_GraficarRangosZonas ............................................................................... 125 3_6_RangosZonasAnsys .................................................................................. 128 Localización Nodos Críticos .......................................................................................... 129 1_2_EliminarNodos2 ....................................................................................... 129 4_1_ObtenerMinMax ...................................................................................... 130 4_2_EvaluarRangosMedias ............................................................................. 132 4_3_Ordenar_A4 ............................................................................................. 135 4_4_Graficar .................................................................................................... 136 4_5_ObtenerNodos ......................................................................................... 140 4_6_Pareto ...................................................................................................... 141 FORM ............................................................................................................................ 144 Función Límite Analítica .................................................................................. 144
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 9 ÍNDICE DE FIGURAS Figura 1 - EN 1990: Clasificación de los métodos probabilísticos de nivel 1, 2, 3 y 4 ................................. 21 Figura 2 – Demanda vs Capacidad: Distribuciones de demanda y capacidad. Se resalta la zona de superposición por la posibilidad de darse casos de fallos. Se muestran también los valores característicos. .................................................................................................................................................................... 28 Figura 3 – Demanda vs Capacidad: Distribuciones, valores característicos y valores de diseño de demanda frente a capacidad ...................................................................................................................................... 28 Figura 4 – Monte Carlo: Conjunto de diseños fallidos y correctos ............................................................. 30 Figura 5 – FORM: Representación de distribuciones, función límite y 𝜷 ................................................... 31 Figura 6 - FORM: Proceso de normalización y estandarización del espacio de variables .......................... 32 Figura 7 – Metodología OptiSLang: Módulo FORM de OptiSLang con la integración de Ansys configurada y Bloque Static Structural de Ansys con parámetros preparados para su manipulación. ............................ 36 Figura 8 – Metodología OptiSLang: Menú configuración de OptiSLang con las variables definidas .......... 35 Figura 9 – Metodología UQLab: Configurar modelo o función para UQLab para su uso como modelo de cálculo en FORM ......................................................................................................................................... 36 Figura 10 – Metodología UQLab: Conexión y edición en Python del proyecto de Ansys Mechanical ....... 37 Figura 11 – Comparativa: Geometría de brida estudiada en Ansys ........................................................... 38 Figura 12 – Metodología UQLab: Parte del código en la que se incluye la toma de tiempos .................... 39 Figura 13 - Contacto entre brida y junta .................................................................................................... 41 Figura 14 - Contacto entre brida y pernos .................................................................................................. 40 Figura 15 - Condición de Simetría Radial .................................................................................................... 41 Figura 16 - Condición de Simetría Axial ...................................................................................................... 42 Figura 17 – Comparativa: Convergencia hacia la función límite de las metodologías ............................... 43 Figura 18 - Banco de ensayo Borli o Rim Rolling ........................................................................................ 45 Figura 19 – Caracterización Residuales: Datos de tensión residual agrupados por tensión y profundidad .................................................................................................................................................................... 47 Figura 20 – Caracterización Residuales: Definición del modelo probabilístico de MCMC para una distribución normal .................................................................................................................................... 48 Figura 21 – Caracterización Residuales: Métodos de librería arviz para graficar los posteriores del MCMC y sus distribuciones. ................................................................................................................................... 48 Figura 22 – Caracterización Residuales: Distribuciones resultantes por tensión y profundidad ............... 49 Figura 23 – Caracterización Residuales: Distribuciones y varianza de los posteriores de las tensiones residuales axiales a 1mm de profundidad .................................................................................................. 49 Figura 24 – Caracterización Residuales: Resumen del resultado del MCMC de tensión residual axial a 1mm de profundidad ........................................................................................................................................... 50
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 16 probabilidad de que los elementos estructurales no se comporten como se espera debido a factores impredecibles. En este sentido, entender las posibles consecuencias de un fallo, ya sea humano, económico o ambiental, se convierte en un factor esencial para el diseño de infraestructuras seguras. La vida útil de una estructura también está influenciada por estas incertidumbres. Las estructuras pueden experimentar un envejecimiento y deterioro impredecibles debido a condiciones ambientales cambiantes, cargas no anticipadas o la degradación de los materiales. Es crucial, por tanto, contar con métodos de evaluación que consideren estas incertidumbres para estimar de manera más realista la durabilidad de la infraestructura. El mantenimiento juega un papel esencial en la gestión de la fiabilidad estructural, especialmente cuando se consideran las incertidumbres. Las inspecciones periódicas y las acciones correctivas permiten identificar signos tempranos de deterioro y realizar ajustes antes de que se materialicen fallos. Sin embargo, incluso el mantenimiento debe abordar las incertidumbres en cuanto a la evolución del comportamiento de la estructura y la identificación de riesgos potenciales, lo que hace que la planificación preventiva sea una tarea compleja. En resumen, la seguridad y la fiabilidad estructural deben considerar las incertidumbres que afectan a cada fase del ciclo de vida de una infraestructura. Estas incertidumbres no solo hacen más compleja la evaluación de los riesgos asociados, sino que también refuerzan la necesidad de enfoques robustos en el diseño, el mantenimiento y la gestión de las estructuras a lo largo de su vida útil.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 17 OBJETIVOS Y ALCANCE El trabajo realizado tiene como objetivo el desarrollo de una metodología de estimación de la fiabilidad mecánica de estructuras mediante métodos probabilistas incluidos en normativas actuales y métodos de análisis por elementos finitos (FEM). Para cumplir este objetivo se han estudiado las normativas y los métodos y herramientas necesarios para desarrollar la metodología de fiabilidad probabilista. Se han implementado los métodos probabilistas en herramientas FEM y se ha analizado su eficiencia. Finalmente, se ha aplicado la metodología desarrollada en un caso de uso real, con un cliente confidencial de Ikerlan. Se analiza la incertidumbre, se caracteriza, se determina el nivel de fiabilidad estructural mediante la metodología desarrollada y se proponen soluciones ajustadas al caso.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 18 PLANIFICACIÓN Y EJECUCIÓN DE TAREAS En esta sección se detallan que tareas se han planificado para llevar a cabo este proyecto. • Estudio general de fiabilidad estructural probabilística: o Estudio de las normativas estructurales. o Estudio de los métodos probabilistas. o Estado del arte. • Desarrollo de las metodologías: o Búsqueda de software de fiabilidad. o Implementación de las metodologías con software comercial FEM. o Comparativa y validación de metodologías. • Implementación en un caso de uso real: o Análisis de posibles casos de uso. o Preparación del modelo FEM. o Caracterización de incertidumbres. o Cálculo de nivel de fiabilidad. • Escritura del trabajo de fin de grado: o Escribir y documentar el informe del proyecto de forma detallada. o Presentar los resultados obtenidos. Este es el Diagrama de Gantt aproximado de las tareas llevadas a cabo: Tabla 1 - Diagrama de Gantt Tareas Sep Oct Nov Dic Ene Feb Mar Abr May Jun Estudio general Desarrollo de metodologías Caso de uso Escritura
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 19 ESTRUCTURA DEL DOCUMENTO El presente trabajo se estructura en cinco secciones numeradas que detallan los aspectos introducidos en la introducción. Estas secciones abordan cronológicamente el desarrollo del estudio: Revisión de la Normativa, Estado del Arte, Desarrollo, Caso de Uso y Resultados. La Revisión de la Normativa explica el sistema y las herramientas empleadas para asegurar niveles de seguridad adecuados en estructuras. Se presentan métodos para evaluar la fiabilidad de estructuras, conceptos como función límite, modos de fallo e incertidumbres en el ámbito de la fiabilidad. Además, se exploran dos enfoques en fiabilidad estructural: semi-probabilista y probabilista. En el Estado del Arte se examinan los modelos computacionales para el análisis probabilístico, la gestión de la incertidumbre y la integración de estos análisis con normativas y diseño basado en fiabilidad. El Desarrollo se centra en la implementación de dos softwares con capacidades de fiabilidad probabilística mediante modelos FEM, seguido de una comparación detallada de metodologías, tiempos de computación y resultados obtenidos. A partir de las metodologías implementadas con técnicas de análisis de fiabilidad probabilístico mediante FEM, se aplica este conocimiento a un Caso de Uso real: el diseño de llantas de automóvil para un cliente confidencial de Ikerlan. Se detalla la configuración del modelo FEM, la caracterización de las incertidumbres, el estudio de las cargas aplicadas y el análisis de fiabilidad probabilístico correspondiente. Finalmente, se presentan y analizan los resultados del análisis de fiabilidad realizado sobre la llanta del cliente, proponiendo soluciones adaptadas basadas en las metodologías desarrolladas. Es importante mencionar que a lo largo del trabajo se han desarrollado numerosos scripts para automatizar tareas repetitivas o manejar grandes volúmenes de datos, todos documentados en el anexo final del documento.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 20 1. REVISIÓN DE LA NORMATIVA Para la regulación de la fiabilidad de las estructuras en la industria, se emplean normativas; como la EN 1990 [1]. Estas normativas asocian clases de consecuencias de fallo en función de la gravedad de las consecuencias antes mencionadas (Tabla 2). A partir de estas clases de consecuencia y la vida útil objetivo de la estructura, se asigna un valor de fiabilidad objetivo representado a través de un valor 𝛽 (Tabla 3) que se usa como base para los estudios de fiabilidad y está relacionado con la probabilidad de fallo de la estructura. Tabla 2 – EN 1990: Clases de consecuencia Clase de consecuencia Descripción Ejemplos CC4 Consecuencias extremas por pérdida de vidas humanas o enormes consecuencias económicas, sociales o ambientales. Plantas nucleares CC3 Consecuencias altas por pérdida de vidas humanas, o consecuencias económicas, sociales o ambientales muy grandes. Tribunas, edificios públicos donde las consecuencias de un fallo son graves (por ejemplo, una sala de conciertos) CC2 Consecuencia media por pérdida de vidas humanas, consecuencias económicas, sociales o ambientales considerables. Edificios residenciales y de oficinas, edificios públicos donde las consecuencias de un fallo son medianas (por ejemplo, un edificio de oficinas) CC1 Consecuencias bajas por pérdida de vidas humanas y consecuencias económicas, sociales o ambientales pequeñas o insignificantes. Edificios agrícolas donde normalmente no entra gente (por ejemplo, edificios de almacenamiento), invernaderos CC0 Consecuencia más baja por pérdida de vidas humanas. Elementos distintos a los estructurales Tabla 3 - EN 1990: Valores de 𝛽 para distintas clases de fiabilidad. (Cuanto mayor sea 𝛽, menor es la probabilidad de fallo y mayor el nivel de seguridad que se está exigiendo) Clase de fiabilidad Valores mínimos de 𝜷 Periodo de recurrencia: 1 año Periodo de recurrencia: 50 años RC3 5,2 4,3 RC2 4,7 3,8 RC1 4,2 3,3
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 21 1.1. MÉTODOS DE ESTIMACIÓN DE LA FIABILIDAD En la EN 1990 [1], para evaluar la seguridad teniendo en cuenta las incertidumbres, se guía a los diseñadores hacia estudios de fiabilidad, clasificados en función del nivel de caracterización de las incertidumbres (Figura 1). En el Anexo C de EN 1990, se describen las diferencias entre los métodos disponibles. Figura 1 - EN 1990: Clasificación de los métodos probabilísticos de nivel 1, 2, 3 y 4 El método semi probabilista o de nivel 1 emplea los coeficientes de seguridad de las normas, basados en experiencia, para aportar márgenes seguros. Estos métodos se usaban en los inicios de la seguridad estructural y siguen siendo los más aplicados hoy día gracias a su sencillez y validez en el mundo de la ingeniería. Los métodos de nivel 2 son los que, mediante aproximaciones, obtienen un valor de la probabilidad de fallo del componente estudiado. Estos hacen uso de descripciones parciales de las distribuciones de probabilidad de las variables y solo usan los momentos de segundo orden o inferiores para definirlas. Los métodos de nivel 3 aplican la combinación completa de distribuciones probabilísticas de las variables sin aproximaciones para obtener una probabilidad de fallo más realista que los previos métodos. Es por esto por lo que se denominan métodos completamente probabilistas.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 22 Por último, los métodos de nivel 4 son los que aplican los anteriores niveles junto a algoritmos de optimización para tener en cuenta factores económicos. Estos no están incluidos en la Figura 1 ya que se inclinan más hacia un estudio de rentabilidad económica que de fiabilidad. Resumiendo, los estudios de fiabilidad caracterizan la incertidumbre mediante variables deterministas o estocásticas y obtienen una probabilidad de fallo de la estructura asociada. En el presente trabajo se aplican los métodos de nivel 2 en el ámbito de la ingeniería industrial añadiendo el uso de modelos FEM, ampliamente empleados en la industria. 1.2. FUNCIÓN LÍMITE En la EN 1990, para poder calcular la fiabilidad y así comprobar el nivel de seguridad, se cuantifican la capacidad de resistir y la carga que se le demanda a la estructura mediante variables numéricas. A continuación se calcula el nivel de fiabilidad en función de si cumple o no con la demanda para la que se diseña. Para estimar el nivel de fiabilidad, se hace uso de la ecuación (1) que representa el comportamiento de la estructura. La ecuación se denomina función límite (G) y en fiabilidad estructural se suele representar como una comparativa entre la combinación de cargas sufridas y la resistencia de la estructura. Pero para casos generales aplicables a cualquier estudio de fiabilidad, se usan terminos generales como capacidad y demanda. 𝐺=𝐶−D (1) 𝐺=𝑅−𝑆=𝐶−𝐷 (2) En esta definición general de la función límite (1), C representa la capacidad de resistir de la estructura y D la Demanda que se le exige. La C y la D pueden ser combinaciones de distintas variables con relaciones complejas que definan el comportamiento de la estructura. También se puede representar desde la perspectiva de un análisis de tensiones representando la resistencia con R y la carga sufrida con S, como se ve en la ecuación (2), al igual que dependiendo de la fuente se expresa también como una comparación entre capacidad (C) y demanda (D) como ya se ha mencionado. Como se muestra en (3), en función del valor de G, se considerará que la estructura se encuentra en la zona segura o en la zona de fallo, es decir, si cumple o no las condiciones de diseño. {𝐺>0; 𝑍𝑜𝑛𝑎 𝑠𝑒𝑔𝑢𝑟𝑎 𝐺=0; 𝐿í𝑚𝑖𝑡𝑒 𝐺<0; 𝑍𝑜𝑛𝑎 𝑑𝑒 𝑓𝑎𝑙𝑙𝑜 (3)
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 23 1.3. INCERTIDUMBRES En la normativa actual, se tiene en cuenta la variabilidad causada por las incertidumbres ya mencionadas. En los análisis de fiabilidad estructural de nivel 1 en los que se aplican coeficientes de seguridad, son los propios coeficientes los que incluyen las incertidumbres asociadas a los materiales y a las cargas aplicadas. En los casos en los que se precisa de un estudio más profundo como lo es el probabilístico, se caracterizan las distribuciones de cada variable y se las considera explícitamente para la estimación de la fiabilidad. Estos cálculos con métodos de nivel II pueden resultar interesantes en: • Ampliación del periodo de vida útil de estructuras existentes. • Estructuras singulares en las que los requisitos de diseño sean superiores a los incluidos en las normativas • Estructuras de alto coste en las que se quieran aplicar criterios de optimización • Estructuras en entornos muy controlados en las que las incertidumbres sean limitadas Por lo tanto, se deben tener en cuenta las incertidumbres a la hora de estimar la seguridad de una estructura. Estas incertidumbres se clasifican en tres grandes grupos: • Incertidumbre física: Se refiere a la variabilidad natural en cargas, propiedades del material o dimensiones. Por ejemplo, dos barras de suspensión pueden presentar ligeras diferencias en su límite de resistencia debido a micro defectos en el proceso de fabricación o diferencias en el tratamiento térmico. • Incertidumbre estadística: Aparece al estimar distribuciones de probabilidad con datos limitados. Por ejemplo, si en un ensayo de llantas para medir su resistencia estructural se dispone de pocos especimenes de ensayo, los parámetros obtenidos pueden tener un margen de error significativo. • Incertidumbre en el modelo: Surge por simplificaciones hechas en los cálculos. Por ejemplo, puede asumirse un comportamiento lineal-elástico en el análisis de un chasis, ignorando efectos no lineales o interacciones complejas entre componentes, lo que puede limitar la precisión del modelo. Para determinar la fiabilidad de una estructura se usan modelos matemáticos que requieren representaciones matemáticas de las variables. Por eso es muy importante determinar el nivel de influencia de cada variable en el análisis de fiabilidad. Para ello se estudia la correlación entre las variables de entrada y salida del modelo mediante un análisis de sensibilidad. A partir del análisis de sensibilidad se pueden determinar las incertidumbres relevantes en el diseño. Minimizando así el número de variables estocásticas.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 24 Una vez identificadas las variables relevantes del problema, es necesario caracterizar su distribución estadística para poder representar de forma matemática la incertidumbre presente en el análisis. Para ello, se pueden emplear distintos métodos estadísticos que permiten estimar las distribuciones de probabilidad asociadas a dichas variables. Estos métodos se agrupan principalmente en dos enfoques, que difieren en la forma en que interpretan el concepto de probabilidad: el enfoque frecuentista y el enfoque bayesiano. 1.3.1. Métodos Frecuentistas Los métodos frecuentistas constituyen un enfoque clásico de la estadística, en el que la probabilidad se interpreta como la frecuencia relativa de un evento en un número muy grande de repeticiones de un experimento. En este paradigma, los parámetros de un modelo estadístico se consideran constantes desconocidas, mientras que los datos observados se tratan como realizaciones aleatorias de un proceso generador. Como consecuencia de esta visión, los métodos frecuentistas no permiten estimar distribuciones de probabilidad sobre los parámetros, sino únicamente valores puntuales o intervalos derivados del comportamiento muestral. La inferencia frecuentista se basa exclusivamente en los datos disponibles, sin asumir distribuciones previas sobre los parámetros. Entre las técnicas más representativas se encuentran: • Estimación puntual, donde se obtiene un valor específico para un parámetro, como en los métodos de los momentos o el de máxima verosimilitud. • Intervalos de confianza, que proporcionan un rango de valores en el cual se espera que se encuentre el parámetro con cierta probabilidad (frecuentista). • Pruebas de hipótesis, donde se contrastan hipótesis sobre parámetros poblacionales a partir de estadísticas muestrales, con el uso de valores p y niveles de significancia. • Modelado estadístico clásico, como la regresión lineal, el ANOVA o modelos de clasificación y predicción basados en supuestos sobre la distribución de errores. En este enfoque, el énfasis está en el comportamiento de los procedimientos estadísticos bajo repeticiones hipotéticas del experimento. Por ejemplo, un intervalo de confianza al 95% no implica que haya un 95% de probabilidad de que el parámetro esté en ese intervalo, sino que el 95% de los intervalos construidos de esta manera contendrán el verdadero valor del parámetro si el experimento se repitiera indefinidamente. Los métodos frecuentistas son ampliamente utilizados por su simplicidad, interpretabilidad y por no requerir especificación de distribuciones previas, aunque pueden ser menos flexibles en contextos con información limitada o estructuras jerárquicas complejas.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 25 1.3.2. Métodos Bayesianos Los métodos bayesianos abordan la inferencia estadística desde una perspectiva diferente: interpretan la probabilidad como una medida de incertidumbre o creencia sobre un evento o parámetro, permitiendo incorporar información previa junto con los datos observados [2]. La base teórica de este enfoque es la regla de Bayes, que permite actualizar la distribución de probabilidad de un parámetro A a partir de nuevos datos B. Esta actualización se representa como: 𝑃(𝐴|𝐵)∝𝑃(𝐴)∗𝑃(𝐵|𝐴) (4) Y en su forma completa: 𝑃(𝐴|𝐵)=𝑃(𝐵│𝐴)∗𝑃(𝐴) 𝑃(𝐵) (5) Donde: • 𝑃(𝐴|𝐵) es la probabilidad posterior, es decir, la probabilidad de la distribución A dados los datos observados B. Representa el conocimiento actualizado después de incorporar la información nueva. • 𝑃(𝐵|𝐴) es la verosimilitud, la probabilidad de observar los datos B si la distribución A fuera cierta. • 𝑃(𝐴) es la probabilidad previa o prior, que expresa el conocimiento, creencias o supuestos que se tienen sobre A antes de observar los datos. • 𝑃(𝐵) es la probabilidad marginal de los datos B, también llamada evidencia; actúa como constante de normalización para garantizar que la posterior sea una distribución válida. El prior puede ser informativo, si incorpora conocimientos previos sustanciales, o no informativo, si se desea minimizar su influencia, permitiendo que los datos dominen el análisis. Esta formulación permite una gran flexibilidad, como el uso de modelos jerárquicos, el manejo riguroso de la incertidumbre y la obtención directa de distribuciones completas sobre los parámetros (en lugar de estimaciones puntuales). En resumen, la estadística bayesiana permite incorporar conocimiento previo, actualizarlo con datos nuevos y obtener conclusiones probabilísticas completas, lo que la hace especialmente útil en contextos con información limitada, modelos complejos o necesidad de decisiones basadas en incertidumbre.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 32 Figura 6 - FORM: Proceso de normalización y estandarización del espacio de variables La Figura 6 representa el proceso de simplificación llevado a cabo por el método para dos variables. Las variables junto con la función límite son transformadas primeramente a una distribución normal (z). Después se pasan a normal estándar (u), de manera que los contornos de probabilidad de la distribución de variables quedan concéntricos y simétricos. Tras esto, se usa un algoritmo de búsqueda para calcular la 𝛽, es decir, para determinar el punto más cercano al (0, 0) que se encuentre en la función límite. A parte de simplificar a la hora de cambiar de distintos tipos de distribuciones a una distribución normal, se realiza también una simplificación en la manera de calcular la probabilidad a través de 𝛽. Así que es recomendable disminuir el número de variables y comprender la naturaleza de su distribución para minimizar lo máximo posible los errores. El método SORM es una mejor versión del FORM en la que en lugar de simplificar la función límite con una función de primer grado se hace uso del segundo grado.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 33 2. ESTADO DEL ARTE La fiabilidad estructural bajo condiciones de fatiga se ha convertido en un área crítica de estudio en la ingeniería estructural moderna, especialmente en componentes de acero expuestos a cargas cíclicas como puentes, plataformas offshore o llantas. A diferencia de los enfoques deterministas tradicionales, los métodos probabilísticos integrados con modelos computacionales permiten capturar y gestionar la incertidumbre inherente a estos sistemas complejos. Esta incertidumbre puede provenir de múltiples fuentes: variabilidad en las propiedades del material, condiciones de carga, dimensiones geométricas, condiciones ambientales, y modelos de daño acumulado. Modelos computacionales para el análisis probabilístico En el artículo [5], se detallan diversas técnicas computacionales que permiten simular y evaluar el comportamiento estructural frente a la fatiga con una perspectiva probabilística. Entre las más destacadas se encuentran: • Modelos estocásticos del crecimiento de grietas: Se utilizan formulaciones como la ley de Paris o variantes mejoradas para simular la propagación de grietas bajo cargas cíclicas. Estas se integran con modelos probabilísticos que introducen distribuciones estadísticas para los parámetros materiales y condiciones de carga. • Métodos de Monte Carlo (MC) y sus variantes: Son ampliamente empleados para simular miles o millones de escenarios posibles, evaluando la probabilidad de falla estructural. Debido a su alto costo computacional, se han desarrollado métodos acelerados como el Latin Hypercube Sampling o técnicas de reducción de varianza. • Análisis de confiabilidad estructural: Se aplican métodos como FORM (First-Order Reliability Method) y SORM (Second-Order Reliability Method), que permiten estimar de forma eficiente la probabilidad de falla al identificar superficies límite de rendimiento estructural. Gestión de la incertidumbre: epistemológica y aleatoria Los modelos computacionales también permiten diferenciar entre dos tipos de incertidumbre: • Incertidumbre aleatoria (variabilidad natural): Por ejemplo, la variación en la resistencia del acero o la amplitud de las cargas aplicadas puede ser modelada estadísticamente. • Incertidumbre epistemológica (falta de conocimiento): Relacionada con modelos incompletos o simplificaciones, esta puede abordarse mediante enfoques como análisis de sensibilidad, técnicas bayesianas o actualización de modelos con datos reales (structural health monitoring).
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 34 Vinculación con normativas y diseño basado en fiabilidad El artículo [6] resalta que, aunque estas metodologías avanzadas existen, su implementación en los códigos estructurales aún es limitada. Las normativas actuales como Eurocode [1] o AASHTO [7] han comenzado a introducir formatos de diseño por estados límite con coeficientes parciales, pero todavía no integran completamente análisis probabilísticos detallados. Una de las barreras principales para esta integración es la complejidad computacional y la falta de familiaridad de los ingenieros de práctica con estas herramientas. Sin embargo, la tendencia futura apunta a una transición gradual hacia el diseño basado en fiabilidad (Reliability-Based Design) [6] [8], con apoyo en herramientas digitales que automaticen y simplifiquen estos procesos. Por lo tanto, el uso de modelos computacionales avanzados en combinación con técnicas probabilísticas representa el estado del arte en la evaluación de estructuras de acero sometidas a fatiga [9] [10]. Estas herramientas permiten simular con alta precisión el comportamiento estructural bajo incertidumbre, facilitando una evaluación del riesgo más realista. El desafío actual consiste en integrar estas metodologías dentro de los marcos normativos y en hacerlas accesibles para su aplicación práctica, marcando una dirección clara hacia el diseño estructural del futuro.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 35 3. DESARROLLO En el presente trabajo se desarrolla una metodología basada en FEM para calcular la probabilidad de fallo de sistemas mecánicos a fatiga. Se propone el uso de dos metodologías para calcular la probabilidad de fallo y se comparan en función del tiempo de cálculo. Se dispone de dos softwares capaces de realizar el FORM usando el análisis FEM de Ansys como modelo de cálculo. La primera opción es OptiSLang [11], un software propiedad de Ansys que está integrado con este último y permite utilizar módulos de conexión directa con modelos FEM de Ansys, lo que lo convierte en una herramienta fácil de usar. La segunda opción es UQLab [12], un software desarrollado por ETH Zúrich que admite cualquier tipo de modelo externo. Las dos metodologías se basan en la necesidad de obtener un valor de la función límite a cada iteración del FORM. El objetivo es obtener este valor del FEM de Ansys y se logra con distintas conexiones en cada software. 3.1. OPTISLANG En la primera propuesta se utiliza el módulo “FORM” de OptiSLang para calcular la probabilidad de fallo del modelo definido de Ansys. Para conectar el modelo de cálculo FEM, se introduce un módulo “Integración de Workbench” dentro del módulo “FORM” (Figura 8 (a)). De esta manera, en cada iteración del FORM se calcula el valor de la función límite con el resultado del modelo FEM. OptiSLang realiza todo el proceso de cálculo automáticamente tras lo que muestra los resultados en una ventana de postproceso configurable. Esta metodología requiere un archivo de Ansys Workbench en el que las variables de entrada y salida estén recogidas en una tabla de parámetros (Figura 8 (b)); y, un archivo de OptiSLang configurado con las distribuciones de las variables (Figura 7). Una característica negativa del software OptiSLang es la falta de transparencia en todo el proceso y la lógica detrás de ciertos cálculos del algoritmo FORM. Figura 7 – Metodología OptiSLang: Menú configuración de OptiSLang con las variables definidas
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 36 Figura 8 – Metodología OptiSLang: Módulo FORM de OptiSLang con la integración de Ansys configurada y Bloque Static Structural de Ansys con parámetros preparados para su manipulación. 3.2. UQLAB La segunda propuesta usa el algoritmo FORM del software UQLab. Para su uso, se emplea un script de Python y la API UQ[py]Lab. Esta librería permite realizar el FORM con cualquier modelo de cálculo que pueda definirse dentro de un método o función del script (Figura 9). El método definido en Python y usado por el FORM de UQ[py]Lab, puede ser desde una función límite analítica hasta un proceso complejo siempre que devuelva un valor de la función límite. Los scripts de Pyhton usados tanto para UQLab como más adelante para OptiSLang se encuentran completos en el Anexo, en la sección Metodologías. Figura 9 – Metodología UQLab: Configurar modelo o función para UQLab para su uso como modelo de cálculo en FORM
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 37 La metodología se caracteriza por utilizar el FEM de Ansys, empleando pyMechanical [13] de puente. PyMechanical es una API de Ansys Mechanical que permite automatizar en Python el proceso de edición de variables, lanzamiento del cálculo y extracción de resultados. Así se logra el uso de FEM para el cálculo de la función límite iteración a iteración de forma similar a la otra metodología con OptiSLang. Es necesario un proyecto de Ansys predefinido en el que se configura un “Sistema Paramétrico” (Figura 8 (b)). En la tabla de parámetros de Ansys se introducen las variables, a las que se les asocia la incertidumbre mediante distribuciones en el FORM. El método definido en Python para conectar Ansys sigue los siguientes pasos, que se ejecutarán cada iteración del FORM de UQLab (Figura 10): 1. Generar un objeto o variable que contenga una sesión de Ansys Mechanical. 2. Extraer los inputs de la variable proporcionada por el FORM de UQLab. 3. Editar los valores del modelo de Ansys con pyMechanical en función del valor de los inputs. 4. Lanzar el cálculo en Ansys. 5. Extraer los valores de output del resultado del cálculo, como por ejemplo la tensión máxima de una superficie. 6. Calcular el valor de la función límite y devolver el valor al FORM de UQLab. Figura 10 – Metodología UQLab: Conexión y edición en Python del proyecto de Ansys Mechanical
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 38 Una ventaja de esta metodología es que permite un mayor control sobre todas las funcionalidades de Ansys. Por el contrario, requiere un mayor conocimiento sobre programación en Ansys Mechanical Scripting. Y aunque ofrece una mayor maniobrabilidad dentro del modelo de Ansys, también exige más cambios y configuraciones para distintos objetivos o modificaciones del modelo. 3.3. COMPARATIVA El principal factor limitante del estudio probabilístico de la incertidumbre es el tiempo de computación, consecuencia directa de la cantidad de iteraciones que exigen los métodos usados. Además, en la industria se trabaja con modelos computacionalmente exigentes, que hacen que incluso el FORM, con su bajo número de iteraciones, suponga mucho tiempo de cálculo. Por eso, para la comparativa entre los distintos métodos se configura un FEM de una brida de tubería sometida a presión, con el objetivo de obtener aproximadamente 20 minutos de cálculo (Figura 11). Después, se configuran los scripts de Python necesarios para las dos metodologías; Metodología 1, Metodología 2 (workflow) y Metodología 2 (modelo), y se añaden herramientas para cronometrar tiempos de cálculo. La Figura 12 muestra las líneas de código dedicadas a cronometrar la metodología de UQLab desde Python. En total se usa un archivo FEM de la propia brida en Ansys Mechanical, el proyecto de OptiSLang con el FORM configurado y los scripts de Python para las dos metodologías. Con todo configurado en un ordenador dedicado exclusivamente al cálculo, se lanzan las metodologías en serie, midiendo para cada una los tiempos, tanto del cálculo total como de cada iteración del FORM. Figura 11 – Comparativa: Geometría de brida estudiada en Ansys La Figura 11 muestra el modelo 3D de las bridas utilizado para el análisis FEM. Los modelos representan la brida soldada a una extensión de tubería, montada sobre una junta espiral enrollada personalizada y el conjunto de pernos.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 39 Figura 12 – Metodología UQLab: Parte del código en la que se incluye la toma de tiempos 3.3.1. Configuración FEM Dado que la geometría, las cargas y las condiciones de contorno lo permiten, solo se ha modelado una sección de 45°, aplicando condiciones de simetría en las caras seccionadas. Se han añadido extensiones de tubería para evitar singularidades locales en el extremo del cuello de la brida, y los pernos se han modelado con un diámetro igual al diámetro en la raíz de la rosca. La simulación por elementos finitos (FEM) tiene las siguientes características: • Modelo 3D. • Propiedades de material lineales. • Todas las cargas son estáticas. El material de la brida es ASTM A707 L5 Cl.3 y el material de los pernos es ASTM A193 B7. Para fines de simulación, se supone que la extensión de tubería y la junta tienen las mismas propiedades que la brida; de igual forma, se asume que las tuercas tienen las mismas propiedades que los pernos. El módulo de Young de los materiales se ha obtenido del ASME BPVC, Sección II, parte D, Tabla TM, en función de la composición del material.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 40 Tabla 4 - Modulo de Young materiales de la brida Material Young’s modulus 25°C (MPa) A707 L5 Cl.3 191000 A193 B7 204000 Los esfuerzos de fluencia y último a temperatura ambiente se muestran en la siguiente tabla: Tabla 5 - Propiedades mecánicas brida Material Yield stress 25°C (MPa) Ultimate stress 25°C (MPa) A707 L5 Cl.3 415 515 El coeficiente de Poisson para todos los materiales es 0,3 y el coeficiente de expansión térmica es de 10·10-6 mm/mm/°C. Los contactos entre los componentes en contacto (brida, junta y pernos) son de tipo friccional, con un coeficiente de fricción de 0,2 como se ve en la Figura 14 y la Figura 13. Figura 13 - Contacto entre brida y pernos
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 41 Figura 14 - Contacto entre brida y junta El contacto soldado entre la tubería y la brida se representa mediante una topología compartida (contacto unido) entre los componentes. Por último, las condiciones de contorno son: • Soporte sin fricción aplicado a la brida, junta y extensión de tubería en el plano de corte axial del modelo; este soporte actúa como plano de simetría. Figura 15 - Condición de Simetría Radial • Soporte sin fricción aplicado a los pernos y a la junta en el plano de corte radial del modelo; este soporte actúa como plano de simetría que simula dos bridas idénticas atornilladas entre sí.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 48 Figura 20 – Caracterización Residuales: Definición del modelo probabilístico de MCMC para una distribución normal Después se usa el resultado para obtener distintas gráficas y datos representativos de los datos iniciales proporcionados. Se usan los métodos de la librería arviz [14] de análisis bayesiano para graficar cada grupo de datos posteriores obtenidos (Figura 21 y Figura 22): Figura 21 – Caracterización Residuales: Métodos de librería arviz para graficar los posteriores del MCMC y sus distribuciones.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 49 Figura 22 – Caracterización Residuales: Distribuciones resultantes por tensión y profundidad Tras esto, se analizan uno a uno los grupos caracterizados para localizar el más restrictivo (Tensión Axial a 1mm de profundidad en la Figura 22) y se comprueban los datos posteriores obtenidos para verificarlos visualmente (Figura 23). La dispersión de los parámetros µ (mu) y σ (sigma) del posterior representan la variabilidad de las distintas distribuciones con las que se podrían haber generado los datos de entrada que se le proporcionan al MCMC. Esta variación disminuye a medida que aumenta el número de datos de entrada. Al disponer de una cantidad muy pequeña de datos, el análisis realizado devuelve una distribución definida con parámetros que a su vez tienen mucha varianza. Figura 23 – Caracterización Residuales: Distribuciones y varianza de los posteriores de las tensiones residuales axiales a 1mm de profundidad
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 50 Resumiendo, se han analizado y caracterizado las tensiones residuales a distintas profundidades y se ha concluido que la tensión residual axial a 1 mm de profundidad es la más crítica. En la Figura 24 se muestra un resumen de la caracterización MCMC de la tensión residual axial a 1mm de profundidad: • mean: Media estimada del parámetro. • sd: Desviación estándar (incertidumbre). • hdi_3% / hdi_97%: Intervalo creíble (del 3% al 97%) de la distribución posterior. • mcse_mean / mcse_sd: Precisión de la media y desviación estándar por el muestreo. • ess_bulk / ess_tail: Tamaño efectivo de muestra (calidad del muestreo). • r_hat: Indicador de convergencia (debe ser ≈1). Figura 24 – Caracterización Residuales: Resumen del resultado del MCMC de tensión residual axial a 1mm de profundidad Como conclusión el resultado más crítico tiene una distribución normal de media 14,16 y sigma 12.83. 4.1.2. Material: Curva SN / Ecuación de Basquin Para la caracterización de la curva que define el comportamiento a fatiga del material, se emplean datos extraídos del Aluminio AlS15Cu3Mg0.4 T5 del Articulo de Sonsino [15] a falta de datos de ensayos propios. Se quiere obtener una curva SN en base a los ensayos extraidos de Sonsino que se puede representar como dos rectas de distinta pendiente con un punto de quiebra o codo (cambio de pendiente) alrededor de los 10^6 ciclos. Este cambio de pendiente se debe al comportamiento de los materiales a grandes ciclos de fatiga, donde las amplitudes de carga bajas hacen que los materiales soporten ciclos de vida que en ciertos casos se llegan a considerar infinitos. En articulos como en Sonsino se caracteriza esta supuesta zona de vida infinita a fatiga a partir de aproximadamente los 10^6 ciclos usando una curva con distinta pendiente. Empleando los puntos de ensayo de Sonsino se caracteriza usando MCMC la curva SN con dos pendientes para así lograr extraer la distribución de la misma para los datos propuestos. Para extraer los valores de la gráfica del artículo [15] (Figura 25), se usan los rangos y escalas de los ejes junto a un procesamiento de imagen. Se realiza una captura de la gráfica original pero únicamente de la zona interior del gráfico y se marcan los puntos de los ensayos con colores que no se encuentran en el gráfico original. Conociendo los colores de los puntos marcados, se detectan los pixeles marcados usando sus valores RGB. A continuación, usando los rangos y
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 51 escalas de los ejes originales, se extrapolan los valores de tensión y ciclos a partir de los píxeles en los que se encuentran las marcas hechas (Figura 26). El código para el procesamiento de la imagen está adjunto en el Anexo como Procesamiento de Imagen. Figura 25 – Procesamiento de Imagen SN: Captura de la gráfica con curva SN, marcando los ensayos con puntos azules y amarillos. Ejes en escala logarítmica, ciclos en x y amplitud de tensión de los ciclos en y. La frecuencia de los ensayos con ciculos o triángulos es la frecuencia de ciclado usada en los ensayos. En los circulos se emplea una frecuencia de 20 KHz para acelerar todo el proceso de ensayo. Figura 26 – Procesamiento de Imagen SN: Gráfica resultante del procesamiento de la gráfica original, con ejes en escala logarítmica A partir de los datos extraídos, se caracteriza la curva con el método MCMC. En este caso se usan las variables que conforman la ecuación de Basquin (11) para el ajuste. La caracterización matemática de los puntos, se realiza mediante dos rectas independientes que intersectan en el codo más probable en función de los ensayos proporcionados. En valores de ciclos mayores (o tensiones menores) al codo o intersección, se usa la segunda curva y viceversa. Las variables que definen la ecuación pueden ser representadas en la escala logarítmica, lo que transforma la ecuación de Basquin (11) en una recta (12). En las gráficas se emplean escalas logaritmicas Ensayos 30Hz Ensayos 20kHz Marcador 30Hz Marcador 20kHz
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 52 decimales para facilitar su representación en lugar de la representacion en logaritmo neperiano que aparece en las ecuaciones (12), (14). 𝑆𝑎=𝑎∗𝑁𝑏 (11) 𝐿𝑛(𝑆𝑎)=𝐿𝑛(𝑎)+𝑏∗𝐿𝑛(𝑁) (12) Como la amplitud de la tensión (Sa) resultante de la caracterización tiene una cierta incertidumbre, la variable resultante que se emplea en el caso de uso, se representa mediante las distribuciones (13) o (14). Cabe destacar que, por el cambio de escala entre las dos ecuaciones, los valores de sigma no son los mismos en las dos. 𝑆𝑎=𝑁((𝑎∗𝑁𝑏) ,𝑠𝑖𝑔𝑚𝑎) (13) 𝐿𝑛(𝑆𝑎)=𝑁((𝐿𝑛(𝑎)+𝑏∗𝐿𝑛(𝑁)) ,𝑠𝑖𝑔𝑚𝑎) (14) Inicialmente se configura un script para el uso de MCMC y la representación gráfica de los resultados en escala logarítmica (Figura 27). De esta manera se simplifican cálculos como el codo de la curva. En las líneas 50-53 se definen los parámetros que junto a los ciclos determinan la amplitud de tensión de la primera y segunda curva. Después, se definen la sigma y cómo calcular el número de ciclos en el que se encuentra el codo o transición entre las curvas (parámetro c). Por último, se definen las curvas en funcion de los parametros y cuando usar cada una antes de lanzar el proceso MCMC. Figura 27 – Caracterización SN: Definición del modelo MCMC para caracterizar con una distribución normal los parámetros de la curva de Basquin en escala logarítmica.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 53 En la Figura 28, se muestran los resultados del MCMC resumidos: Figura 28 – Caracterización SN: Resumen del resultado del MCMC de la ecuación de Basquin. Partiendo del resultado del MCMC, se usan los valores medios de los parámetros que definen las dos curvas (log_a1, b1, log_a2, b2) para graficar en escala logarítmica la combinación de curvas de Basquin más probables con su codo. A continuación, se tiene en cuenta la sigma para calcular las curvas representativas de los cuantiles de 0.1 y 0.9 y graficarlos. Figura 29 – Caracterización SN: Curvas SN obtenidas con MCMC con variabilidad y PDFs En cuanto al proceso MCMC y la veracidad de los resultados obtenidos, se obtienen también gráficas relevantes usando la librería arviz. Como la correlación de variables de la Figura 30 en la que se observa la esperada correlación entre los parámetros log_a y b de cada curva, o la correlación del codo con el resto.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 54 Figura 30 – Caracterización SN: Correlación de variables del MCMC Resumiendo, se ha procesado la imagen extraída del artículo para obtener los ensayos. Después, se ha empleado MCMC para obtener la combinación de curvas más probable y la variación de estas. Por último, se ha graficado la curva de Basquin obtenida junto con distintas gráficas de MCMC y se ha obtenido la media y variación necesaria para el análisis FORM. 4.2. MODELADO La metodología empleada para el cálculo de la probabilidad analiza solo los puntos críticos del modelo, ya que, en caso de darse un fallo, se dará en esos puntos y se considerará un fallo completo de la estructura. Entonces, es necesario localizar los puntos más críticos y las tensiones que se generan ahí a lo largo del ciclo para implementarlas a la función analítica del FORM. Por lo tanto, se realiza un primer FEM, el cual requiere una discretización de la geometría de la llanta. Para lograr una malla de calidad, se fija como objetivo obtener un valor límite de fracción nodal del 5% como máximo. La fracción nodal es comúnmente usada para verificar la calidad de malla y se calcula como del cociente del valor de estrés del nodo sobre el valor medio de los nodos adyacentes. Siendo n el número de nodos del elemento y 𝜎𝑖 la tensión del nodo i, el valor de fracción nodal de tensión de un nodo i rodeado de n-1 nodos es: 𝑁𝑜𝑑𝑎𝑙 𝐹𝑟𝑎𝑐𝑡𝑖𝑜𝑛𝑖= 𝜎𝑖 ∑𝜎𝑗 𝑖𝑗=1 (15)
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 55 Por restricciones de tiempos de cálculo, se fija también un límite máximo de 3.000.000 nodos para el modelo y se presta especial importancia a los radios y agujeros presentes en la llanta. Este criterio se basa en experiencia previa con modelos de llantas, en los cuales se han encontrado puntos críticos en los radios y agujeros. Las zonas críticas se pueden observar marcadas en rojo en la llanta simplificada de la derecha en la Figura 31. El análisis de la llanta se realiza a lo largo de un ciclo de carga completo, es decir, un giro de 360º. Para el modelado, se divide la vuelta completa en 36 puntos en sectores de 10º, tomandose como puntos de referencia las divisiones entre sectores. En cada uno de esos puntos, la llanta soportará una carga constante que simula la operación del vehículo en curvas. A partir de las componentes Fz y Fy de esta carga constante lateral sobre el neumático, se derivan las cargas Fva, Fta, Fvb y Ftb a aplicar en los puntos A y B de la llanta como se ve en la Figura 31 (a). Tras esto, siguiendo especificaciones de cliente, se dividen en 7 para simular la distribución real de la fuerza en la superficie de la llanta Figura 31 (b). Esta división en 7 se emplea para cada una de las fuerzas calculadas en el paso anterior (Fva, Fta, Fvb, Ftb) y se hace siguiendo una distribución parabólica derivada de la fórmula de Simpson compuesta [16]. Figura 31 - Modelado: Distribución de cargas y nodos críticos típicos de una llanta en Rim-Rolling En el análisis de Rim-Rolling las fuerzas Fv y Ft aplicadas, así como el punto de aplicación de las mismas, representan las condiciones de ensayo según la norma B94 6120 conforme con los datos suministrados por el cliente. Figura 32 - Modelado: Cálculo de fuerzas y su distribución parabólica usando la regla de Simpson con 7 puntos
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 56 Las componentes de las cargas resultantes en A y B distribuidas en 7 puntos (Figura 32) se aplican al modelo mediante 7 superficies distintas en cada step o ángulo del giro. La magnitud de las fuerzas se introduce mediante tabular_data a cada una de las superficies situadas en los 36 posibles puntos a lo largo del giro. En la Figura 33 se observan los valores asignados a una de las 36 superficies del punto B en distintos instantes del giro de la rueda. Este punto de la llanta no sufre cargas en el primer instante del giro, pero empiezan a aumentar a medida que se aproxima al instante en el que la fuerza se le aplica directamente, para luego ir disminuyendo hasta volver a cero. Figura 33 - Modelado: Configuración de fuerzas de uno de los puntos de la llanta empleando Tabular Data Todas las tabular data siguiendo este criterio hacen que, al visualizar las cargas en uno de los instantes haya 7 cargas aplicadas en A y otras 7 en B cada una con la magnitud correspondiente al step 5 en su tabular data (Figura 34). Figura 34 - Modelado: Distribución de cargas en la superficie de la llanta en los puntos A y B en el step 5 Se incluyen también condiciones de contorno de empotramiento a las interfaces llanta-vehículo, lo cual se ve reflejado con marcas de empotramiento en el esquema de la llanta de la Figura 34. En cuanto al material, se usa el módulo de Young del Aluminio de 7,1 GPa y un modelo elástico lineal.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 57 4.3. MALLADO Tras un mallado inicial se observa que no se puede cumplir con ambos objetivos de nodos y calidad de malla simultáneamente en toda la llanta. Por lo tanto, se procede a buscar una fracción del modelo que se pueda mallar sin perder información relevante al modo de fallo, lo cual es una tecnica normal empleada en estudios FEM o CFD. La llanta se compone de cinco brazos simétricos y excepto cuatro agujeros para los pernos y uno para la válvula, es completamente simétrica. Por lo que se analiza la diferencia de tensión entre quintas partes para compararlas y mallar la más crítica con mayor calidad que el resto. En la Figura 35 se aprecia la silueta de la llanta estudiada en la cual se pueden observar los 5 brazos y 4 agujeros. Como se mencionaba previamente, dada la confidencialidad con el cliente no se puede mostrar la geometría. Figura 35 - Mallado: Silueta de la llanta Antes de realizar la comparativa, para saber por dónde dividir la llanta en cinco partes, se lanza un cálculo con las condiciones especificadas, pero sin cumplir la calidad de malla (Nodos: 1.488.060, Elementos: 1.024.318, Calidad: Muchas zonas por encima del límite de 5% de fracción nodal) y se extraen los datos de los nodos para cada instante del ciclo de carga. De esta manera, se pueden verificar cuales son las zonas críticas y seleccionar dichos nodos para el análisis comparativo de las quintas partes por zonas críticas. Comparando después estas zonas
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 64 Figura 44 - Ciclo de tensión con mayor media tractiva (nodo 837205) Como conclusión se obtienen cuatro posibles nodos críticos que se representan resumidos en la Tabla 9, Figura 45 y Figura 46. Tabla 9 - Resúmen nodos críticos Nodo Steps Máximo y Mínimo Rango(MPa) Media(MPa) 4º Mayor Rango 49341 24 33 281,632 44,064 9º Mayor Rango 49872 4 31 276,425 43,707 14º Mayor Rango 838139 10 19 273,301 43,840 (1º) Mayor Media 837205 12 22 254,985 59,8375
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 65 Figura 45 - Representación gráfica de medias y rangos de los nodos críticos Figura 46 - Posición de los nodos críticos (hexagono = válvula de aire) Se emplean por consiguiente los cuatro nodos para evaluar la probabilidad de fallo que presenta la llanta en cada uno de ellos. Se realiza un cálculo FORM inicial para determinar el más crítico que representa entonces la probabilidad de fallo completa de la llanta. -96,75 -94,51 -92,81 -67,66 184,88 181,92 180,49 187,33 44,1 43,7 43,8 59,8 -150 -100 -50 0 50 100 150 200 250 49341 49872 838139 837205 Tensión [MPa] Nodos Rangos y Medias Min Max Media
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 66 4.5. CONFIGURACIÓN OPTISLANG Para el caso de uso, se implementa un modelo analítico que permite calcular el valor de la función límite en cada iteración del método FORM. Dado que las variables con incertidumbre no afectan directamente al modelo FEM, se extraen los ciclos de tensión del cálculo FEM inicial, el cual ha permitido identificar los nodos críticos junto con sus valores medios de tensión y amplitudes. A partir de estos valores medios, se aplican las distribuciones de tensión residual caracterizadas previamente, y se emplea el criterio de Goodman [4] para adaptar los resultados a ensayos con relación de carga R = -1. La tensión de amplitud obtenida se incorpora como carga en la función límite (2). La resistencia del material se modela mediante la distribución de la ecuación de Basquin a 10^6 ciclos porque es el objetivo de vida marcado por el cliente, también obtenida durante la fase de caracterización. El cálculo de la función límite no se realiza mediante el uso de FEM, sino a través de scripts de Python integrados en un bloque FORM dentro de OptiSLang (Figura 47). Estos scripts devuelven el valor de la función límite para combinaciones específicas de tensión residual y tensión límite. Las distribuciones de las variables se definen dentro del propio bloque FORM, permitiendo calcular probabilidades de fallo para cada nodo crítico (Figura). Figura 47 - Bloque FORM de OptiSLang con integración de Python para cálculo de probabilidad de fallo Figura 48 - Menú configuración de bloque FORM de OptiSLang preparado para cálculo de probabilidad de fallo Se introducen las distribuciones de las dos variables caracterizadas en la configuración del FORM en OptiSLang (figura 48) y para cada nodo crítico se cambian ciertos parámetros del script de Python llamado Función Límite Analítica. Las variables en cuestión son las que tienen una incertidumbre ya caracterizada en apartados previos. Log_S_lim es la variable que se obtiene de la caracterización de la curva SN, representa el límite de la amplitud de tensión del ciclo de carga
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 67 del material de la llanta para sobrevivir 10^6 ciclos de vida, y la varianza de la misma. Tensión_residual_axial representa el valor con varianza de las tensiones residuales generadas en el proceso de fabricación de la llanta. El valor de la función límite que se devuelve al algoritmo FORM se calcula siguiendo los siguientes pasos: 1. Obtener los valores puntuales del límite de tensión del material a 106 ciclos y de la tensión residual axial. 2. Sumar la tensión residual a la tensión media del ciclo del nodo correspondiente. 3. Usando la tensión media final y la amplitud de tensión del ciclo del nodo correspondiente calcular mediante Goodman la amplitud de tensión del ciclo equivalente para una relación de carga de R = -1. 4. Calcular el valor de la función límite como la resta entre la tensión límite que resiste el material y la tensión equivalente para R = -1 sufrida. O, en caso de que la iteración del FORM solicita calcular con unos valores que superan la tensión última, devolver un valor de la función límite de -1, es decir, fallido. A continuación, tras observar los resultados de los cuatro nodos críticos, se procede a analizar desde otra perspectiva el caso de uso. Se calcula cuál es el valor medio de la ecuación de Basquin (a 106 ciclos) que permite que el material soporte las cargas del caso de uso con una probabilidad de fallo del 5%. Para ello, se fija la distribución de la tensión residual y se introduce el bloque FORM en un bloque de optimización que ajusta la media de la tensión límite hasta alcanzar la probabilidad deseada. Este procedimiento requiere un bloque de conexión adicional, ya que la extracción del valor de la probabilidad de fallo del bloque FORM no es automática. Figura 49 - Algoritmo FORM integrado dentro de un bloque de optimización, conectado mediante un bloque data mining que extrae el valor de probabilidad calculada con cada posible diseño
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 68 Figura 50 - Configuración de distribuciones y la optimización de la curva del material en el bloque de optimización y en el FORM; así como los criterios de optimización para encontrar la probabilidad de fallo de 5% o 𝛽 = 1.644... En la siguiente sección de resultados, se evalúa el caso inverso; se mantiene fija la tensión límite y se modifica la tensión residual para determinar el tratamiento superficial necesario que garantice la probabilidad de fallo del 5% sin cambiar el material. Finalmente, se realiza una optimización multivariable, variando ambos parámetros (tensión límite y tensión residual), lo que permite obtener un frente de Pareto con todas las combinaciones que resultan en una probabilidad de fallo del 5%, como se ve en la proxima sección.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 69 5. RESULTADOS Los cálculos iniciales realizados con los cuatro nodos críticos dan como resultado probabilidades de fallo del 100%, lo que quiere decir que el diseño propuesto no está cumpliendo con las condiciones de diseño pedidas. Se realizan por lo tanto las dos optimizaciones, fijando primero una variable y después la otra, para así calcular los valores necesarios para cumplir el 5% de probabilidad de fallo. Se puede optar por otro material que presente unas características apropiadas. Para ello se pueden cambiar las características del material del análisis variando en la optimización la curva SN pero fijando el valor de las tensiones residuales. Así se logra el 5% de probabilidad de fallo a partir del valor log_S_limite = 5,46 (Figura 51). Por consecuente se necesita un material con una curva SN que tenga un límite de amplitud de tensión a 106 ciclos de e5,46 o 235 MPa. Este valor no resulta factible dentro de la gama de aluminios del mercado por lo que se procede a realizar el cálculo inverso. Figura 51 - Postproceso de la optimización de la curva SN del material manteniendo las mismas tensiones residuales. Se muestra el mejor diseño 77 en la tabla de diseños, como el historial de diseños calculados y los valores de las distintas variables del mejor diseño. Al mantener constante la resistencia o curva SN del material y optimizar el valor de las tensiones residuales, se consiguen las tensiones residuales necesarias para cumplir con las condiciones de
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 70 diseño de la llanta. En Figura 52 puede observarse que manteniendo la curva SN, se necesitaría una tensión residual de 181,3 MPa para cumplir con el 5% de probabilidad de fallo. Cabe destacar que el valor de la tabla es negativo dado que se muestra el valor objetivo que usa el software, no la tensión residual en sí. Esto se ve claramente en el historial de diseños comprobados. Figura 52 - Postproceso de la optimización de la tensión residual manteniendo la misma curva SN. Se muestra el mejor diseño 81 en la tabla de diseños, así como el historial de diseños calculados y los valores de las distintas variables del mejor diseño. Por último, se obtiene el Pareto de la optimización de ambas variables para localizar los diseños intermedios que logran el 5% de probabilidad de fallo objetivo. En la Figura 53, Figura 54 y Figura 55 se ven el postproceso de OptiSLang y la curva de Pareto en escala log-lineal y lineal-lineal. Esto ofrece la posibilidad de que el cliente adapte las características de las dos variables a las necesidades de la empresa.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 71 Figura 53 - Pareto resultante de la optimización de las dos variables Figura 54 - Pareto resultante log_S vs T_Res
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 72 Figura 55 - Pareto resultante S vs T_Res
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 73 CONCLUSIONES Y LINEAS DE DESARROLLO FUTURO El estudio realizado sobre la llanta permitió caracterizar su comportamiento a fatiga combinando datos provenientes de ensayos experimentales, información de la literatura, simulación por elementos finitos y análisis de fiabilidad mediante el método FORM. A lo largo del proceso, se identificaron las zonas críticas del componente a través del análisis de tensiones durante el ciclo de carga, lo que facilitó el refinamiento del mallado en las áreas más comprometidas estructuralmente. Gracias a la simetría del diseño de la llanta, fue posible hacer un mallado con tamaño variable centrándose en los puntos de mayor interés. La integración de scripts en Python con el entorno de Ansys permitió automatizar la localización de los nodos con mayor riesgo de fallo por fatiga, pudiendo así obtener mediante FORM la probabilidad de fallo en los puntos más críticos del componente. Los resultados indicaron que, bajo las condiciones actuales del material y las tensiones residuales, la probabilidad de fallo estructural a fatiga alcanza el 100%, lo que evidencia la necesidad de rediseñar el componente. Se exploraron distintas estrategias para un diseño de la llanta aceptable, desde la elección de nuevos materiales con curvas SN más resistentes hasta la incorporación de tratamientos superficiales que induzcan esfuerzos de compresión residual. La solución más viable (Figura 55) resultó ser una combinación de ambas medidas, ya que ningún aluminio disponible alcanzaba el desempeño requerido por sí solo, y aplicar únicamente tratamientos supondría inducir 181 MPa de tensión compresiva en la superficie del material, lo cual puede ser inviable técnica o económicamente. Finalmente, se generó un frente de Pareto que permitió visualizar y comparar soluciones de compromiso entre propiedades del material y requerimientos de tratamiento, facilitando la toma de decisiones en función de los recursos disponibles y las necesidades del cliente. Más allá del caso de uso específico, el presente trabajo ha demostrado la viabilidad de una metodología integral de análisis probabilístico estructural que combina técnicas de simulación FEM, caracterización de incertidumbres y programación. La comparativa entre OptiSLang y UQLab + pyMechanical muestra que ambas herramientas son válidas, aunque UQLab ofrece mayor eficiencia en entornos académicos y OptiSLang mejor integración industrial. Esta versatilidad sugiere que la metodología es extrapolable a otros componentes críticos del sector mecánico. Además, el enfoque automatizado permite reducir tiempos de simulación y errores humanos, lo que la convierte en una herramienta de alto valor tanto en investigación como en el ámbito profesional.
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 80 f = ( r"C:\Users\ivan.alonso\OptiSLang Files\WorkflowpyOptisBrida\WorkflowpyOptis.opd" r"\ReliabilityFORM\ReliabilityFORM.omdb" ) # Espera a que termine el procesamiento y abre el archivo de postprocesado la # primera vez que el estado sea "PROCESSING" i = 1 while osl.application.project.get_status() == "PROCESSING": if i == 1: try: os.startfile(filepath=f) i = 2 except: print("No se ha podido abrir el archivo de postprocesado.") # Muestra el estado final del proyecto print(osl.application.project.get_status()) # Detiene el proyecto, guarda y libera recursos osl.application.project.stop() osl.application.save() osl.dispose() print("") Metodología 2 (workflow) #//////////////////////////////////////////////////////////////////////////// # Este script realiza un análisis FORM usando uqpylab y pyMechanical. # Uqpylab usa la librería pyMechanical para poder usar directamente un modelo # de ANSYS como función. El usuario debe adaptar los parámetros de entrada, # el modelo y las opciones de análisis según su caso. #//////////////////////////////////////////////////////////////////////////// from uqpylab import sessions import time, logging # Devuelve la hora actual en formato legible def get_formatted_time(): return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # Calcula la duración entre dos instantes en h:m:s def calculate_duration(start, end): duration = end - start hours = int(duration // 3600)
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 81 minutes = int((duration % 3600) // 60) seconds = int(duration % 60) return hours, minutes, seconds print(f"\n\n{get_formatted_time()} : Inicio del script") # Datos de sesión personal # (el usuario debe poner su token y la instancia de UQCloud) myToken = '1e18d5f6935f12bf058b29ce213411ef24c2a501' UQCloud_instance = 'https://uqcloud.ethz.ch' # Inicia la sesión remota con UQCloud mySession = sessions.cloud(host=UQCloud_instance, token=myToken) # Acceso rápido a la interfaz de línea de comandos de uqpylab uq = mySession.cli # Resetea la sesión para empezar limpio mySession.reset() # Definición del modelo: aquí se indica la función de modelo a usar # (debe estar en UqLabMechFunc.py) modelopts = { "Type": "Model", "ModelFun": "UqLabMechFunc.model", "isVectorized": False } # Crea el modelo en uqpylab myModel = uq.createModel(modelopts) uq.print(myModel) # Especifica las opciones para el vector aleatorio de entrada # (el usuario puede modificar medias y sigmas) Input = { 'Marginals': [ {'Name': 'R', 'Type': 'Gaussian', 'Parameters': [350, 35]}, {'Name': 'P', 'Type': 'Gaussian', 'Parameters': [69, 10]} ] } # Crea el vector aleatorio normal bivariado myInput1 = uq.createInput(Input) uq.print(myInput1) # Opciones para el análisis de fiabilidad FORM
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 82 FORMOpts = { "Type": "Reliability", "Method": "FORM" } iFORM = get_formatted_time() print(f"\n{iFORM} : Inicio del algoritmo FORM\n") start_time = time.time() # Ejecuta el análisis FORM FORMAnalysis = uq.createAnalysis(FORMOpts) end_time = time.time() fFORM = get_formatted_time() print(f"\n{fFORM} : Fin del algoritmo FORM\n") hours, minutes, seconds = calculate_duration(start_time, end_time) print(f"\nDuración de algoritmo FORM: {hours} horas, {minutes} minutos," f" {seconds} segundos\n") # Muestra los resultados del análisis FORM uq.print(FORMAnalysis) uq.display(FORMAnalysis) # Termina la sesión remota en UQCloud mySession.quit() Metodología 2 (modelo) #//////////////////////////////////////////////////////////////////////////// # Este script realiza un análisis FORM usando uqpylab y pyMechanical. # Uqpylab usa la librería pyMechanical para poder usar directamente un modelo # de ANSYS como función. El usuario debe adaptar la ruta del archivo .mechdb # y los IDs de los objetos según su modelo de ANSYS. #//////////////////////////////////////////////////////////////////////////// import numpy as np import ansys.mechanical.core as mech import time, logging from ansys.mechanical.core.embedding.logger import Configuration # Devuelve la hora actual en formato legible def get_formatted_time(): return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 83 # Calcula la duración entre dos instantes en h:m:s def calculate_duration(start, end): duration = end - start hours = int(duration // 3600) minutes = int((duration % 3600) // 60) seconds = int(duration % 60) return hours, minutes, seconds # Inicializa la aplicación de Mechanical solo una vez (para eficiencia) def initialize_mechanical_app(): global app if app is None: app = mech.App() # (Opcional) Configura el logging para mostrar información en la terminal # Configuration.configure(level=logging.INFO, to_stdout=True) # Variable global para la instancia de ANSYS Mechanical app = None # Función principal que uqpylab usará como modelo def model(X): # Marca el inicio del script iScript = time.time() print(f"\n{get_formatted_time()} : Inicio de Script de Mechanical") global app initialize_mechanical_app() # Ruta al archivo de Mechanical (.mechdb) # El usuario debe adaptar esta ruta a su caso mechdb_path = ( r"C:\Users\ivan.alonso\ANSYS Files\Brida\Brida_files" r"\dp0\global\MECH\SYS.mechdb" ) # Abre el proyecto de Mechanical app.update_globals(globals()) app.open(mechdb_path) # app.print_tree() # (Opcional) Muestra el árbol del modelo # Extrae los valores de entrada (R y P) del array X X = np.array(X, ndmin=2) R = X[0, 0].tolist() P = X[0, 1].tolist()
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 84 print(f"\nR: {R} MPa P: {P} MPa") # Actualiza el valor de la fuerza en el modelo de ANSYS # El usuario debe asegurarse de que el ID (81) corresponde al objeto correcto pressure_81 = app.DataModel.GetObjectById(81) pressure_81.Magnitude.Output.SetDiscreteValue( 0, Quantity(P, "MPa") # type: ignore ) # Ejecuta el análisis en Mechanical iCalc = time.time() print(f"\n{get_formatted_time()} : Inicio del cálculo en Mechanical") app.Model.Analyses[0].Solution.Solve(True) fCalc = time.time() print(f"{get_formatted_time()} : Fin del cálculo en Mechanical") hours, minutes, seconds = calculate_duration(iCalc, fCalc) print( f"Duración del cálculo de Mechanical: {hours} horas, " f"{minutes} minutos, {seconds} segundos" ) # Obtiene el resultado del análisis # El usuario debe asegurarse de que el ID (463) corresponde al resultado deseado S_value = app.DataModel.GetObjectById(463).Maximum.Value print(f"\nS: {S_value/10**6} MPa L_f: {R - S_value/10**6} MPa") # Guarda y cierra el proyecto de Mechanical app.save() app.close() fScript = time.time() print(f"\n{get_formatted_time()} : Fin de Script de Mechanical") hours, minutes, seconds = calculate_duration(iScript, fScript) print( f"Duración del Script de Mechanical: {hours} horas, " f"{minutes} minutos, {seconds} segundos\n" ) print( "///////////////////////////////////////////////////////////////////\n" ) # Devuelve el resultado que uqpylab usará como función de estado límite return R - S_value/10**6
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 85 CARACTERIZACIÓN Procesamiento de imagen """ Este script realiza las siguientes tareas: 1. Carga una imagen y detecta puntos correspondientes a triángulos (30Hz) y círculos (20Hz) basándose en umbrales de color. 2. Calcula los centros de masa de los puntos detectados. 3. Guarda las coordenadas de los puntos en archivos CSV. 4. Convierte las coordenadas a una escala logarítmica y las guarda en nuevos archivos CSV. 5. Genera una gráfica en escala logarítmica con los puntos detectados. """ from PIL import Image import numpy as np import pandas as pd from scipy.ndimage import label, center_of_mass from matplotlib.markers import MarkerStyle import matplotlib.pyplot as plt # Cargar la imagen image_path = r"Procesamiento de imagen\Captura de SN.png" img = Image.open(image_path).convert("RGB") img_np = np.array(img) # Definir el rango logarítmico para columnas y filas log_min_col = 1e3 log_max_col = 1e12 log_min_row = 40 log_max_row = 200 # Obtener las dimensiones de la imagen height, width = img_np.shape[:2] # Definir umbrales para detectar colores asociados a triángulos (30Hz) y # círculos (20Hz) def is_triangle(pixel): # Triángulos (30Hz) r, g, b = pixel # Azul: bajo rojo, bajo-medio verde, alto azul return r < 100 and g < 150 and b > 150 def is_circle(pixel): # Círculos (20Hz)
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 86 r, g, b = pixel # Amarillo: alto rojo y verde, bajo azul return r > 200 and g > 200 and b < 100 # Crear máscaras binarias para los puntos de triángulos y círculos triangle_mask = np.zeros((height, width), dtype=bool) circle_mask = np.zeros((height, width), dtype=bool) # Iterar sobre cada píxel para aplicar los umbrales for y in range(height): for x in range(width): pixel = img_np[y, x] if is_triangle(pixel): triangle_mask[y, x] = True elif is_circle(pixel): circle_mask[y, x] = True # Etiquetar componentes conectados en las máscaras triangle_labeled, triangle_num_features = label(triangle_mask) circle_labeled, circle_num_features = label(circle_mask) # Calcular los centros de masa de los componentes conectados triangle_centers = center_of_mass( triangle_mask, triangle_labeled, range(1, triangle_num_features + 1) ) circle_centers = center_of_mass( circle_mask, circle_labeled, range(1, circle_num_features + 1) ) # Crear una imagen en blanco para visualizar los puntos detectados output_img = np.ones((height, width, 3), dtype=np.uint8) * 255 # Fondo blanco # Listas para almacenar las coordenadas de los puntos triangle_coordinates = [] circle_coordinates = [] # Dibujar los centros de masa de los puntos de triángulos y almacenar sus # coordenadas def draw_circle(img, center, radius, color): y, x = center for i in range(-radius, radius + 1): for j in range(-radius, radius + 1): if ( 0 <= y + i < img.shape[0] and 0 <= x + j < img.shape[1] and i**2 + j**2 <= radius**2
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 87 ): img[y + i, x + j] = color for center in triangle_centers: y, x = map(int, center) draw_circle(output_img, (y, x), 4, [0, 0, 255]) # Azul triangle_coordinates.append((x + 1, height - y)) # (columna, fila) # Dibujar los centros de masa de los puntos de círculos y almacenar sus # coordenadas for center in circle_centers: y, x = map(int, center) draw_circle(output_img, (y, x), 4, [255, 255, 0]) # Amarillo circle_coordinates.append((x + 1, height - y)) # (columna, fila) # Añadir el punto (465, 361) manualmente a los puntos de triángulos porque # está muy cerca en la imagen y no lo detecta triangle_coordinates.append((465, 361)) # Guardar la imagen con los puntos detectados output_image_path = r"Procesamiento de imagen\detected_points.png" Image.fromarray(output_img).save(output_image_path) # Guardar las coordenadas en archivos CSV triangle_df = pd.DataFrame(triangle_coordinates, columns=["Column", "Row"]) circle_df = pd.DataFrame(circle_coordinates, columns=["Column", "Row"]) triangle_df.to_csv( r"Procesamiento de imagen\30Hz_triangle_pixel_coords.csv", index=False, ) circle_df.to_csv( r"Procesamiento de imagen\20Hz_circle_pixel_coords.csv", index=False, ) print(f"\nOutput image saved as {output_image_path}") print("Triangle pixel coordinates saved to triangl_pixel_coords.csv") print("Circle pixel coordinates saved to circle_pixel_coords.csv") # Función para mapear columnas de píxeles a escala logarítmica def map_column_to_log_scale(column, width, log_min, log_max): return 10 ** ( np.log10(log_min) + (column / (width - 1)) * (np.log10(log_max) - np.log10(log_min)) )
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 88 # Función para mapear filas de píxeles a escala logarítmica def map_row_to_log_scale(row, height, log_min, log_max): return 10 ** ( np.log10(log_min) + (row / (height - 1)) * (np.log10(log_max) - np.log10(log_min)) ) # Cargar los archivos CSV con las coordenadas triangle_df = pd.read_csv( r"Procesamiento de imagen\30Hz_triangle_pixel_coords.csv" ) circle_df = pd.read_csv( r"Procesamiento de imagen\20Hz_circle_pixel_coords.csv" ) # Aplicar el mapeo a escala logarítmica triangle_df["N"] = triangle_df["Column"].apply( lambda col: map_column_to_log_scale(col, width, log_min_col, log_max_col) ) triangle_df["MPa"] = triangle_df["Row"].apply( lambda row: map_row_to_log_scale(row - 1, height, log_min_row, log_max_row) ) circle_df["N"] = circle_df["Column"].apply( lambda col: map_column_to_log_scale(col, width, log_min_col, log_max_col) ) circle_df["MPa"] = circle_df["Row"].apply( lambda row: map_row_to_log_scale(row - 1, height, log_min_row, log_max_row) ) # Guardar las coordenadas logarítmicas en nuevos archivos CSV triangle_df[["N", "MPa"]].to_csv( r"Procesamiento de imagen\30Hz_values.csv", index=False ) circle_df[["N", "MPa"]].to_csv( r"Procesamiento de imagen\20Hz_values.csv", index=False ) print("Triangle points log coordinates saved to triangle_values.csv") print("Circle points log coordinates saved to circle_values.csv") # Crear la gráfica en escala logarítmica plt.figure(figsize=(10, 5)) # Graficar los puntos de triángulos sin relleno
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 89 plt.scatter( triangle_df["N"], triangle_df["MPa"], edgecolor='black', facecolor='none', label='Triangles (30Hz)', s=75, marker=MarkerStyle('^'), ) # Graficar los puntos de círculos sin relleno plt.scatter( circle_df["N"], circle_df["MPa"], edgecolor='red', facecolor='none', label='Circles (20Hz)', s=75, marker=MarkerStyle('o'), ) # Graficar los puntos de triángulos en azul (puntos pequeños) plt.scatter( triangle_df["N"], triangle_df["MPa"], color='blue', label='Triangles (30Hz)', s=5, ) # Graficar los puntos de círculos en amarillo (puntos pequeños) plt.scatter( circle_df["N"], circle_df["MPa"], color='yellow', label='Circles (20Hz)', s=5, ) # Configurar escalas logarítmicas plt.xscale('log') plt.yscale('log') # Configurar límites de los ejes plt.xlim(log_min_col, log_max_col) plt.ylim(log_min_row, log_max_row)
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 96 # Rotar líneas verticales vline_x1 = [rotation_point_x1, rotation_point_x1] vline_y1 = [min(a1_range), max(a1_range)] rotated_vline_x1, rotated_vline_y1 = rotate_line_with_aspect_correction( vline_x1, vline_y1, rotation_point_x1, rotation_point_y1, rotation_matrix1, aspect_ratio_x1, aspect_ratio_y1 ) vline_x2 = [rotation_point_x2, rotation_point_x2] vline_y2 = [min(a2_range), max(a2_range)] rotated_vline_x2, rotated_vline_y2 = rotate_line_with_aspect_correction( vline_x2, vline_y2, rotation_point_x2, rotation_point_y2, rotation_matrix2, aspect_ratio_x2, aspect_ratio_y2 ) # Grafica datos, curvas SN y PDFs plt.scatter( ciclos, tension, label="Datos experimentales", color="black", s=3 ) plt.plot( ciclos_fit, tension_fit_mean, label=f"Curva ajustada (media)", color="black", linewidth=1.5 ) plt.plot( ciclos_fit, tension_fit_inf, label=f"Curva fractil {inf_cuant}", color="black", linestyle="--", linewidth=0.5 ) plt.plot( ciclos_fit, tension_fit_sup, label=f"Curva fractil {sup_cuant}", color="black", linestyle="--", linewidth=0.5 ) plt.plot( rotated_a1_density_graph, rotated_a1_range, label="PDF curva 1", color="black", linewidth=0.5 ) plt.plot( rotated_a2_density_graph, rotated_a2_range, label="PDF curva 2", color="black", linewidth=0.5 ) plt.plot( rotated_vline_x1, rotated_vline_y1, color="black", linewidth=0.5 ) plt.plot( rotated_vline_x2, rotated_vline_y2, color="black", linewidth=0.5 )
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 97 plt.xlabel("Nº de Ciclos (N)") plt.ylabel("Amplitud de Tensión (Sa) [MPa]") plt.title("Curva SN con cuantiles y PDFs obtenidos por MCMC") plt.legend(loc="upper right", fontsize=8, frameon=False) plt.grid(True, which="both", linestyle="--", linewidth=0.1) plt.savefig( f"{output_folder}/1_sn_curve_with_pdfs.png", dpi=1200, bbox_inches="tight" ) if show_plot: plt.show() # Graficar pares de parámetros, trazas y posteriors pair_ax = az.plot_pair( result, var_names=["log_a1", "b1", "log_a2", "b2", "log_c", "sigma"], kind="scatter", marginals=True, gridsize=int(result.posterior.dims["draw"] ** 0.35) ) # Mostrar solo el valor mínimo y máximo en los ejes for ax in np.array(pair_ax).flatten(): if hasattr(ax, "set_xlabel"): ax.set_xlabel(ax.get_xlabel(), fontsize=40) if hasattr(ax, "set_ylabel"): ax.set_ylabel(ax.get_ylabel(), fontsize=40) # Limitar ticks a solo min y max if ( hasattr(ax, "get_xlim") and hasattr(ax, "set_xticks") and ax.figure is not None ): xmin, xmax = ax.get_xlim() ax.set_xticks([xmin, xmax]) ax.set_xticklabels( [f"{xmin:.2g}", f"{xmax:.2g}"], fontsize=28 ) if ( hasattr(ax, "get_ylim") and hasattr(ax, "set_yticks") and ax.figure is not None ): ymin, ymax = ax.get_ylim() ax.set_yticks([ymin, ymax]) ax.set_yticklabels( [f"{ymin:.2g}", f"{ymax:.2g}"], fontsize=28
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 98 ) # Aumentar el grosor de los bordes de cada gráfica for spine in ax.spines.values(): spine.set_linewidth(3) plt.savefig( f"{output_folder}/2_pair_plot.png", dpi=600, bbox_inches='tight' ) plt.close() az.plot_trace(result, combined=False) plt.savefig( f"{output_folder}/3_trace_plot.png", dpi=600, bbox_inches='tight' ) plt.close() az.plot_posterior(result) plt.savefig( f"{output_folder}/4_posterior_plot.png", dpi=600, bbox_inches='tight' ) plt.close() # Calcula y guarda la matriz de correlación de los parámetros ajustados params = ["log_a1", "b1", "log_a2", "b2", "sigma", "log_c"] posterior_samples = {p: result.posterior[p].values.flatten() for p in params} df_corr = pd.DataFrame(posterior_samples) corr_matrix = df_corr.corr() corr_matrix.to_csv(f"{output_folder}/correlation_matrix.csv") plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, annot=True, cmap="coolwarm", fmt=".2f") plt.title("Matriz de correlación de los parámetros MCMC") plt.tight_layout() plt.savefig(f"{output_folder}/5_correlation_matrix.png", dpi=600) plt.close() if __name__ == '__main__': # Crea la carpeta de salida si no existe folder = "Resultados_SN_MCMC" input_file = os.path.join(folder, "testing_values.csv") data = pd.read_csv(input_file) data.columns = ["Ciclos", "Tension"] run_mcmc_sn_curve_with_knee( data, folder, load_result=True, save_result=True, show_plot=False )
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 99 MCMC (tensiones residuales) #/////////////////////////////////////////////////////////////////////////////////// # Este script realiza un ajuste bayesiano (MCMC) de los datos de tensiones # residuales usando PyMC. Permite analizar subconjuntos de los datos según # punto, tipo de tensión y profundidad, y genera gráficos y resúmenes de los # parámetros ajustados. El usuario puede personalizar los subconjuntos y los # límites de los gráficos. #/////////////////////////////////////////////////////////////////////////////////// import pymc as pm import pandas as pd import arviz as az import matplotlib.pyplot as plt import os import numpy as np from scipy.stats import norm def run_mcmc(datos, tipos_tension, puntos, profundidades, output_prefix, output_folder, limits=None): # Conversión de la columna 'profundidad' a float si es necesario # (por si hay decimales con coma) if datos["profundidad"].dtype == "object": datos["profundidad"] = datos["profundidad"].str.replace( ",", ".").astype(float) # Filtrado de los datos según los criterios seleccionados por el usuario datos_filtrados = datos[ (datos["tipo_de_tensión"].isin(tipos_tension)) & (datos["punto"].isin(puntos)) & (datos["profundidad"].isin(profundidades)) ] # Extrae los valores de tensión para el análisis observed_data = datos_filtrados["tensión_MPa"].values print(f"Datos observados: {observed_data}\n") # Si no hay datos para la combinación seleccionada, se omite if datos_filtrados.empty: print("No se encontraron datos para esta combinación. Saltando...") return # Definición y ajuste del modelo Bayesiano with pm.Model() as model: # Priors no informativos para la media y la desviación estándar
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 100 mu = pm.Normal("mu", mu=0, sigma=1e6) sigma = pm.HalfNormal("sigma", sigma=1e6) # Likelihood: modelo normal para los datos observados pm.Normal("likelihood", mu=mu, sigma=sigma, observed=observed_data) # MCMC sampling trace = pm.sample(10000, return_inferencedata=True, discard_tuned_samples=True) # Visualización de la traza de los parámetros axes = az.plot_trace(trace, combined=False) # Permite al usuario configurar los límites de los ejes para cada subplot if limits and "trace" in limits: for i, ax in enumerate(axes.flatten()): if i in limits["trace"]: ax_limits = limits["trace"][i] if "xlim" in ax_limits: ax.set_xlim(ax_limits["xlim"]) if "ylim" in ax_limits: ax.set_ylim(ax_limits["ylim"]) plt.savefig(f"{output_folder}\\{output_prefix}_trace_plot.png", dpi=600, bbox_inches='tight') plt.close() # Visualización de los posteriores axes = az.plot_posterior(trace) if limits and "posterior" in limits: for i, ax in enumerate(axes.flatten()): if i in limits["posterior"]: ax_limits = limits["posterior"][i] if "xlim" in ax_limits: ax.set_xlim(ax_limits["xlim"]) if "ylim" in ax_limits: ax.set_ylim(ax_limits["ylim"]) plt.savefig(f"{output_folder}\\{output_prefix}_posterior_plot.png", dpi=600, bbox_inches='tight') plt.close() # Visualización de la correlación entre parámetros axes = az.plot_pair( trace, var_names=["mu", "sigma"], kind="scatter", marginals=True, ) if limits and "pair" in limits: for i, ax in enumerate(axes.flatten()):
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 101 if i in limits["pair"]: ax_limits = limits["pair"][i] if "xlim" in ax_limits: ax.set_xlim(ax_limits["xlim"]) if "ylim" in ax_limits: ax.set_ylim(ax_limits["ylim"]) plt.savefig(f"{output_folder}\\{output_prefix}_pair_plot.png", dpi=600, bbox_inches='tight') plt.close() # Resumen estadístico de los parámetros ajustados summary = az.summary(trace) print("\n", summary, "\n") summary.to_csv(f"{output_folder}\\{output_prefix}_summary.csv") # === GENERACIÓN DE LA PDF NORMAL AJUSTADA === # Obtiene la media y desviación estándar ajustadas (media de la posterior) mu_fit = trace.posterior["mu"].mean().item() sigma_fit = trace.posterior["sigma"].mean().item() # Rango de valores para graficar la PDF (4 sigmas a cada lado de la media) x = np.linspace(mu_fit - 4*sigma_fit, mu_fit + 4*sigma_fit, 1000) pdf = norm.pdf(x, mu_fit, sigma_fit) # Crea la figura y grafica la PDF ajustada plt.figure(figsize=(13, 5)) plt.plot(x, pdf, label=f'N({round(mu_fit, 1)}, {round(sigma_fit**2, 1)})') plt.xlabel('x', fontsize=18) plt.ylabel('p(x)', fontsize=18) plt.xticks(fontsize=18) plt.yticks([]) plt.legend(fontsize=22) plt.grid() plt.xlim(mu_fit - 4*sigma_fit, mu_fit + 4*sigma_fit) # Guarda la gráfica en la carpeta de resultados plt.savefig(f"{output_folder}\\{output_prefix}_pdf.png", dpi=600, bbox_inches='tight') plt.close() if __name__ == '__main__': # Carga de los datos experimentales desde archivo datos = pd.read_csv("datos_ordenados.txt", sep="\t") # === CONFIGURACIÓN POR EL USUARIO === # El usuario puede modificar la lista 'eleccion' para decidir qué dimensiones # analizar por separado. Por ejemplo: ["puntos","tipos_tension","profundidades"]
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 102 # analizará cada punto, tipo de tensión y profundidad por separado. Si se # elimina una dimensión de la lista, se analizarán todas sus opciones juntas. eleccion = ["puntos", "tipos_tension", "profundidades"] # <-- Cambia aquí según lo que quieras analizar # Límites de los ejes para los gráficos. El usuario puede personalizarlos # para cada subplot. limits = { "trace": { 0: {"xlim": (-30, 30), "ylim": None}, 1: {"xlim": None, "ylim": None}, 2: {"xlim": (0, 60), "ylim": None}, 3: {"xlim": None, "ylim": None}, }, "posterior": { 0: {"xlim": (-30, 30), "ylim": None}, 1: {"xlim": (0, 60), "ylim": None}, }, "pair": { 0: {"xlim": (-65, 50), "ylim": None}, 2: {"xlim": None, "ylim": (0, 140)}, }, } # === GENERACIÓN DE COMBINACIONES SEGÚN LA CONFIGURACIÓN DEL USUARIO === # Estas listas determinan qué subconjuntos de los datos se analizarán. # Se puede modificar los valores de cada lista para personalizar el análisis. combinaciones = [] if "puntos" in eleccion: puntos_opciones = [[2, 4]] # <-- Cambia aquí los puntos a analizar else: puntos_opciones = [[1, 2, 3, 4]] # <-- O analiza todos juntos if "tipos_tension" in eleccion: tipos_tension_opciones = [["Axial"], ["Hoop"], ["Shear"]] # <-- Cambia aquí los tipos de tensión a analizar else: tipos_tension_opciones = [["Axial", "Hoop", "Shear"]] # <-- O analiza todos juntos if "profundidades" in eleccion: profundidades_opciones = [[0], [0.5], [1]] # <-- Cambia aquí las profundidades a analizar else: profundidades_opciones = [[0, 0.5, 1]] # <-- O analiza todas juntas
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 103 # Genera todas las combinaciones posibles según la configuración for puntos in puntos_opciones: for tipos_tension in tipos_tension_opciones: for profundidades in profundidades_opciones: combinaciones.append({ "puntos": puntos, "tipos_tension": tipos_tension, "profundidades": profundidades }) # Carpeta de salida para los resultados (se crea automáticamente si no existe) output_folder = f"Resultados_{'_'.join(eleccion)}" if not os.path.exists(output_folder): os.makedirs(output_folder) # Ejecuta el análisis para cada combinación generada for combinacion in combinaciones: puntos = combinacion["puntos"] tipos_tension = combinacion["tipos_tension"] profundidades = combinacion["profundidades"] # Generar nombre del archivo de salida según la configuración seleccionada output_prefix = [] if "puntos" in eleccion: output_prefix.append(f"puntos{'-'.join(map(str, puntos))}") if "tipos_tension" in eleccion: output_prefix.append(f"tension{'-'.join(tipos_tension)}") if "profundidades" in eleccion: output_prefix.append(f"depth{'-'.join(map(str, profundidades))}") output_prefix = "_".join(output_prefix) print("\n//////////////////////////////////////////////////////////////////" "//////////////////////////////////////////////////////////////////\n") print(f"Procesando {tipos_tension} para puntos {puntos} y profundidades " f"{profundidades}...\n") # Llama a la función principal de análisis run_mcmc(datos, tipos_tension, puntos, profundidades, output_prefix, output_folder, limits)
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 104 ANÁLISIS GLOBAL MALLADO 1_1_EliminarNodos #//////////////////////////////////////////////////////////////////////////////////// # Este script elimina líneas correspondientes a ciertos nodos de varios archivos # de resultados de tensiones equivalentes. Lee una lista de nodos a eliminar # desde 'NodesToAvoid2.txt' y procesa los archivos de resultados del 2 al 37, # guardando versiones "limpias" con el sufijo '_cleaned'. # # Uso: # - Asegúrate de tener 'NodesToAvoid2.txt' con un nodo por línea. # - Los archivos a limpiar deben estar en la carpeta 'EquivalentStressFilesCoor' # o 'EquivalentStressFiles'. #//////////////////////////////////////////////////////////////////////////////////// # Leer la lista de nodos a eliminar desde el archivo de texto nodes_to_remove = set() with open('NodesToAvoid2.txt', 'r') as f: for line in f: try: nodes_to_remove.add(int(line.strip())) except ValueError: continue # Ignora líneas vacías o no numéricas # Procesar cada archivo de resultados del 2 al 37 for i in range(2, 38): # Poner o quitar 'Coor' según la ubicación de los archivos a filtrar input_filename = ( f'EquivalentStressFilesCoor//EquivalentStressResultFile{i}.txt' ) output_filename = ( f'EquivalentStressFilesCoor//EquivalentStressResultFile{i}_cleaned.txt' ) print(f"Procesando archivo {i}...") with open(input_filename, 'r') as infile, open(output_filename, 'w') as outfile: for line in infile: try: node_number = int(line.split()[0]) # Escribe la línea solo si el nodo no está en la lista a eliminar if node_number not in nodes_to_remove: outfile.write(line) except ValueError: # Escribe encabezados u otras líneas no numéricas outfile.write(line)
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 105 print( "Procesamiento completo. Los archivos limpiados se han guardado " "con el sufijo '_cleaned'." ) 2_1_ObtenerMinMax #//////////////////////////////////////////////////////////////////////////////////// # Este script obtiene, para cada nodo, el valor máximo y mínimo de tensión # equivalente a lo largo de todos los archivos de resultados procesados. # Lee los archivos '_cleaned' de la carpeta definida y guarda los # resultados en un CSV con el nodo, el step donde ocurre el máximo/mínimo # y el valor correspondiente. # # Uso: # - Los archivos deben estar en 'EquivalentStressFiles' u otro definido y llamarse # 'EquivalentStressResultFileX_cleaned.txt' (X = 2 a 37). # - El resultado se guarda en 'ResultadosGlobal//A1_Max_Min_Values.csv'. #//////////////////////////////////////////////////////////////////////////////////// # Archivo de salida para los valores máximos y mínimos max_min_filename = 'ResultadosGlobal//A1_Max_Min_Values.csv' # Diccionario para almacenar los valores máximos y mínimos de cada nodo node_values = {} # Procesar cada archivo del 2 al 37 for i in range(1, 37): print(f"Procesando archivo {i+1}") # Cambiar la ruta según la ubicación de los archivos # Aquí se asume que los archivos están en 'EquivalentStressFiles' file1 = ( f'EquivalentStressFiles//EquivalentStressResultFile{i+1}_cleaned.txt' ) with open(file1, 'r') as f1: lines1 = f1.readlines()[1:] # Omitir la primera línea (títulos) for line1 in lines1: try: # Reemplazar comas por puntos para convertir a float node_index = int(line1.split()[0]) node_value = float(line1.split()[1].replace(',', '.')) # Si el nodo no está en el diccionario, lo añade if node_index not in node_values: node_values[node_index] = {
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 112 import os # Crear la carpeta 'Filtered zones' si no existe filtered_zones_folder = 'ResultadosZonas//Filtered zones' os.makedirs(filtered_zones_folder, exist_ok=True) # Obtener la lista de archivos en la carpeta 'NodesToAnalize' nodes_to_analyze_folder = ( 'ResultadosZonas//Filtered zones/NodesToAnalize' ) node_files = [ f for f in os.listdir(nodes_to_analyze_folder) if f.endswith('.txt') ] # Procesar cada archivo de nodos for node_file in node_files: nodes_to_keep = set() with open( os.path.join(nodes_to_analyze_folder, node_file), 'r' ) as f: next(f) # Saltar el encabezado for line in f: try: nodes_to_keep.add(int(line.strip())) except ValueError: continue # Ignora líneas vacías o no numéricas # Crear una carpeta para cada archivo de nodos folder_name = os.path.splitext(node_file)[0] output_folder = os.path.join(filtered_zones_folder, folder_name) os.makedirs(output_folder, exist_ok=True) # Procesar cada archivo del 2 al 37 for i in range(2, 38): input_filename = ( 'EquivalentStressFilesCoor//EquivalentStressResultFile' f'{i}.txt' ) output_filename = os.path.join( output_folder, f'EquivalentStressResultFile{i}_filtered.txt' ) print( f"Procesando archivo {i} para {folder_name}" )
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 113 with open(input_filename, 'r') as infile, \ open(output_filename, 'w') as outfile: for line in infile: try: node_number = int(line.split()[0]) if node_number in nodes_to_keep: outfile.write(line) except ValueError: # Escribir encabezados u otras líneas no numéricas outfile.write(line) print( "Procesamiento completo. Los archivos filtrados se han guardado en la " "carpeta 'Filtered zones'." ) 3_2_ObtenerMinMaxZonas #//////////////////////////////////////////////////////////////////////////////////// # Este script obtiene, para cada nodo de cada zona filtrada, el valor máximo y # mínimo de tensión equivalente a lo largo de todos los archivos de resultados # filtrados. Incluye las coordenadas del nodo y guarda los resultados en un CSV # por zona. # # Uso: # - Los archivos filtrados deben estar en subcarpetas de # 'ResultadosZonas//Filtered zones'. # - El resultado se guarda como 'A1_Max_Min_Values.csv' en cada carpeta de zona. #//////////////////////////////////////////////////////////////////////////////////// import os # Ruta base de las carpetas de zonas filtradas base_path = 'ResultadosZonas//Filtered zones' # Iterar sobre cada carpeta de zonas filtradas for zone_folder in os.listdir(base_path): zone_path = os.path.join(base_path, zone_folder) if os.path.isdir(zone_path): print( f"Procesando carpeta: {zone_folder}" ) # Archivo de salida para los valores máximos y mínimos
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 114 max_min_filename = os.path.join( zone_path, 'A1_Max_Min_Values.csv' ) # Diccionario para almacenar los valores máximos y mínimos de cada nodo node_values = {} # Procesar cada archivo del 1 al 36 for i in range(1, 37): print( f"Procesando archivo {i+2}" ) file1 = os.path.join( zone_path, f'EquivalentStressResultFile{i+1}_filtered.txt' ) if os.path.exists(file1): with open(file1, 'r') as f1: lines1 = f1.readlines()[1:] # Omitir la primera línea for line1 in lines1: try: # Reemplazar comas por puntos para convertir a float parts = line1.split() node_index = int(parts[0]) x_coord = float( parts[1].replace(',', '.') ) y_coord = float( parts[2].replace(',', '.') ) z_coord = float( parts[3].replace(',', '.') ) node_value = float( parts[4].replace(',', '.') ) if node_index not in node_values: node_values[node_index] = { 'max': (node_value, i), 'min': (node_value, i), 'coords': ( x_coord, y_coord,
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 115 z_coord ) } else: if ( node_value > node_values[node_index]['max'][0] ): node_values[node_index]['max'] = ( node_value, i ) if ( node_value < node_values[node_index]['min'][0] ): node_values[node_index]['min'] = ( node_value, i ) except (ValueError, IndexError) as e: print( f"Error procesando línea: {line1}" ) print(e) continue # Guardar los valores máximos y mínimos en un archivo de salida with open(max_min_filename, 'w') as outfile: # Escribir encabezado outfile.write( "Node,X,Y,Z,MaxFile,MaxValue,MinFile,MinValue\n" ) for node_index, values in sorted(node_values.items()): max_value, max_file = values['max'] min_value, min_file = values['min'] x_coord, y_coord, z_coord = values['coords'] outfile.write( f"{node_index},{x_coord},{y_coord},{z_coord}," f"{max_file},{max_value},{min_file},{min_value}\n" ) print( f"Procesamiento completo para {zone_folder}. " f"Los valores máximos y mínimos se han guardado en " f"'{max_min_filename}'." )
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 116 3_3_EvaluarMinMaxZonas #//////////////////////////////////////////////////////////////////////////////////// # Este script recorre todas las carpetas de zonas filtradas y, para cada una, # lee el archivo 'A1_Max_Min_Values.csv' con los valores máximos y mínimos de # tensión equivalente por nodo. Calcula todas las diferencias posibles entre # pares de archivos de resultados para cada nodo, considerando los archivos # donde se alcanzan el máximo y el mínimo. Guarda las diferencias ordenadas # en 'A4_Pair_Ranges.csv' dentro de cada carpeta de zona. #//////////////////////////////////////////////////////////////////////////////////// import csv import os from itertools import combinations from collections import defaultdict # Ruta base de las carpetas de zonas filtradas base_path = 'ResultadosZonas//Filtered zones' # Iterar sobre cada carpeta de zonas filtradas for zone_folder in os.listdir(base_path): zone_path = os.path.join(base_path, zone_folder) if os.path.isdir(zone_path): print( f"Procesando carpeta: {zone_folder}" ) # Leer el archivo CSV generado con los valores máximos y mínimos max_min_filename = os.path.join( zone_path, 'A1_Max_Min_Values.csv' ) # Archivo de salida para las diferencias entre pares de archivos differences_filename = os.path.join( zone_path, 'A4_Pair_Ranges.csv' ) node_data = {} if os.path.exists(max_min_filename): with open(max_min_filename, 'r') as csvfile: reader = csv.DictReader(csvfile) for row in reader: node = int(row['Node']) x = float(row['X']) y = float(row['Y'])
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 117 z = float(row['Z']) max_file = int(row['MaxFile']) max_value = float(row['MaxValue']) min_file = int(row['MinFile']) min_value = float(row['MinValue']) node_data[node] = { 'max_file': max_file, 'max_value': max_value, 'min_file': min_file, 'min_value': min_value, 'x': x, 'y': y, 'z': z } # Generar todas las combinaciones de parejas de archivos (sin repetición) file_pairs = list( combinations(range(1, 37), 2) ) # Lista para almacenar todas las diferencias encontradas all_differences = [] for file1, file2 in file_pairs: print( f"Comparando archivos {file1} y {file2}" ) for node, values in node_data.items(): if ( (values['max_file'] == file1 and values['min_file'] == file2) or (values['max_file'] == file2 and values['min_file'] == file1) ): difference = abs( values['max_value'] - values['min_value'] ) all_differences.append( ( file1, file2, node, values['x'], values['y'], values['z'], difference ) )
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 118 # Ordenar todas las diferencias de mayor a menor all_differences.sort( key=lambda x: x[6], reverse=True ) # Guardar las diferencias en el archivo de salida with open( differences_filename, 'w', newline='' ) as differences_file: writer = csv.writer(differences_file) writer.writerow( [ 'File1', 'File2', 'Node', 'x', 'y', 'z', 'Rango(MPa)' ] ) for ( file1, file2, node, x, y, z, difference ) in all_differences: writer.writerow( [file1, file2, node, x, y, z, difference] ) print( f"Diferencias guardadas en '{differences_filename}'." ) 3_4_OrdenarZonasGeometricamente #//////////////////////////////////////////////////////////////////////////////////// # Este script recorre todas las zonas filtradas y ordena los archivos de cada # zona geométricamente, comparando las coordenadas de los nodos entre archivos. # Usa rotaciones para buscar coincidencias geométricas y calcula distancias # euclidianas. Filtra los nodos no coincidentes y guarda los archivos ordenados # en cada subcarpeta de zona. #//////////////////////////////////////////////////////////////////////////////////// import os import pandas as pd import numpy as np import warnings import matplotlib.pyplot as plt
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 119 # Suprimir advertencias específicas de pandas warnings.filterwarnings( "ignore", category=pd.errors.PerformanceWarning ) warnings.filterwarnings( "ignore", category=FutureWarning, message=( "The behavior of DataFrame concatenation with empty or all-NA " "entries is deprecated" ) ) # Ruta base de las carpetas de zonas base_path = ( r'C:\Users\ivan.alonso\Python Files\Llanta\Mallado\ResultadosZonas' r'\Filtered zones' ) # Definir la tolerancia para cada zona tolerances = { '1': 0.1, # Tolerancia para la zona 1 '2': 0.1, # Tolerancia para la zona 2 '3': 0.005, # Tolerancia para la zona 3 '4': 0.05, # Tolerancia para la zona 4 '5': 0.05, # Tolerancia para la zona 5 '6': 0.05, # Tolerancia para la zona 6 '7': 0.1 # Tolerancia para la zona 7 } # Función para leer los archivos de una zona def read_zone_files(zone_prefix): zone_files = [] for i in range(1, 6): file_path = os.path.join( base_path, f"{zone_prefix}_{i}", 'A4_Pair_Ranges.csv' ) if os.path.exists(file_path): df = pd.read_csv(file_path) zone_files.append(df) else: print(f"Archivo no encontrado: {file_path}") return zone_files # Función para rotar coordenadas x, z un ángulo dado def rotate_coordinates(x, z, angle):
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 120 theta = np.radians(angle) rotation_matrix = np.array([ [np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)] ]) rotated_coords = rotation_matrix.dot(np.array([x, z])) return rotated_coords # Ordena los nodos de un archivo respecto a otro usando rotaciones y tolerancia def sort_values(base_df, df, atol): df_sorted = pd.DataFrame(columns=df.columns) angles = [72, 144, 216, 288] not_found_count = 0 max_distance = 0 total_distance = 0 distance_count = 0 distances_list = [] for i, base_row in base_df.iterrows(): x_base = base_row['x'] y_base = base_row['y'] z_base = base_row['z'] matching_rows = pd.DataFrame() x_rot = [] z_rot = [] for angle in angles: x, z = rotate_coordinates(x_base, z_base, angle) x_rot.append(x) z_rot.append(z) # Condición para encontrar coincidencias geométricas condition = ( np.isclose(df['y'], y_base, atol) & ( (np.isclose(df['x'], x_rot[0], atol) & np.isclose(df['z'], z_rot[0], atol)) | (np.isclose(df['x'], x_rot[1], atol) & np.isclose(df['z'], z_rot[1], atol)) | (np.isclose(df['x'], x_rot[2], atol) & np.isclose(df['z'], z_rot[2], atol)) | (np.isclose(df['x'], x_rot[3], atol) & np.isclose(df['z'], z_rot[3], atol)) ) )
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 121 matching_rows = df[condition] if len(matching_rows) > 0: min_distance = float('inf') best_row = None for j, (x_r, z_r) in enumerate(zip(x_rot, z_rot)): distances = matching_rows.apply( lambda row: np.sqrt( (row['x'] - x_r) ** 2 + (row['y'] - y_base) ** 2 + (row['z'] - z_r) ** 2 ), axis=1 ) min_distance_idx = distances.idxmin() if distances[min_distance_idx] < min_distance: min_distance = distances[min_distance_idx] best_row = matching_rows.loc[min_distance_idx] if min_distance < 0.001: total_distance += min_distance distance_count += 1 distances_list.append(min_distance) if min_distance > max_distance: max_distance = min_distance if best_row is not None: df_sorted = pd.concat( [df_sorted, best_row.to_frame().T], ignore_index=True ) df = df.drop(best_row.name) else: empty_row = pd.Series(index=df.columns) df_sorted = pd.concat( [df_sorted, empty_row.to_frame().T], ignore_index=True ) not_found_count += 1 else: empty_row = pd.Series(index=df.columns) df_sorted = pd.concat( [df_sorted, empty_row.to_frame().T], ignore_index=True ) not_found_count += 1 else: empty_row = pd.Series(index=df.columns)
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 128 alpha=0.7, linewidth=1 ) else: print(f"Archivo no encontrado: {file_path}") fig2.tight_layout() # Ajustar el diseño para que no se superpongan las etiquetas plt.title( f'Rango de {zone_prefix}_i respecto a {zone_prefix}_1' ) plt.legend() plt.show() # Graficar las diferencias para cada zona for zone in range(1, 8): plot_differences(str(zone)) 3_6_RangosZonasAnsys #//////////////////////////////////////////////////////////////////////////////////// # Este script recorre todas las subcarpetas de zonas y combina los archivos # 'A4_Pair_Differences.csv' de cada subzona en un único archivo CSV por zona. # El resultado se guarda como 'A4{zona}.csv' en la carpeta principal de zonas. #//////////////////////////////////////////////////////////////////////////////////// import os import pandas as pd # Ruta base de las carpetas de zonas base_path = 'ResultadosZonas//Filtered Zones' # Función para combinar archivos A4_Pair_Differences.csv de cada subzona def combine_a4_files(zone_prefix): combined_df = pd.DataFrame() for i in range(1, 6): folder_name = f"{zone_prefix}_{i}" file_path = os.path.join( base_path, folder_name, 'A4_Pair_Differences.csv' ) if os.path.exists(file_path): df = pd.read_csv(file_path) # Añadir solo las columnas 'Node' y 'Difference(MPa)'
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 129 combined_df = pd.concat( [combined_df, df[['Node', 'Difference(MPa)']]], ignore_index=True ) else: print(f"Archivo no encontrado: {file_path}") # Guardar el archivo combinado para la zona output_file = os.path.join( base_path, f"A4{zone_prefix}.csv" ) combined_df.to_csv(output_file, index=False) print( f"Archivo combinado guardado en: {output_file}" ) # Combinar archivos para cada zona (del 1 al 7) for zone in range(1, 8): combine_a4_files(str(zone)) LOCALIZACIÓN NODOS CRÍTICOS 1_2_EliminarNodos2 #//////////////////////////////////////////////////////////////////////////////////// # Elimina los nodos listados en 'NodesToAvoidVolume.txt' de los archivos en # 'Results', generando archivos nuevos con el sufijo '_cleanedVolume.txt'. #//////////////////////////////////////////////////////////////////////////////////// # Leer la lista de nodos a eliminar nodes_to_remove = set() with open('NodesToAvoidVolume.txt', 'r') as f: for line in f: try: nodes_to_remove.add(int(line.strip())) except ValueError: continue # Procesar cada archivo del 1 al 2 y cada step del 1 al 36 for n in range(1, 3): for i in range(1, 37): input_filename = ( f'Results//{n}_{i}.txt'
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 130 ) output_filename = ( f'Results//{n}_{i}_cleanedVolume.txt' ) print(f"{n}_{i}") with open(input_filename, 'r') as infile, \ open(output_filename, 'w') as outfile: for line in infile: try: node_number = int(line.split()[0]) if node_number not in nodes_to_remove: outfile.write(line) except ValueError: # Escribir encabezados u otras líneas no numéricas outfile.write(line) print( "Procesamiento completo. Los archivos limpiados se han guardado " "con el sufijo '_cleanedVolume.txt'." ) 4_1_ObtenerMinMax #//////////////////////////////////////////////////////////////////////////////////// # Calcula y guarda el valor máximo y mínimo de cada nodo a lo largo de 36 steps # leyendo archivos de resultados limpios y guardando el resultado en un CSV. #//////////////////////////////////////////////////////////////////////////////////// # Archivo de salida para los valores máximos y mínimos max_min_filename = 'A1_Max_Min_Values.csv' # Diccionario para almacenar los valores máximos y mínimos de cada nodo node_values = {} # Procesar cada archivo del 1 al 36 for i in range(1, 37): print(f"Procesando step {i}...") file1 = ( f'Results//1_{i}_cleanedVolume.txt' # Maximum Principal ) file2 = ( f'Results//2_{i}_cleanedVolume.txt' # Minimum Principal )
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 131 with open(file1, 'r') as f1, open(file2, 'r') as f2: lines1 = f1.readlines()[1:] # Omitir la primera línea (títulos) lines2 = f2.readlines()[1:] # Omitir la primera línea (títulos) for line in lines1: try: # Reemplazar comas por puntos para convertir a float node_index = int(line.split()[0]) node_value = float( line.split()[1].replace(',', '.') ) if node_index not in node_values: node_values[node_index] = { 'max': (node_value, i), 'min': (node_value, i) } else: if node_value > node_values[node_index]['max'][0]: node_values[node_index]['max'] = ( node_value, i ) except (ValueError, IndexError) as e: print(f"Error procesando maximos en línea: {line}") print(e) continue for line in lines2: try: # Reemplazar comas por puntos para convertir a float node_index = int(line.split()[0]) node_value = float( line.split()[1].replace(',', '.') ) if node_value < node_values[node_index]['min'][0]: node_values[node_index]['min'] = ( node_value, i ) except (ValueError, IndexError) as e: print(f"Error procesando minimos en línea: {line}") print(e) continue # Guardar los valores máximos y mínimos en un archivo de salida with open(max_min_filename, 'w') as outfile: # Escribir encabezado outfile.write("Node,MaxStep,MaxValue,MinStep,MinValue\n")
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 132 for node_index, values in sorted(node_values.items()): max_value, max_step = values['max'] min_value, min_step = values['min'] outfile.write( f"{node_index},{max_step},{max_value},{min_step},{min_value}\n" ) print( f"Procesamiento completo. Los valores máximos y mínimos se han guardado en " f"'{max_min_filename}'." ) 4_2_EvaluarRangosMedias #//////////////////////////////////////////////////////////////////////////////////// # Calcula y guarda los rangos y medias de nodos entre steps, generando varios # archivos resumen y ordenando los resultados por rango. #//////////////////////////////////////////////////////////////////////////////////// import csv from itertools import combinations from collections import defaultdict # Leer el archivo CSV generado max_min_filename = 'A1_Max_Min_Values.csv' step_pair_summary_filename = 'A2_Step_Pair_Summary.csv' steps_summary_filename = 'A3_Steps_Summary.csv' rangos_filename = 'A4_Rangos_Medias.csv' node_data = {} with open(max_min_filename, 'r') as csvfile: reader = csv.DictReader(csvfile) for row in reader: node = int(row['Node']) max_step = int(row['MaxStep']) max_value = float(row['MaxValue']) min_step = int(row['MinStep']) min_value = float(row['MinValue']) node_data[node] = { 'max_step': max_step, 'max_value': max_value, 'min_step': min_step, 'min_value': min_value }
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 133 # Generar todas las combinaciones de parejas de steps step_pairs = list(combinations(range(1, 37), 2)) # Diccionarios para almacenar el resumen y las diferencias pair_summary = {} pair_ranges = {} pair_medias = {} for step1, step2 in step_pairs: pair_key = (step1, step2) pair_summary[pair_key] = 0 pair_ranges[pair_key] = [] pair_medias[pair_key] = [] print(f"Comparando steps {step1} y {step2}") for node, values in node_data.items(): if ( (values['max_step'] == step1 and values['min_step'] == step2) or (values['max_step'] == step2 and values['min_step'] == step1) ): pair_summary[pair_key] += 1 rango = abs(values['max_value'] - values['min_value']) pair_ranges[pair_key].append((node, rango)) media = (values['max_value'] + values['min_value']) / 2 pair_medias[pair_key].append((node, media)) # Guardar el resumen de combinaciones de archivos en A2_Pair_Summary.csv with open(step_pair_summary_filename, 'w', newline='') as summary_file: writer = csv.writer(summary_file) writer.writerow( ['Step1', 'Step2', 'NodeCount', 'MaxRangeNode', 'MaxRange'] ) for (step1, step2), ranges in pair_ranges.items(): if ranges: max_range_node, max_range = max(ranges, key=lambda x: x[1]) writer.writerow( [step1, step2, pair_summary[(step1, step2)], max_range_node, max_range] ) # Guardar las diferencias en A4_Pair_Differences.csv with open(rangos_filename, 'w', newline='') as ranges_file: writer = csv.writer(ranges_file) writer.writerow(['Step1', 'Step2', 'Node', 'Range', 'Media']) for (step1, step2) in pair_medias.keys():
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 134 media_data = {node: media for node, media in pair_medias[(step1, step2)]} range_data = {node: rango for node, rango in pair_ranges[(step1, step2)]} for node in sorted( media_data.keys(), key=lambda x: media_data[x], reverse=True ): writer.writerow( [step1, step2, node, range_data[node], media_data[node]] ) # Leer el archivo A4_Pair_Differences.csv y ordenar por Rango rows = [] with open(rangos_filename, 'r') as csvfile: reader = csv.reader(csvfile) header = next(reader) # Leer el encabezado for row in reader: rows.append(row) # Ordenar las filas por Rango en orden descendente rows.sort(key=lambda x: float(x[3]), reverse=True) # Escribir el archivo ordenado with open(rangos_filename, 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow(header) # Escribir el encabezado writer.writerows(rows) # Escribir las filas ordenadas # Crear un resumen adicional que agrupe los datos por cada archivo individual step_summary = defaultdict( lambda: {'NodeCount': 0, 'MaxRangeNode': None, 'MaxRange': 0} ) for row in rows: step1 = int(row[0]) step2 = int(row[1]) node = int(row[2]) rango = float(row[3]) for step in [step1, step2]: step_summary[step]['NodeCount'] += 1 if rango > step_summary[step]['MaxRange']: step_summary[step]['MaxRangeNode'] = node step_summary[step]['MaxRange'] = rango with open(steps_summary_filename, 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow(['Step', 'NodeCount', 'MaxRangeNode', 'MaxRange'])
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 135 for step, summary in sorted( step_summary.items(), key=lambda x: x[1]['MaxRange'], reverse=True ): writer.writerow( [step, summary['NodeCount'], summary['MaxRangeNode'], summary['MaxRange']] ) print( f"Resumen de todas las posibles combinaciones de steps guardado en " f"'{step_pair_summary_filename}'." ) print( f"Resumen adicional guardado en '{steps_summary_filename}'." ) print( f"Rangos guardadas en '{rangos_filename}'." ) 4_3_Ordenar_A4 #/////////////////////////////////////////////////////////////////////////// # Ordena el archivo A4_Rangos_Medias.csv por rango o media y lo sobrescribe. #/////////////////////////////////////////////////////////////////////////// import os import csv # Ruta base de los archivos base_path = ( r"C:\Users\ivan.alonso\Python Files\Llanta\CalibrarSN" ) # Archivo de entrada con los nodos input_csv = os.path.join( base_path, "A4_Rangos_Medias.csv" ) # Configuración: "Rango" o "Media" Dependencia = "Media" # Leer el archivo A4 y ordenar por Rango o Media rows = [] with open(input_csv, 'r') as csvfile:
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 136 reader = csv.reader(csvfile) header = next(reader) # Leer el encabezado for row in reader: rows.append(row) if Dependencia == "Rango": rows.sort(key=lambda x: float(x[3]), reverse=True) elif Dependencia == "Media": rows.sort(key=lambda x: float(x[4]), reverse=True) # Escribir el archivo ordenado with open(input_csv, 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow(header) # Escribir el encabezado writer.writerows(rows) # Escribir las filas ordenadas 4_4_Graficar #//////////////////////////////////////////////////////////////////////////////// # Ordena nodos por rango o media, extrae tensiones de steps y grafica resultados. #//////////////////////////////////////////////////////////////////////////////// import os import csv import pandas as pd import matplotlib.pyplot as plt # Ruta base de los archivos base_path = r"C:\Users\ivan.alonso\Python Files\Llanta\CalibrarSN" # Archivo de entrada con los nodos input_csv = os.path.join(base_path, "A4_Rangos_Medias.csv") # Archivos de salida Dependencia = "Rango" # "Rango" o "Media" output_csv_1 = os.path.join( base_path, f"Nodos_Max{Dependencia}_MaxPrincipalEstres-Steps.csv" ) output_csv_2 = os.path.join( base_path, f"Nodos_Max{Dependencia}_MinPrincipalEstres-Steps.csv" ) output_folder = os.path.join(base_path, f"Max{Dependencia}s")
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 137 # Leer el archivo A4 y ordenar por Rango o Media rows = [] with open(input_csv, 'r') as csvfile: reader = csv.reader(csvfile) header = next(reader) # Leer el encabezado for row in reader: rows.append(row) if Dependencia == "Rango": rows.sort(key=lambda x: float(x[3]), reverse=True) elif Dependencia == "Media": rows.sort(key=lambda x: float(x[4]), reverse=True) # Escribir el archivo ordenado with open(input_csv, 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow(header) # Escribir el encabezado writer.writerows(rows) # Escribir las filas ordenadas # Leer los 10 primeros nodos try: nodos_df = pd.read_csv(input_csv) top_10_nodos = nodos_df.head(10)['Node'].tolist() except Exception as e: print(f"Error al leer el archivo {input_csv}: {e}") exit() # Solo procesar los archivos si no existen los CSV de salida if not (os.path.exists(output_csv_1) and os.path.exists(output_csv_2)): def procesar_estres(nodos, prefix, stress_column, output_csv): stress_data = pd.DataFrame( columns=['Nodo'] + [f"Step {i}" for i in range(1, 37)] ) for nodo in nodos: nodo_data = {'Nodo': nodo} print(f"Procesando nodo: {nodo}") for step in range(1, 37): file_name = f"{prefix}_{step}_cleanedVolume.txt" file_path = os.path.join( base_path, "Results", file_name ) if not os.path.exists(file_path): print(f"Archivo no encontrado: {file_path}") nodo_data[f"Step {step}"] = None
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 144 # Guardar la gráfica como imagen output_image = os.path.join(base_path, "Pareto_Front_Grafica.png") plt.savefig( output_image, dpi=600, bbox_inches='tight' ) print(f"Gráfica guardada en: {output_image}") # Mostrar la gráfica plt.show() FORM Función Límite Analítica #//////////////////////////////////////////////////////////////////////////////////// # Calcula la función límite para fatiga multiaxial según parámetros de entrada. # Instrucciones: Ajusta los parámetros según los resultados del nodo analizado. #//////////////////////////////////////////////////////////////////////////////////// import numpy as np """ --------------------------------------------------------------------------- # Parameters --------------------------------------------------------------------------- # """ # Check if Python is called outside optiSLang if not 'OSL_REGULAR_EXECUTION' in locals(): OSL_REGULAR_EXECUTION = False # Valores por defecto para prueba si no se ejecuta desde optiSLang if not OSL_REGULAR_EXECUTION: log_S_limite_1e6_ciclos = 6.652 tension_residual_axial = 14 # Constante del modelo tension_ultima = 222 # Varíar en función del nodo tension_media_base = 44.064 tension_rango = 281.6321 tension_amplitud = tension_rango / 2
Metodología FEM para la evaluación de fiabilidad mecánica Alonso García, Iván 145 """ --------------------------------------------------------------------------- # Results --------------------------------------------------------------------------- # """ # Tensión media final tension_media_final = tension_media_base + tension_residual_axial S_limite_1e6_ciclos = np.exp(log_S_limite_1e6_ciclos) S = tension_amplitud / ( 1 - (tension_media_final / tension_ultima) ) log_S = np.log(S) # Control de valores función límite y valores no físicos if tension_media_final >= tension_ultima: # Valor no físico: tensión media supera la última, función límite negativa Gx = -1.0 print( "Advertencia: tensión_media_final >= tensión_ultima. " "Se asigna Gx = -1.0" ) else: # Se multiplica por factor de escala para el cálculo de la probabilidad # de fallo Gx = ( (np.exp(log_S_limite_1e6_ciclos) - np.exp(log_S)) * np.exp(log_S_limite_1e6_ciclos) )