PRECISIÓN DEL CÁLCULO
Todas las cifras DE NUESTRO MOTOR se recalculan al compilar, leyendo los ficheros del repositorio y pasándolos por src/engine: ninguna está escrita a mano. La única columna tecleada a mano es la del otro programa, que por definición no se puede recalcular —se copia de su informe— y al compilar se coteja contra la nuestra. Las que todavía no existen se dejan vacías.
El flujo que sale de integrar la curva reproduce un valor declarado aparte de la matriz de candelas en 2 de 2 fichas publicadas por el fabricante, en 1 de 1 cabeceras del propio fichero y en 52 de 52 EULUMDAT con LORL declarado. Solo las primeras son un dato de fuera del fichero.
LO QUE ESTÁ DEMOSTRADO HOY
Un fichero fotométrico se puede comprobar contra sí mismo y salir bien siempre: el flujo integrado es lo que sale de la matriz de candelas, así que compararlo con esa misma matriz no prueba nada. Lo que sí prueba algo es contrastarlo con un flujo declarado por el laboratorio e independiente de la curva. Hay tres sitios de donde sacarlo y los tres están usados aquí, pero no valen lo mismo: solo el primero trae un dato de fuera del fichero. Van separados por eso, y no sumados en un único recuento.
1 · Contra la ficha publicada del fabricante — 2 de 3 anclas
Es el contraste más fuerte que existe hoy en el proyecto, y el único cuyo dato viene de fuera del fichero: si el parser aplicara mal una escala o reconstruyera mal la simetría, el fichero seguiría siendo coherente consigo mismo y dejaría de coincidir con lo que el fabricante publica. Cada una lleva en validation/anclajes.json la URL de su ficha y su grado de confianza, y cada grado tiene su propio umbral.
Confianza alta. Ficha oficial de Efficient Lighting Systems «ADL150 WIDE BEAM DOWNLIGHT», referencia ADL150.3000.90.40.61 (haz de 90°, 4000 K, no regulable). El paquete IES oficial de ELS trae el mismo informe de ensayo LightLab LL14741-FLEX40-S1 que este fichero.
Este dato se imprime, no aprueba: el manifiesto deja documentado por qué se duda del valor publicado, así que a este ancla solo se le pide la banda ancha del 10 % —suficiente para cazar un error de escala o de simetría, que son de factor 2 o 4—. Que salga una décima no lo convierte en una referencia de precisión fina.
Confianza media. Ficha oficial ELS «ADL90 TRIMLESS», referencia ADL90.XTM5.9540.61TL, módulo Xicato XTM 19954013CCA. Los 11,5 W coinciden al vatio con la línea de datos del propio IES.
2 · Contra la cabecera del propio fichero — 1 de 3 anclas
Aquí el valor de referencia no viene de fuera: sale del mismo fichero, de una palabra clave de su cabecera, y así lo dice su fuente. Sigue probando algo —esa palabra clave no se deduce de la matriz de candelas, de modo que un error de escalado la delataría—, pero no es una comprobación independiente y por tanto no se cuenta entre las fichas de fabricante. Se separa para que el recuento de arriba no infle lo que hay.
Confianza alta. El propio fichero, keyword [_TOTALLUMINAIRELUMENS], PRIMERA aparición. Coincide con el [LUMCAT] «CHSL 2x2 80CRI 35K 4000LM MNML 2SDP».
Otros 2 ficheros del manifiesto no tienen ancla y se dice por qué: erco-optec-14w-30.ies — Fotometría RELATIVA: la cabecera declara 1080 lm, que son los de la LÁMPARA. El flujo de luminaria no está en el fichero. · williams-downlight-wallwash.ies — No publicado. El 8DR se cataloga en tres distribuciones (W 65°, M 50°, N 35°) y el wall wash queda fuera de tabla. La ficha de la época publica los otros tres ensayos ATAL del mismo lote del 12/11/2015 y se salta justo el 011608, que es el de este fichero. Un ancla inventada haría pasar un parser roto, así que ahí no se escribe ningún número estimado.
3 · Contra el LORL que declara cada EULUMDAT
El formato EULUMDAT declara en su línea 23 el rendimiento de la luminaria (LORL), que mide el laboratorio aparte de la matriz. Integrar la curva tiene que devolver flujo de lámpara × LORL. Es la comprobación que cierra las dos trampas del formato: el escalado en cd/1000 lm y la reconstrucción de la matriz completa por simetría —si cualquiera de las dos estuviera mal, el error saldría de factor 2, 4 o de órdenes de magnitud, no de décimas—. Es una comprobación interna: fuerte, pero del fichero contra sí mismo.
El peor es h1-eulumdat-rs-projector.ldt, con 2,11 %. Los demás quedan por debajo. Peor error de las anclas del manifiesto: 0,04 %.
EL CORPUS
Los ficheros están en el repositorio (validation/fixtures) y el recuento se hace leyendo la carpeta al compilar. La mayoría son fotometrías de catálogo de fabricante; unos pocos son ficheros de ejemplo de las propias especificaciones de los formatos, que sirven para cubrir casos raros y que no representan a ninguna luminaria en venta. No se dice «todos de fabricante» porque no lo son.
El recuento de nombres es el de las cabeceras, sin limpiar: una misma marca puede aparecer con dos grafías y algún fichero de ejemplo escribe ahí un texto que no es un nombre comercial. Se enseña tal cual antes que redondeado a ojo.
Simetrías EULUMDAT
Código Isym de la línea 3. El fichero solo guarda el sector mínimo y hay que reconstruir los 360°: si el código se interpreta mal, medio local sale a cero.
| 0 | Sin simetría | 18 |
| 1 | De revolución | 7 |
| 2 | Espejo en C0–C180 | 4 |
| 3 | Espejo en C90–C270 | 9 |
| 4 | Espejo en los dos ejes | 15 |
Revisiones de LM-63
Con la revisión que ha aplicado el motor al leer cada fichero, no con una segunda lectura de la línea de versión: de esa revisión depende que las candelas se multipliquen o no por el factor de balasto, así que lo honesto es enseñar lo que se hizo. La de 1986 es la única que no lleva línea de versión, así que un IES sin ella se cuenta ahí. Aquí suman 10 de los 13 ficheros IES: la diferencia son los que el motor rechaza (3), porque de un fichero que no se ha leído no se puede decir con qué reglas se leyó.
| LM-63 1986 | 2 |
| LM-63 1991 | 2 |
| LM-63 1995 | 2 |
| LM-63 2002 | 4 |
62 se leen · 4 se rechazan a propósito
Un rechazo con motivo no es un fallo: es la conducta correcta. Lo que no puede pasar es que un fichero que el motor no entiende salga con un número creíble. Estos son los del corpus, con el mensaje exacto que devuelve el parser:
El flujo del juego de lámpara es negativo. En EULUMDAT ese campo es la ESCALA de toda la matriz —las intensidades vienen en cd por cada 1.000 lm— así que sin un flujo válido no hay forma de convertirlas en candelas sin inventarse el dato. (línea 29, se esperaba un flujo de lámpara mayor que 0 lm (o 0 para fotometría absoluta), se encontró -2 lm)
Los ángulos del fichero no van en orden creciente. El motor interpola entre ángulos consecutivos, y con la lista desordenada la interpolación daría valores que no están en ninguna parte de la curva. (línea 17, se esperaba un ángulo mayor que 105°, se encontró 100°)
El fichero es de fotometría de tipo A o B, propia de proyectores de espectáculos y de automoción. Sus ángulos no son el polar y el azimutal, así que este motor no lo puede calcular: pídele al fabricante el mismo producto en tipo C, que es el convenio de interiores. (línea 18, se esperaba tipo fotométrico 1 (C), se encontró 2 (B))
El fichero es de fotometría de tipo A o B, propia de proyectores de espectáculos y de automoción. Sus ángulos no son el polar y el azimutal, así que este motor no lo puede calcular: pídele al fabricante el mismo producto en tipo C, que es el convenio de interiores. (línea 20, se esperaba tipo fotométrico 1 (C), se encontró 2 (B))
LA COMPARACIÓN CONTRA OTRO PROGRAMA
Parámetros idénticos en los 10 casos: factor de mantenimiento 0,80 · plano de trabajo 0,80 m · zona marginal pedida 0,50 m. Son la causa número uno de que dos cálculos correctos den números distintos. No en todos: donde el local no da para tanta banda, el motor la estrecha al 15 % del lado corto —casos 5 (0,30 m) · 8 (0,45 m)—, y ahí los lux se han promediado sobre esa superficie y no sobre la pedida.
| # | Local | Em Solarion Lux | Em otro programa | Desviación | Objetivo |
|---|---|---|---|---|---|
| 1 | 6 × 4 × 2,8 m | 655,7 lx | 660,0 lx | −0,7 % | < 5 % |
| 2 | 12 × 8 × 3,0 m | 538,6 lx | 544,0 lx | −1,0 % | < 5 % |
| 3 | 9 × 7 × 3,0 m | 591,4 lx | 602,0 lx | −1,8 % | < 5 % |
| 4 | 30 × 20 × 8,0 m | 731,4 lx | 744,0 lx | −1,7 % | se documenta |
| 5 | 20 × 2 × 2,7 m | 919,6 lx | 893,0 lx | +3,0 % | < 5 % |
| 6 | 40 × 15 × 10,0 m | 761,3 lx | 784,0 lx | −2,9 % | se documenta |
| 7 | 8 × 5 × 2,7 m | 635,3 lx | 643,0 lx | −1,2 % | < 5 % |
| 8 | 3 × 3 × 2,5 m | 156,8 lx | 164,0 lx | −4,4 %† | se documenta |
| 9 | 10 × 10 × 4,5 m | 236,2 lx | 237,0 lx | −0,3 % | se documenta |
| 10 | 15 × 10 × 3,0 m | 508,8 lx | 516,0 lx | −1,4 % | < 5 % |
† En este caso el motor avisa de que su propia media no es fiable a menos de unos puntos porcentuales: al calcular con la malla al doble de fina, cambia mucho más de lo que cambia en una instalación bien resuelta. Es lo típico de un proyector de haz estrecho en un local pequeño. El mapa de isolux y el mínimo sí valen. La desviación se publica igual, porque lo único que se exige es publicar el número verdadero.
Desviación = (Em Solarion Lux − Em del otro programa) / Em del otro programa × 100. El objetivo del 5 % no cubre los 10 casos: se exige en 6 de ellos, los locales rectangulares corrientes. En los otros 4 se sabe de antemano que el método de flujo dividido se degrada (techos muy altos, un local mínimo con una sola luminaria, y una instalación donde más de un tercio de la luz llega rebotada) y lo único que se exige es publicar el número verdadero, salga el que salga.
El resto de nuestras cifras — comparadas fuera de esta tabla
Estas seis columnas no tienen aquí su pareja del otro programa, y eso es una limitación de esta tabla, no del trabajo: la uniformidad y las iluminancias mínima y máxima sí se han medido contra el programa de referencia, en más casos que los de aquí, y el resultado está publicado con sus cifras en el expediente de validación del repositorio.
Lo que ese expediente dice, y es la razón de que la promesa hable de la iluminancia media y solo de ella: el motor promedia mucho mejor de lo que reparte. La media se aparta poco; la uniformidad se aparta bastante más, y el porqué está localizado y escrito —la componente interreflejada se entrega como un valor único para todo el plano—. Ese límite se cuenta entero en la sección 04.
Los W/m² son un caso aparte y conviene mirarlos los primeros: no dependen de la física —potencia instalada dividida por superficie—, así que si no coinciden es que uno de los dos programas ha cargado otra luminaria. En los casos medidos coinciden al céntimo, y eso es lo que prueba que los dos están calculando la misma instalación.
| Solarion Lux · estas seis se comparan en el expediente, no en esta tabla | ||||||
|---|---|---|---|---|---|---|
| # | Emin | U0 | Emin/Emax | W/m² | Malla | Puntos útiles |
| 1 | 442,4 lx | 0,67 | 0,56 | 7,02 | 72 × 64 | 2880 de 4608 |
| 2 | 347,6 lx | 0,65 | 0,51 | 5,26 | 88 × 80 | 5600 de 7040 |
| 3 | 368,0 lx | 0,62 | 0,50 | 6,01 | 80 × 72 | 4464 de 5760 |
| 4 | 355,3 lx | 0,49 | 0,41 | 7,00 | 112 × 104 | 10.584 de 11.648 |
| 5 | 607,8 lx | 0,66 | 0,54 | 7,38 | 104 × 56 | 4000 de 5824 |
| 6 | 351,3 lx | 0,46 | 0,37 | 8,40 | 128 × 96 | 11.160 de 12.288 |
| 7 | 429,9 lx | 0,68 | 0,53 | 6,32 | 80 × 72 | 4060 de 5760 |
| 8 | 5,9 lx | 0,04 | 0,01 | 1,89 | 56 × 56 | 1600 de 3136 |
| 9 | 112,7 lx | 0,48 | 0,29 | 3,52 | 80 × 80 | 5184 de 6400 |
| 10 | 327,9 lx | 0,64 | 0,48 | 4,21 | 96 × 80 | 6480 de 7680 |
LOS LÍMITES DEL MÉTODO
Un profesional que lee los límites se fía más, no menos. Estos son los del motor tal y como está hoy, y están escritos también en el código, donde ocurren.
No modela sombras ni obstrucciones
La componente interreflejada se resuelve por flujo dividido: el local se parte en seis superficies —techo, suelo y cuatro paredes— y se equilibra el flujo con sus reflectancias. Es excelente en un local vacío y se degrada con el mobiliario. Una estantería, una columna o una máquina no proyectan sombra en este cálculo. Fuera de alcance en la v1: geometría no rectangular, obstrucciones, luz natural y exteriores.
El flujo dividido se degrada en geometrías extremas
La interreflejada se reparte como un valor uniforme en todo el plano de trabajo. Lo que eso cuesta no es la media —el método equilibra todo el flujo que sale de la luminaria, así que la media aguanta incluso cuando la mayor parte de la luz ha rebotado— sino el reparto: cuanto más pesa esa componente, más plana sale la uniformidad frente a la real. En estos 10 casos el extremo es el nº 9 (10 × 10 × 4,5 m, 4 suspendidas a 1,00 m del techo), donde el 34,9 % de la luz que llega al plano de trabajo ha rebotado antes. Por eso los casos con techo muy alto, local mínimo o mucha luz indirecta no entran en el objetivo del 5 %: se publica su desviación real.
Los tipos fotométricos A y B no se leen
El motor solo calcula con fotometría de tipo C, que es el convenio de interiores. Los tipos A y B —proyectores de espectáculos y automoción— tabulan dos ángulos que no son el polar y el azimutal: meterlos en la fórmula de la componente directa daría una aritmética correcta cuyo resultado no significa lo que el motor cree, y saldría un mapa isolux creíble y falso. Se rechazan en la puerta, con un mensaje que dice que hay que pedirle al fabricante el fichero en tipo C. En este corpus hay 4 ficheros rechazados por esta y otras causas, listados arriba.
La v1 no incorpora la EN 12464-1
El objetivo de lux lo pone el usuario. La aplicación no dice si una instalación cumple la EN 12464-1 ni la ISO 8995-1: son normas con copyright y reproducir su contenido exige una licencia que la v1 no tiene. Para España se pueden usar los valores del Real Decreto 486/1997, anexo IV, que es ley publicada en el BOE y se cita como fuente.
CASOS DE REFERENCIA CON SOLUCIÓN CERRADA
Las secciones anteriores comparan este programa con datos de fuera: con la ficha de un fabricante, o con lo que devuelve otro programa. Esta sección hace algo distinto: enfrenta cada cifra con la fórmula que dice cuál tiene que ser. El valor correcto se conoce antes de ejecutar nada, porque se deriva a mano y está escrito al lado.
La diferencia no es de comodidad. Comparar dos programas dice que se parecen, no que acierten: dos motores con el mismo error coinciden perfectamente. Aquí no hay a quién parecerse.
| # | Qué pone a prueba | La fórmula | Este programa | Diferencia |
|---|---|---|---|---|
| R1 | El flujo de una curva constante, y con él el peso de ángulo sólido.Φ = 4π·I | 12.566,3706 lm | 12.566,3706 lm | 0,000000 % |
| R3 | El flujo de una curva lineal a trozos, que distingue la primitiva analítica del trapecio.Φ = 2π·I₀·(1 − sen γ₀/γ₀), que para γ₀ = 90° vale 2π·I₀ − 4·I₀ | 2283,1853 lm | 2283,1853 lm | +0,000000 % |
| R5 | La escala del motor: si esto falla, ninguna otra cifra significa nada.E = I / h² | 206,6116 lx | 206,6116 lx | 0,000000 % |
| R8 | Separa el ángulo fotométrico γ del ángulo de incidencia θ sobre una pared.E = I(γ)·cos θ / d², con cos γ = 1/3 y cos θ = 2/3 a d = 3,00 m | 16,0257 lx | 16,0257 lx | 0,000000 % |
| R9 | La cadena directa con una curva real, no lineal a trozos.E = I₀·h² / (h² + r²)², con h = 3,00 m y r = 0 (punto A) | 111,1111 lx | 111,1111 lx | 0,000000 % |
| R11 | La media sobre la malla de producción, con su zona marginal.Em = (1/2304)·Σ I·h/((xᵢ−2)² + (yⱼ−2)² + h²)^{3/2} sobre los 2.304 centros útiles | 143,5382 lx | 143,5382 lx | +0,000000 % |
| R14 | La componente interreflejada en el único caso donde tiene solución exacta.E_ir = (1/A)·ρ·Φ/(1 − ρ), con A = 96 m², Φ = 10 000 lm y ρ = 0,50 | 104,1667 lx | 104,1667 lx | 0,000000 % |
| R17 | La cadena entera por la misma puerta que usa el producto.Em = (directa media + ρ·Φ/(A·(1−ρ))) · FM, con FM = 0,80 | 268,8931 lx | 268,8931 lx | 0,000000 % |
Hasta dónde llega cada uno.
R1. Acredita: Que el integrador aplica el peso sen γ y cierra la vuelta azimutal. No acredita: Nada sobre la lectura de ficheros reales: la curva se construye en código.
R3. Acredita: Que la integración usa la primitiva exacta y no una regla del trapecio. No acredita: Curvas que no sean lineales a trozos: para esas está R9.
R5. Acredita: La magnitud absoluta de la componente directa bajo la vertical. No acredita: La geometría del coseno fuera del nadir, ni la incidencia oblicua.
R8. Acredita: Que el motor no confunde el ángulo de emisión con el de incidencia. No acredita: El reparto sobre la pared entera: es un solo punto.
R9. Acredita: La interpolación de una curva suave y la magnitud resultante. No acredita: Curvas asimétricas: la lambertiana tiene simetría de revolución.
R11. Acredita: Que la media se toma sobre las celdas que corresponde y con el peso que corresponde. No acredita: Que esa media sea la media verdadera del rectángulo: la de malla la supera en un 0,0090 %, que es el sesgo de muestreo del punto medio y se publica.
R14. Acredita: Que el solucionador de rebotes converge y que la energía cierra. No acredita: El reparto espacial de la interreflejada, las reflectancias no uniformes, y el comportamiento del método en geometrías que no sean un recinto cerrado y uniforme.
R17. Acredita: Que las dos componentes se suman en el orden correcto y que el factor de mantenimiento se aplica una sola vez y al final. No acredita: Nada que no acrediten ya R11 y R14 por separado: esto valida el montaje, no las piezas.
10 COMPARACIONES MEDIDAS
Caso 1 · local de 6,00 × 4,00 × 2,80 m. Iluminancia media: 655,7 lx aquí y 660,0 lx en el programa de referencia, una diferencia del −0,7 %. Medido el 20 de agosto de 2026.
Caso 2 · local de 12,00 × 8,00 × 3,00 m. Iluminancia media: 538,6 lx aquí y 544,0 lx en el programa de referencia, una diferencia del −1,0 %. Medido el 20 de agosto de 2026.
Caso 3 · local de 9,00 × 7,00 × 3,00 m. Iluminancia media: 591,4 lx aquí y 602,0 lx en el programa de referencia, una diferencia del −1,8 %. Medido el 21 de agosto de 2026.
Caso 4 · local de 30,00 × 20,00 × 8,00 m. Iluminancia media: 731,4 lx aquí y 744,0 lx en el programa de referencia, una diferencia del −1,7 %. Medido el 21 de agosto de 2026.
Caso 5 · local de 20,00 × 2,00 × 2,70 m. Iluminancia media: 919,6 lx aquí y 893,0 lx en el programa de referencia, una diferencia del +3,0 %. Medido el 21 de agosto de 2026.
Caso 6 · local de 40,00 × 15,00 × 10,00 m. Iluminancia media: 761,3 lx aquí y 784,0 lx en el programa de referencia, una diferencia del −2,9 %. Medido el 21 de agosto de 2026.
Caso 7 · local de 8,00 × 5,00 × 2,70 m. Iluminancia media: 635,3 lx aquí y 643,0 lx en el programa de referencia, una diferencia del −1,2 %. Medido el 21 de agosto de 2026.
Caso 8 · local de 3,00 × 3,00 × 2,50 m. Iluminancia media: 156,8 lx aquí y 164,0 lx en el programa de referencia, una diferencia del −4,4 %. Medido el 21 de agosto de 2026.
Caso 9 · local de 10,00 × 10,00 × 4,50 m. Iluminancia media: 236,2 lx aquí y 237,0 lx en el programa de referencia, una diferencia del −0,3 %. Medido el 21 de agosto de 2026.
Caso 10 · local de 15,00 × 10,00 × 3,00 m. Iluminancia media: 508,8 lx aquí y 516,0 lx en el programa de referencia, una diferencia del −1,4 %. Medido el 21 de agosto de 2026.
La diferencia es la cifra de aquí menos la del otro programa, dividida por la del otro programa. Con signo más, aquí sale más luz que allí.
Están medidas las 10 comparaciones de la hoja. Cada una habla de su local, con su luminaria y con sus supuestos; fuera de esos 10 locales no hay ninguna medida.
La comparación se hizo contra un software de cálculo luminotécnico de referencia en Europa. Su nombre y su versión constan en la documentación técnica de este cálculo, disponible a petición.
Los dos programas han calculado el mismo local sobre plano, vacío y rectangular. Ninguna de estas cifras dice lo que marcará un luxómetro en la obra terminada.
Fuentes de esta pantalla, todas en el repositorio: validation/anclajes.json (3 anclas con su fuente y su confianza, de las cuales 2 con URL de ficha publicada), validation/fixtures (66 ficheros fotométricos), validation/cases/casos.ts (la definición de los 10 casos), validation/comparaciones.json (la tabla de comparaciones medidas contra otro programa, 10 de 10, tecleada a mano y cotejada contra el motor al compilar) y validation/RESULTADOS.md (la hoja para reproducirlos en el otro programa, y cómo se rellena la anterior), validation/cases/analiticos.ts (las 8 referencias con solución cerrada, cada una con su fórmula, y sin poder importar ni un valor del motor: si la fórmula la calculara el propio motor, se estaría comparando consigo mismo) y validation/referencias.json (lo que se declara de ellas para publicar, hoy las 8). El cálculo lo hace src/engine al compilar esta página.