Código

Armadilhas de conversão de unidades em scripts de engenharia civil

Por que um script que «converge» ainda pode estar errado por 10⁹ — milímetros misturados com metros, MPa versus pascals, e densidade versus peso específico.

Scripts civis falham mais vezes por unidades misturadas do que pelo solver. Motores de elementos finitos, inclusive o OpenSees, são adimensionais: devolverão de bom grado um deslocamento de 1e6 «algo» se E, I e L não compartilham um sistema. Planilhas escondem o mesmo erro atrás de um formato de célula.

Este artigo não é uma biblioteca completa de unidades. Mostra os modos de falha que aparecem em scripts estruturais e BIM, e uma lista curta que os pega antes de você confiar num número.

Pré-requisitos

  • Python 3
  • A forma fechada da viga em balanço δ = P L³ / (3 E I) (resistência dos materiais elementar)
  • Disposição para imprimir ambos o resultado de unidades misturadas e o de unidades coerentes na mesma corrida

A armadilha: três números que parecem bem

Suponha uma viga em balanço de aço de 4 m, seção quadrada 100 mm × 100 mm, E = 200 GPa, carga na ponta 1 kN. Um script apressado costuma parecer assim:

E = 200_000      # "MPa" in the comment, used as if it were N and mm
I = 8.333e6      # mm⁴  (100 mm × 100 mm rectangle)
L = 4.0          # metres  — the silent mix
P = 1_000        # newtons

delta_mixed = P * L**3 / (3.0 * E * I)
print(delta_mixed)

Cada literal é uma quantidade real que alguém escreveu num desenho. Juntos não são um modelo. L³ está em m³ enquanto EI está em N·mm² se você levou o comentário a sério — ou pior, o comentário é ignorado e os valores são só floats.

Dois sistemas coerentes que devem coincidir

Fique dentro de um sistema, e depois converta o deslocamento no fim.

Newton–milímetro (E em N/mm², que é MPa; I em mm⁴; L em mm; P em N; δ em mm):

E_nmm = 200_000.0       # N/mm²
I_nmm = 100.0 * 100.0**3 / 12.0  # mm⁴
L_nmm = 4_000.0         # mm
P_n = 1_000.0           # N
delta_mm = P_n * L_nmm**3 / (3.0 * E_nmm * I_nmm)

Newton–metro (SI):

E_si = 2.0e11           # Pa
I_si = I_nmm * 1e-12    # mm⁴ → m⁴
L_si = 4.0              # m
delta_m = P_n * L_si**3 / (3.0 * E_si * I_si)
delta_mm_from_si = delta_m * 1_000.0
rel = abs(delta_mm - delta_mm_from_si) / abs(delta_mm_from_si)
print(f"δ = {delta_mm:.6f} mm (N-mm system)")
print(f"δ = {delta_mm_from_si:.6f} mm (SI, converted)")
print(f"relative difference = {rel:.3e}")
if rel > 1e-9:
    raise SystemExit("unit systems disagree — stop")

Se os dois sistemas diferirem, você não tem um problema de arredondamento. Tem um fator de conversão errado (em geral 10³, 10⁶, 10⁹ ou 10¹² em I).

Uma terceira corrida que de propósito deixa L em metros com E e I em unidades milimétricas deveria diferir do resultado coerente por muitas ordens de magnitude. Conserve essa chamada quebrada num teste chamado test_mixed_mm_m_is_detected para a armadilha continuar visível.

Outros clássicos civis

Densidade versus peso específico

Concreto em torno de 2400 kg/m³ não é 2400 kN/m³. O peso específico é γ = ρ g. Usar 9.81 m/s² dá cerca de 23.5 kN/m³. Usar 2400 num padrão de carga que espera kN/m³ é um erro de cerca de duas ordens de magnitude. O inverso — tratar 25 kN/m³ como kg/m³ numa matriz de massa — é igualmente ruim.

Scripts em unidades US customary acrescentam g = 32.2 ft/s² versus 9.81 m/s², e kips versus libras. Não converta g «de olho».

Propriedades de seção

I de mm⁴ para m⁴ é um fator de 10⁻¹², não 10⁻⁶. Área mm² para m² é 10⁻⁶. Misturar esses dois fatores é como uma coluna «funciona» num notebook e pandeia na conferência real de unidades.

BIM e IFC

Arquivos IFC carregam uma unidade de comprimento do projeto. Uma quantidade armazenada como float sem aplicar ifcopenshell.util.unit (ou o equivalente) não é um metro só porque a sua variável se chama length_m. Esse é o próximo tutorial.

Solvers sem sistema de unidades

O OpenSees, muitos códigos de pesquisa e uma grande fração de Python interno não avisam. Um primeiro modelo elástico que coincida com P L³ / (3 E I) num conjunto de unidades documentado é o teste de regressão mais barato que você pode acrescentar.

Validação

  1. Ida e volta: converta mm → m → mm em L, I e δ em separado; cada ida e volta deveria atingir erro relativo de precisão de máquina nessas escalas.
  2. Ordem de magnitude: uma barra de aço de 4 m, quadrada de 100 mm, 1 kN na ponta é uma flecha pequena de milímetros a centímetros, não metros nem nanômetros. Se a impressão for 1e5 ou 1e-12, acredite nas unidades, não no solver.
  3. Sistema independente: N-mm versus SI devem coincidir depois de converter δ.
  4. Não aceite um fator de 1000 gerado por um LLM sem escrever no papel a dimensão de I.

Limitações

  • Esta página não substitui uma biblioteca de unidades (pint, unyt ou um enum de projeto). Essas ferramentas ainda falham se você colar a unidade errada na borda (IFC, CSV, uma GUI).
  • Unidades térmicas, unidades estruturais US customary (kip, kip·in²) e kPa geotécnico versus ksf só são esboçadas. Acrescente testes para os pares de unidades que o seu escritório realmente mistura.
  • Peso próprio, fatores de carga e combinações de norma não são conversões de unidades. Não os meta no mesmo auxiliar.
  • O acordo numérico entre duas expressões Python não substitui uma fórmula de viga citada nem uma verificação de solver.

Contexto profissional

Se um pacote de cálculo não declara o sistema de unidades na mesma página que o resultado, os revisores não conseguem conferi-lo. Ponha o conjunto de unidades no cabeçalho do script, na linha de log ao lado de cada deslocamento impresso, e na nota de verificação que você guarda com o modelo.

Referências

  • BIPM. The International System of Units (SI). Folheto vigente — nomes e prefixos, não uma norma estrutural.
  • Timoshenko, S. P., e Gere, J. M. Mechanics of Materials. Resultado da viga em balanço usado como expressão árbitro.
  • Documentação do OpenSeesPy: o motor não converte unidades por você. https://openseespydoc.readthedocs.io/