Código

Seu primeiro modelo elástico no OpenSeesPy

Detecte a instalação do OpenSeesPy na sua máquina, construa uma viga em balanço elástica 2D e compare o deslocamento na ponta com a forma fechada de Euler–Bernoulli. Este site não empacota o OpenSees.

Um modelo elástico é a primeira conferência honesta de que o seu solver, as suas unidades e a sua conectividade descrevem o problema que você acha que descrevem. Este tutorial constrói uma viga em balanço prismática 2D no OpenSeesPy e compara o deslocamento na ponta com a forma fechada elementar. É uma conferência estática linear, não uma verificação de norma nem uma análise dinâmica.

Detecte primeiro: a sua instalação, não um solver empacotado

O OpenSees é desenvolvido na University of California, Berkeley / PEER. O OpenSeesPy é uma interface Python desse motor. Você o instala no interpretador que já usa para scripts de engenharia. Este site não envia OpenSees, não redistribui binários e não envolve um solver empacotado da Mamut. Se um assistente ou uma página de produto implicar o contrário, trate isso como um erro.

Confirme o import antes de construir um modelo:

def require_openseespy():
    try:
        import openseespy.opensees as ops
    except ImportError as exc:
        raise SystemExit(
            "OpenSeesPy is not importable in this interpreter. "
            "Install it yourself, for example `pip install openseespy`, "
            "in the same environment you use for engineering work. "
            "This tutorial does not bundle or redistribute OpenSees."
        ) from exc
    return ops


ops = require_openseespy()

Se essa chamada encerrar o processo, pare. Não cole um modelo Tcl numa sessão Python, e não assuma que uma segunda máquina (CI, o laptop de um colega, um contêiner) tem a mesma roda. As notas oficiais da API estão na documentação do OpenSeesPy. Instalação e ressalvas de plataforma mudam; confie na documentação da sua versão, não num comando copiado de um blog antigo.

OpenSees em Tcl é um binário à parte. Este artigo usa só o OpenSeesPy.

Pré-requisitos

  • Python 3 na sua máquina
  • OpenSeesPy importável nesse interpretador (o passo de detecção acima)
  • Familiaridade com os graus de liberdade de uma viga 2D (axial, transversal, rotação)
  • Um sistema de unidades que você não misturará (veja o tutorial de unidades ligado abaixo)

O problema de engenharia

Uma viga em balanço prismática horizontal, comprimento L, rigidez à flexão EI, engastada em x = 0, carga na ponta P na direção y negativa. Sob a teoria de vigas de Euler–Bernoulli (pequena deflexão, sem deformação por cisalhamento, material elástico linear), a magnitude do deslocamento transversal na ponta é:

δ = P L³ / (3 E I)

Essa forma fechada é o resultado padrão em resistência dos materiais elementar —por exemplo Timoshenko e Gere, Mechanics of Materials—, não uma cláusula copiada de uma norma de edificação. Usamo-la como conferência independente, não como substituto de uma norma.

O OpenSees é adimensional. Escolha um conjunto coerente e fique nele. Este script usa newtons e metros (P em N, E em Pa, I em m⁴, L em m, deslocamento em m). Misturar milímetros em I e deixar L em metros é um jeito comum de obter um modelo «resolvido» que está errado por muitas ordens de magnitude.

Implementação

Um elasticBeamColumn com transformação geométrica linear e interpolação cúbica hermitiana recupera a viga em balanço de Euler–Bernoulli exatamente para um membro prismático com cargas só nas extremidades (dentro do ruído de ponto flutuante). Esse é o ponto do primeiro modelo: se isto discordar de P L³ / (3 E I), o erro está em unidades, condições de contorno, direção da carga ou a assinatura do elemento — não em «refinar a malha».

ops = require_openseespy()

L = 4.0           # m
E = 2.0e11        # Pa (N/m²)
I = 8.333e-6      # m⁴  (100 mm × 100 mm rectangle: b h³ / 12)
A = 0.01          # m²  (needed by the element; does not affect this tip load)
P = 1000.0        # N, downward

ops.wipe()
ops.model("basic", "-ndm", 2, "-ndf", 3)

ops.node(1, 0.0, 0.0)
ops.node(2, L, 0.0)
ops.fix(1, 1, 1, 1)

ops.geomTransf("Linear", 1)
ops.element("elasticBeamColumn", 1, 1, 2, A, E, I, 1)

ops.timeSeries("Linear", 1)
ops.pattern("Plain", 1, 1)
ops.load(2, 0.0, -P, 0.0)

ops.constraints("Plain")
ops.numberer("RCM")
ops.system("BandGeneral")
ops.algorithm("Linear")
ops.integrator("LoadControl", 1.0)
ops.analysis("Static")
ok = ops.analyze(1)
if ok != 0:
    raise RuntimeError(f"static analysis failed, analyze() returned {ok}")

uy = ops.nodeDisp(2, 2)
delta_closed = P * L**3 / (3.0 * E * I)
rel = abs(abs(uy) - delta_closed) / delta_closed

print(f"OpenSees uy = {uy:.6e} m")
print(f"Closed form = {delta_closed:.6e} m")
print(f"Relative error on |uy| = {rel:.3e}")

Leia a lista de argumentos de elasticBeamColumn do seu build de OpenSeesPy. Em 2D a ordem habitual é tag, nós, A, E, Iz, tag de transformação. Uma assinatura 3D insere G, J, Iy e não coincidirá com este script.

Validação

Trate a forma fechada como o árbitro deste problema concreto:

  1. |uy| deveria coincidir com P L³ / (3 E I) em torno de 1e-8 relativo ou melhor num build típico de dupla precisão. Se você vir 1e-3 ou pior, não «aceite tolerância de engenharia» — ache o erro de unidades ou de GDL.
  2. uy deveria ser negativo com a carga acima. Um deslocamento positivo na ponta com Py negativo significa que a carga ou o GDL de deslocamento não é o que você pensa.
  3. Parta o membro em vários segmentos elasticBeamColumn com nós intermediários. Os cúbicos de Euler–Bernoulli carregados nas extremidades deveriam permanecer na forma fechada; um salto grande depois de malhar costuma significar um erro de transformação, liberação ou restrição, não «faltam mais elementos».
  4. Gire a viga em balanço para vertical e carregue-a axialmente: o deslocamento transversal na ponta deve colapsar a zero numérico. Se não, a transformação geométrica ou os eixos locais estão errados.

Um modelo de linguagem que imprime um deslocamento sem esta conferência não é um solver. Conserve a forma fechada no mesmo script que chama o OpenSees.

Erros comuns

  • O import funcionou noutro Python. Editores, notebooks e CI muitas vezes não compartilham o interpretador onde você rodou pip install.
  • Unidades. E em MPa com I em mm⁴ e L em m é a falha silenciosa clássica. O OpenSees ainda «convergirá».
  • Máscara fix errada. Deixar a rotação livre no apoio não é uma viga em balanço.
  • Elemento 3D num modelo 2D (ou o inverso). A análise pode falhar ou, pior, rodar com uma lista de argumentos mal interpretada.
  • geomTransf omitida ou reutilizada com a dimensão errada. O Linear 2D não é o Linear 3D que precisa de um vetor que defina o plano xz local.
  • Confiar em massa padrão ou geomTransf('PDelta') numa primeira conferência elástica. Comece com Linear e sem massa.

Limitações

  • Euler–Bernoulli: sem deformação por cisalhamento. Uma viga profunda precisa de um elemento tipo Timoshenko e outra forma fechada.
  • Geometria linear: isto não é uma conferência P-delta nem de grandes deslocamentos.
  • Prismático, elástico, isotrópico, carga só na extremidade. Carga distribuída, seções afuniladas e ligações semirrígidas são outros modelos.
  • Um caso de carga, estático. Períodos naturais, espectros de resposta e combinação modal ficam fora deste artigo. Para dinâmica, use uma referência de dinâmica estrutural como Chopra, Dynamics of Structures — a entrada de livros deste hub usa o content id chopra-dynamics-of-structures — e continue mantendo uma conferência em forma fechada ou de espectro à mão.
  • As rodas do OpenSeesPy e os builds Tcl diferem por plataforma. Um resultado que você não consegue regenerar numa segunda máquina não é um resultado que deva assinar.
  • Nada disto substitui a norma de edificação, o engenheiro responsável licenciado nem um plano documentado de verificação.

Contexto profissional

Um primeiro modelo elástico é um passo de verificação: esta instalação, este sistema de unidades e esta conectividade reproduzem um problema cuja resposta você já conhece? Modelos de produção precisam desse hábito mais uma revisão independente. Não cole esta viga em balanço num arquivo de projeto e chame a estrutura de «conferida».

Referências

  • Documentação do OpenSees / OpenSeesPy, University of California, Berkeley / PEER. https://openseespydoc.readthedocs.io/
  • McKenna, F. OpenSees: a framework for earthquake engineering simulation. Computing in Science & Engineering, 2011 (contexto do framework; não substitui a versão que você instalou).
  • Timoshenko, S. P., e Gere, J. M. Mechanics of Materials. Resultado elementar da viga em balanço δ = P L³ / (3 E I). Cite a edição da sua prateleira; não copie trechos longos.
  • Chopra, A. K. Dynamics of Structures. Para o passo depois da verificação elástica estática (content id chopra-dynamics-of-structures).