🚀 Auto-deploy: BrainWind atualizado em 01/09/2026 14:27:19
This commit is contained in:
@@ -29,6 +29,8 @@ export interface ShelterInput {
|
||||
rightClosure: number;
|
||||
/** Posição da abertura na parede de fundo ('top' | 'bottom' | 'distributed') */
|
||||
openingPos: OpeningPosition;
|
||||
/** Número de pórticos principais/pilares contínuos (padrão: 2) */
|
||||
numColumns?: number;
|
||||
/** Ângulo de incidência do vento (0° = frontal, 45° = oblíquo, 90° = lateral) */
|
||||
windAngle?: ShelterWindAngle;
|
||||
}
|
||||
@@ -38,10 +40,14 @@ export interface ShelterResult {
|
||||
windAngle: ShelterWindAngle;
|
||||
/** Coeficiente de pressão superior da cobertura (Ce superior) */
|
||||
cpeTop: number;
|
||||
/** Coeficiente de pressão superior EXTREMO na zona de borda livre (Ce borda) */
|
||||
cpeEdgeTop: number;
|
||||
/** Coeficiente de pressão interna efetivo sob a cobertura (Cpi inferior) */
|
||||
cpiBottom: number;
|
||||
/** Coeficiente de força líquida vertical na cobertura (Cnf = cpeTop - cpiBottom) */
|
||||
/** Coeficiente de força líquida vertical média na cobertura (Cnf = cpeTop - cpiBottom) */
|
||||
cnfVertical: number;
|
||||
/** Coeficiente de força líquida vertical de PICO na zona de borda livre */
|
||||
cnfEdgeVertical: number;
|
||||
/** Coeficiente de força horizontal na parede de fundo */
|
||||
cfBack: number;
|
||||
/** Coeficiente de força horizontal nas paredes laterais */
|
||||
@@ -61,10 +67,18 @@ export interface ShelterResult {
|
||||
};
|
||||
/** Carga linear estimada nos pórticos metálicos principais (kN/m) (ex: Tubo 150x150) */
|
||||
lineLoads: {
|
||||
/** Carga horizontal em cada pilar (kN/m) */
|
||||
/** Carga horizontal no pilar do PÓRTICO CENTRAL (mais carregado) (kN/m) */
|
||||
columnLoad: number;
|
||||
/** Carga vertical/horizontal na viga em balanço (kN/m) */
|
||||
/** Carga horizontal no pilar do PÓRTICO DE EXTREMIDADE (kN/m) */
|
||||
columnLoadEdge: number;
|
||||
/** Carga vertical/horizontal média equivalente na viga do PÓRTICO CENTRAL (kN/m) */
|
||||
beamLoad: number;
|
||||
/** Carga vertical/horizontal média equivalente na viga do PÓRTICO DE EXTREMIDADE (kN/m) */
|
||||
beamLoadEdge: number;
|
||||
/** Momento fletor na raiz/engaste do balanço CENTRAL (kN.m) considerando o Efeito Asa de Avião */
|
||||
beamMoment: number;
|
||||
/** Momento fletor na raiz/engaste do balanço na EXTREMIDADE (kN.m) */
|
||||
beamMomentEdge: number;
|
||||
};
|
||||
/** Alívio percentual de arrancamento obtido pela posição da abertura (%) */
|
||||
reliefPercentage: number;
|
||||
@@ -98,6 +112,7 @@ export function calculateShelterWind(input: ShelterInput, q: number): ShelterRes
|
||||
leftClosure,
|
||||
rightClosure,
|
||||
openingPos,
|
||||
numColumns = 2,
|
||||
} = input;
|
||||
|
||||
const windAngle: ShelterWindAngle = input.windAngle ?? 0;
|
||||
@@ -115,15 +130,19 @@ export function calculateShelterWind(input: ShelterInput, q: number): ShelterRes
|
||||
// 1. Coeficiente externo superior na cobertura (Ce superior)
|
||||
// Varia conforme o ângulo de incidência (0°, 45° ou 90°)
|
||||
let cpeTop = -1.0;
|
||||
let cpeEdgeTop = -2.0;
|
||||
if (windAngle === 0) {
|
||||
// Frontal: -1.0 a -1.4 de sucção de barlavento, dependendo de theta
|
||||
cpeTop = theta <= 5 ? -1.0 : theta <= 15 ? -1.2 : -1.4;
|
||||
cpeEdgeTop = theta <= 5 ? -1.8 : theta <= 15 ? -2.0 : -2.4;
|
||||
} else if (windAngle === 45) {
|
||||
// Oblíquo 45°: forte vórtice cônico de canto nas bordas de barlavento (aumento de sucção em ~20% a 30%)
|
||||
cpeTop = theta <= 5 ? -1.3 : theta <= 15 ? -1.4 : -1.6;
|
||||
cpeEdgeTop = theta <= 5 ? -2.2 : theta <= 15 ? -2.5 : -2.8;
|
||||
} else {
|
||||
// Lateral 90°: escoamento transversal sobre a cobertura, sucção constante por descolamento
|
||||
cpeTop = -1.1;
|
||||
cpeEdgeTop = -1.6;
|
||||
}
|
||||
|
||||
// 2. Cálculo do Cpi sob a cobertura (efeito estagnação da parede traseira / laterais)
|
||||
@@ -189,6 +208,7 @@ export function calculateShelterWind(input: ShelterInput, q: number): ShelterRes
|
||||
// Cnf vertical total na cobertura (arrancamento para cima = negativo)
|
||||
const cnfUp = cpeTop - Math.max(0, effectiveCpi);
|
||||
const cnfDown = 0.2 - Math.min(0, effectiveCpi);
|
||||
const cnfEdgeUp = cpeEdgeTop - Math.max(0, effectiveCpi);
|
||||
|
||||
// 4. Coeficientes horizontais em paredes de fundo e laterais
|
||||
let cfBack = 1.3 * bClose;
|
||||
@@ -210,20 +230,45 @@ export function calculateShelterWind(input: ShelterInput, q: number): ShelterRes
|
||||
const fySide = cfSide * q * (areaSide * 2);
|
||||
const fFriction = 0.04 * q * areaRoof;
|
||||
|
||||
// 6. Carga linear em pórticos (2 pórticos principais)
|
||||
const numPorticos = 2;
|
||||
let columnLoad = 0;
|
||||
// 6. Carga linear em pórticos (usando Áreas Tributárias)
|
||||
const numPorticos = Math.max(2, numColumns);
|
||||
const numBays = numPorticos - 1;
|
||||
const overhang = 0.6; // beiral genérico considerado no 3D
|
||||
// Largura total efetiva entre o primeiro e o último pilar:
|
||||
const spanWidth = Math.max(0.1, width - 2 * overhang);
|
||||
const spacing = spanWidth / numBays;
|
||||
|
||||
// A área tributária de um pórtico central é o espaçamento 's'
|
||||
// A área tributária de um pórtico de extremidade é 's/2' + overhang
|
||||
const tributaryCentral = spacing;
|
||||
const tributaryEdge = spacing / 2 + overhang;
|
||||
|
||||
// Fração da carga total que vai para o pórtico central vs extremidade
|
||||
const fractionCentral = tributaryCentral / width;
|
||||
const fractionEdge = tributaryEdge / width;
|
||||
|
||||
let columnLoadTotal = 0;
|
||||
if (windAngle === 0) {
|
||||
columnLoad = (fxBack / height / numPorticos) + (q * 1.8 * 0.15);
|
||||
columnLoadTotal = fxBack;
|
||||
} else if (windAngle === 45) {
|
||||
const combForce = Math.sqrt(fxBack * fxBack + fySide * fySide);
|
||||
columnLoad = (combForce / height / numPorticos) + (q * 1.8 * 0.15);
|
||||
columnLoadTotal = Math.sqrt(fxBack * fxBack + fySide * fySide);
|
||||
} else {
|
||||
// Em 90°, a carga transversal principal atua nas paredes laterais (Fy)
|
||||
columnLoad = (fySide / height / numPorticos) + (q * 1.8 * 0.15);
|
||||
columnLoadTotal = fySide;
|
||||
}
|
||||
|
||||
const beamLoad = (fzUp / depth / numPorticos);
|
||||
// Cargas Distribuídas Lineares no Pilar
|
||||
const windBaseLoadColumn = q * 1.8 * 0.15; // arrasto base no próprio perfil do pilar
|
||||
const columnLoad = (columnLoadTotal * fractionCentral / height) + windBaseLoadColumn;
|
||||
const columnLoadEdge = (columnLoadTotal * fractionEdge / height) + windBaseLoadColumn;
|
||||
|
||||
// Cargas Distribuídas Lineares na Viga (Balanço)
|
||||
const beamLoad = (fzUp * fractionCentral / depth);
|
||||
const beamLoadEdge = (fzUp * fractionEdge / depth);
|
||||
|
||||
// Cálculo do Momento Fletor na raiz da viga em balanço considerando o centro de pressão deslocado (L/3)
|
||||
const cpRootDist = (2 / 3) * depth;
|
||||
const beamMoment = (fzUp * fractionCentral) * cpRootDist;
|
||||
const beamMomentEdge = (fzUp * fractionEdge) * cpRootDist;
|
||||
|
||||
// Texto explicativo por condição e ângulo
|
||||
let statusText = '';
|
||||
@@ -266,8 +311,10 @@ export function calculateShelterWind(input: ShelterInput, q: number): ShelterRes
|
||||
return {
|
||||
windAngle,
|
||||
cpeTop: Number(cpeTop.toFixed(2)),
|
||||
cpeEdgeTop: Number(cpeEdgeTop.toFixed(2)),
|
||||
cpiBottom: Number(effectiveCpi.toFixed(2)),
|
||||
cnfVertical: Number(cnfUp.toFixed(2)),
|
||||
cnfEdgeVertical: Number(cnfEdgeUp.toFixed(2)),
|
||||
cfBack: Number(cfBack.toFixed(2)),
|
||||
cfSide: Number(cfSide.toFixed(2)),
|
||||
forces: {
|
||||
@@ -279,7 +326,11 @@ export function calculateShelterWind(input: ShelterInput, q: number): ShelterRes
|
||||
},
|
||||
lineLoads: {
|
||||
columnLoad: Number(columnLoad.toFixed(2)),
|
||||
columnLoadEdge: Number(columnLoadEdge.toFixed(2)),
|
||||
beamLoad: Number(beamLoad.toFixed(2)),
|
||||
beamLoadEdge: Number(beamLoadEdge.toFixed(2)),
|
||||
beamMoment: Number(beamMoment.toFixed(2)),
|
||||
beamMomentEdge: Number(beamMomentEdge.toFixed(2)),
|
||||
},
|
||||
reliefPercentage,
|
||||
statusText,
|
||||
|
||||
Reference in New Issue
Block a user