Calcula 6.0 (2026)
==================

Continuación de Psicro 5.0-15 con otro nombre: calcula resuelve sistemas
de ecuaciones por módulos (dados tantos datos como grados de libertad,
halla las demás variables con Newton y GSL). El detalle, versión por
versión, está en debian/changelog.

- Nombres: programa calcula, bibliotecas libcalcula-<módulo>.so, variables
  de entorno calcula_<opción>, configuración ~/.calcula y
  /etc/calcula.conf, paquete Debian calcula. Licencia GPL 3 o posterior
  (Psicro 4.0 y 5.0 eran AGPL).
- Sistemas: cada uno es un archivo <id>.sis (módulo y, si es del módulo
  dinámico, su .din) en /usr/share/calcula/sistemas,
  ~/.local/share/calcula/sistemas o $CALCULA_SISTEMAS; calcula -s ID,
  %ID; al comienzo de una línea, calcula --sistemas. No hay sistema por
  defecto. Del paquete: psicro, pendulo, pendulo-dinamico,
  circuito-carga, circuito-bobinas y circuito-rlc.
- Lectores con slex y Bison (6.0-38): el lenguaje (src/lexico.c y
  psi_yacc.y), la configuración y los .sis (src/claves.y) y la estructura
  del .din (src/lectura_din.y). Ya no hace falta flex.
- Dominio de las variables (l = 1 [m] > 0 en los .din, <m>_limites en los
  módulos compilados) y restricciones generales entre expresiones
  (sección restricciones de los .din): los datos y resultados que no las
  cumplen se rechazan con un mensaje que nombra la variable.
- Dominios deducidos de las ecuaciones (sqrt(x) da x >= 0, log(x) da
  x > 0) cuando el archivo no los declara; calcula -t los lista.
- Los resultados del módulo dinámico y del péndulo se pulen con un paso
  más de Newton: una corriente nula sale 0 y no 3e-9.
- Compila con gcc 14 y en C23, sin macros obsoletas de autoconf ni avisos
  de bison y flex (6.0-17).
- --limite=VAR[:PESO],...: desde un punto avanza en una dirección de los
  datos hasta el borde de lo que se puede resolver y dice el motivo.
- Sistemas grandes en el módulo dinámico (6.0-38): jacobiano disperso con
  KLU, OpenBLAS, GMRES y Newton-Krylov (CALCULA_LINEAL), las ecuaciones
  compiladas a Fortran (CALCULA_COMPILADO=1) y repartidas entre hilos
  (CALCULA_HILOS), y una carga del .din sin costos cuadráticos. Decenas de
  miles de ecuaciones; la grilla RC de 10x10 de siru, de 208 s a 7,7 s.
  Ver MODULODINAMICO.md, "Sistemas grandes".
- Solver: si un paso de Newton cae fuera del dominio de las ecuaciones lo
  acorta; si el jacobiano es singular reintenta con el método híbrido de
  Powell (resolvió, entre otros, tbh = 0, wr = 1 salvo con --hw).
- Circuitos de ejemplo del módulo dinámico, cada uno en un instante:
  dos capacitores en paralelo y su dual, dos bobinas en serie, con el
  trasvase instantáneo cuando sus tensiones o corrientes difieren, y el
  circuito de la figura 2 de Saravia (2015).
- tabla('archivo', 'X', 'Y', valor [, método]) en las expresiones del
  módulo dinámico: tablas de texto externas (también resultados de
  Simusol) interpoladas con la biblioteca tabular2 de Siru, lineal o por
  spline; sistema circuito-tabla, un termistor con la tabla del
  fabricante (6.0-18). El paquete Debian exige tabular2 desde 6.0-20.
- Tablas dentro del .din: sección tablas con "tabla NOMBRE" y la tabla
  debajo, en el formato de tabular2; tabla('NOMBRE', ...) la usa, antes
  que un archivo del mismo nombre (6.0-23, con tabular2 2.0-9).
- Modo --machine: protocolo por líneas para Simul2 (6.0-23).
- El módulo dinámico resuelve mucho más rápido (6.0-25). Medido sobre un
  circuito del corpus de Simusol de 187 ecuaciones, 200 consultas: 7,6 s
  antes, 1,0 s sin repetir la comprobación de que los datos determinan el
  sistema, y 0,39 s si el `.din` trae las marcas `# @lineal` que escriben sus
  generadores, porque entonces se resuelve sin Newton: una factorización que
  se reusa y una sustitución por consulta. La marca se verifica con los datos
  de cada consulta; una marca equivocada cuesta eficiencia, nunca un
  resultado. El detalle está en `RESOLUCION.md`.
- Un sistema sin nada que resolver es válido y no devuelve ningún dato
  (6.0-24). Hace falta para los `.din` que salen de un dato de Simul que no
  describe un circuito: llevan la carga comentada y ningún sistema. No hay
  marca que poner en el archivo, porque la ausencia de la lista de variables
  ya lo dice, y para el lector una sección ausente y una vacía son lo mismo.
  Con variables y sin ecuaciones, todas son dato y el programa devuelve lo que
  le dieron. El módulo se sale antes del solver en ese caso: sin eso el
  proceso moría, porque gsl_vector_alloc(0) trata el largo cero como error de
  programación y el manejador por omisión de GSL llama a abort().

Psicro 5.0 (2026)
=================

Bibliotecas de módulos cargadas con dlopen, módulo dinámico (ExprTk),
cuatro modelos de propiedades del aire húmedo (ASHRAE RP-1485 por defecto,
Hyland y Wexler con --hw, gas ideal con --ideal y TEOS-10 con --teos10),
escala ITS-90 y bulbo húmedo termodinámico exacto. Ver debian/changelog.

Psicro 4.0 (2008)
=================
