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:
|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.uydeveria 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.- Parta o membro em vários segmentos
elasticBeamColumncom 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». - 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
fixerrada. 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.
geomTransfomitida ou reutilizada com a dimensão errada. OLinear2D não é oLinear3D 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 comLineare 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).