Saltar a contenido

Extensiones mediante subrutinas de usuario

FrontISTR proporciona un conjunto de subrutinas de usuario para ampliar la funcionalidad sin modificar el código fuente principal. Estas cubren implementaciones de usuario de leyes constitutivas y la incorporación de cargas externas definidas por el usuario. Este capítulo enumera los puntos de extensión disponibles y las palabras clave del archivo de control del análisis utilizadas para invocar cada uno. Para obtener información detallada sobre los argumentos de las subrutinas y los procedimientos de recompilación, consulte Subrutinas de usuario (Guía de programación).

Resumen de funciones

Los puntos de extensión mediante subrutinas de usuario se dividen en dos categorías: leyes constitutivas de materiales y cargas externas. En el lado de las leyes constitutivas existen cuatro rutas de invocación —elasticidad lineal, hiperelasticidad, elastoplasticidad y una ley constitutiva de propósito general—, cada una activada mediante una palabra clave independiente. Para las cargas externas se proporciona una ruta que lee información de carga desde un archivo externo preparado por el usuario y la añade al vector global de cargas y al vector de residuos. Cada extensión queda disponible después de editar el archivo de plantilla incluido en la distribución de FrontISTR y recompilar el programa principal.

Categoría de extensión Palabra clave de control del análisis Principales subrutinas de usuario Plantilla que debe editarse
Elasticidad lineal de usuario !ELASTIC, TYPE=USER uElasticMatrix, uElasticUpdate fistr1/src/lib/user/uelastic.f90
Hiperelasticidad de usuario !HYPERELASTIC, TYPE=USER uElasticMatrix, uElasticUpdate fistr1/src/lib/user/uelastic.f90
Elastoplasticidad de usuario (función de fluencia y retorno) !PLASTIC, YIELD=USER uElastoPlasticMatrix, uBackwardEuler, uElastoPlasticNumStatus fistr1/src/lib/user/uyield.f90
Ley constitutiva de usuario de propósito general !USER_MATERIAL uMatlMatrix, uUpdate fistr1/src/lib/user/umat.f90
Carga externa definida por el usuario !ULOAD, FILE=<fname> ureadload, uloading, uResidual fistr1/src/lib/user/uload.f90

No se admiten leyes de endurecimiento definidas por el usuario (una ruta que conserve la función de fluencia incorporada y sustituya únicamente la curva de endurecimiento por una implementación del usuario). Si se necesita una curva de endurecimiento definida por el usuario, seleccione !PLASTIC, YIELD=USER y sustituya toda la ley constitutiva elastoplástica por una implementación de usuario. Tampoco se admiten condiciones de contorno de usuario ni puntos de extensión para procesamiento de usuario durante el reinicio.

!CREEP con TYPE=USER no está admitido. Utilice !USER_MATERIAL para implementar como extensión de usuario una ley constitutiva dependiente del tiempo.

Leyes constitutivas de usuario

Las leyes constitutivas de usuario proporcionan un punto de entrada para implementar en una subrutina externa relaciones tensión-deformación que no pueden representarse mediante los modelos de material incorporados. Existen cuatro rutas según el marco de la ley constitutiva incorporada correspondiente: elasticidad lineal de usuario, hiperelasticidad de usuario, elastoplasticidad de usuario y una ley constitutiva de usuario de propósito general. En cada ruta, dentro del bloque !MATERIAL de los datos de control del análisis, especifique TYPE=USER o YIELD=USER en la palabra clave correspondiente. Pueden especificarse hasta 100 constantes de usuario, que se transfieren a la subrutina.

Elasticidad lineal de usuario

La elasticidad lineal de usuario es la ruta en la que el usuario calcula la matriz elástica dentro del marco de deformaciones infinitesimales. Cuando se especifica !ELASTIC, TYPE=USER en los datos de control del análisis, FrontISTR lo trata como una ley constitutiva de deformaciones infinitesimales y llama a uElasticMatrix (que devuelve la matriz elástica \(D\)) durante el cálculo de la rigidez del elemento y a uElasticUpdate (que devuelve la tensión) durante la actualización de la tensión. No debe utilizarse junto con un modelo hiperelástico o elastoplástico existente.

Hiperelasticidad de usuario

La hiperelasticidad de usuario es la ruta para calcular la tensión y la rigidez tangente a partir de derivadas de una función de energía de deformación dentro de un marco de grandes deformaciones (Lagrange total). Especifique !HYPERELASTIC, TYPE=USER en los datos de control del análisis. Las subrutinas llamadas son las mismas uElasticMatrix y uElasticUpdate que para la elasticidad lineal de usuario, y se comparte la misma plantilla fistr1/src/lib/user/uelastic.f90. Como la especificación de la palabra clave determina si FrontISTR trata la implementación como deformación infinitesimal o como Lagrange total, la misma plantilla no puede utilizarse simultáneamente para implementaciones de deformaciones infinitesimales y grandes deformaciones. Impleméntela como una de las dos leyes constitutivas.

Elastoplasticidad de usuario

La elastoplasticidad de usuario es la ruta en la que el usuario implementa la función de fluencia y el procedimiento de retorno. Especifique !PLASTIC, YIELD=USER en los datos de control del análisis. Esto entra en una rama independiente de las funciones de fluencia incorporadas de Mises, Mohr-Coulomb y Drucker-Prager. uElastoPlasticMatrix (que devuelve la rigidez tangente elastoplástica \(D\)) se llama durante el cálculo de la rigidez del elemento, uBackwardEuler (que transforma la tensión de prueba en tensión real y actualiza las variables de estado) durante la actualización de la tensión, y uElastoPlasticNumStatus (que devuelve el número de variables de estado de valor real que deben conservarse) durante la inicialización de los puntos de Gauss. No se admite una ruta que sustituya únicamente la curva de endurecimiento por una implementación del usuario. Incluso cuando solo se necesite una curva de endurecimiento definida por el usuario, utilice esta ruta para sustituir toda la ley constitutiva elastoplástica por una implementación de usuario.

Ley constitutiva de usuario de propósito general

La ley constitutiva de usuario de propósito general es una ruta para implementar leyes constitutivas que no encajan en los marcos elástico, hiperelástico o elastoplástico. Especifique !USER_MATERIAL en los datos de control del análisis. De forma predeterminada se trata dentro del marco de Lagrange actualizado; cuando se especifica KIRCHHOFF, se trata como Lagrange total. El número de variables de estado se especifica mediante NSTATUS. uMatlMatrix (que devuelve la rigidez tangente \(D\)) se llama durante el cálculo de la rigidez del elemento, y uUpdate (que actualiza la tensión y las variables de estado) durante la actualización de la tensión.

Transferencia de constantes de usuario y variables de estado

Para cada una de las rutas !ELASTIC, TYPE=USER, !HYPERELASTIC, TYPE=USER y !USER_MATERIAL, las constantes de usuario escritas en las líneas de datos de los datos de control del análisis (hasta 100) se pasan directamente a la subrutina mediante el argumento matl. Para !PLASTIC, YIELD=USER, se pasan las constantes elásticas especificadas mediante !ELASTIC y las constantes de usuario suministradas mediante las líneas de datos de !PLASTIC.

Para la ley constitutiva de usuario de propósito general y !PLASTIC, YIELD=USER, la información histórica del paso anterior (como deformación plástica, tensión de retroceso y daño) puede pasarse a la implementación de usuario mediante la variable de estado fstat y escribirse de nuevo al final del paso. El número de variables de estado se determina, para la ley constitutiva de usuario de propósito general, mediante !USER_MATERIAL y su NSTATUS, y para !PLASTIC, YIELD=USER, mediante el valor de retorno de uElastoPlasticNumStatus.

Cargas externas definidas por el usuario

Las cargas externas definidas por el usuario proporcionan una ruta para definir fuerzas externas que no pueden representarse mediante las cargas concentradas, cargas distribuidas o fuerzas de volumen incorporadas. Cuando se escribe !ULOAD, FILE=<fname> en los datos de control del análisis, FrontISTR pasa el nombre de archivo especificado a ureadload, y la información leída por la implementación del usuario se conserva como datos del módulo.

Las tres subrutinas siguientes corresponden a la invocación de !ULOAD.

  • ureadload: Al inicio del análisis, lee las cargas definidas por el usuario desde el archivo externo especificado en el archivo de control. La implementación del usuario abre el archivo y almacena los datos necesarios en variables del módulo.
  • uloading: Se llama durante el ensamblaje del vector de cargas externas de cada paso y añade la carga de usuario al vector global de cargas. El número del paso actual y el factor de carga se pasan como argumentos.
  • uResidual: Se llama durante el ensamblaje del vector de residuos en cada iteración y añade la contribución de la carga de usuario al vector global de residuos. Se llama tanto desde las iteraciones no lineales como desde los cálculos de equilibrio.

No se proporciona ningún punto de extensión para condiciones de contorno de usuario (extensiones de usuario de desplazamientos prescritos o condiciones de contacto). Si se necesita una extensión de usuario distinta de una fuerza externa, utilice la palabra clave incorporada correspondiente o una ruta de ley constitutiva de usuario.

Procedimiento para implementar subrutinas de usuario

Para utilizar una subrutina de usuario, edite el archivo de plantilla incluido con la distribución del código fuente de FrontISTR y, a continuación, vuelva a compilar FrontISTR. Las subrutinas de usuario no pueden sustituirse en los binarios distribuidos, por lo que utilizar una extensión de usuario requiere un entorno en el que FrontISTR pueda compilarse desde el código fuente.

Las plantillas de subrutinas de usuario se encuentran bajo fistr1/src/lib/user/, con un archivo específico que debe editarse para cada categoría de extensión (consulte la tabla de Resumen de funciones para conocer los nombres de archivo). En su estado inicial, los archivos contienen cuerpos de subrutina vacíos o una implementación de ejemplo de elasticidad lineal; los usuarios añaden allí su propia ley constitutiva o definición de carga. Después de editar la plantilla, vuelva a compilar FrontISTR normalmente con CMake y ejecute el análisis con el ejecutable fistr1 resultante.

Los detalles, como el significado de los argumentos de las subrutinas, el tratamiento de las matrices de variables de estado y las precauciones al recompilar, se proporcionan en las páginas correspondientes de la guía de programación.

Véase también