# calcula.summa: TODO lo necesario para generar los paquetes de calcula
# (deb, rpm, tgz y tar.gz). Se cambia aca; debian/ se genera de esto con
# summa.py debian (hacer-deb lo hace solo). debian/changelog no: es la
# historia, y la version de arriba tiene que ser BASEVERSION.
# Escrito por 'summa.py crear' desde debian/ el 07/10/2026.

# ---- el paquete
VERSION="2026.6.0.r313-1"
# adonde lo sube "sp subir" (usuario@servidor:/camino). En svn va el real: el
# grupo de desarrollo es de confianza; lo que no tiene es la clave ssh del
# servidor, sin la cual no se sube. En lo publicado (tar.gz, .summa con
# version) hacer-pkg deja la plantilla "usuario@servidor:/camino".
SUBIR_A="usuario@servidor:/camino"
BASEVERSION="2026.6.0.r313"
SUMMARY="resuelve sistemas de ecuaciones por módulos; psicro (aire húmedo)"
DESCRIPTION=$(cat << 'FIN_SUMMA'
Calcula halla las variables de un sistema de ecuaciones a partir de tantos
datos como grados de libertad tenga, con Newton (GSL). Su módulo psicro es
la calculadora psicrométrica que hasta la versión 5.0 fue el programa
psicro: calcula las propiedades del aire húmedo a partir de tres datos
(por ejemplo temperatura, humedad relativa y altitud): temperaturas de
rocío y de bulbo húmedo, humedad absoluta, entalpía, entropía, volumen
específico y presión de vapor, para el punto dado y sus estados de rocío,
bulbo húmedo y saturación. Resuelve el sistema de ecuaciones con GSL.

El programa carga en tiempo de ejecución la biblioteca del módulo pedido
(psicro, pendulo o modulodinamico, que toma variables y ecuaciones de un
archivo de texto), incluidas en este paquete. El lenguaje de entrada
separa módulo, comandos y datos con punto y coma:
[%modulo;] [comandos;] tipo=valor,...
FIN_SUMMA
)
MAINTAINER="Diego Saravia <dsa@unsa.edu.ar>"
HOMEPAGE="http://www.psicro.org/"
SECTION="science"
PRIORITY="optional"
STANDARDS="4.6.2"
LICENSE="GPL-3+"
DEPENDS="\${shlibs:Depends}, \${misc:Depends}, libtabular2-0 (>= 2.0-9)"
SOURCE_EXTRA="Rules-Requires-Root: no"

# ---- como se compila
BUILDDEPENDS="debhelper-compat (= 13), libgsl-dev, libreadline-dev, libncurses-dev, bison, gfortran, g++, libtabular2-dev (>= 2.0-9), libexprtk-dev, libsuitesparse-dev, libopenblas-dev, libslex-dev (>= 1.0-23), libunidades-dev, pkg-config"
FUENTES_PREPARAR='for fuente in src/claves.y src/lectura_din.y; do base=${fuente##*/}; nombre=${base%.y}; (cd src && bison -Wall -o "$nombre.tab.c" "$base"); done'
DH=""
CONFIGURE="--with-tabular2 --with-klu --with-openblas"
RULES=$(cat << 'FIN_SUMMA'
# tabular2 obligatoria: sin ella tabla() no existe y circuito-tabla no anda.

# Se instala en debian/tmp para que debian/calcula.install elija que va al
# paquete (binario y bibliotecas .so*) y debian/not-installed descarte el
# resto (.a, .la, .pc y scripts de documentacion).
override_dh_auto_install:
	dh_auto_install --destdir=debian/tmp

# Las bibliotecas de modulos se cargan con dlopen("libcalcula-<modulo>.so"): hacen
# falta tambien los enlaces .so sin version, que van en este mismo paquete.
FIN_SUMMA
)

# ---- los paquetes que salen
PACKAGES="calcula"

# calcula
calcula_ARCH="any"
calcula_EXTRA="Recommends: gfortran"

# ---- los demas archivos de debian/, enteros
SOURCEFORMAT="3.0 (quilt)"
ARCHIVOS="README.source calcula.1 calcula.install calcula.lintian-overrides copyright docs manpages not-installed tests/control tests/solver"
EJECUTABLES="tests/solver"
ARCHIVO_README_source=$(cat << 'FIN_SUMMA'
Construcción del paquete Debian/Ubuntu de calcula 6.0
=====================================================

Requisitos: build-essential, debhelper (>= 13), dh-autoreconf, libtool,
libgsl-dev, libreadline-dev, libncurses-dev, bison, flex, gfortran (la
biblioteca SIA de TEOS-10 en src/sia es Fortran; el paquete queda con
dependencia de libgfortran5). Para las pruebas: python3.

Ademas, dos que salen del repositorio siru y no de apt: libexprtk-dev, con
la que evalua el modulo dinamico, y libtabular2-dev y libtabular2-0, para
la funcion tabla(). Las tres se arman e instalan con

    sudo ../../siru/instalar tabular2

hacer-deb las comprueba antes de empezar y dice esto mismo si faltan.

    calcula-6.0/hacer-deb

exporta calcula-6.0 a un temporal (así autoreconf no ensucia el working
copy), corre dpkg-buildpackage -us -uc -b y deja calcula_6.0-1_<arq>.deb en
calcula-6.0/, junto a sus fuentes. Instalar con
sudo apt install ./calcula_6.0-*_amd64.deb.
Es el sucesor del paquete psicro (5.0-15 fue el último); no entra en
conflicto con él porque instala /usr/bin/calcula y bibliotecas con otro
nombre, así que pueden convivir.

El paquete instala los sistemas (*.sis y *.din) en /usr/share/calcula/sistemas,
/usr/bin/calcula y las bibliotecas libcalcula-psicro,
libcalcula-pendulo, libcalcula-modulodinamico y las *-ele, con los enlaces
.so sin versión, porque el programa las carga con
dlopen("libcalcula-<modulo>.so"). Quedan fuera (debian/not-installed)
las .a, .la, calcula.pc y los scripts auxiliares detectahttpd e infosis.

Paquete fuente (3.0 quilt): tarball original con el mismo export sin
debian/:

    tar --exclude=debian -czf calcula_6.0.orig.tar.gz calcula-6.0
    cd calcula-6.0 && dpkg-buildpackage -us -uc
FIN_SUMMA
)
ARCHIVO_calcula_1=$(cat << 'FIN_SUMMA'
.TH CALCULA 1 "2026-09-24" "calcula 6.0" "Manual del usuario"
.SH NOMBRE
calcula \- resuelve sistemas de ecuaciones; el sistema psicro es la calculadora psicrométrica
.SH SINOPSIS
.B calcula
.RI [ \-s SISTEMA ]
.RI [ \-p DATOS ]
.RI [ \-m MODULO ]
.RI [ \-d [ NIVEL ]]
.RI [ archivo ...]
.SH DESCRIPCIÓN
.B calcula
resuelve un sistema de ecuaciones: dados tantos datos como grados de
libertad tiene, halla las demás variables con Newton (GSL). Cada sistema
corre en un módulo, una biblioteca libcalcula-<modulo>.so que se carga al
usarlo: psicro y pendulo son módulos compilados con un solo sistema cada
uno; modulodinamico resuelve sistemas escritos en archivos .din. El
sistema psicro es la calculadora psicrométrica que hasta la versión 5.0 se
llamaba
.BR psicro :
a partir de tres datos calcula las propiedades del aire húmedo y muestra
el punto central junto con sus estados de rocío, bulbo húmedo y saturación.
.PP
No hay sistema por defecto: se nombra con
.BR \-s ,
con
.BI % SISTEMA ;
al comienzo de la línea de datos, con sistema=SISTEMA en ~/.calcula o con
calcula_sistema en el entorno. Si falta, calcula lo avisa, lista los
sistemas y muestra la ayuda (estado de salida 2).
.B calcula \-\-sistemas
los lista.
.PP
Sin argumentos lee líneas de la entrada estándar (o de los archivos
indicados). Cada línea tiene la forma
.PP
.RS
.RI [ %sistema ;] [ comando [= valores "] " comando " ...;] " tipo1=valor1,tipo2=valor2,tipo3=valor3
.RE
.PP
El punto y coma separa el sistema, los comandos y los datos; la coma
separa los datos.
.BI % SISTEMA ;
vale para esa línea. Con el sistema psicro: unidades SI, temperatura en
grados centígrados, nombres de tipo en minúsculas: t x p v h pv xs wr alt
s td tbh gs th xbh ha sa va.
.SH OPCIONES
.TP
.BI \-p " DATOS" ", " \-\-procesa= DATOS
Procesa DATOS como si fuera una línea de entrada y termina. En el shell,
entrecomille el argumento si contiene espacios o %.
.TP
.BI \-s " SISTEMA" ", " \-\-sistema= SISTEMA
Sistema a resolver; calcula deduce su módulo y, si es del módulo dinámico,
su archivo .din.
.TP
.B \-\-sistemas
Lista los sistemas disponibles, uno por línea, con id, módulo, título,
datos de ejemplo y archivo separados por tabulador.
.TP
.B \-\-machine
Protocolo por líneas para programas. Solo admite sistemas del módulo
modulodinamico; emite READY 1 al iniciar y responde OK o ERR por cada
petición EVAL. Los valores salen con 17 cifras significativas, sin el filtro
de ceros de la salida interactiva. Clases de error: INPUT, DOMAIN, SOLVER
e INTERNAL. CAPS id consulta la capacidad optativa SENS1: SENS resuelve
el punto y devuelve sensibilidades locales de salidas respecto de datos,
con controles de escala, consistencia y singularidad. Sus fallos específicos
llevan clase SENSITIVITY. El formato completo está en PROTOCOLO-MAQUINA.md.
No se combina con -p, archivos de datos, -t, --limite ni --sistemas.
.TP
.BI \-\-limite= VAR[:PESO],...
Desde el punto de cada línea, avanza en esa dirección de los datos
(p. ej. \fB\-\-limite=v\fR, \fB\-\-limite=l:\-1\fR o
\fB\-\-limite=v:1,e:\-1\fR) hasta el borde de lo que se puede resolver:
pasos que se duplican hasta el primer fallo y bisección, partiendo cada
intento de la solución anterior. Informa el valor límite, el motivo
(restricción, dominio, sin solución) o que no hay límite, y la solución en
el borde.
.TP
.BI \-m " MODULO" ", " \-\-modulo= MODULO
Usa un módulo directamente, sin sistema registrado (con modulodinamico,
junto con --dinamico). Reemplaza al módulo del sistema.
.TP
.BR \-H ", " \-\-hw
Modelo histórico del módulo psicro (Hyland y Wexler 1983 y Brochure ASHRAE 1977,
en IPTS-68, gas ideal en el volumen) en vez de la formulación ASHRAE
RP-1485 (Herrmann, Kretzschmar y Gatley 2009), la usada por defecto desde
la 5.0-9. También con calcula_hw=1 en el entorno o hw=1 en ~/.calcula.
.TP
.BR \-i ", " \-\-ideal
Modelo de gas ideal del ASHRAE Handbook ("perfect gas relationships"):
fs = 1, v = RT/p, h = 1,006 t + W (2501 + 1,86 t) kJ/kg, bulbo húmedo de
gas ideal, presión de vapor IAPWS. También con calcula_ideal=1 en el
entorno o ideal=1 en ~/.calcula. Si se dan --hw e --ideal, vale --ideal.
.TP
.BR \-T ", " \-\-teos10
Modelo TEOS-10 (biblioteca SIA, Feistel et al. 2010): funciones de
Helmholtz completas del agua (IAPWS-95), el hielo (IAPWS-06) y el aire
(Lemmon 2000), saturación por igualdad de potenciales químicos. Coincide
con RP-1485 dentro de partes en 1e5 y agrega rango y agua de mar. También
con calcula_teos10=1 en el entorno o teos10=1 en ~/.calcula. Tiene prioridad
sobre --ideal y --hw.
.TP
.BI \-S " S" ", " \-\-sal= S
Salinidad absoluta del agua de mar en g/kg (35 en el océano) con la que se
satura el aire: humedad relativa, rocío y bulbo húmedo pasan a referirse al
equilibrio con esa agua (IAPWS-08, composición de referencia del océano,
0 a 120 g/kg). Por defecto 0, agua pura. Solo con --teos10; los otros
modelos la ignoran. También con calcula_sal=S en el entorno o sal=S en
~/.calcula (fijada ahí, queda para todas las corridas con --teos10).
.TP
.BI \-D " ARCHIVO" ", " \-\-dinamico= ARCHIVO
Archivo de variables y ecuaciones del módulo modulodinamico: secciones
constantes, funciones, variables (nombre = semilla [unidad]) y ecuaciones
(expresiones que deben anularse, o izquierda = derecha), evaluadas con
ExprTk. Cualquier subconjunto de NV-NE variables puede ser dato. Ejemplos
en /usr/share/calcula/sistemas. También con calcula_dinamico=ARCHIVO en el
entorno o dinamico=ARCHIVO en ~/.calcula.
.TP
.BR \-1 ", " \-\-fs1
Factor de corrección fs = 1 (xs = pws/p) en vez del del modelo (ecuación
3.25 de RP-1485, o la de equilibrio agua-aire del Brochure con --hw).
También con calcula_fs1=1 en el entorno o fs1=1 en ~/.calcula.
.TP
.BR \-w ", " \-\-pvhw
Presión de vapor de Hyland y Wexler 1983 (IPTS-68) en vez de la IAPWS
(Wagner y Pruss 1993 sobre agua, sublimación IAPWS 2011 sobre hielo), que
es la usada por defecto. También con calcula_pvhw=1 en el entorno o pvhw=1
en ~/.calcula.
.TP
.BR \-8 ", " \-\-ipts68
Las temperaturas de entrada y salida están en la escala IPTS-68, la de
las tablas anteriores a 1990. Por defecto se entran y salen en ITS-90
(diferencia de hasta 0,026 K en el rango de trabajo). También con calcula_ipts68=1 en el entorno o ipts68=1
en ~/.calcula.
.TP
.BR \-d [ NIVEL "], " \-\-debug [= NIVEL ]
Trazas de depuración por la salida de error; NIVEL 2 agrega la traza del
analizador. También con calcula_debug=NIVEL en el entorno o debug=NIVEL
en ~/.calcula.
.TP
.BR html ", " dp ", " imp [= tipos ]
Comandos generales: salida en HTML, derivadas parciales, o una línea por
cálculo (imp=t,x imprime solo esos tipos).
.TP
.BR Ba ", " Bm ", " Bn ", " Bv
Base en que se muestran X, H, S y V: por kg de aire seco (defecto), por kg
de mezcla, por mol de mezcla, por m3 de mezcla (V por kg de mezcla).
.TP
.BR \-? ", " \-\-help
Muestra la ayuda.
.TP
.BR \-V ", " \-\-version
Muestra la versión.
.SH EJEMPLOS
.nf
calcula --sistemas
calcula -s psicro -pt=30,wr=1,alt=0
calcula -s psicro '-pBm;t=30,wr=1,alt=0'
calcula '-p%psicro;html Ba;t=30,wr=1,alt=0'
calcula -s circuito-carga -pr=10,c1=1,c2=2,v1=4,v2=4
echo "tbh=20,wr=.6,alt=0" | calcula -s psicro
echo "%pendulo;l=1" | calcula
calcula -m modulodinamico --dinamico=mio.din -px=1
.fi
.SH SISTEMAS
Cada sistema es un archivo
.IR id .sis
(el nombre lleva solo minúsculas, cifras y guiones, porque sirve igual en
.BI % id ;
y en la dirección de su página web) con líneas clave = valor:
.BR titulo ,
.B modulo
(obligatoria),
.B archivo
(el .din, relativo al .sis),
.B datos
(un juego de datos de ejemplo) y
.BR descripcion .
Se buscan, y el primero gana, en los directorios de $CALCULA_SISTEMAS
(separados por dos puntos), en ~/.local/share/calcula/sistemas y en
/usr/share/calcula/sistemas. Si un sistema está en más de uno, calcula
usa el primero y avisa por la salida de error cuál usa y cuál queda
tapado. Para agregar un sistema propio alcanza con
poner su .sis y su .din en ~/.local/share/calcula/sistemas. El formato del
\&.din está en /usr/share/doc/calcula/MODULODINAMICO.md.
.SH ESTADO DE SALIDA
0 si todos los cálculos convergieron; 1 si algún punto no tuvo solución
válida (se informa por la salida de error y no se imprime como resultado);
2 si no se indicó el sistema o no existe.
.SH VÉASE TAMBIÉN
http://www.psicro.org/
.SH AUTOR
Diego Saravia Alía <dsa@unsa.edu.ar>. Software libre bajo la GPL 3 o
posterior (hasta la 5.0, psicro era AGPL).
FIN_SUMMA
)
# Que se instala y adonde: ORIGEN DESTINO lo copia make install (summa.py
# automake, instalar.am); una ruta sola es lo que instala la compilacion
# (Makefile.am). La lista elige tambien que va en el paquete.
ARCHIVO_calcula_install=$(cat << 'FIN_SUMMA'
usr/bin/calcula
usr/lib/*/lib*.so*
calcula.pc usr/lib/pkgconfig
sistemas usr/share/calcula
FIN_SUMMA
)
ARCHIVO_calcula_lintian_overrides=$(cat << 'FIN_SUMMA'
# Las bibliotecas son modulos privados que el programa carga con dlopen;
# no son bibliotecas publicas con paquete propio (se distribuyen juntas a
# proposito, con los enlaces .so sin version que dlopen necesita).
calcula: link-to-shared-library-in-wrong-package *
calcula: package-name-doesnt-match-sonames *
# Los modulos *ele solo contienen tablas y funciones aritmeticas, no llaman
# a libc.
calcula: library-not-linked-against-libc *
FIN_SUMMA
)
ARCHIVO_copyright=$(cat << 'FIN_SUMMA'
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: calcula
Upstream-Contact: Diego Saravia <dsa@unsa.edu.ar>
Source: http://www.psicro.org/
Comment: Hasta la versión 5.0 (paquete psicro) el programa se distribuía
 bajo la AGPL 3 o posterior; desde Calcula 6.0 el autor lo distribuye bajo
 la GPL 3 o posterior. Puyuspa, la interfaz web, sigue bajo la AGPL.

Files: *
Copyright: 1992-2026 Diego Saravia Alía <dsa@unsa.edu.ar>
License: GPL-3+

Files: src/exprtk/*
Copyright: 1999-2024 Arash Partow
License: Expat
 Free use of the C++ Mathematical Expression Toolkit Library is permitted
 under the guidelines and in accordance with the most current version of the
 MIT License (https://www.opensource.org/licenses/MIT).

Files: src/sia/*.F90
Copyright: R. Feistel, D. G. Wright y otros (TEOS-10, SIA 4.0.1)
License: public-domain
 El repositorio de la SIA (https://github.com/TEOS-10/SIA-Fortran) no trae
 archivo de licencia; TEOS-10 la distribuye como software abierto de uso
 libre y aquí se toma como de dominio público, por decisión del autor
 (ver src/sia/LEAME). src/sia/psicro_teos.F90 es de calcula (GPL-3+).

Files: src/rp1485.c src/rp1485.h
Copyright: revisión externa de ASHRAE RP-1485 (doc/rp1485 del repositorio de psicro)
License: CC0-1.0
 Dominio público; donde no se pueda, CC0 1.0 Universal
 (https://creativecommons.org/publicdomain/zero/1.0/).

Files: debian/*
Copyright: 2026 Diego Saravia <dsa@unsa.edu.ar>
License: GPL-3+

License: GPL-3+
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
 .
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 .
 On Debian systems, the complete text of the GNU General Public
 License version 3 can be found in "/usr/share/common-licenses/GPL-3".
FIN_SUMMA
)
ARCHIVO_docs=$(cat << 'FIN_SUMMA'
README
NEWS
MODULODINAMICO.md
PROTOCOLO-MAQUINA.md
tests/README.md
FIN_SUMMA
)
ARCHIVO_manpages=$(cat << 'FIN_SUMMA'
debian/calcula.1
FIN_SUMMA
)
ARCHIVO_not_installed=$(cat << 'FIN_SUMMA'
usr/lib/*/lib*.a
usr/lib/*/lib*.la
usr/bin/detectahttpd
usr/bin/infosis
FIN_SUMMA
)
ARCHIVO_tests_control=$(cat << 'FIN_SUMMA'
Tests: solver
Depends: python3, build-essential, libgsl-dev, libreadline-dev, libncurses-dev, bison, pkg-config, libslex-dev, libunidades-dev
FIN_SUMMA
)
ARCHIVO_tests_solver=$(cat << 'FIN_SUMMA'
#!/bin/sh
set -e
python3 tests/test_solver.py
FIN_SUMMA
)

# ---- compilar desde las fuentes, sin herramientas de Debian (bajar-paquetes
# --para fuentes --instalar; etapa 1, 07/10/2026). PKGCONFIG: los modulos de
# pkg-config que provee, para saber si ya esta instalado en cualquier
# distribucion. FUENTES_CONSTRUIR y FUENTES_INSTALAR: como se compila e
# instala con $PREFIX; vacios, lo de autotools (autoreconf, configure
# $CONFIGURE, make; make install).
PKGCONFIG="calcula"
FUENTES_CONSTRUIR=""
FUENTES_INSTALAR=""
