calcula (6.0-38) noble; urgency=medium

  * Modulo dinamico: sistemas grandes (MODULODINAMICO.md, "Sistemas
    grandes"; PENDIENTE-din-compilado.md y PENDIENTE-iterativos.md).
  * Jacobiano disperso con KLU de SuiteSparse desde 100 ecuaciones
    (CALCULA_KLU, CALCULA_KLU_MIN): por el camino lineal, por Newton y al
    pulir. La grilla RC de 10x10 de siru pasa de 110 a 1 ms por consulta.
    determina() empareja sobre el patron disperso con MC21, sin matrices de
    NE x NE.
  * OpenBLAS como BLAS de GSL si esta, con un hilo salvo
    OPENBLAS_NUM_THREADS.
  * CALCULA_LINEAL=gmres: GMRES con la factorizacion vieja de
    precondicionador. CALCULA_LINEAL=jfnk: Newton-Krylov sin jacobiano.
  * CALCULA_COMPILADO=1: las ecuaciones del .din traducidas a Fortran,
    compiladas con gfortran (en trozos, en paralelo) y cargadas con dlopen;
    se comparan con ExprTk al cargar y, si algo no anda, se sigue con
    ExprTk. CALCULA_HILOS=n reparte entre hilos el jacobiano y los residuos
    del compilado (OpenMP).
  * CALCULA_LINEAL=bloques: el sistema partido en subcircuitos con Mongoose
    de SuiteSparse, cada bloque factorizado con KLU en paralelo y GMRES para
    lo que los acopla. Mismos resultados; hoy rinde menos que KLU solo.
  * Carga del .din: un solo parser de ExprTk que junta las variables al
    compilar, y tablas hash en lugar de busquedas cuadraticas. 40000
    ecuaciones cargan en 1,5 s.
  * Modo maquina: nombres por tabla hash, hasta dos millones de variables y
    pedidos de hasta 64 MB (antes 4096 y 4 MB).
  * La grilla RC de 10x10 de siru, de punta a punta: de 208 s a 7,7 s, con
    la misma curva.
  * tabla(): la busqueda del archivo y de los nombres de columna en
    (tabla, vista) de tabular2 se hace una vez y no en cada evaluacion, que
    era el 26 % del tiempo de g04 del corpus de siru. Con siru, g04 pasa de
    44,7 a 31,2 s y la salida es identica bit a bit. Ademas verbose se pone
    en 0 al cargar: libslex lo define en 1 y libtabular2 lo espera del
    programa, asi que segun el orden de resolucion de simbolos salian las
    trazas de tabular2 por stderr.
  * Build-Depends: libsuitesparse-dev, libopenblas-dev. Recommends: gfortran.

  * Los lectores, con slex y Bison: el lenguaje (src/lexico.c con slex, era
    psi_lex.l de flex; psi_yacc.y como parser puro), la configuracion y los
    .sis (src/claves.y) y la estructura del .din (src/lectura_din.y; las
    expresiones siguen en ExprTk). Un comentario con # va hasta el fin del
    renglon aunque tenga : (antes daba syntax error); quit, exit, sale y
    chau solos en un renglon; un renglon sin = en la configuracion se avisa
    (antes la colgaba); un # entre comillas simples en un .din es parte de
    la expresion. Build-Depends: libslex-dev (>= 1.0-23), sin flex.
  * Un renglon con solo un comentario ## o ### ya no hace caer a calcula
    (psi_yacc.y: la regla linea: comen dejaba el texto como si fuera un
    dato).
 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 06 Oct 2026 17:30:00 -0300

calcula (6.0-37) noble; urgency=medium

  * Modo maquina: un numero subnormal en un dato ya no es INPUT NONFINITE.
    strtod devuelve ERANGE tanto al desbordar por arriba como por abajo, y
    por abajo el valor que da --el subnormal o el cero mas cercano-- es
    legitimo y el mejor que hay. Cortaba c11.d del corpus de siru, una
    cadena de cien celdas LC donde la senal decae geometricamente y los
    ultimos estados valen 5e-324. Por arriba sigue rechazado, porque
    HUGE_VAL no es finito.

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 06 Oct 2026 04:40:00 -0300

calcula (6.0-36) noble; urgency=medium

  * Modulo dinamico: el patron de ceros del jacobiano con que determina()
    comprueba que los datos determinen el sistema se media en un solo punto,
    la semilla, y un cero de la semilla puede no ser un cero de la funcion.
    Si el emparejamiento no completa se vuelve a medir en uno o dos puntos
    corridos y se unen; y como ahi el jacobiano de la semilla no tiene rango,
    se sigue desde el punto corrido. Un circuito con una resistencia que vale
    lo que la fuente (pru_form.d del corpus de siru, R3 = 5e6*E4) decia "los
    datos dados no determinan el sistema" y no corria, aunque el sistema se
    determina y Newton converge.

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 06 Oct 2026 04:10:00 -0300

calcula (6.0-35) noble; urgency=medium

  * Modulo dinamico: Newton contra un quiebre de las ecuaciones (una tabla
    lineal a tramos, un ABS(), un MIN()). Si ningun paso corto baja la norma
    de los residuos se da el paso entero aunque suba, hasta 8 veces por
    pedido: del otro lado del quiebre la pendiente es la buena. Antes
    quedaba clavado sin converger (g02.d del corpus de siru, el generador
    que satura).

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 05 Oct 2026 00:30:00 -0300

calcula (6.0-34) noble; urgency=medium

  * Modulo dinamico: tabla() acepta las columnas por numero, contadas desde
    0 (tabla('archivo','0','2',x,2)), ademas de por nombre. Es como las
    nombra ETABLE de SCEPTRE, que siru traduce a tabla().
  * Una funcion externa en Fortran (EXTERNAL) se enlaza con tabular2, asi
    puede usarla: el ETABLE en Fortran de tabular2 (fortran/etable.f90) no
    cargaba, "undefined symbol: interpolate_num".

 -- Diego Saravia <dsa@unsa.edu.ar>  Sun, 04 Oct 2026 23:30:00 -0300

calcula (6.0-33) noble; urgency=medium

  * Modulo dinamico: incognitas colgantes. La que nombra una sola ecuacion
    se resuelve aparte, despues del resto del sistema. Si su ecuacion no se
    puede evaluar en ese punto (una salida PREND = PENCA/PENJ que en t = 0
    es 0/0, tanque_int.d del corpus de siru) vale NaN y el resto se resuelve
    igual; antes el pedido entero fallaba. Un error de tabla() sigue siendo
    un error.
  * Protocolo maquina: un resultado NaN se devuelve (nombre=nan); un
    infinito sigue siendo SOLVER NONFINITE.

 -- Diego Saravia <dsa@unsa.edu.ar>  Sun, 04 Oct 2026 22:00:00 -0300

calcula (6.0-32) noble; urgency=medium

  * Modulo dinamico, camino lineal: si F(0) o un coeficiente no es finito
    (una ecuacion que divide por una incognita, evaluada en cero) la marca
    @lineal no se cumple y el sistema va por Newton. Antes la comparacion
    con NaN la daba por cumplida y el pedido fallaba con "problem with
    user-supplied function" (planeta1.d del corpus de siru).

 -- Diego Saravia <dsa@unsa.edu.ar>  Sun, 04 Oct 2026 20:00:00 -0300

calcula (6.0-31) noble; urgency=medium

  * Modulo dinamico: la busqueda lineal de Newton es propia. Se da el paso
    de Newton entero (newton de GSL) y, si no baja la norma de los
    residuos, la mitad, un cuarto, etc. Antes se usaba gnewton de GSL, cuya
    busqueda achica el paso con una interpolacion cuadratica: cuando el paso
    entero hacia explotar una exponencial (un diodo) lo dejaba en 1e-5 del
    de Newton en cada iteracion, y con un residuo lineal grande al lado no
    llegaba en 10000 iteraciones (a01_2.d del corpus de siru, rerun 1,
    t = 58.3: ahora 14 iteraciones).
  * CALCULA_TRAZA=N en el entorno escribe por stderr las primeras N
    iteraciones de Newton (y una de cada 1000) con el mayor residuo.

 -- Diego Saravia <dsa@unsa.edu.ar>  Sun, 04 Oct 2026 18:30:00 -0300

calcula (6.0-30) noble; urgency=medium

  * Modulo dinamico: el paso del jacobiano por diferencias es
    sqrt(eps)*max(|x|, 1), el mismo de pulir(), y no sqrt(eps)*|x|. Con una
    incognita casi nula (la corriente de un capacitor en el punto de
    operacion, 1e-20) el paso era 1e-28, la columna del jacobiano salia
    vacia y determina() rechazaba un sistema bien planteado ("incognitas
    que ninguna ecuacion libre siente"); con 1e-9 la derivada salia con
    ruido y Newton no avanzaba. Lo mostro d04.d del corpus de siru (cuatro
    transistores): no pasaba de t = 2 y ahora corre entero.

 -- Diego Saravia <dsa@unsa.edu.ar>  Sun, 04 Oct 2026 17:00:00 -0300

calcula (6.0-29) noble; urgency=medium

  * Modulo dinamico: un sistema cerrado, con tantas ecuaciones como
    variables, se acepta y se resuelve sin datos, desde las semillas del
    .din (antes: "no queda ningun dato por dar"). Mas ecuaciones que
    variables sigue siendo un error. Lo usan resultanuevo1.ds, tabla3.ds y
    tabla4.ds del corpus de siru.

 -- Diego Saravia <dsa@unsa.edu.ar>  Fri, 02 Oct 2026 00:10:00 -0300

calcula (6.0-28) noble; urgency=medium

  * calcula --machine: cada EVAL acepta al final SEMILLAS k nombre=valor
    (de donde arranca Newton; las demas, las del .din) e ITER n (el tope de
    iteraciones de ese pedido; antes, 10000 fijo). Valen solo para ese
    pedido. La linea puede tener hasta 4 MB. Simul2 los usa para la
    prediccion del paso y para fallar rapido y achicar el paso, como el
    metodo de Gear de SCEPTRE.
  * El error de tabla() da el motivo y el detalle de tabular2 2.0-10.
  * Fuera la continuacion de r156 en el solver del modulo dinamico.

 -- Diego Saravia <dsa@unsa.edu.ar>  Thu, 01 Oct 2026 08:00:00 -0300

calcula (6.0-27) noble; urgency=medium

  * Funciones externas en Fortran: la seccion externas del .din (NOMBRE N
    RUTA) declara una FUNCTION de doble precision; calcula la compila con
    gfortran a ~/.cache/calcula/externas, la carga con dlopen y la registra
    en ExprTk. Solo con CALCULA_EXTERNAS=1 en el entorno, porque es codigo
    de afuera (el editor de Puyuspa no la pone).

 -- Diego Saravia <dsa@unsa.edu.ar>  Wed, 30 Sep 2026 21:30:00 -0300

calcula (6.0-26) noble; urgency=medium

  * La comprobacion de que los datos determinan el sistema es estructural:
    sobre el patron de ceros del jacobiano en la semilla busca un
    emparejamiento completo entre ecuaciones e incognitas, y si falta avisa
    que incognitas quedan sin ecuacion y que ecuaciones sin incognita. Antes
    miraba la relacion entre valores singulares del jacobiano equilibrado,
    con umbral 1e-8, y se equivocaba con las ganancias grandes: una fuente
    controlada E = 2e5 * V (a13.d del corpus de Simusol) daba 1e-12 con una
    matriz invertible. El condicionamiento es asunto del solver.
  * El rescate de Newton con jacobiano (raiz_metodo_fdf) ya no acepta un paso
    porque sea finito: exige que baje el mayor residuo. Y cuando gnewton
    deja x en NaN --su busqueda lineal hace theta = inf si el residuo del
    paso completo es infinito, exp(38*v) de un diodo-- rehace el paso de
    Newton desde el punto anterior y lo amortigua.

 -- Diego Saravia <dsa@unsa.edu.ar>  Wed, 30 Sep 2026 21:30:00 -0300

calcula (6.0-25) noble; urgency=medium

  * El modulo dinamico resuelve mucho mas rapido, por dos caminos. Medido
    sobre un circuito del corpus de Simusol de 187 ecuaciones, 200 consultas:

      antes                                 7,6 s
      sin repetir la comprobacion de datos  1,0 s
      con las marcas @lineal del .din       0,39 s

  * Si el .din trae las marcas "# @lineal" que escriben sus generadores, el
    sistema se resuelve sin Newton: los coeficientes salen exactos de
    F(e_j) - F(0), se factoriza una vez y cada consulta es una sustitucion.
    La marca se verifica con los datos de cada consulta, porque r12*ir12 es
    lineal si r12 es dato y no lo es si se pide calcular la resistencia; si no
    se cumple, se avisa y se resuelve como no lineal. Una marca equivocada
    cuesta eficiencia, nunca un resultado.
  * La comprobacion de que los datos determinan el sistema corre cuando cambia
    la eleccion de datos y no en cada consulta. Lo que diagnostica es si esas
    variables alcanzan para fijar las demas, y eso no cambia en una
    integracion: cambian los valores, no cuales son. Su descomposicion en
    valores singulares se llevaba el 73 % del tiempo, medido con callgrind.
  * Cuando no hay marcas, el jacobiano se arma columna por columna evaluando
    solo las ecuaciones que nombran esa variable, y se le entrega al solver en
    lugar de dejar que GSL lo estime evaluando todo.
  * sistemas/circuito-rlc.din lleva las marcas; los otros cuatro del paquete
    tienen no linealidades de verdad y no las llevan.
  * El detalle de todo esto, con las mediciones, esta en RESOLUCION.md.

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 28 Sep 2026 16:30:00 -0300

calcula (6.0-24) noble; urgency=medium

  * Un sistema sin nada que resolver es valido y no devuelve ningun dato.
    Antes el modulo dinamico se negaba a cargarlo con "no hay variables" o
    "no hay ecuaciones". Hace falta para los .din que salen de un dato de
    Simul que no describe un circuito: llevan la carga comentada y ningun
    sistema. No hay ninguna marca nueva que poner en el archivo: la ausencia
    de la lista de variables ya lo dice, y para el lector una seccion ausente
    y una vacia son lo mismo.
  * Con variables y sin ecuaciones, todas son dato y el programa devuelve lo
    que le dieron; sin ninguna de las dos, no devuelve nada.
  * modulodinamico_punto se sale antes del solver cuando no hay ecuaciones.
    Sin eso el proceso moria: gsl_vector_alloc(0) trata el largo cero como
    error de programacion y su manejador por omision llama a abort(), asi que
    aceptar el sistema y no tocar esto daba un volcado de core en el primer
    EVAL.
  * La comprobacion de "tantas o mas ecuaciones que variables" queda, pero
    solo si hay variables: con cero de cada una, 0 >= 0 la disparaba.
  * machine.c admite nv == 0 y reserva sus arreglos con al menos un elemento.
  * Verificado que no cambia lo que andaba: psicro interactivo, circuito-rlc
    por --machine, y las pruebas de Simul2 que manejan a calcula por el
    protocolo (protocolo.t 17/17, integracion.t 16/16, desde_dat.t 32/32).

 -- Diego Saravia <dsa@unsa.edu.ar>  Mon, 28 Sep 2026 00:30:00 -0300

calcula (6.0-23) noble; urgency=medium

  * Tablas dentro del .din: una seccion tablas con "tabla NOMBRE" y debajo
    la tabla en el formato de siempre de tabular2 (#X Y y los datos), y
    tabla('NOMBRE', 'X', 'Y', valor) la usa. Un sistema queda en un solo
    archivo, sin tablas sueltas al lado. En esa seccion el # no es
    comentario sino el encabezado de la tabla; ## sigue siendo comentario.
  * La tabla interna tiene prioridad sobre un archivo del mismo nombre. Se
    leen antes que todo, asi las constantes ya pueden usarlas aunque la
    seccion este mas abajo. Cada tabla se registra en tabular2 con un
    nombre unico por carga: dos .din con la misma tabla, o uno recargado,
    no se mezclan.
  * Necesita tabular2 2.0-9, que lee una tabla desde el texto
    (create_table_from_string): configure lo mira (CON_TABULAR_TEXTO) y
    el paquete lo exige. Compilado contra un tabular2 anterior, tabla()
    sigue leyendo archivos y un .din con tablas adentro se rechaza
    diciendo por que. Sin tabular2 la seccion se acepta y no se usa.
  * Modo --machine: protocolo por lineas para Simul2 (READY 1, EVAL,
    OK/ERR), ver PROTOCOLO-MAQUINA.md.
  * La bateria prueba las tablas internas (lineal, spline, prioridad sobre
    el archivo, constantes, tabla repetida, sin datos, fuera de una tabla)
    o, con un tabular2 anterior, que se rechacen.

 -- Diego Saravia <dsa@unsa.edu.ar>  Sun, 27 Sep 2026 21:59:40 -0300

calcula (6.0-22) noble; urgency=medium

  * exprtk sale del paquete: la cabecera la instala libexprtk-dev y el
    modulo dinamico la incluye como <exprtk.hpp>. Eran 1,6 MB copiados
    adentro, y una copia por proyecto obliga a mantenerlas al dia a mano:
    asi la de siru/exprtk quedo en la de 2018 mientras calcula y tabular2
    llevaban la de 2025.
  * Es obligatoria, no optativa como tabular2: el modulo dinamico evalua
    con ella y no hay forma de compilarlo sin ella. configure corta con
    "Falta exprtk: instale libexprtk-dev", y Build-Depends la pide.
  * La bateria tambien la toma de pkg-config, porque compila el modulo a
    mano.

 -- Diego Saravia <dsa@unsa.edu.ar>  Sat, 26 Sep 2026 21:00:00 -0300

calcula (6.0-21) noble; urgency=medium

  * calcula.pc escrito de verdad y, ahora si, instalado. Era la plantilla
    de ejemplo del codec Theora sin adaptar --"Description: Theora video
    codec", Requires ogg, Libs -ltheora-- y por eso debian/not-installed
    lo descartaba en vez de instalarlo.
  * No tiene Libs ni Cflags, a proposito: calcula es un programa, no
    instala encabezados, y las bibliotecas que instala son modulos que el
    propio programa carga con dlopen. Lo que ofrece son las dos rutas que
    necesita saber quien quiera agregarle algo: moduledir y sistemasdir.
    Asi, quien escriba un sistema nuevo hace
    pkg-config --variable=sistemasdir calcula en lugar de adivinar el
    prefijo.

 -- Diego Saravia <dsa@unsa.edu.ar>  Sat, 26 Sep 2026 19:00:00 -0300

calcula (6.0-20) noble; urgency=medium

  * El paquete exige tabular2: Build-Depends libtabular2-dev (>= 2.0-3),
    Depends libtabular2-0 (>= 2.0-3) y configure --with-tabular2, opcion
    nueva que corta si falta (sin opcion se sigue usando si esta, y
    --without-tabular2 la deja afuera). La 6.0-19 construida en una maquina
    sin tabular2 salia sin tabla() y con el sistema circuito-tabla roto.
  * tabular2 2.0-3 extrapola fuera de la tabla con la recta de los dos
    puntos del extremo, a los dos lados (la lineal devolvia, a la derecha,
    el ultimo valor). MODULODINAMICO.md, el manual y circuito-tabla.din lo
    dicen asi; el dominio de t en circuito-tabla sigue siendo el de la
    tabla (la recta daria -437 ohm a 150 C).
  * La bateria informa si probo tabla() o si tabular2 no estaba.

 -- Diego Saravia <dsa@unsa.edu.ar>  Sat, 26 Sep 2026 18:30:00 -0300

calcula (6.0-19) noble; urgency=medium

  * tabla() lee tal cual los archivos de resultados de Simusol (.simul y
    .INTER) y los archivos de datos de gnuplot: es tabular2 r1373 la que
    los entiende, pero cambia lo que se puede escribir en un .din. Un
    sistema de Calcula puede tomar como dato una curva calculada antes
    por Simusol.
  * El archivo de datos admite comentarios en cualquier parte (tabular2
    r1372). circuito-tabla-ntc.txt vuelve a llevar los suyos arriba.
  * MODULODINAMICO.md y el manual documentan el formato del archivo de
    datos entero: separadores, comentarios y como se distingue el
    encabezado, nombres opcionales, la columna de entrada que no puede
    decrecer, que fuera de la tabla no se extrapola, y que formatos
    entran sin convertir.

 -- Diego Saravia <dsa@unsa.edu.ar>  Sat, 26 Sep 2026 13:30:00 -0300

calcula (6.0-18) noble; urgency=medium

  * Tablas externas en las expresiones del módulo dinámico:
    tabla('archivo.txt', 'X', 'Y', valor [, método]) busca en un archivo
    de texto la columna con encabezado X, entra con valor y devuelve la
    columna Y, interpolada lineal (método 1, el de por defecto) o por
    spline (método 2). La hace tabular2, la biblioteca de tablas de
    Siru/Simusol, registrada como función de ExprTk en
    modulodinamico_ele.cpp. Una ruta relativa se busca junto al .din.
    Es una función como cualquier otra y va adentro de una ecuación, así
    que el solver la atraviesa en los dos sentidos: se puede entrar por
    la columna X y preguntar la Y, o dar la Y y que Newton busque la X.
    Un archivo que no está, una columna que no existe o un método que no
    es 1 ni 2 devuelven NaN y avisan una vez por stderr; no terminan el
    proceso.
  * tabular2 es opcional: configure la busca con pkg-config y, si no
    está, Calcula compila igual y tabla() no existe. Tampoco entra en
    Build-Depends por eso; para tenerla hay que instalar tabular2 (y
    mem_util) antes de configurar.
  * Sistema nuevo circuito-tabla: una batería de fuerza electromotriz v y
    resistencia interna ri alimenta un termistor NTC cuya resistencia sale
    de la tabla del fabricante (sistemas/circuito-tabla-ntc.txt, 10 kΩ a
    25 °C, B = 3435 K, de 0 a 100 °C). 10 variables, 7 ecuaciones, 3
    datos. El dominio de t es el de la tabla. Con v=12,ri=0.5,t=25 da
    r = 10000 Ω e i = 1,19994 mA; dando i = 0,00721631 A despeja
    t = 80 °C, que es una búsqueda inversa en la tabla hecha por el mismo
    Newton. En t = 45 °C la spline da 4846,2 Ω contra los 4846,87 de la
    fórmula exacta del termistor, y la recta 4930.
  * La batería de pruebas detecta tabular2 con pkg-config: si está,
    compila el módulo con ella y corre los casos de circuito-tabla (punto
    tabulado, entre puntos, spline, búsqueda inversa, dominio y archivo
    inexistente); si no, los saltea.
  * Una prueba de la batería se colgaba: calcula -t imprime el informe y
    sigue al prompt interactivo, y el caso del dominio deducido lo
    llamaba sin cerrar la entrada.

 -- Diego Saravia <dsa@unsa.edu.ar>  Sat, 26 Sep 2026 11:30:00 -0300

calcula (6.0-17) noble; urgency=medium

  * Compila con gcc 14 y en C23: tipos de retorno, prototipos y punteros
    en calcula.c, calcula_gsl.c, la gramática, el lexer y los módulos
    psicro y pendulo (61 errores con las reglas de gcc 14, ninguno ahora).
    struct datum tenía var y quees como punteros a int pero guardaba
    enteros; ahora son int, y la estructura está una sola vez, en
    common_ele.h (psicro_plus.c tenía una copia). Las funciones int que
    terminaban sin return devuelven 0 (o su estado); el prototipo de
    pendulo_prop_t tenía el nombre equivocado.
  * Formatos de printf y fscanf: %m en lugar de la vieja extensión %a de
    GNU al leer ~/.calcula y /etc/calcula.conf; VERSION sale de configure.
  * configure.ac sin macros obsoletas: LT_INIT, AC_USE_SYSTEM_EXTENSIONS,
    AC_PROG_LEX([noyywrap]) y la comprobación directa de GSL en lugar de
    AM_PATH_GSL; autoreconf -Wall no da avisos.
  * bison y flex sin avisos: %empty, %expect 24 (los conflictos conocidos;
    uno nuevo avisa) y la regla <DEFPAR>[^n] de psi_lex.l, errata de \n
    que tapaba la de ':' y contaba una línea de más. psi_yacc.h ya no se
    versiona: lo genera make (AM_YFLAGS = -d, BUILT_SOURCES).
  * Sin avisos del compilador al armar el paquete: asprintf se verifica
    (ASPRINTF en psiyac.h: si no hay memoria corta con un mensaje en lugar
    de usar un puntero indefinido), las definiciones de variables ya no
    llevan extern, y el motivo de --limite tiene lugar para el mensaje y
    su detalle (antes se podía cortar).

 -- Diego Saravia <dsa@unsa.edu.ar>  Fri, 25 Sep 2026 20:30:00 -0300

calcula (6.0-16) noble; urgency=medium

  * Resultados sin el ruido de la tolerancia: tras converger, el módulo
    dinámico y el péndulo pulen la solución con uno o dos pasos de Newton
    (pulir() en calcula_gsl.c, con un jacobiano cuyo incremento no se anula
    para una variable casi nula, como hacía el de GSL), y el módulo dinámico
    imprime 0 un resultado menor que 1e-14 veces el mayor dato. En el
    circuito-rlc, las corrientes nulas salen 0 en lugar de 2.98e-09.
  * Dominio deducido de las ecuaciones en los .din: sqrt(x) da x >= 0 y
    log, log10, log2 dan x > 0 (log1p, x > -1) cuando el argumento es una
    variable sola por o entre números o constantes positivos; los datos y
    resultados fuera de él se rechazan como con un dominio declarado.
    calcula -t lista los dominios, declarados y deducidos.
  * pendulo_plus.c incluye calcula_gsl.h (llamaba a raiz sin prototipo).

 -- Diego Saravia <dsa@unsa.edu.ar>  Fri, 25 Sep 2026 20:00:00 -0300

calcula (6.0-15) noble; urgency=medium

  * NEWS y ChangeLog al día con la serie 6.0 (hasta ahora terminaban en
    Psicro 4.0); el paquete instala NEWS en /usr/share/doc/calcula. README:
    el manual del repositorio describe la 6.0.
  * calcula-6.0 pasa a estar bajo Subversion, como svn copy de psicro-5.0.

 -- Diego Saravia <dsa@unsa.edu.ar>  Fri, 25 Sep 2026 23:00:00 -0300

calcula (6.0-14) noble; urgency=medium

  * Sistema nuevo circuito-rlc: el circuito de la figura 2 de Saravia
    (2015), «Simusol: ecuaciones implícitas con interpretación dinámica,
    cortes inductivos y lazos capacitivos» (fuente e1, resistencias r12 y
    r3, bobinas l2 y l23, capacitor c3). Calcula resuelve un instante: con
    los parámetros y el estado (il2, il23, vc3) da las ramas y las
    derivadas del estado. 18 variables, 9 ecuaciones, 9 datos.

 -- Diego Saravia <dsa@unsa.edu.ar>  Fri, 25 Sep 2026 22:00:00 -0300

calcula (6.0-13) noble; urgency=medium

  * circuito-carga y circuito-bobinas, duales variable por variable (pedido
    del autor): los datos son las tensiones v1, v2 de los capacitores (o
    sus cargas) y las corrientes i1, i2 de las bobinas (o sus flujos); el
    trasvase da deltav1, deltav2 y deltaq1, deltaq2 en uno y deltai1,
    deltai2 y deltafi1, deltafi2 en el otro, con deltaq1 + deltaq2 = 0 y
    deltafi1 + deltafi2 = 0. Las corrientes de los capacitores son ic1,
    ic2 (duales de vl1, vl2, que pasan a ser las tensiones que entregan
    las bobinas); vr y dvr/dt en las bobinas, duales de v y dv/dt. 19
    variables, 14 ecuaciones, 5 datos cada uno.

 -- Diego Saravia <dsa@unsa.edu.ar>  Fri, 25 Sep 2026 21:00:00 -0300

calcula (6.0-12) noble; urgency=medium

  * Circuitos simplificados (pedido del autor): sin batería y con una sola
    resistencia. circuito-carga: dos capacitores en paralelo que se
    descargan por r; los datos son sus cargas q1 y q2 y, si dan tensiones
    distintas, deltaq1 y deltaq2 son los cambios instantáneos de carga
    que las igualan (deltaq1 + deltaq2 = 0; ep, la energía disipada).
    circuito-bobinas: el dual, dos bobinas en serie; los datos son sus
    corrientes i1 e i2, y deltai1, deltai2 los cambios que las igualan
    conservando el flujo. 15 variables, 10 ecuaciones, 5 datos cada uno.
  * Se quita circuito-conexion (dos capacitores y una llave): su trasvase
    ya está en circuito-carga, y una llave supone un antes y un después
    que un sistema de un instante no maneja.
  * La batería prueba restricciones, --limite y el cambio de sistema con
    un sistema de prueba propio con restricción (ninguno del paquete la
    tiene ahora).

 -- Diego Saravia <dsa@unsa.edu.ar>  Fri, 25 Sep 2026 19:00:00 -0300

calcula (6.0-11) noble; urgency=medium

  * circuito-carga: si las cargas previas de los capacitores (q1i, q2i)
    dan tensiones distintas, un trasvase instantáneo entre ellos (no en la
    batería, que tiene resistencias en serie) iguala la tensión: se
    conserva la carga, delta es la que pasa de c1 a c2 y ep la energía
    disipada. Variables nuevas dvdt y didt: i1 = c1 dv/dt, i2 = c2 dv/dt
    y (r + rc) di/dt + dv/dt = 0. 20 variables, 13 ecuaciones, 7 datos
    (con delta = 0, el caso sin trasvase de antes).
  * Sistema nuevo circuito-bobinas: dos bobinas en serie con una batería,
    el dual de circuito-carga: di/dt, tensión (vl = l di/dt) y flujo
    magnético (fi = l i) de cada bobina, potencias; si las corrientes
    previas son distintas, al ponerlas en serie la corriente se iguala
    conservando el flujo total (delta, el flujo que pasa de l1 a l2; ep,
    la energía disipada). 18 variables, 11 ecuaciones, 7 datos.
  * Solver: si Newton (dnewton) encuentra un jacobiano singular en el
    camino, se reintenta desde la misma semilla con el método híbrido de
    Powell. Resuelve la carga en v = e con rc = 4 y, en RP-1485, ideal y
    TEOS-10, los casos tbh = 0, wr = 1 que antes no convergían (con Hyland
    y Wexler siguen sin converger).

 -- Diego Saravia <dsa@unsa.edu.ar>  Fri, 25 Sep 2026 17:00:00 -0300

calcula (6.0-10) noble; urgency=medium

  * circuito-carga.din y circuito-conexion.din: c1 y c2 con su comentario
    (Puyuspa muestra los comentarios como descripción de cada variable).

 -- Diego Saravia <dsa@unsa.edu.ar>  Fri, 25 Sep 2026 14:00:00 -0300

calcula (6.0-9) noble; urgency=medium

  * El sistema circuito eran dos problemas independientes en un mismo
    archivo (compartían solo c1 y c2); ahora son dos sistemas:
    circuito-carga (Kirchhoff, 6 datos, restricción v <= e) y
    circuito-conexion (conexión de dos capacitores cargados, 4 datos).
  * La batería se aísla de los sistemas instalados (SISTEMASDIR vacío y
    HOME temporal) y recarga en una corrida un .din con restricciones.

 -- Diego Saravia <dsa@unsa.edu.ar>  Fri, 25 Sep 2026 13:00:00 -0300

calcula (6.0-8) noble; urgency=medium

  * Restricciones en los .din: una sección "restricciones" con
    desigualdades entre expresiones (<, <=, >, >=, ==, !=, con las
    funciones y constantes del archivo), el borde físico en general. Las
    que usan solo datos se comprueban antes de resolver y todas sobre la
    solución ("Restriccion no cumplida: v <= e (izquierda 13, derecha
    12)"). El circuito declara v <= e.
  * --limite=VAR[:PESO],...: desde el punto de cada línea avanza en esa
    dirección de los datos (pasos que se duplican y bisección, cada
    intento desde la solución anterior y, si no anda, desde las semillas)
    hasta el borde de lo que se puede resolver, y dice el valor límite y
    el motivo (restricción, dominio, sin solución: posible límite del
    método numérico) o que no hay límite.
  * Arreglo: al recargar un .din en la misma corrida, las expresiones se
    destruían después de su tabla de símbolos (con restricciones, calcula
    se caía).

 -- Diego Saravia <dsa@unsa.edu.ar>  Fri, 25 Sep 2026 12:00:00 -0300

calcula (6.0-7) noble; urgency=medium

  * Dominio de las variables: un módulo puede declarar límites
    (<modulo>_limites) y en los .din una variable puede llevarlos después
    de la unidad ("l = 1 [m] > 0", hasta dos condiciones > >= < <=).
    Calcula rechaza un dato fuera del dominio antes de resolver y una raíz
    que lo viola después, con un mensaje que nombra la variable. El
    péndulo con l = 0 daba t = -7e-9 s sin aviso; ahora dice "Dato fuera
    del dominio: l = 0; debe ser > 0". Péndulo (compilado y .din): l, t > 0;
    circuito: c1, c2 > 0 y r, rc >= 0.

 -- Diego Saravia <dsa@unsa.edu.ar>  Fri, 25 Sep 2026 02:00:00 -0300

calcula (6.0-6) noble; urgency=medium

  * Solver: si un paso de Newton cae fuera del dominio de las ecuaciones
    (raíz de un negativo, logaritmo de cero), en lugar de abandonar prueba
    desde el punto anterior con la mitad del paso, un cuarto, etc., y sigue
    iterando. Arregla el péndulo (compilado y dinámico) con un período de
    1 s o menos, que fallaba con "problem with user-supplied function"
    aunque la solución existe (t = 1 s da l = 0,2484 m). La batería agrega
    esos casos; sus 1747 puntos por modelo no cambian.

 -- Diego Saravia <dsa@unsa.edu.ar>  Fri, 25 Sep 2026 01:00:00 -0300

calcula (6.0-5) noble; urgency=medium

  * Nombres de sistema simples: solo minúsculas, cifras y guiones, porque
    el mismo nombre va en %ID;, en el archivo y en la dirección de la
    página del sistema en Puyuspa (/puyuspa/ID.html). Un .sis con otro
    nombre se ignora con un aviso.

 -- Diego Saravia <dsa@unsa.edu.ar>  Thu, 24 Sep 2026 14:00:00 -0300

calcula (6.0-4) noble; urgency=medium

  * Si un sistema está en más de un directorio (por ejemplo uno propio en
    ~/.local/share/calcula/sistemas con el nombre de uno instalado), se
    sigue usando el primero, pero calcula avisa por la salida de error
    cuál usa y cuál queda tapado, una vez por sistema y por corrida.

 -- Diego Saravia <dsa@unsa.edu.ar>  Thu, 24 Sep 2026 13:00:00 -0300

calcula (6.0-3) noble; urgency=medium

  * Registro de sistemas: cada sistema es un archivo <id>.sis (módulo,
    archivo .din, datos de ejemplo, título) en /usr/share/calcula/sistemas,
    ~/.local/share/calcula/sistemas o $CALCULA_SISTEMAS. La terminal nombra
    el sistema (-s ID, %ID; al comienzo de la línea) y calcula deduce el
    módulo y el archivo; calcula --sistemas los lista. Los .din pasan de
    /usr/share/calcula/ejemplos a /usr/share/calcula/sistemas. Sistemas:
    psicro, pendulo, circuito y pendulo-dinamico.
  * No hay sistema por defecto: sin él calcula avisa, lista los sistemas y
    muestra la ayuda (estado 2).
  * El módulo dinámico recarga su archivo si cambia el sistema en la
    misma corrida.
  * Licencia: desde Calcula 6.0 el programa se distribuye bajo la GPL 3 o
    posterior (hasta la 5.0, psicro era AGPL). Puyuspa sigue bajo la AGPL.

 -- Diego Saravia <dsa@unsa.edu.ar>  Thu, 24 Sep 2026 12:00:00 -0300

calcula (6.0-2) noble; urgency=medium

  * El comando imp del módulo pendulo imprime la línea pedida (antes no
    imprimía nada), y pendulo y modulodinamico la imprimen con diez cifras
    significativas en lugar de cinco decimales fijos: Puyuspa 6.0-2 arma
    sus gráficos con esas líneas. El módulo psicro no cambia.

 -- Diego Saravia <dsa@unsa.edu.ar>  Wed, 23 Sep 2026 22:00:00 -0300

calcula (6.0-1) noble; urgency=medium

  * Calcula 6.0, continuación de Psicro 5.0-15 con otro nombre: el
    programa es /usr/bin/calcula, los módulos son libcalcula-psicro,
    libcalcula-pendulo y libcalcula-modulodinamico (dlopen de
    libcalcula-<modulo>.so), las variables de entorno calcula_<opción>,
    la configuración ~/.calcula y /etc/calcula.conf, los ejemplos en
    /usr/share/calcula/ejemplos. Psicro es el módulo del aire húmedo, con
    el mismo lenguaje de entrada y los mismos resultados.
  * El módulo pendulo imprime en HTML la misma tabla que el módulo
    dinámico (antes con html no imprimía nada).

 -- Diego Saravia <dsa@unsa.edu.ar>  Wed, 23 Sep 2026 21:00:00 -0300

psicro (5.0-15) noble; urgency=medium

  * Última versión de Psicro como programa: el desarrollo sigue como
    Calcula 6.0, del que Psicro pasa a ser el módulo del aire húmedo.
    Documentación, --help y página de manual con la nota.
  * El paquete lleva ahora README, MODULODINAMICO.md (el módulo dinámico:
    uso, formato del archivo, ejemplos, funcionamiento) y el README de la
    batería en /usr/share/doc/psicro.

 -- Diego Saravia <dsa@unsa.edu.ar>  Wed, 23 Sep 2026 20:30:00 -0300

psicro (5.0-14) noble; urgency=medium

  * Módulo dinámico (modulodinamico): variables y ecuaciones leídas de un
    archivo de texto (--dinamico=ARCHIVO) y evaluadas con ExprTk (MIT), con
    la misma mecánica de Calcula que los módulos compilados; ejemplos
    circuito.din y pendulo.din en /usr/share/psicro/ejemplos.
  * Retirado el módulo circuito, que nunca funcionó; su circuito es ahora
    un ejemplo del módulo dinámico.

 -- Diego Saravia <dsa@unsa.edu.ar>  Wed, 23 Sep 2026 20:00:00 -0300

psicro (5.0-13) noble; urgency=medium

  * Módulos péndulo y circuito: la verificación recibía el puntero al
    contador de iteraciones en vez del valor y el péndulo decía siempre
    "El sistema no converge" con el resultado correcto.

 -- Diego Saravia <dsa@unsa.edu.ar>  Wed, 23 Sep 2026 19:00:00 -0300

psicro (5.0-12) noble; urgency=medium

  * Cuarto modelo de propiedades: --teos10 / -T (psicro_teos10=1), TEOS-10
    con la biblioteca SIA (Fortran, incluida en src/sia): Helmholtz
    completas de IAPWS-95, IAPWS-06 y Lemmon 2000, saturación por igualdad
    de potenciales químicos. Con --sal=S (g/kg) el aire se satura sobre
    agua de mar (IAPWS-08). Requiere gfortran para construir y libgfortran5
    para correr.

 -- Diego Saravia <dsa@unsa.edu.ar>  Wed, 23 Sep 2026 01:40:00 -0300

psicro (5.0-11) noble; urgency=medium

  * Tercer modelo de propiedades: --ideal / -i (psicro_ideal=1), el gas
    ideal del ASHRAE Handbook (fs = 1, v = RT/p, h = 1,006 t + W (2501 +
    1,86 t), bulbo húmedo de gas ideal, presión de vapor IAPWS).

 -- Diego Saravia <dsa@unsa.edu.ar>  Wed, 23 Sep 2026 01:00:00 -0300

psicro (5.0-10) noble; urgency=medium

  * Modelo histórico (--hw): restituido el término virial de la entalpía,
    que un dif=0 de depuración anulaba; el aire seco a 0 °C da 0 en vez
    de 0,28 kJ/kg y la entalpía coincide con las tablas ASHRAE 1985.

 -- Diego Saravia <dsa@unsa.edu.ar>  Wed, 23 Sep 2026 00:40:00 -0300

psicro (5.0-9) noble; urgency=medium

  * Modelo de propiedades ASHRAE RP-1485 (Herrmann, Kretzschmar y Gatley
    2009) por defecto: viriales actuales, factor de corrección completo,
    volumen de gas real, h y s con referencia ASHRAE exacta (h = s = 0 para
    el aire seco a 0 °C). Escala interna ITS-90; constantes CODATA.
  * Opción --hw / -H (psicro_hw=1): el modelo histórico de Hyland y Wexler
    1983 y Brochure 1977, como hasta la 5.0-8.
  * Búsqueda del bulbo húmedo acotada a [-100, t].

 -- Diego Saravia <dsa@unsa.edu.ar>  Wed, 23 Sep 2026 00:10:00 -0300

psicro (5.0-8) noble; urgency=medium

  * Factor de corrección fs de la presión de vapor en la mezcla (ecuación
    de equilibrio agua-aire del Brochure 1977) reincorporado: xs = fs pws/p.
    Faltaba desde la 4.0 (0,4 a 0,5 % en W). Opción --fs1 para fs = 1.

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 22 Sep 2026 23:27:46 -0300

psicro (5.0-7) noble; urgency=medium

  * Presión de vapor IAPWS por defecto (Wagner y Pruß 1993 sobre agua,
    sublimación IAPWS 2011 sobre hielo, ITS-90). Con --pvhw, Hyland y
    Wexler 1983 sin el factor 0,999076 que bajaba la curva un 0,092 %.
  * Corrige el orden de la tabla de opciones: psicro_ipts68 en el entorno
    activaba las trazas de depuración.

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 22 Sep 2026 23:19:26 -0300

psicro (5.0-6) noble; urgency=medium

  * Las temperaturas entran y salen en ITS-90; las correlaciones (IPTS-68)
    se aplican tras convertir (Rusby 1991). Opción --ipts68 para no
    convertir.

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 22 Sep 2026 23:03:19 -0300

psicro (5.0-5) noble; urgency=medium

  * Bulbo húmedo con la ecuación termodinámica exacta (entalpías del
    modelo) en vez de la aproximada del Handbook 1985 con cp=1,000;
    diferencia de 0,001 a 0,03 C. Batería de regresión adaptada.

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 22 Sep 2026 22:54:27 -0300

psicro (5.0-4) noble; urgency=medium

  * Copyright y páginas de manual a nombre de Diego Saravia Alía.

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 22 Sep 2026 19:38:26 -0300

psicro (5.0-3) noble; urgency=medium

  * Se retira todo lo relativo a Emacs Muse (publicamuse, muse-init.el,
    iniciatexi, macros de configure): la documentación ya no se genera con
    Muse.

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 22 Sep 2026 19:34:13 -0300

psicro (5.0-2) noble; urgency=medium

  * El módulo circuito no cargaba: libcircuito.so tenía el símbolo delta sin
    definir (declarado extern y nunca definido).

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 22 Sep 2026 17:09:53 -0300

psicro (5.0-1) noble; urgency=medium

  * Psicro 5.0: bibliotecas de módulos (psicro, pendulo, circuito) cargadas
    con dlopen, nuevo lenguaje de entrada con ';', opción --debug, bases
    Bm/Bn/Bv operativas, corrección del solver de humedad portada de 4.0.
  * Reemplaza a psicro 4.0-1 (mismo /usr/bin/psicro). No incluye unidad.

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 22 Sep 2026 13:25:07 -0300

psicro (4.0-1) noble; urgency=medium

  * Primer empaquetado Debian/Ubuntu.
  * Incluye la corrección del solver de humedad (r6 del repositorio SVN):
    tbh=20,wr=.6,alt=0 converge; un cálculo fallido termina con error.

 -- Diego Saravia <dsa@unsa.edu.ar>  Tue, 22 Sep 2026 12:24:16 -0300
