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
- 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.
- 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.
- Sistema independente: N-mm versus SI devem coincidir depois de converter δ.
- 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,unytou 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/