Ir para o conteúdo

Extensões por sub-rotinas de utilizador

O FrontISTR disponibiliza um conjunto de sub-rotinas de utilizador para ampliar a funcionalidade sem modificar o código-fonte principal. Estas abrangem implementações pelo utilizador de leis constitutivas e a integração de cargas externas definidas pelo utilizador. Este capítulo enumera os pontos de extensão disponíveis e as palavras-chave do ficheiro de controlo da análise utilizadas para invocar cada um deles. Para obter detalhes sobre os argumentos das sub-rotinas e os procedimentos de recompilação, consulte Sub-rotinas de utilizador (Guia de programação).

Visão geral das funções

Os pontos de extensão por sub-rotinas de utilizador dividem-se em duas categorias: leis constitutivas de material e cargas externas. Do lado das leis constitutivas, existem quatro vias de invocação — elasticidade linear, hiperelasticidade, elastoplasticidade e uma lei constitutiva de utilização geral —, cada uma ativada por uma palavra-chave independente. Do lado das cargas externas, é fornecida uma via que lê informações de carga a partir de um ficheiro externo preparado pelo utilizador e as adiciona ao vetor global de cargas e ao vetor residual. Cada extensão fica disponível depois de editar o ficheiro de modelo incluído na distribuição do FrontISTR e recompilar o programa principal.

Categoria de extensão Palavra-chave de controlo da análise Principais sub-rotinas de utilizador Modelo a editar
Elasticidade linear de utilizador !ELASTIC, TYPE=USER uElasticMatrix, uElasticUpdate fistr1/src/lib/user/uelastic.f90
Hiperelasticidade de utilizador !HYPERELASTIC, TYPE=USER uElasticMatrix, uElasticUpdate fistr1/src/lib/user/uelastic.f90
Elastoplasticidade de utilizador (função de cedência e return mapping) !PLASTIC, YIELD=USER uElastoPlasticMatrix, uBackwardEuler, uElastoPlasticNumStatus fistr1/src/lib/user/uyield.f90
Lei constitutiva de utilizador de utilização geral !USER_MATERIAL uMatlMatrix, uUpdate fistr1/src/lib/user/umat.f90
Carga externa definida pelo utilizador !ULOAD, FILE=<fname> ureadload, uloading, uResidual fistr1/src/lib/user/uload.f90

Não são suportadas leis de endurecimento definidas pelo utilizador (uma via que mantenha a função de cedência integrada e substitua apenas a curva de endurecimento por uma implementação do utilizador). Se for necessária uma curva de endurecimento definida pelo utilizador, selecione !PLASTIC, YIELD=USER e substitua toda a lei constitutiva elastoplástica por uma implementação do utilizador. Também não são suportadas condições de fronteira definidas pelo utilizador nem pontos de extensão para processamento do utilizador durante o restart.

!CREEP com TYPE=USER não é suportado. Utilize !USER_MATERIAL para implementar uma lei constitutiva dependente do tempo como extensão de utilizador.

Leis constitutivas de utilizador

As leis constitutivas de utilizador fornecem um ponto de entrada para implementar, numa sub-rotina externa, relações tensão-extensão que não podem ser representadas pelos modelos de material integrados. Estão disponíveis quatro vias, de acordo com a estrutura da lei constitutiva integrada correspondente: elasticidade linear de utilizador, hiperelasticidade de utilizador, elastoplasticidade de utilizador e uma lei constitutiva de utilizador de utilização geral. Em cada via, no bloco !MATERIAL dos dados de controlo da análise, especifique TYPE=USER ou YIELD=USER na palavra-chave correspondente. Podem ser especificadas até 100 constantes do utilizador, que são passadas à sub-rotina.

Elasticidade linear de utilizador

A elasticidade linear de utilizador é a via na qual o utilizador calcula a matriz elástica no âmbito das deformações infinitesimais. Quando !ELASTIC, TYPE=USER é especificado nos dados de controlo da análise, o FrontISTR trata-a como uma lei constitutiva de deformações infinitesimais e chama uElasticMatrix (que devolve a matriz elástica \(D\)) durante o cálculo da rigidez do elemento e uElasticUpdate (que devolve a tensão) durante a atualização da tensão. Não a utilize em conjunto com um modelo hiperelástico ou elastoplástico existente.

Hiperelasticidade de utilizador

A hiperelasticidade de utilizador é a via para calcular a tensão e a rigidez tangente a partir das derivadas de uma função de energia de deformação no âmbito de grandes deformações (Total Lagrange). Especifique !HYPERELASTIC, TYPE=USER nos dados de controlo da análise. As sub-rotinas chamadas são as mesmas uElasticMatrix e uElasticUpdate utilizadas para a elasticidade linear de utilizador, e é partilhado o mesmo modelo fistr1/src/lib/user/uelastic.f90. Como a especificação da palavra-chave determina se o FrontISTR trata a implementação como deformação infinitesimal ou Total Lagrange, o mesmo modelo não pode ser utilizado simultaneamente para implementações de deformações infinitesimais e de grandes deformações. Implemente-o como uma das duas leis constitutivas.

Elastoplasticidade de utilizador

A elastoplasticidade de utilizador é a via na qual o utilizador implementa a função de cedência e o procedimento de return mapping. Especifique !PLASTIC, YIELD=USER nos dados de controlo da análise. Isto entra num ramo independente das funções de cedência integradas de Mises, Mohr-Coulomb e Drucker-Prager. uElastoPlasticMatrix (que devolve a rigidez tangente elastoplástica \(D\)) é chamada durante o cálculo da rigidez do elemento, uBackwardEuler (que mapeia a tensão de ensaio para a tensão efetiva e atualiza as variáveis de estado) durante a atualização da tensão, e uElastoPlasticNumStatus (que devolve o número de variáveis de estado reais a conservar) durante a inicialização dos pontos de Gauss. Não é suportada uma via que substitua apenas a curva de endurecimento por uma implementação do utilizador. Mesmo quando apenas é necessária uma curva de endurecimento definida pelo utilizador, utilize esta via para substituir toda a lei constitutiva elastoplástica por uma implementação do utilizador.

Lei constitutiva de utilizador de utilização geral

A lei constitutiva de utilizador de utilização geral é uma via para implementar leis constitutivas que não se enquadram nos âmbitos elástico, hiperelástico ou elastoplástico. Especifique !USER_MATERIAL nos dados de controlo da análise. Por predefinição, é tratada no âmbito Updated Lagrange; quando KIRCHHOFF é especificado, é tratada como Total Lagrange. O número de variáveis de estado é especificado por NSTATUS. uMatlMatrix (que devolve a rigidez tangente \(D\)) é chamada durante o cálculo da rigidez do elemento, e uUpdate (que atualiza a tensão e as variáveis de estado) durante a atualização da tensão.

Passagem de constantes do utilizador e variáveis de estado

Para cada uma das vias !ELASTIC, TYPE=USER, !HYPERELASTIC, TYPE=USER e !USER_MATERIAL, as constantes do utilizador escritas nas linhas de dados dos dados de controlo da análise (até 100) são passadas diretamente à sub-rotina através do argumento matl. Para !PLASTIC, YIELD=USER, são passadas as constantes elásticas especificadas por !ELASTIC e as constantes do utilizador fornecidas através das linhas de dados de !PLASTIC.

Para a lei constitutiva de utilizador de utilização geral e !PLASTIC, YIELD=USER, a informação histórica do passo anterior (como extensão plástica, tensão de retorno e dano) pode ser passada à implementação do utilizador através da variável de estado fstat e escrita novamente no fim do passo. O número de variáveis de estado é determinado, para a lei constitutiva de utilizador de utilização geral, por !USER_MATERIAL e o respetivo NSTATUS, e, para !PLASTIC, YIELD=USER, pelo valor devolvido por uElastoPlasticNumStatus.

Cargas externas definidas pelo utilizador

As cargas externas definidas pelo utilizador fornecem uma via para definir forças externas que não podem ser representadas pelas cargas concentradas, cargas distribuídas ou forças volúmicas integradas. Quando !ULOAD, FILE=<fname> é escrito nos dados de controlo da análise, o FrontISTR passa o nome de ficheiro especificado a ureadload, e a informação lida pela implementação do utilizador é conservada como dados do módulo.

As três sub-rotinas seguintes correspondem à invocação de !ULOAD.

  • ureadload: no início da análise, lê as cargas definidas pelo utilizador a partir do ficheiro externo especificado no ficheiro de controlo. A implementação do utilizador abre o ficheiro e armazena os dados necessários em variáveis do módulo.
  • uloading: chamada durante a montagem do vetor de cargas externas de cada passo e adiciona a carga do utilizador ao vetor global de cargas. O número do passo atual e o fator de carga são passados como argumentos.
  • uResidual: chamada durante a montagem do vetor residual em cada iteração e adiciona a contribuição da carga do utilizador ao vetor residual global. É chamada tanto nas iterações não lineares como nos cálculos de equilíbrio.

Não é fornecido qualquer ponto de extensão para condições de fronteira definidas pelo utilizador (extensões de utilizador para deslocamentos prescritos ou condições de contacto). Se for necessária uma extensão de utilizador que não seja uma força externa, utilize a palavra-chave integrada correspondente ou uma via de lei constitutiva de utilizador.

Procedimento de implementação de sub-rotinas de utilizador

Para utilizar uma sub-rotina de utilizador, edite o ficheiro de modelo incluído na distribuição do código-fonte do FrontISTR e, em seguida, recompile o FrontISTR. As sub-rotinas de utilizador não podem ser substituídas nos binários distribuídos, pelo que a utilização de uma extensão de utilizador exige um ambiente no qual seja possível compilar o FrontISTR a partir do código-fonte.

Os modelos de sub-rotinas de utilizador encontram-se em fistr1/src/lib/user/, existindo um ficheiro específico a editar para cada categoria de extensão (consulte a tabela em Visão geral das funções para os nomes dos ficheiros). No estado inicial, os ficheiros contêm corpos de sub-rotina vazios ou uma implementação de exemplo de elasticidade linear; os utilizadores adicionam aí a sua própria lei constitutiva ou definição de carga. Depois de editar o modelo, recompile normalmente o FrontISTR com CMake e execute a análise com o executável fistr1 resultante.

Detalhes como o significado dos argumentos das sub-rotinas, o tratamento dos arrays de variáveis de estado e as precauções a tomar na recompilação são fornecidos nas páginas correspondentes do guia de programação.

Consulte também