using Geometria, LinearAlgebra
cil_x(R) = θ -> [θ[1], R * sin(θ[2]), R * cos(θ[2])]
resultados = Tuple{String,Bool}[]
reg(nombre, ok) = push!(resultados, (nombre, ok))
# Nivel 2: propiedades del elemento (6 autovalores nulos, simetría)
plana = placa_oblicua(π / 2); X = [0.0 1 1 0; 0 0 1 1]
K = rigidez_elemento(plana, X, 1.0, 0.3, 0.1)
ev = eigvals(Symmetric(K))
reg("K simétrica (1e-10)", norm(K - K') < 1e-10)
reg("6 autovalores nulos", count(<(1e-9 * maximum(ev)), ev) == 6)
# Nivel 4: tubo a presión (analítica)
R, t, E, ν, p = 500.0, 5.0, 210e3, 0.3, 0.5
r = cil_x(R); nodos, conn = malla_rectangular((0, 100.0), (0, π / 2), 2, 8)
Kc, _, F = ensamblar(r, nodos, conn, E, ν, t; f = θ -> p .* [0, sin(θ[2]), cos(θ[2])])
fij = Int[]
for k in 1:size(nodos, 2)
_, φ = nodos[:, k]; append!(fij, [gdl(k, 1), gdl(k, 4)])
(φ ≈ 0 || φ ≈ π / 2) && append!(fij, [gdl(k, 2), gdl(k, 5)])
end
u = resolver_estatica(Kc, F, unique(fij))
k45 = argmin([norm(nodos[:, k] .- [50.0, π / 4]) for k in 1:size(nodos, 2)])
reg("tubo a presión (rtol 1e-4)", isapprox(u[gdl(k45, 3)], p * R^2 * (1 - ν^2) / (E * t); rtol = 1e-4))
# Nivel 2: masa total y carga total de un elemento
M = masa_elemento(cil_x(0.5), [0.0 0.1 0.1 0; 0 0 0.1 0.1], 7850.0, 0.005)
δ = zeros(20); for k in 1:4; δ[5(k-1)+1] = 1.0; end
reg("masa total ρtA (rtol 1e-9)", isapprox(δ' * M * δ, 7850 * 0.005 * 0.1 * 0.5 * 0.1; rtol = 1e-9))
[(nombre = n, pasa = ok) for (n, ok) in resultados]