TABULAR

Tabular es una biblioteca en C, con un programa de consola, que lee tablas de datos en columnas, las interpola y las extrapola, en forma lineal o por spline (curva suavizada). La entrega publicada es tabular2 2.0-19 (octubre de 2026); la anterior, tabular 1, se distribuía como simusol_table.

La usan Simusol y SCEPTRE (función ETABLE), Siru y ExprTk (función Table()) y Calcula (función tabla()).

Puede usarla cualquiera que quiera procesar tablas, interpolarlas o convertir formatos, por ejemplo: archivos gnuplot, csv, los binarios de SCEPTRE, del primero al último, archivos de spice, y los .simul de sceptre-simusol.

Instalación

Paquetes binarios

Tabular2 publica libtabular2-0 (biblioteca), libtabular2-dev (desarrollo) y tabular (programas interpola y sceptre-tabular). Para instalarlos en Debian o Ubuntu:

curl -fsSLO https://www.simusol.org/downloads/installsumma.sh
sh installsumma.sh --para deb tabular2

El instalador obtiene SummaPack si hace falta e instala las dependencias de los paquetes elegidos. En Descargas también hay RPM y TGZ; el TGZ se administra con instalar-tgz, no con pacman. Los binarios se construyen sobre una base antigua para ampliar su compatibilidad, pero el formato del paquete no garantiza por sí solo la compatibilidad con todas las bibliotecas del sistema.

Desde fuentes (recomendado para enlazar con las bibliotecas de la máquina)

Para construir los paquetes con los encabezados y las bibliotecas de la máquina destinataria:

sh installsumma.sh --para fuentes tabular2

El instalador conserva cada proyecto si todos sus paquetes ya están instalados en la versión publicada o una posterior. Si faltan o están desactualizados, obtiene las fuentes publicadas, instala las herramientas externas de desarrollo, construye paquetes y los instala con APT, DNF o Zypper; no hace make install en /usr/local. sh installsumma.sh --para fuentes --prueba tabular2 muestra qué haría antes de instalar.

Dependencias de la entrega binaria

Estas son las dependencias directas declaradas por los DEB 2.0-19 construidos sobre Ubuntu 22.04; otros formatos pueden usar nombres distintos.

Paquete Dependencias obligatorias
libtabular2-0 libc6 >= 2.22, libmem-util0 >= 2017.2.1.R1008-2, libslex0 >= 1.0-30 y libunidades0 >= 1.0.
libtabular2-dev libtabular2-0 = 2.0-19, libmem-util-dev, libslex-dev y libunidades-dev.
tabular libc6 >= 2.34, libslex0 >= 1.0-30, libtabular2-0 >= 2.0-19, libunidades0, simusol-readline y python3.

Para construir desde fuentes se necesitan, además de las bibliotecas de desarrollo propias, compilador C, herramientas de empaquetado, Autoconf, Automake, Libtool, pkg-config, Bison, libexprtk-dev y libreadline-dev. El instalador resuelve los nombres adecuados para la distribución. No instala Simusol, Siru, Calcula ni SCEPTRE.

Qué tablas lee

Un archivo de texto con columnas de números separadas por blancos, tabuladores o comas, y un renglón de nombres arriba, con # o sin él:

# t     T      p
0       20     101325
60      25     101000

Además lee, tal como los escriben los programas que los producen:

Unidades

Si debajo del renglón de nombres hay otro cuyas palabras son todas unidades, los valores de cada columna se pasan al SI al leer la tabla (- es una columna sin unidad):

# t     T      p      n
# min   tempC  mmHg   -
0       20     760    1

queda en segundos, kelvin y pascales. Las unidades son las de GNU units, que Tabular usa como biblioteca (libunidades).

Días, horas y fechas

Las duraciones numéricas pueden llevar unidades de tiempo, como s, min, hr o day: con un renglón de unidades se convierten al SI, en segundos.

Fecha y hora completas se convierten a epoch Unix: segundos desde 1970-01-01T00:00:00Z, conservando fracciones de segundo. Si la entrada no especifica zona, se toma la de la máquina donde se ejecuta, o TZ si está definida. Si trae Z o un desplazamiento como -03:00, se respeta.

Una fecha sin hora usa medianoche. Una hora sin fecha es una duración en segundos desde medianoche, no un instante epoch. Las horas locales inexistentes por cambios estacionales se rechazan; para una hora ambigua, indicar el desplazamiento explícito. Las marcas deben ocupar una celda: usar ISO con T en tablas separadas por blancos, o fecha y hora dentro de una celda CSV.

Esto requiere libmem-util0 2017.2.1.R1008-2 o posterior, que se instala con summapack (ver Instalación); con la versión anterior, 1.0-2, las fechas pierden la hora.

Discontinuidades

Repetir un valor de la columna x, dos o tres veces, es una discontinuidad: antes vale el valor de la primera fila, despues el de la segunda, si son dos, o el de la tercera, si son tres, y en el punto el promedio o el valor de la fila del medio, si son tres. La spline se arma por tramos y conserva el salto.

Cargar desde un archivo o desde texto

Origen Cómo se carga
Archivo En la consola, leer archivo.csv; desde C, interpolate("archivo.csv", ...) carga la tabla al necesitarla. create_search_table permite cargarla explícitamente.
Cadena de texto en memoria create_table_from_string(nombre, texto, &nt) registra una tabla con el mismo formato textual que un archivo, sin escribir un archivo intermedio. Después se usa ese nombre con interpolate.
Tabla embebida en un modelo Calcula admite la sección tablas del .din; Siru entrega las TABLE del circuito a Tabular.

Por ejemplo, la cadena "# T R\n0 100\n10 50\n20 30\n" define tres filas y dos columnas. El nombre registrado identifica la tabla y su extensión selecciona el tratamiento CSV cuando corresponde. Si el nombre ya está cargado, se conserva la tabla anterior: volver a registrarlo no la reemplaza.

Usarla con Simusol y SCEPTRE

Ver el ejemplo tanqueT.dia en simusol_ejemplos/simples.

Cuando se necesita el valor de la tabla se invoca la función

ETABLE(NUM TABLA, COLUMNA X, COLUMNA Y, VALOR X, FORMA DE INTERPOLACION)

Las columnas se indican con números, empezando por 0. La forma de interpolación es 1, lineal, o 2, spline (suavizada).

NUM TABLA se indica en un cuadro adicional llamado ETABLE: cada línea tiene el número de la tabla y el nombre del archivo que la contiene, relativo al directorio donde se ejecuta Simusol.

ETABLE está escrita en Fortran y llama a tabular2: se compila con el programa que genera SCEPTRE y se enlaza con -ltabular2. Si la tabla da un error, lo informa y detiene la simulación en lugar de seguir con un valor inventado.

Usarla desde C

Guardar este programa completo como ejemplo2.c:

#include <stdio.h>
#include <stdlib.h>
#include <interpola.h>
#include <tables.h>

/* Globales requeridas por la biblioteca. */
int verbose = 0;
char *archivoenuso = "datos.txt";

int main(void)
{
    double r = 0.0;
    int e = interpolate("datos.txt", "UNO", "DOS", 550.0, 2, &r);
    if (e != 0) {
        fprintf(stderr, "%s: %s\n", tb_mensaje(e), tb_detalle());
        free_tablelist();
        return EXIT_FAILURE;
    }

    printf("DOS(550) = %.17g\n", r);
    free_tablelist();
    return EXIT_SUCCESS;
}

Guardar también este archivo como datos.txt en el directorio desde el que se ejecutará el programa:

# UNO DOS
0 0
300 30
600 60
900 90
1200 120

"datos.txt" es el archivo; "UNO" es el nombre de la columna que hace de dominio y "DOS" el de la que hace de codominio, los dos del renglón de nombres; 550. es el valor buscado en la columna UNO; 2 pide spline (1, lineal); el resultado queda en r. Devuelve 0 si pudo; si no, tb_mensaje y tb_detalle dicen qué pasó (qué columna, qué renglón).

Con gcc y pkg-config instalados, y libtabular2-dev (lo instala sh installsumma.sh tabular2), compilar y ejecutar:

gcc -std=c11 -Wall -Wextra ejemplo2.c -o ejemplo2 $(pkg-config --cflags --libs tabular2)
./ejemplo2

Con estos datos el resultado es DOS(550) = 55, salvo redondeo numérico. El programa informa los errores por la salida de errores, devuelve un estado distinto de cero si falla y libera las tablas antes de terminar.

La biblioteca puede usarse desde varios hilos: cada hilo tiene sus propias tablas cargadas, y con tb_ctx_nuevo y tb_ctx_usar un mismo hilo puede llevar lecturas separadas.

Usarla con ExprTk, Siru y Calcula

En una expresión de ExprTk (y así en Siru) es la función

Table('archivo.txt', 'X', 'Y', valor, metodo)

y en los .din de Calcula, tabla('archivo.txt', 'X', 'Y', valor, metodo). En un .din la tabla también puede ir adentro del mismo archivo, en la sección tablas. Siru le pasa a Tabular las TABLE de un circuito de SCEPTRE.

El programa interpola

Es una consola (con historial y completado) para mirar e interpolar tablas sin escribir un programa:

$ interpola datos.txt
interpola> columnas
interpola> x t
interpola> metodo spline
interpola> interpolar 90 T p
interpola> inversa T 300
interpola> integ 0 120 p
interpola> saltos 0 120 10 > cada10.txt
interpola> graficar T

Lee varias tablas, interpola en cualquier columna, busca al revés dónde una columna toma un valor, calcula valor medio, valor eficaz e integral entre dos abscisas, rehace la tabla a paso fijo y la grafica con gnuplot. También corre órdenes sin preguntar: interpola datos.txt -e 'x t; interpolar 90'. Con man interpola está la lista completa.

Texto en las celdas

Las celdas guardan texto además de números, y tests/t_cadenas.c lo comprueba. Los nombres de columna son celdas de texto —por eso una columna se pide por su nombre—, y un dato no numérico en una celda se guarda tal cual: se lo recupera con get_string_data_cell, no se convierte a cero ni al prefijo numérico del texto, y una consulta no lo sobrescribe. Pasa de verdad: los archivos de SPICE traen columnas de texto.

Al interpolar, una fila con texto en la columna de la abscisa o en la de la ordenada no da un punto de la vista: se descarta entera y se interpola entre los valores numéricos de los lados, con sus abscisas originales. En la tabla 0 100 / 10 nohay / 20 30, la ordenada vale 65 en T=10 y 82.5 en T=5. Vale igual para huecos consecutivos, para texto en los extremos —la tabla queda como si esas filas no estuvieran— y para una columna entera de texto, que no estorba a las demás.

Lo que vuelca la tabla escribe el texto, no un cero: mostrar lo copia tal cual —así mostrar > archivo reproduce una tabla mixta y se la puede volver a leer—, columnas dice - y «solo texto» en una columna sin números en lugar de inf/-inf, y --exportar-simul escribe el texto. Donde un cero falsearía el resultado, la fila se saltea: graficar no dibuja un punto en cero donde hay texto, e inversa no toma el cero de una celda de texto como abscisa. Falta definir la política con spline y con los saltos.

Versión original de la página

TABULAR

Tabular es una biblioteca en C, con un programa de consola, que lee tablas de datos en columnas, las interpola y las extrapola, en forma lineal o por spline (curva suavizada). La versión actual en este árbol es tabular2 2.0-18 (octubre de 2026); la anterior, tabular 1, se distribuía como simusol_table.

La usan Simusol y SCEPTRE (función ETABLE), Siru y ExprTk (función Table()) y Calcula (función tabla()).

Puede usarla cualquiera que quiera procesar tablas, interpolarlas o convertir formatos, por ejemplo: archivos gnuplot, csv, los binarios de SCEPTRE, del primero al último, archivos de spice, y los .simul de sceptre-simusol.

Qué tablas lee

Un archivo de texto con columnas de números separadas por blancos, tabuladores o comas, y un renglón de nombres arriba, con # o sin él:

# t     T      p
0       20     101325
60      25     101000

Además lee, tal como los escriben los programas que los producen:

Unidades

Si debajo del renglón de nombres hay otro cuyas palabras son todas unidades, los valores de cada columna se pasan al SI al leer la tabla (- es una columna sin unidad):

# t     T      p      n
# min   tempC  mmHg   -
0       20     760    1

queda en segundos, kelvin y pascales. Las unidades son las de GNU units, que Tabular usa como biblioteca (libunidades).

Días, horas y fechas

Las duraciones numéricas pueden llevar unidades de tiempo, como s, min, hr o day: con un renglón de unidades se convierten al SI, en segundos.

Fecha y hora completas se convierten a epoch Unix: segundos desde 1970-01-01T00:00:00Z, conservando fracciones de segundo. Si la entrada no especifica zona, se toma la de la máquina donde se ejecuta, o TZ si está definida. Si trae Z o un desplazamiento como -03:00, se respeta.

Una fecha sin hora usa medianoche. Una hora sin fecha es una duración en segundos desde medianoche, no un instante epoch. Las horas locales inexistentes por cambios estacionales se rechazan; para una hora ambigua, indicar el desplazamiento explícito. Las marcas deben ocupar una celda: usar ISO con T en tablas separadas por blancos, o fecha y hora dentro de una celda CSV.

Esto requiere libmem-util0 2017.2.1.R1008-2 o posterior, que se instala con summapack (ver Instalación); con la versión anterior, 1.0-2, las fechas pierden la hora.

Discontinuidades

Repetir un valor de la columna x, dos o tres veces, es una discontinuidad: antes vale el valor de la primera fila, despues el de la segunda, si son dos, o el de la tercera, si son tres, y en el punto el promedio o el valor de la fila del medio, si son tres. La spline se arma por tramos y conserva el salto.

Paquetes

Son tres paquetes:

Descargar e instalar

Se instala con Summapack.

Hay entregas para distintas distribuciones y formatos. Hay que elegir paquetes compatibles con la distribución y arquitectura de la máquina; que exista un formato DEB, RPM o TGZ no significa que un mismo binario funcione en todos los sistemas. En una terminal:

curl -fsSLO https://www.simusol.org/downloads/installsumma.sh

sh installsumma.sh tabular2

Pregunta qué bajar, mostrando lo que hay: fuentes para compilar en la máquina, deb para Ubuntu y Debian, rpm para Fedora y openSUSE, tgz para Arch y las demás (también se puede decir de antemano: sh installsumma.sh --para fuentes tabular2). Instala summapack, la herramienta de Simusol para bajar e instalar paquetes, y Tabular con todo lo que necesita: las bibliotecas de Simusol que falten (libslex, libunidades, libmem-util), las del sistema y gnuplot para graficar. Comprueba el md5 de cada archivo e instala con el sistema de paquetes de la distribución; pide permiso mediante sudo. Para instalar solo el programa, sin los archivos de desarrollo: sh installsumma.sh tabular2/tabular. Se usa el mismo instalador aunque SummaPack ya esté instalado.

Los DEB 2.0-18 comprobados aquí se construyeron en Ubuntu 24.04 y requieren libc6 >= 2.38; no sirven como binarios para Ubuntu 22.04, cuya glibc es anterior. La disponibilidad y compatibilidad de lo publicado deben comprobarse para cada entrega. Si no hay un binario compatible, se puede instalar desde las fuentes (fuentes) y compilar en la máquina de destino.

No instala Simusol, Siru, Calcula ni SCEPTRE.

Los paquetes están en https://www.simusol.org/downloads/, cada uno en el directorio de su proyecto (tabular2/, slex/, unidades/, summapack/); las versiones anteriores, en el subdirectorio otros/ de cada proyecto.

Dependencias

Dependencias directas de los DEB 2.0-18 para amd64 construidos en Ubuntu 24.04; corresponden a estos archivos concretos, no a cualquier compilación de otra distribución.

Paquete Dependencias obligatorias
libtabular2-0 libmem-util0 >= 2017.2.1.R1008-2, libslex0 >= 1.0-25, libunidades0 >= 1.0 y libc6 >= 2.38.
libtabular2-dev libtabular2-0 = 2.0-18, libmem-util-dev >= 2017.2.1.R1008-2, libslex-dev y libunidades-dev.
tabular libtabular2-0 >= 2.0-18, libslex0 >= 1.0-25, libunidades0 >= 1.0, libreadline8t64 >= 6.0, libc6 >= 2.38 y python3.

Tabular no depende de Calcula ni de Siru para funcionar: son esos programas los que utilizan Tabular.

Cargar desde un archivo o desde texto

Origen Cómo se carga
Archivo En la consola, leer archivo.csv; desde C, interpolate("archivo.csv", ...) carga la tabla al necesitarla. create_search_table permite cargarla explícitamente.
Cadena de texto en memoria create_table_from_string(nombre, texto, &nt) registra una tabla con el mismo formato textual que un archivo, sin escribir un archivo intermedio. Después se usa ese nombre con interpolate.
Tabla embebida en un modelo Calcula admite la sección tablas del .din; Siru entrega las TABLE del circuito a Tabular.

Por ejemplo, la cadena "# T R\n0 100\n10 50\n20 30\n" define tres filas y dos columnas. El nombre registrado identifica la tabla y su extensión selecciona el tratamiento CSV cuando corresponde. Si el nombre ya está cargado, se conserva la tabla anterior: volver a registrarlo no la reemplaza.

Usarla con Simusol y SCEPTRE

Ver el ejemplo tanqueT.dia en simusol_ejemplos/simples.

Cuando se necesita el valor de la tabla se invoca la función

ETABLE(NUM TABLA, COLUMNA X, COLUMNA Y, VALOR X, FORMA DE INTERPOLACION)

Las columnas se indican con números, empezando por 0. La forma de interpolación es 1, lineal, o 2, spline (suavizada).

NUM TABLA se indica en un cuadro adicional llamado ETABLE: cada línea tiene el número de la tabla y el nombre del archivo que la contiene, relativo al directorio donde se ejecuta Simusol.

ETABLE está escrita en Fortran y llama a tabular2: se compila con el programa que genera SCEPTRE y se enlaza con -ltabular2. Si la tabla da un error, lo informa y detiene la simulación en lugar de seguir con un valor inventado.

Usarla desde C

Guardar este programa completo como ejemplo2.c:

#include <stdio.h>
#include <stdlib.h>
#include <interpola.h>
#include <tables.h>

/* Globales requeridas por la biblioteca. */
int verbose = 0;
char *archivoenuso = "datos.txt";

int main(void)
{
    double r = 0.0;
    int e = interpolate("datos.txt", "UNO", "DOS", 550.0, 2, &r);
    if (e != 0) {
        fprintf(stderr, "%s: %s\n", tb_mensaje(e), tb_detalle());
        free_tablelist();
        return EXIT_FAILURE;
    }

    printf("DOS(550) = %.17g\n", r);
    free_tablelist();
    return EXIT_SUCCESS;
}

Guardar también este archivo como datos.txt en el directorio desde el que se ejecutará el programa:

# UNO DOS
0 0
300 30
600 60
900 90
1200 120

"datos.txt" es el archivo; "UNO" es el nombre de la columna que hace de dominio y "DOS" el de la que hace de codominio, los dos del renglón de nombres; 550. es el valor buscado en la columna UNO; 2 pide spline (1, lineal); el resultado queda en r. Devuelve 0 si pudo; si no, tb_mensaje y tb_detalle dicen qué pasó (qué columna, qué renglón).

Con gcc y pkg-config instalados, y libtabular2-dev (lo instala sh installsumma.sh tabular2), compilar y ejecutar:

gcc -std=c11 -Wall -Wextra ejemplo2.c -o ejemplo2 $(pkg-config --cflags --libs tabular2)
./ejemplo2

Con estos datos el resultado es DOS(550) = 55, salvo redondeo numérico. El programa informa los errores por la salida de errores, devuelve un estado distinto de cero si falla y libera las tablas antes de terminar.

La biblioteca puede usarse desde varios hilos: cada hilo tiene sus propias tablas cargadas, y con tb_ctx_nuevo y tb_ctx_usar un mismo hilo puede llevar lecturas separadas.

Usarla con ExprTk, Siru y Calcula

En una expresión de ExprTk (y así en Siru) es la función

Table('archivo.txt', 'X', 'Y', valor, metodo)

y en los .din de Calcula, tabla('archivo.txt', 'X', 'Y', valor, metodo). En un .din la tabla también puede ir adentro del mismo archivo, en la sección tablas. Siru le pasa a Tabular las TABLE de un circuito de SCEPTRE.

El programa interpola

Es una consola (con historial y completado) para mirar e interpolar tablas sin escribir un programa:

$ interpola datos.txt
interpola> columnas
interpola> x t
interpola> metodo spline
interpola> interpolar 90 T p
interpola> inversa T 300
interpola> integ 0 120 p
interpola> saltos 0 120 10 > cada10.txt
interpola> graficar T

Lee varias tablas, interpola en cualquier columna, busca al revés dónde una columna toma un valor, calcula valor medio, valor eficaz e integral entre dos abscisas, rehace la tabla a paso fijo y la grafica con gnuplot. También corre órdenes sin preguntar: interpola datos.txt -e 'x t; interpolar 90'. Con man interpola está la lista completa.

Pendiente: texto en celdas