Manual HTML independiente · Fuente Markdown · Todos los ejemplos (ZIP) · Gramática y materiales (ZIP)

Gramática .ds y .d

El archivo .ds es el eje que conecta los programas del proyecto Simusol: describe el problema físico o matemático, sus datos, ecuaciones, modelos, condiciones iniciales y controles, y puede incluir tanto el esquema como los gráficos de resultados. Puede escribirse directamente o prepararse a partir de un dibujo .dia. No exige que el problema sea un circuito.

Con RK=[-1], el .ds contiene la descripción necesaria para construir el sistema de Calcula: Siru lo prepara, llama a Calcula para resolver un punto y escribe sus resultados en .simul. No se necesita una integración, un tiempo ficticio ni un .din escrito por el usuario. Los archivos externos que se nombren —bibliotecas, tablas o funciones Fortran— deben acompañar al problema.

Esta referencia reúne sintaxis, significado, ejemplos y límites del lector d2datdinc y de los programas que consumen sus datos. Revisión: 9 de octubre de 2026. Describe las capacidades del árbol de fuentes revisado; una instalación anterior puede requerir actualización. Distingue las construcciones operativas de los encabezados heredados que sólo reconoce el lector.

Versión web en Simusol · Manual de Siru · Slex · ExprTk · Dibuja · Simplot

1. Un lenguaje compartido

Archivo o programa Responsabilidad
.dia / Dia-Simusol Dibujo de origen y datos del modelo; se transforma en una descripción textual que debe revisarse.
.ds Descripción explícita del problema, controles y presentación; formato recomendado para modelos nuevos.
.d Descripción procedente de SCEPTRE/Simusol, con las diferencias de sintaxis detalladas en §3. No toda extensión de Siru puede ejecutarse en SCEPTRE.
Slex / d2datdinc Lee secciones y sentencias; produce el dato estructurado .dat y puede generar el sistema .din. La interpretación común de UNIDADES y RESULTADOS corresponde a esta etapa, antes de simular (§3.9 detalla la migración).
.dat Dato JSON del problema: conserva modelos, ramas, ecuaciones y, si se declaran, GLOBAL.formas y GLOBAL.simplot. No es una tabla de resultados.
.din Sistema preparado para Calcula y, para una corrida, sus descriptores de integración. No sustituye al .ds como documento que reúne también los dibujos y gráficos.
Calcula / ExprTk Calcula resuelve las ecuaciones; ExprTk evalúa sus expresiones. Las funciones externas pueden implementarse en Fortran.
Siru Coordina la construcción del sistema, la resolución de un punto o los pasos de integración, y escribe la tabla numérica.
.simul Tabla de resultados: nombres, unidades cuando están definidas y números producidos por el cálculo.
Dibuja / FORMAS Construye el esquema SVG a partir de las ramas y conexiones. Ayuda a comprobar visualmente la conversión .dia → .ds; no verifica por sí solo las ecuaciones ni los valores.
Simplot / PARAPLOT Dibuja las tablas preparadas. PARAPLOT es opcional: sin él usa las columnas, nombres, magnitudes y unidades disponibles, sin reinterpretar las reglas físicas.

2. Elegir el problema y ejecutarlo

Necesidad Qué declarar
Resolver ecuaciones algebraicas sin ramas Datos en DEFINED_PARAMETERS, incógnitas y semillas en VARIABLES, residuos en EQUATIONS, RK=[-1] en RUN_CONTROLS.
Integrar ecuaciones diferenciales sin ramas Estados e iniciales, incógnitas derivadas, ecuaciones, familia de integrador, paso y condición de continuación; §10–11.
Simular un circuito eléctrico o térmico Modelos en ELEMENT_DESCRIPTION, ramas en ELEMENTS, condiciones iniciales, integrador y salidas. La analogía térmica cambia el significado físico de las variables y sus unidades.
Resolver sólo el estado inicial de un circuito Las mismas ramas y estados, con RK=[-1]; los estados quedan fijados en sus valores iniciales.
Calcular el punto de operación DC Controles RUN INITIAL CONDITIONS de .d; no confundir equilibrio DC con fijar los estados iniciales mediante RK=[-1].
Dibujar el esquema automáticamente Añadir FORMAS, aunque quede vacía; el paquete Dibuja debe estar instalado.
Graficar datos ya calculados Un .ds con secciones gráficas, o un .paraplot, puede entregarse a Simplot sin ejecutar Siru.

Instalación de los componentes mediante el instalador del proyecto:

curl -fsSLO https://www.simusol.org/downloads/installsumma.sh
sh installsumma.sh siru slex/d2datdinc dibuja/dibuja simplot

Ejecución habitual:

siru problema.ds
siru -nosimplot punto.ds
dibuja problema.ds
simplot problema.ds

Siru llama a Simplot al terminar, salvo -nosimplot. Dibuja y Simplot también funcionan por separado. En §17 hay ejemplos completos para descargar y comprobar. En los fragmentos, ... significa contenido omitido y no debe copiarse como una sentencia.

3. .d o .ds: cuál usar

Los dos describen lo mismo con las mismas secciones y las mismas líneas de elementos; el lector es uno solo (d2datdinc) y el sistema que sale es el mismo. Difieren en lo que sigue.

.d (SCEPTRE) .ds (Siru)
de dónde viene lo que Simusol genera para SCEPTRE; el manual de SCEPTRE el formato propio de Siru
tipo de rama por la primera letra del nombre: R1 es RB, C3 es CB, E1 es EB, J1 es JB, L2 es LB, S1 es SB; un tipo propio que sea prefijo del nombre (ESIN1, MW1) explícito, con guión: RB-R1, CB-C3, SB-S1
biblioteca de elementos se incluye sola hay que escribir include .../libraryori.siru (ruta relativa al archivo)
comentarios #, y ; #; ; separa sentencias
secciones con espacio: RUN CONTROLS con espacio o con _: RUN_CONTROLS
fin de la corrida STOP TIME = 5 o T>5 en RUN CONTROLS TIEMPOFINAL=5 en DEFINED_PARAMETERS y T<TIEMPOFINAL en CONTROL_EQUATIONS
método de integración INTEGRATION ROUTINE = TRAP (12), IMPLICIT o XPO (13), RUK (7); sin ella, 13. RK=[...] no se entiende en un .d RK=[12] en RUN_CONTROLS, un índice definido en el catálogo; sin ella, Euler (0)
paso STARTING STEP SIZE = 0.05 STARTING STEP SIZE = 0.05 (desde r1890; también MINIMUM y MAXIMUM), o SIRU_PASO=[0.05]
semilla de calcula SEMILLA VL2 = 0.1 SEMILLA VL2 = 0.1, o VL2=0.1 en VARIABLES si es de una rama
condiciones iniciales INITIAL CONDITIONS (o DEFINED PARAMETERS) DEFINED_PARAMETERS
modelos de SCEPTRE (MODEL 101M (B-C-E), transistores de modellib.siru) sí no
tablas adentro del archivo (TABLE 1) sí sí (desde r1950), o por archivo aparte, Table('tabla.txt',...)
incluir otro archivo SCEPTRE no tiene include, pero siru lo acepta: include parte.d mete otro .d, que se lee como .d (desde r2066); una biblioteca (.siru, .ds) se lee como .ds. Un .d con include ya no corre en SCEPTRE include otro.ds (o input otro.ds): el otro archivo entra en ese lugar, con su ruta relativa al que lo incluye o al directorio actual; sirve para la biblioteca y para partes de un circuito
cadenas entre comillas no sí (Table('...'))

Cuál usar: .ds para lo nuevo —dice el tipo de cada rama, no lo adivina por la letra, y es el formato de Siru—; .d para correr lo que viene de SCEPTRE o de Simusol, o lo que usa sus modelos de transistor y sus tablas incorporadas. Lo que sigue muestra las dos formas donde difieren.

3.1 Estructura y reglas de escritura

La siguiente referencia describe el formato .ds que lee d2datdinc, el lector basado en slex. Las secciones explican qué significa cada sentencia; una misma expresión escrita bajo otro encabezado puede significar otra cosa. El recorrido es:

problema.ds → d2datdinc → dato del problema (.dat)
                              ├─ sistema (.din) → Calcula → resultados (.simul)
                              └─ FORMAS + ramas → dibuja → esquema (.svg)

Siru coordina ese recorrido con siru problema.ds. Los archivos intermedios pueden ser temporales: no hace falta prepararlos a mano. FORMAS aporta información de dibujo; las ecuaciones se construyen con la descripción del sistema, sin depender de que exista el dibujo.

Regla Escritura y significado
Encabezado En una línea propia: DEFINED_PARAMETERS o DEFINED PARAMETERS. En encabezados se admiten mayúsculas/minúsculas, espacios, tabuladores y _ entre palabras. Puede seguir un comentario.
Cuerpo Desde el encabezado hasta el siguiente encabezado o el fin del archivo. Se pueden omitir las secciones que no se necesitan y volver a abrir una sección; esto no permite redefinir arbitrariamente los mismos nombres. Ninguna sección requiere una orden de cierre.
Fin Basta el fin del archivo; no se añade END a PARAPLOT ni a las demás secciones. Por compatibilidad, el lector admite el END histórico, que termina la fuente actual y descarta lo que siga; no es un cierre de sección.
Sentencias Una por línea, o varias separadas por ;. En .ds, ; no introduce un comentario.
Continuación Una barra inversa \ al final une la línea siguiente. Terminar en +, , o = sin \ no pide continuación en .ds.
Comentarios # o // hasta fin de línea; también /* ... */, con bloques anidados. Un bloque sin cierre es un error de lectura. Dentro de cadenas entre comillas no comienzan comentarios.
Inclusión INPUT ruta o INCLUDE ruta, sin distinguir mayúsculas/minúsculas; se aceptan también #INPUT y #include. La ruta va sin espacios ni comillas y se busca relativa al archivo que incluye o al directorio de trabajo. Se admiten inclusiones anidadas y, al terminar cada fuente, se vuelve a la anterior. Un ciclo en la cadena activa se rechaza; volver a incluir un archivo después de terminarlo sí se permite. La sección activa puede continuar a través de la inclusión: conviene escribir encabezados explícitos al volver.
Nombres Para parámetros e incógnitas: letra seguida de letras, dígitos o _, por ejemplo TEMP, Y1, P_T. Para tipo, rama y nodo se aceptan letras, dígitos y _, incluso un nodo numérico. No usar blancos dentro del nombre.
Mayúsculas La tolerancia de los encabezados no se extiende a todas las claves. Escribir RK, SIRU_PASO, V: y D: como se documentan y mantener la misma escritura de los nombres. Los nombres del sistema generado pueden aparecer en minúsculas.
Números Decimal con punto, signo opcional y exponente e/E: 12, -0.5, .001, 2e-6. La coma separa campos; no es separador decimal.
Cantidades con unidad En expresiones: número, blanco y unidad GNU units, por ejemplo 10 kohm, 100 uF, 25 tempC. El lector convierte la cantidad a SI. 10k no es esta sintaxis; C es coulomb, tempC es Celsius absoluto. CONSTANTS y DATA tienen sus propias reglas indicadas más abajo.
Expresiones Operadores explícitos: + - * / ^, paréntesis, funciones y condiciones de ExprTk. Ejemplos: 2*(X+1), sin(T), if(T<1,0,1). No hay multiplicación implícita. Las comillas simples o dobles delimitan cadenas, como las rutas de Table(...).

3.2 Secciones del archivo

Sección Contenido Desarrollo
CIRCUIT_DESCRIPTION Texto que describe el problema. §4
ELEMENT_DESCRIPTION, alias ELEMENT_DEFINITION Tipos de rama y sus ecuaciones; también pueden llegar mediante include. §3.3 y §5
ELEMENTS Ramas, nodos, valores y acoplamientos. Se omite en un sistema de ecuaciones sin circuito. §3.3, §5–8
CONSTANTS Constantes numéricas con nombre. §3.4
DEFINED_PARAMETERS Datos conocidos, expresiones auxiliares y valores iniciales de estados. §3.4 y §10
INITIAL_CONDITIONS Encabezado de compatibilidad con SCEPTRE. En un .ds nuevo escribir las condiciones en DEFINED_PARAMETERS. §3 y §10
VARIABLES Incógnitas y semillas para Calcula; también derivadas propias. §3.4 y §10
EQUATIONS Residuos que Calcula debe anular. §3.4 y §10
FUNCTIONS Funciones, tablas incorporadas o declaraciones EXTERNAL. §3.5 y §9
RUN_CONTROLS Selección del modo de resolución y opciones numéricas. §3.6, §11 y §12
CONTROL_EQUATIONS Condiciones para continuar una integración. §3.6 y §11
OUTPUTS Variables que se quieren observar y abscisa opcional. §3.6 y §12
FORMAS Símbolos de las ramas e información conservada del dibujo de Dia. Su presencia solicita el esquema. §3.8
DEFAULTDOMAIN dominio Dominio físico de las ramas sin forma; si se omite, ELECTRICO. No abre un bloque de registros. §3.8.1
DATA Datos estructurados de compatibilidad, como tablas de métodos. §3.7
DATABLOB Texto de compatibilidad con Siru antiguo; no es una sección general para programar el Siru actual. §3.7
RESULTADOS, UNIDADES, PARAPLOT, GRAFICOS, ACEPTAR_GRAFICOS, GRAFICOS_ADICIONALES Presentación de tablas y gráficos mediante Simplot. §3.9
SENSITIVITY, MONTE_CARLO, WORST_CASE / WORST-CASE Conjuntos de variables para los análisis DC correspondientes. §11 ter–quinquies

El lector reconoce además encabezados históricos como FORCED_VARIABLES, MODELS, MODEL_DESCRIPTION, MULTIELEMENT_DEFINITION, CONTROLS, ECUACIONES, OPTIMIZATION, CLEAR, RERUN_DESCRIPTION, CONTINUE y RE-OUTPUT. Reconocer el encabezado no implica implementar su contenido en .ds: los modelos de SCEPTRE, reruns y continuaciones descritos en esta referencia usan su sintaxis .d. FORCED_VARIABLES no tiene traducción general en .ds; usar parámetros y ecuaciones explícitos. Las órdenes de la terminal antigua (EXECUTE, PREPARE, SHOW, solve, plot, etc.) no se ejecutan al leer un .ds.

3.3 Gramática de ramas y modelos

En las reglas siguientes, las comillas indican texto literal, { ... } significa repetición y [ ... ] significa parte opcional. expresion representa una expresión del lenguaje numérico, no un nombre literal. Los separadores se interpretan fuera de paréntesis y cadenas.

rama       = tipo "-" nombre "," nodo "-" nodo "=" valores [ "=" controles ]
valores    = pieza { "&" pieza }
controles  = pieza { "&" pieza }
pieza      = expresion [ "V:" nombre { "," nombre } ]
mutua      = nombre_M "," bobina "-" bobina "=" expresion
modelo     = tipo "(" cantidad ")" "=" campo { "," campo }
campo      = expresion | marca_modelo
Parte Ejemplo y regla
Rama RB-R1, entrada-salida = 1000. RB es el tipo; R1, el nombre usado en VR1, IR1 y FORMAS.
Varios valores En .ds se separan con &: ESIN-E1, GND-1 = 5 & 2*pi*T. Son x1, x2, etc., en el modelo. Las comas dentro de una llamada separan los argumentos de esa llamada.
Control de rama El segundo = introduce el control histórico de la rama. Para una llave corriente usar el tipo SB y su valor de apertura/cierre (§6); otros controles pueden no tener traducción al motor actual.
Masa Un circuito .ds usa GND. No sustituirla por 0; esa compatibilidad pertenece a .d. Un sistema sin ramas no necesita masa.
Mutua M12, L1-L2 = 0.2; las dos bobinas deben estar declaradas. El valor es la inductancia mutua, no el coeficiente de acoplamiento (§8).
Modelo algebraico RB(1) = VOLTAGE - x1*CURRENT. Cada expresión del modelo es un residuo que se anula.
Estado de un modelo IC: CURRENT:CURRENT:DCURRENT declara la asociación de estado/derivada del modelo de bobina; véanse los modelos completos de §5 y biblioteca.siru.
Otras marcas de modelo IF: expresion, INV: expresion, OP: parte:parte, VARS: nombre:nombre. Son campos del modelo; no encabezados del archivo. Las dos primeras intervienen en la definición y el signo de las fuentes. OP y VARS conservan información del modelo para su traducción.

La definición de los tipos debe estar disponible antes de construir el sistema. Se pueden copiar sólo los modelos utilizados dentro del .ds, como en los ejemplos de dibuja, o incluir la biblioteca. El valor de una rama no es su símbolo gráfico: la forma eléctrica, térmica o genérica se declara por separado en FORMAS.

3.4 Parámetros, incógnitas, constantes y ecuaciones

parametro  = nombre "=" expresion [ "D:" derivada ]
variable   = nombre "=" semilla   [ "D:" derivada ]
constante  = nombre "=" numero [ unidad ]
ecuacion   = expresion { marca_ecuacion }
Sección y ejemplo Significado
DEFINED_PARAMETERS / PRES=101325 Dato conocido: se entrega a Calcula con ese valor.
VARIABLES / PV=1500 Incógnita: 1500 es una semilla, no un valor impuesto. Calcula la determina mediante las ecuaciones.
CONSTANTS / TKO=273.15 Constante numérica, opcionalmente con unidad separada por un blanco: LARGO=5 m, AMBIENTE=25 tempC. Se convierte a SI y conserva metadatos de unidad; no admite expresiones generales como K=2+3.
DEFINED_PARAMETERS / X=1 D:DX Valor inicial de X y nombre de su derivada. La derivada debe quedar determinada por el sistema. También se reconoce la relación convencional entre X y DX descrita en §20.
DEFINED_PARAMETERS / POT=V*I Definición mediante expresión; no es un dato numérico independiente. Se traduce en una incógnita con su ecuación.
EQUATIONS / PV-PW(TEMP) Calcula busca que el residuo sea cero: equivale a PV=PW(TEMP). Escribir el residuo evita confundir una ecuación con la asignación de un parámetro.

Cada incógnita necesita la relación que la determina; las semillas ayudan a resolver el sistema pero no agregan ecuaciones. No repetir la misma declaración de parámetro, variable o constante: el lector avisa y descarta la repetida. En cambio, una sección reabierta puede agregar otros nombres.

Las marcas opcionales van después de la expresión y no se repiten en una sentencia:

Marca Forma y uso
V: V:X,Y declara los nombres asociados a la ecuación. Se permite V: X, Y; escribir la coma pegada al nombre anterior.
LINEAL: Sin valor. La parte inicial pasa a ser una lista de coeficientes, alineada con V:.
INDEP: Un valor: término independiente de la forma lineal. 1,-1 V:X,Y LINEAL: INDEP:2 representa X-Y=2.
NONUCLEO: Sin valor. Marca una ecuación fuera del núcleo del sistema. Es información avanzada de compatibilidad; no usarla para una ecuación que Calcula deba resolver como parte del sistema.
RES: Un nombre asociado al resultado de una expresión.
TIPO: Un valor que clasifica la ecuación en el dato histórico; por ejemplo TIPO:POST. Su lectura no garantiza que cualquier clasificación tenga implementación en el motor actual.

3.5 Funciones y tablas

funcion    = nombre_funcion "(" cantidad_o_argumentos ")" "=" expresion
externa    = "EXTERNAL" nombre_funcion "(" cantidad ")" ruta
tabla      = "TABLE" nombre_tabla
             numero "," numero { "," numero "," numero }
Forma Ejemplo y alcance
Función por cantidad PW(1)=exp(x), COC(2)=x/y. Los argumentos formales son x, y, z, etc.
Función por nombres COC(A,B)=A/B. El lector admite la lista explícita de argumentos; los nombres de función llevan letras y dígitos, sin _.
Uso COC(PV,PRES) dentro de una expresión. Los argumentos van separados por comas y entre paréntesis.
Subcircuito .d subcircuito.d
Tabla incorporada En FUNCTIONS, TABLE 1 y después 0,0, 1,10, 2,20. También puede ir todo en una línea: TABLE 1, 0,0, 1,10, 2,20. Se usa como TABLE 1(T); §9 detalla las formas equivalentes y los saltos.
Tabla de resultados incorporada (prevista) Una sección superior TABLE sin nombre si es la única tabla, o TABLE NOMBRE si hay varias; su contenido puede emplear cualquier formato textual que Tabular2 admita, no sólo el del ejemplo. §9 distingue esta ampliación de la sintaxis ya operativa.
Tabla externa Table('tabla.txt','TIEMPO','VALOR',T,1). La tabla referenciada debe acompañar al .ds; §9 explica columnas e interpolación.
Función externa EXTERNAL FGEN (2) fgen.f90. Acepta entre 1 y 12 argumentos y requiere el fuente y las herramientas de compilación indicadas en §9.

3.6 Controles, condiciones y salidas

control    = clave "=" "[" valor { "," valor } "]"
condicion  = expresion_logica { marca_ecuacion }
salidas    = [ abscisa ":" ] nombre { "," nombre }
Escritura Efecto
RUN_CONTROLS / RK=[-1] Un único punto resuelto por Calcula. No integra. Véase §12.
RK=[12] Integración con el método 12. Los métodos y sus límites están en §11.
RK=[18,18,11] Secuencia de métodos; no mezclar -1 con métodos de integración.
SIRU_PASO=[0.01] y SIRU_ADAPT=[0] Paso fijo de 0.01. Sin la segunda opción, declarar un paso puede activar adaptación; véase §11.
STARTING STEP SIZE = 0.01 Forma compatible admitida también en .ds; MINIMUM STEP SIZE, MAXIMUM STEP SIZE y SEMILLA VL2 = 0.1 son otras excepciones a la lista entre corchetes.
GLM=[...], PGLM=[...], ROS=[...], SPLIT=[...] Seleccionan otras familias. Son alternativas a RK, no controles para combinar con RK=[-1]; sus contratos están en §11.
CONTROL_EQUATIONS / T<TIEMPOFINAL Condición para seguir, no para terminar. Se detiene al dejar de cumplirse. Con RK=[-1] no provoca una marcha temporal.
OUTPUTS / T:VC1,IR1 Abscisa T y variables solicitadas para una corrida. No son ecuaciones ni valores impuestos. Conviene poner la lista completa en una línea, o usar \ para continuarla.
OUTPUTS / TEMP,TBH,PRES,PV Lista de observables sin inventar una variable de tiempo. En modo de un punto la tabla de Siru contiene todas las variables del sistema de Calcula, incluidos los datos (§12).

Los valores de los controles no admiten listas anidadas; cada clave valida además sus opciones. Las repeticiones de una clave pueden acumular sus valores: declarar una sola vez el selector de método. Usar exactamente RK=[-1], con corchetes y RK en ese orden; RK=-1 y KR=[-1] no son la escritura de este modo.

3.7 DATA y DATABLOB

DATA conserva datos estructurados; no ejecuta Perl. Su gramática es:

asignacion = camino "=" valor
camino     = clave { [ "->" ] ( clave | indice ) }
clave      = "{" cadena "}"
indice     = "[" entero_sin_signo "]"
valor      = cuenta | cadena | "undef" | "[" [ valor { "," valor } ] "]"
Elemento Regla
Ejemplo {'rungekutta'}->[3]->{'a'}=[[0,0],[1/2,0]]. Se conservan listas, objetos, números y textos.
Cuentas + - * / **, paréntesis, sqrt, exp, log, sin, cos, abs, int, atan2. Aquí la potencia se escribe **.
Índices [0], [3]: enteros no negativos, sin signo. No confundir un índice con un valor: [-1] sí puede ser el valor de una lista.
Compatibilidad {'lnumrk'}=[-1] aparece en archivos antiguos. Para pedir un punto al Siru actual declarar explícitamente RK=[-1] en RUN_CONTROLS; no depender de ese dato histórico.
Errores No se acepta código, un índice negativo, una cadena sin cerrar ni cambiar un objeto ya creado por una lista al recorrer un camino.

DATABLOB transporta el texto histórico y sólo tiene traducciones específicas, entre ellas el selector antiguo de método numrk. No constituye un lenguaje general admitido por el motor actual. Para un archivo nuevo usar ecuaciones, funciones y controles declarativos; el documento del lector precisa el patrón heredado que reconoce.

3.8 FORMAS: el dibujo dentro del .ds

El modelo explícito del octavo campo debe ser un identificador definido en library.siru o mediante UNIDADES Modelo.Clase: unidad,magnitud. Se valida al terminar, por lo que la definición local puede aparecer después. Un modelo desconocido o un identificador como 5 es un error, aunque no exista una rama asociada. Los símbolos históricos sin ese campo no requieren una definición de modelo.

FORMAS permite incluir en el propio .ds la información de NOMBRE.formas, el archivo que dia2formas extrae de un dibujo de Dia. No sustituye ELEMENTS: las ramas y sus conexiones siguen siendo la fuente del circuito. Puede aparecer entre las demás secciones; termina al comenzar otra sección o al llegar a END.

El formato completo tiene siete campos separados por tabuladores reales y un octavo campo opcional para el modelo de unidades, uno por renglón:

nombre<TAB>forma<TAB>orientacion<TAB>x<TAB>y<TAB>ancho<TAB>alto[<TAB>modelo_unidades]

<TAB> representa un tabulador, no los cinco caracteres de esa indicación ni la secuencia literal \t. Los espacios interiores pertenecen al campo. En este ejemplo las separaciones son tabuladores reales:

FORMAS
# nombre	forma	orientacion	x	y	ancho	alto
R1	Electrico - hresistor	horizontal	4	1	3	1.5
masa	Electrico - tierra	fija	8	6	2	2
nodo 1	Electrico - nodo	fija	3	1	1	1
END
Campo Contenido
nombre Nombre de rama sin el prefijo de tipo (R1, no RB-R1), masa o el nombre de nodo de Dia (nodo 1).
forma Nombre de la forma, por ejemplo Electrico - hresistor, Termico - acumulador o Termico - 0gradosc. Se conserva como texto.
orientacion Texto de Dia, por ejemplo horizontal, vertical, fija, hacia la izquierda o con indicaciones de volteo. No es un código numérico.
x, y Coordenadas de la esquina de la forma en Dia, en cm; y crece hacia abajo.
ancho, alto Dimensiones en las mismas unidades de Dia.

Los siete campos deben tener contenido y los cuatro últimos deben ser números finitos. Campos de más, campos vacíos o coordenadas no numéricas hacen fallar la lectura sin publicar un DAT parcial. Como formato abreviado también se admite R1 Electrico - hresistor, o dos campos separados por tabulador: sólo nombre y forma, sin geometría. No escribir siete campos separados por espacios: se interpretarían como la forma abreviada.

El lector conserva el orden, los nodos y las masas repetidas. En el .dat el bloque queda en GLOBAL.formas:

{"GLOBAL":{"formas":[{"nombre":"R1","forma":"Electrico - hresistor","orientacion":"horizontal","x":4,"y":1,"ancho":3,"alto":1.5}]}}

Es un fragmento del dato, no un circuito completo. FORMAS vacía produce "formas":[]; sin la sección, la clave no existe. Esa diferencia es deliberada:

Entrada Acción de Siru
Sin FORMAS Resuelve el problema sin solicitar esquema.
FORMAS vacía Invoca dibuja para construir el esquema a partir de las ramas y conexiones, con símbolos automáticos.
FORMAS con registros Invoca dibuja y le entrega las formas del dato ya leído.
FORMAS y RK=[-1] Solicita el esquema y resuelve un punto con Calcula; dibujar no implica integrar.
dibuja ausente Continúa el cálculo y deja constancia en .log.
Error de dibuja Avisa y continúa el cálculo.

Para pedir el dibujo automático basta poner, antes de END:

FORMAS
END

dibuja elige símbolos con esta información y escribe NOMBRE.svg junto al circuito. Las formas internas prevalecen, por nombre, sobre las del archivo externo NOMBRE.formas; los nombres no cubiertos internamente pueden seguir tomando la forma externa. Las ramas restantes usan DEFAULTDOMAIN o, si se omite, los símbolos eléctricos automáticos; no se deduce su dominio por mayoría de formas. Para nombres repetidos se toma la primera forma; los registros de nodos se conservan pero todavía no seleccionan símbolos de nodo. --electrico permite pedir explícitamente la representación eléctrica al ejecutar dibuja por separado.

Alcance actual de la geometría: slex transporta orientación, posición y tamaño, pero dibuja usa ELK para distribuir el esquema. Todavía no reproduce las coordenadas, tamaños ni volteos originales de Dia. Siru activa este recorrido para .d, .ds y .dat, también al continuar una corrida; un .din no transporta FORMAS.

Ejemplo completo Contenido
automatico.ds FORMAS vacía: esquema automático.
divisor.ds Divisor de tensión con formas eléctricas y modelos incorporados.
termico.ds Circuito con formas térmicas.

Los esquemas de estos ejemplos se muestran también en la página de Dibuja. Para trasladar la información de Dia: ejecutar dia2formas circuito.dia, insertar el contenido de circuito.formas bajo FORMAS antes de END y conservar sus tabuladores. Para dibujar por separado: dibuja circuito.ds o dibuja circuito.dat; la segunda forma no necesita Calcula, Siru ni el lector .ds.

3.8.1 DEFAULTDOMAIN: dominio de las ramas sin forma

Implementado en el lector, el DAT y la selección de símbolos de Dibuja. Es una cláusula del documento .ds, escrita en una línea propia, sin = ni cierre:

DEFAULTDOMAIN TERMICO
defaultdomain ::= "DEFAULTDOMAIN" dominio
dominio       ::= "TERMICO" | "MECANICO1" | "MECANICO2" | "ELECTRICO" | "HIDRAULICO"

Los valores se escriben en mayúsculas. La biblioteca distribuida define los cinco dominios. MECANICO1 usa fuerza como análogo de tensión y velocidad como análogo de corriente; MECANICO2 usa la correspondencia dual. No son movimiento traslacional frente a rotacional. HIDRAULICO usa presión y caudal volumétrico, no caudal másico. Las definiciones activas y sus alias están en biblioteca/library.siru; un documento puede ampliarlas con UNIDADES Modelo.Clase: unidad,magnitud[,alias].

Dominio V / fuente E I / fuente J R C L
ELECTRICO Tensión, V Corriente, A ohm F H
TERMICO Diferencia V: K; fuente E absoluta: tempC Flujo de calor, W K/W J/K Sin definición térmica
MECANICO1 Fuerza, N Velocidad, m/s Amortiguamiento b, N*s/m Compliancia 1/k, m/N Masa, kg
MECANICO2 Velocidad, m/s Fuerza, N Movilidad viscosa 1/b, m/(N*s) Masa, kg Compliancia 1/k, m/N
HIDRAULICO Presión, Pa Caudal volumétrico, m^3/s Pa*s/m^3 m^3/Pa Pa*s^2/m^3

Estas unidades se deducen de las ecuaciones genéricas V=R*I, I=C*dV/dt y V=L*dI/dt; los valores C y L no se convierten en una rigidez por cambiar de dominio. La numeración mecánica aquí adoptada toma como primera la analogía fuerza–tensión de los apuntes del proyecto (termo/presesimusol/loops.tex, cuadro «analogía»), y como segunda su dual. Como referencia externa sobre variables físicas y conexiones: Through and Across Variables, MathWorks. Esa referencia no define la numeración propia de Simusol.

En térmica hay que distinguir la fuente de temperatura absoluta E (tempC por defecto) de una diferencia de potencial térmico V entre extremos, cuya unidad implícita es K. Una semilla VR1=5 representa una diferencia de 5 K, no 278.15 K. La variable de una fuente E usa la definición de E; las declaraciones explícitas de UNIDADES siguen prevaleciendo. Para declarar otras temperaturas absolutas en Celsius, escribir su unidad expresamente.

Situación de una rama Dominio que se aplica
Tiene una forma con modelo físico identificado El modelo referenciado por esa forma; DEFAULTDOMAIN no lo reemplaza.
No tiene forma, aunque otras ramas sí la tengan El indicado por DEFAULTDOMAIN.
No existe la sección FORMAS, o está vacía DEFAULTDOMAIN se aplica a todas las ramas sin forma.
No tiene forma y se omitió DEFAULTDOMAIN ELECTRICO.

El valor es único para el documento y no depende de que la cláusula aparezca antes o después de las ramas. No se infiere el dominio por mayoría de formas: las ramas sin forma usan el dominio declarado o, en su ausencia, el eléctrico. Los dominios desconocidos y las declaraciones contradictorias deben producir un error, no una elección silenciosa.

El dominio permite consultar en library.siru las magnitudes y unidades implícitas del modelo correspondiente, durante el procesamiento común anterior a Siru. No reemplaza las unidades escritas junto a un número ni las declaraciones de UNIDADES; tampoco cambia las ecuaciones de un tipo de rama explícitamente definido. No crea por sí solo una sección FORMAS ni solicita un dibujo.

Por ejemplo, este fragmento declara un dominio térmico por defecto y una excepción eléctrica explícita para R1; las demás ramas sin forma son térmicas:

DEFAULTDOMAIN TERMICO
FORMAS
R1 Electrico - hresistor
Campo del DAT Contenido
GLOBAL.defaultdomain Dominio declarado, o ELECTRICO si no se escribió la cláusula.
GLOBAL.ramas.R1.dominio Dominio resuelto para esa rama.
GLOBAL.ramas.R1.modelo_unidades Referencia a la definición de la biblioteca; el octavo campo opcional de FORMAS tiene prioridad sobre el nombre de la forma.
GLOBAL.ramas.R1.unidad_modelo Unidad, magnitud y alias implícitos, cuando están definidos para esa clase de rama. Son metadatos de origen, no una afirmación sobre la unidad actual de valor.
GLOBAL.unidades_modelo Definiciones leídas desde library.siru y las ampliaciones locales del documento.
GLOBAL.ramas.R1.unidad_calculo Unidad SI del valor de la rama, unidad de origen y procedencia de la elección.
GLOBAL.unidades_entrada Declaraciones de unidades de variables del documento, independientes de los gráficos.
GLOBAL.unidades_calculo Unidades SI de parámetros, semillas, constantes y variables físicas conocidas; Siru las conserva en sus tablas.

Dibuja ya no usa el conjunto predominante. Para TERMICO usa símbolos térmicos; para ELECTRICO, eléctricos. Los dominios mecánicos e hidráulico sin forma explícita usan por ahora un símbolo genérico, sin rótulos de unidades eléctricas. Las opciones explícitas --termico y --electrico siguen disponibles para el dibujo; esta última ignora las formas, como antes. Un archivo externo .formas afecta al dibujo, no cambia retrospectivamente el dominio físico que Slex resolvió en el DAT; para eso las formas deben estar en el .ds.

Conversión implementada antes de Siru: Slex normaliza a SI las entradas numéricas de ramas de un solo valor, DEFINED_PARAMETERS, semillas de VARIABLES y CONSTANTS. La procedencia se conserva separada de la unidad de cálculo: unidad_modelo describe el modelo; unidad_calculo describe el número ya normalizado. El .din se genera a partir del DAT convertido; cargar ese DAT no repite la conversión. Dibuja rotula los valores normalizados con su unidad de cálculo.

Caso ejecutable: defaultdomain.ds. Las pruebas pruebas/probar-defaultdomain.py cubren los cinco dominios, la omisión, FORMAS parciales y vacías, orden de cláusulas, bibliotecas locales, unidades explícitas, fin de archivo, CRLF, TABLE y errores. Las pruebas de Dibuja comprueban la selección y la ausencia de inferencia por mayoría.

3.9 Unidades y resultados comunes; PARAPLOT para el dibujo

Contrato acordado el 11/10/2026: UNIDADES y RESULTADOS se interpretan en Slex (ds2dat/d2datdinc), al convertir el .ds en .dat, antes de simular con Siru, no solamente antes de dibujar. El lector resuelve las unidades y convierte los datos de entrada a las unidades del cálculo; deja interpretados los pedidos de RESULTADOS para aplicarlos cuando existan los valores de salida. Si Simplot recibe directamente un .ds, debe invocar ese mismo procesamiento común, sin otra implementación de las reglas físicas ni necesidad de simular una tabla de mediciones.

Información Responsabilidad
library.siru Unidades, magnitudes y alias por modelo físico, trasladados desde los cuadros de unidades de Dia. El lector consulta esta biblioteca, no los XML de Dia.
FORMAS Nombre de rama, símbolo, referencia al modelo de unidades, orientación y geometría. No duplica las unidades de la biblioteca ni confunde apariencia con modelo físico.
DEFAULTDOMAIN Selecciona el modelo físico de las ramas sin forma; por omisión, ELECTRICO. Las magnitudes y unidades implícitas se toman de library.siru y las entradas numéricas se convierten a SI, según §3.8.1.
UNIDADES Unidad de origen y magnitud de cada variable, aplicables a toda la cadena antes del cálculo. Sintaxis: VARIABLE: unidad, magnitud.
RESULTADOS Selección y nombres de variables, magnitudes y unidades de salida, también sin gráficos. Admite VARIABLE(nuevo_nombre,magnitud,nueva_unidad), VARIABLE(nuevo_nombre,magnitud), VARIABLE(nuevo_nombre) y el nombre sin atributos. No agrega ecuaciones físicas.
PARAPLOT Cómo dibujar los datos preparados: fuentes, coordenadas, series, ejes y paneles. Simplot conserva los metadatos recibidos; no reinterpreta las reglas físicas.
RESULTADO GRAFICO (previsto, no implementado) Única excepción que permitiría a Simplot intervenir en las unidades: se aplicaría después de Siru, sobre los resultados recibidos y sólo para el gráfico. No modificaría las unidades del modelo, los datos del cálculo ni la tabla original.

Pendiente no prioritario: incorporar RESULTADO GRAFICO. Por ahora se documenta la intención; no se añade al lector ni a Simplot y no debe presentarse como sintaxis ejecutable. No es un sinónimo de RESULTADOS: este último pertenece al procesamiento común anterior a la simulación. PARAPLOT sigue describiendo cómo dibujar; no autoriza por sí solo a reinterpretar las unidades físicas.

PARAPLOT no es obligatorio. Si falta, Simplot usa lo que recibe: las columnas y sus nombres, magnitudes y unidades, incluidos los resultados preparados por el procesamiento común. Puede generar gráficos automáticos a partir de una tabla sola; la primera columna se usa como abscisa por convención y no tiene que ser tiempo. Una sola fila representa un punto. Este dibujo automático no traslada a Simplot la interpretación de UNIDADES ni de RESULTADOS.

Prioridad para interpretar un número Unidad que se usa
1 La escrita junto al número.
2 La declarada para la variable en UNIDADES.
3 La del modelo físico referenciado por FORMAS, definida en library.siru; para una rama sin forma se usa DEFAULTDOMAIN o, si se omite, ELECTRICO (§3.8.1).
4 SI si no hay otra declaración; sin información dimensional no se inventa una magnitud.

Los datos se convierten a las unidades del cálculo antes de entrar al resolvedor; la conversión pedida en RESULTADOS se aplica a la salida, sin reinterpretar la entrada. Las conversiones usan Unidades/GNU units y el procesamiento de tablas usa Tabular2. tempC es temperatura absoluta con desplazamiento; las diferencias y unidades compuestas térmicas usan K, K/W y J/K.

Conversión de entradas: uso y alcance

UNIDADES puede aparecer antes o después de los valores; no necesita RESULTADOS ni solicita gráficos. En las entradas del cálculo sus nombres son exactos: E1:tempF,temperatura declara la unidad del valor de la rama E1; VE1:tempF,temperatura declara la de la variable VE1, no la resistencia ni otros parámetros de la rama. Los nombres V/I (y Q/F cuando corresponden) seguidos del nombre de rama heredan el modelo físico. Las derivadas heredan la unidad por segundo, sin el desplazamiento de temperatura absoluta: si VR1 está en tempF, DVR1 tiene escala 5/9 K/s, no suma 255.37 ni 273.15.

Entrada Interpretación antes de Siru
Rama térmica E1 con valor 25, sin otra unidad 298.15 K.
E1 con valor 77 y E1:tempF,temperatura 298.15 K; UNIDADES prevalece sobre el modelo.
E1 con valor 300 K, aunque UNIDADES diga tempF 300 K; la unidad del número prevalece.
Parámetro sin unidad declarada ni modelo identificable Se conserva como SI; no se inventa una magnitud ni se lo etiqueta como adimensional.
Entrada numérica 20+5 con unidad implícita tempC Se convierte el resultado: (20+5)+273.15, no cada sumando.
Expresión TEMP, con TEMP ya normalizada Se usa TEMP en SI, sin volver a sumar el desplazamiento.

Las expresiones con variables, llamadas a funciones o cantidades explícitas operan en SI; no se infieren unidades para cada coeficiente ni se realiza análisis dimensional simbólico. Para una función que produzca grados Celsius como números, la conversión debe escribirse explícitamente en su definición: no basta declarar la unidad del destino. Las conversiones no afines, si se usan, requieren un valor literal; las expresiones numéricas admiten conversiones afines, incluida temperatura absoluta. Una unidad inválida o dos declaraciones contradictorias impiden publicar un DAT parcial.

Un modelo con varios argumentos no tiene una unidad común deducible para todos ellos. En esos casos se escriben cantidades con unidad en cada argumento, o parámetros previamente normalizados con sus propias declaraciones UNIDADES; no se extiende automáticamente la unidad de R, C, etc. a todos los argumentos. Las tablas mantienen su procesamiento de columnas en Tabular2; este paso no asigna la unidad de una rama a todas las celdas de una tabla ni convierte de nuevo sus datos.

Ejemplo completo ejecutable: unidades-entrada.ds. Declara TEMP=25 con unidad tempC, resuelve X=TEMP y produce ambos valores como 298.15 K. pruebas/probar-unidades-entrada.py comprueba el DAT, el .din y una ejecución real con Siru/Calcula; Siru conserva K en la cabecera de la tabla para evitar una segunda conversión en los consumidores.

Salida común implementada: el lector publica GLOBAL.resultados aunque no haya PARAPLOT. Siru entrega la tabla con unidades de cálculo a preparar-resultados de Tabular2 antes de publicarla, incluso con -nosimplot. Allí se aplican selección, orden, nombres, magnitudes y unidades de salida. La marca por bloque evita aplicar otra vez el mismo contrato. El contrato de transporte y ejemplos de consola describe la correspondencia de columnas y los límites del exportador. El motor gráfico se unifica por separado; debe consumir estos resultados, no reinterpretarlos.

En el transporte histórico, estas secciones se guardan en GLOBAL.simplot; Simplot las procesa cuando los resultados están disponibles. Ese alojamiento de UNIDADES y RESULTADOS es transitorio.

Sección Ejemplo
RESULTADOS TEMP(Interior,temperatura,tempC),PV pide columnas con leyenda, magnitud y unidad de presentación opcionales.
UNIDADES TEMP:K,temperatura declara el origen cuando la tabla no lo trae. No cambia por sí sola las ecuaciones ni convierte números del sistema.
PARAPLOT / GRAFICOS / ACEPTAR_GRAFICOS archivo F = caso.simul, lineas G = F,1:2,3, titulo G = Resultado: una orden por sentencia.
GRAFICOS_ADICIONALES Agrega gráficos a los pedidos principales.
Controles asociados SIMPLOT_VERSION=[2] selecciona el contrato tipado; ANADIR_GRAFICOS=[1] suma los pedidos explícitos a los automáticos. Van en RUN_CONTROLS.

Las órdenes, su prioridad y las conversiones se detallan en los contratos DAT/PARAPLOT y DAT/Simplot v2. Las unidades de presentación no deben confundirse con las cantidades con unidad de §3.1: estas últimas sí se convierten a SI al construir el problema.

3.10 Cómo comprobar la lectura

Con el lector instalado, d2datdinc -v problema.ds -o problema.dat genera el dato y muestra advertencias de sintaxis o compatibilidad. Desde la raíz del árbol de fuentes:

slex/d2datdinc/d2datdinc -v \
  -c slex/d2datdinc/d2datdinc.slex \
  -b slex/d2datdinc/biblioteca problema.ds -o problema.dat
perl siru/bin/siru problema.ds

Algunas construcciones históricas mal escritas se descartan con aviso; por eso generar un .dat no prueba por sí solo que todo lo escrito haya sido utilizado. Revisar los avisos de -v. Siru rechaza un sistema con traducciones pendientes. Para comprobar una regla en el código, la gramática léxica está en d2datdinc.slex; las gramáticas de sentencias, en parametros.y, ecuacion.y, declaraciones.y, control.y, data.y, edef.y y piezas.y del mismo directorio. dato.c implementa la interpretación de secciones y de FORMAS.

4. Un archivo mínimo

Un RC alimentado por una batería, con la resistencia dependiendo del voltaje del capacitor. Da lo mismo en los dos formatos.

.d:

CIRCUIT DESCRIPTION
  Un RC con resistencia no lineal
ELEMENTS
 E1, GND-1 = 1
 R1, 1-2 = 1+0.1*VC1
 C1, 2-GND = 1
OUTPUTS
VC1, IR1
INITIAL CONDITIONS
QC1 = 0
RUN CONTROLS
INTEGRATION ROUTINE = TRAP
STOP TIME = 2
END

.ds:

include biblioteca.siru
CIRCUIT_DESCRIPTION
  Un RC con resistencia no lineal
ELEMENTS
 EB-E1, GND-1 = 1
 RB-R1, 1-2 = 1+0.1*VC1
 CB-C1, 2-GND = 1
OUTPUTS
T:VC1,IR1
DEFINED_PARAMETERS
T=0
TIEMPOFINAL=2
QC1=0
RUN_CONTROLS
RK=[12]
CONTROL_EQUATIONS
T<TIEMPOFINAL
END

En .d, la línea de un elemento es NOMBRE, NODO1-NODO2 = VALOR; en .ds, TIPO-NOMBRE, NODO1-NODO2 = VALORES. La masa es GND. Un .ds tiene que tenerla: sin GND, o con un nodo 0, d2datdinc se para y pide ponerla. Un .d es la entrada de SCEPTRE, que no pide masa, y se acepta sin GND: la masa es el nodo 0, o si no lo hay el nodo más chico (los números por su valor, antes que los nombres), y se avisa por la salida de errores (el .d no tiene nodo GND: la masa es el nodo 1). La corriente de la rama va del primer nodo al segundo y su tensión es u(NODO1) - u(NODO2). Una fuente de tensión E1, GND-1 = 1 pone el nodo 1 a +1 V.

5. Los elementos

5.1 La biblioteca (slex/d2datdinc/biblioteca/libraryori.siru)

tipo qué es modelo estado
RB resistencia V = x1·I
CB capacitor, x1 la capacidad total Q/V dQ/dt = I, Q = x1·V la carga Q
CINC capacitor, x1 la capacidad incremental dQ/dV; CINC1, 1-GND = … I = x1·dV/dt el voltaje V
LB bobina V = x1·dI/dt la corriente I
EB fuente de tensión V = x1 (E1, GND-1 = 1 pone 1 V en el nodo 1)
JB fuente de corriente I = x1
SB llave V·x1 + I·(1-x1) = 0; x1 es 1 cerrada, 0 abierta
ESIN fuente senoidal, ESIN1, GND-1 = A, T V = A·sin(x2), con su derivada
MW devanado de un transformador con núcleo, MW1, 2-GND = N, DPHI1 V = N·dPHI/dt
LNL bobina no lineal, LNL1, 2-3 = L, n L·dI/dt = V^n I
RC, EC, JC lo mismo que RB, EB, JB

Los dos capacitores. Con capacidad constante CB y CINC dan lo mismo. Con una capacidad que depende del voltaje (o de una corriente que depende del voltaje) no, porque el número significa otra cosa:

Un .d escrito para SCEPTRE con capacidades variables hay que correrlo con CINC para que dé lo mismo: en un .d es CINC toda rama cuyo nombre empiece con CINC (para SCEPTRE es un capacitor más); las demás C… son CB. En un .ds, CINC-C1, 1-GND = …. La misma capacidad en los dos: c(V) = 1 + 0.2·V² cargada a 10 V por 1 Ω da, en t = 4, V = 4.74 con CB y 6.17 con CINC (y con SCEPTRE). CINC no puede estar en un lazo de capacitores: no tiene la carga como estado. Ejemplos: slex/d2datdinc/pruebas/sceptre/dos-capacitores.d (los dos lado a lado) y a01-cinc.d (el inversor a01 con CE y CC como CINC: igual a SCEPTRE; con CB, a01-tabla2.d, difiere de 6 a 15 %).

Los nombres R, E, J, S, L, C sin la B son de una biblioteca vieja por incrementos y no sirven para siru: una C o una L así en un .ds da el mensaje «modelo por incrementos». Usar CB, LB.

5.2 Lo que un elemento puede nombrar en su valor

en el archivo qué es
un número el valor, constante
PL un parámetro de DEFINED PARAMETERS (PL = 22); dos ramas que nombren PL comparten el valor
VC1, IR1, QC1, IL1 la tensión, la corriente, la carga, la corriente de otra rama (o de la misma): así se escriben los elementos no lineales y las fuentes controladas
T el tiempo
DT, TICK el paso en uso y la cantidad de pasos dados (los pone el simulador, el archivo no los fija)
QC(PC,VC1) una función de FUNCTIONS
T1(T), TABLE 1 (T), Table('tabla.txt','X','Y',T,1) una tabla (sección 9)
sin, cos, exp, log, abs, sqrt, if(c,a,b), <, >, and, or… lo que entiende ExprTk

Las expresiones van en notación de ExprTk: la multiplicación es * y no se sobreentiende (2*(x+1), no 2 (x+1)); ^ es la potencia; una condición vale 1 o 0, así que (T<1)+(T>3) es «antes de 1 o después de 3».

Ejemplos en sintaxis .d (las explicaciones a la derecha son comentarios de documentación; en un archivo .ds requieren #, y las ramas, su tipo explícito):

 R1, 1-2 = 1+0.1*VC1              resistencia que depende del voltaje del capacitor
 C1, 2-GND = 1+0.5*VC1            capacidad que depende de su propio voltaje
 E2, GND-3 = 2e5*VR1              fuente de tensión controlada (amplificador)
 J2, GND-3 = 0.98*IR1             fuente de corriente controlada
 E3, GND-4 = 0.5+0.2*sin(3*T)     fuente que varía en el tiempo
 ESIN1, GND-1 = 1, 6.28*T         la senoidal de la biblioteca: amplitud y fase
 J3, GND-5 = 1e-13*(exp(38*VJ3)-1)  un diodo: fuente de corriente función de su tensión

5.3 Tipos propios

Un modelo nuevo se declara en ELEMENT DEFINITION (.d) o ELEMENT_DESCRIPTION (.ds, que es la sección de una biblioteca): el nombre con la cantidad de parámetros, y las ecuaciones en VOLTAGE, CURRENT, sus derivadas DVOLTAGE, DCURRENT, y la carga CHARGE, DCHARGE; x1, x2… son los valores que da la línea del elemento, separados por & en .ds y por comas en .d.

ELEMENT DEFINITION
   EV(2) = IF: VOLTAGE, VOLTAGE + x1, DVOLTAGE + x2     fuente con su derivada
   MZER(1) = 0                                           elemento nulo
   RQ(1) = VOLTAGE - x1 * CURRENT^3                      resistencia cúbica

5.4 Modelos de SCEPTRE (sólo .d)

MODEL 101M (B-C-E) bajo MODEL DESCRIPTION, o los permanentes de slex/d2datdinc/biblioteca/modellib.siru (T1, 2-3-1 = MODEL 2N2222 (PERM)): subcircuitos con patas que se expanden donde se usan; cada elemento interno lleva el nombre de la instancia como sufijo (CET1). Diodos: DIODE EQUATION (Is, T) es Is*(exp(T*VJ)-1). Ejemplos en slex/d2datdinc/pruebas/sceptre/modelo.d y diodos.d.

La definición de un subcircuito .d se abre bajo MODEL DESCRIPTION; CIRCUIT DESCRIPTION devuelve la lectura al circuito principal. No poner END entre ambos, porque termina la fuente. Ejemplo mínimo de modelo resistivo:

MODEL DESCRIPTION
MODEL DIVISOR (TEMP) (A-B-M)
ELEMENTS
R1,A-M=1000
R2,M-B=1000
CIRCUIT DESCRIPTION
Divisor encapsulado
ELEMENTS
E1,GND-1=10
T1,1-GND-2=MODEL DIVISOR
OUTPUTS
VR2T1
RUN CONTROLS
RUN INITIAL CONDITIONS ONLY
END
Parte Regla de modelos .d
MODEL NOMBRE (TEMP) (A-B-M) Modelo local con terminales externos en ese orden; se admite la cabecera sin (TEMP).
T1,1-GND-2=MODEL DIVISOR Conecta A a 1, B a GND y M a 2. Deben coincidir la cantidad y el orden de terminales.
MODEL 2N2222 (PERM) Selecciona la biblioteca permanente modellib.siru, cargada por el lector de .d.
(CHANGE R1 = 2000) Modifica elementos o parámetros de la instancia; las expresiones de cambio se conservan tal como se escriben.
Nombres interiores R2 en T1 pasa a R2T1; un nodo interno 7 pasa a 7T1. También se distinguen parámetros, funciones y tablas; GND sigue siendo común.
Observación Pedir VR2T1 desde el circuito principal. Los OUTPUTS internos no se agregan automáticamente.
Ámbito Se busca primero el modelo local, salvo (PERM). Un modelo ausente no se sustituye por otro. Esta expansión de subcircuitos es una capacidad .d, diferente de los tipos de rama de .ds.

5.5 Convolución: una caja descripta por su respuesta (K)

Una parte del circuito se puede dar por cómo responde en lugar de por sus elementos: su respuesta al impulso h(t), por tabla o por ecuación. Es la convolución de SCEPTRE (manual, volumen 1, apéndice F), con la diferencia de que la respuesta va en el mismo archivo y no en el «Disk 12».

.d                                          .ds
ELEMENTS                                    ELEMENTS
 K1, 1-GND = FCONVE (H1)    impedancia       KE-K1, 1-GND = H1
 K2, 3-4 = FCONVJ (H2)      admitancia       KJ-K2, 3-4 = H2
FUNCTIONS                                   FUNCTIONS
 TABLE H1                   por tabla        TABLE H1
  0, 2,  0.05, 1.9025, ...                    0, 2,  0.05, 1.9025, ...
 H2 (T) = EXP(-2*T)         por ecuación     H2(1) = exp(-2*x)

Una caja de varias puertas se arma, como en SCEPTRE, con un K entre cada par de nodos. Por dentro, como SCEPTRE, el elemento es una fuente (la historia, lo ya calculado) en serie con una resistencia (el último tramo, que depende de la corriente desconocida): v = e + r·i. siru guarda la historia en cada paso aceptado y calcula e y r para cada etapa del Runge-Kutta, suponiendo h e i lineales entre puntos (la fórmula F.9 del manual, exacta para esa suposición): el error es del orden del cuadrado del paso. Si el circuito no tiene otros estados, el .din lleva un estado reloj (conv_reloj, derivada 1) para que haya algo que integrar.

Cuidados:

Ejemplos, con su prueba en tests/convolucion.t: en siru/corpus/corpus/inventados, la caja RC escrita (caja-rc.ds) y como K por ecuación y por tabla (caja-k-ecuacion.ds, caja-k-tabla.ds); la caja RL escrita (caja-rl.d) y como FCONVJ (caja-kj.d). El plan y las fórmulas: PLAN_CONVOLUCION.md.

6. Llaves

Una llave es un elemento SB (S1 en un .d) cuyo valor es su condición: 1 (o verdadero) cerrada, 0 abierta.

 S1, 2-3 = T<1                       .d
 SB-S1, 2-3 = (T<1)+(T>3)            .ds
 S2, 3-GND = VC1>0.5                 por una variable del circuito

La condición puede usar cualquier variable del circuito, los parámetros y T. Se evalúa al empezar cada paso; si cambia en medio de un paso, la llave cambia en el siguiente. Cada combinación de llaves es una configuración, y su sistema se arma la primera vez que se entra en ella (quedan los .mdin). Una llave abierta puede dejar nodos sin camino a masa (una isla): se les fija potencial cero y no es error. Ejemplos: slex/d2datdinc/pruebas/isla.d, llave-lazo.ds, llave-corte.ds.

6.1 Llaves o if(...): la diferencia

Las dos eligen entre ecuaciones según una condición. La diferencia es cuándo se decide y qué pasa en el salto.

llave (SB, S1) if(c, a, b) en una ecuación
cuándo se evalúa la condición una vez, al empezar cada paso (el sistema del instante) en cada iteración de Newton y en cada etapa del Runge-Kutta
durante el paso la configuración queda fija: un sistema suave, sin saltos puede cambiar de rama en medio del paso, o ir y volver entre dos iteraciones
el salto siru lo resuelve: trasvase de carga o flujo y equilibrio (-I.mdin, -E.mdin) no hay tratamiento: los estados siguen como estaban
para qué sirve cambios de topología, donde los estados pueden saltar leyes por tramos con los estados continuos
robustez buena: cada configuración es su propio sistema más frágil: cerca del cambio, con paso grande, Newton puede oscilar entre las ramas

Un ejemplo de if es el cambio de fase (siru/corpus/corpus/perl/cambiofase.ds): la entalpía es continua y sólo cambia la ley, calor sensible fuera del intervalo de fusión y latente adentro. Las llaves de hoy son ramas de un circuito, así que un sistema sin circuito, como ese, sólo puede usar if.

if, and, or, not y xor pasan tal cual al .din (desde r1899) y Calcula los evalúa con ExprTk. Un estado se puede declarar TEMP=0 D:DTEMP en DEFINED_PARAMETERS con la derivada dada por una ecuación de EQUATIONS (desde r1901), como en cambiofase.ds: la temperatura sube hasta la de fusión, se queda ahí mientras funde y después sigue subiendo.

7. Lazos de capacitores y cortes de bobinas

Dos capacitores en paralelo, un capacitor en paralelo con una batería, o una malla de capacitores y baterías, es un lazo: los voltajes no son independientes. Bobinas en serie en un nodo sin otra salida, o con una fuente de corriente, es un corte: las corrientes no son independientes. No hay nada que escribir: siru los encuentra, integra con la ley del lazo (o del corte) en derivadas, y cuando una llave hace aparecer un lazo o un corte con los estados desparejos hace el equilibrio —el trasvase instantáneo de carga o de flujo— y escribe una fila más con el mismo t. En el .simul se ve como un salto.

Al arrancar, si una fuente impone un estado —una bobina en serie con una fuente de corriente, un capacitor en paralelo con una batería— y el archivo no da su condición inicial, el estado arranca con lo que impone la fuente y no hay salto (arranque: il44 = 10 (lo impone una fuente y el archivo no da su condicion inicial)); es lo que hace SCEPTRE. Si el archivo la da (IL44 = 0), hay equilibrio como en cualquier otro caso: la bobina salta a 10 y las acopladas con ella reciben el golpe.

Una fuente que varía adentro de un lazo o un corte entra con su derivada: la del modelo si la trae (EV, ESIN), y si no la numérica. En un lazo la capacidad puede ser constante o depender del voltaje de capacitores:

Si depende de otra cosa (el tiempo, una corriente cualquiera), en un lazo es un error que lo dice. Ejemplos: siru/corpus/corpus/llaves/*.d, slex/d2datdinc/pruebas/capacidad-variable.d, slex/d2datdinc/pruebas/sceptre/lazo-c-ajeno.d.

El estado de un capacitor es su carga, Q = C·V, y la corriente es dQ/dt: con una capacidad variable eso incluye el término V·dC/dt. SCEPTRE hace otra cosa: integra I = C·dV/dt, con C evaluada en el punto (la capacidad incremental). Con capacidad constante es lo mismo; con capacidad variable los resultados difieren y no es un error de ninguno de los dos: en slex/d2datdinc/pruebas/sceptre/c-variable.d (C1 = 1 + 0.2·VC1² cargado a 10 V por 1 Ω) SCEPTRE da VC1 = 6.17 en t = 4 y siru 4.74. Para escribir en siru la capacidad incremental de SCEPTRE c(V) hay que dar C = (1/V)·∫c dV (para c = 1 + 0.2·V², C = 1 + 0.2·V²/3): con eso siru da lo mismo que SCEPTRE (c-variable-q.d: 6.166829 contra 6.166827).

Con lazos o cortes, el punto de operación (11 bis) se resuelve en un sistema aparte, NOMBRE-[bits]D.mdin: el instante con las ecuaciones originales en lugar de las leyes derivadas, que con las derivadas en cero no atan nada.

8. Acoplamientos magnéticos

Inductancia mutua, como en SCEPTRE: una línea M, L1-L2 = valor entre dos bobinas LB que ya existen. Agrega M·dI2/dt a la tensión de L1 y viceversa. Si una llave abre la rama de una de las dos, la otra recibe el golpe: ΔI2 = (M/L2)·I1 (se conserva el flujo concatenado).

 L1, 2-GND = 1
 L2, 3-GND = 4
 M,  L1-L2 = 1.8

Transformador con núcleo: cada devanado es un MW con sus vueltas y la derivada del flujo del núcleo; el flujo es un estado propio y la fuerza magnetomotriz una ecuación propia (sección 10).

ELEMENTS
    MW1, 2-GND = 1, DPHI1          N1 = 1 vuelta
    MW2, 3-GND = 2, DPHI1          N2 = 2 vueltas
VARIABLES
    DPHI1 = 0
EQUATIONS
    1*IMW1 + 2*IMW2 - REL*PHI1     N1·I1 + N2·I2 = reluctancia · flujo
DEFINED PARAMETERS
    REL = 1
    PHI1 = 0

REL puede ser una expresión (un núcleo que satura). Ejemplos: slex/d2datdinc/pruebas/mutua.d, nucleo.d, siru/corpus/.../trafo*.d.

9. Funciones y tablas

FUNCTIONS: NOMBRE(args) = expresión. En un .d los argumentos llevan nombre. En un .ds se puede declarar la cantidad y llamarlos x, y, z…; también se admite la lista explícita de nombres de §3.5.

FUNCTIONS                              .d
QC(PC,V) = PC*(1+0.1*V)

FUNCTIONS                              .ds
QC(2) = x*(1+0.1*y)

Hasta 6 argumentos las compila Calcula; con más, d2datdinc reemplaza cada llamada por el cuerpo de la función, así que andan igual. Las constantes de CONSTANTS se pueden usar adentro.

Tablas: una función de una variable dada por puntos, interpolada (lineal; un x repetido es un salto). Si la tabla se evalúa en el tiempo, como TABLE 1(TIME), cada salto es un punto de quiebre de la corrida. siru corta el paso justo antes del salto y lo cruza con un paso mínimo, así ningún paso promedia el valor de antes con el de después. La salida muestra el salto en dos filas, una a cada lado (Integrador, r2104; siru/corpus/EXACTAS.md). Vale también para una tabla en archivo aparte, y para funciones que saltan en el tiempo, aunque el tiempo esté transformado de forma lineal: if(T<1,...), if(4*T-2 < 2,...), T < TCORTE con un parámetro, sgn(T-1), mod(T,2), T % 3, floor(T/2), una tabla evaluada en 2*T+1, o una función propia evaluada en T que haga eso. Vale con Runge-Kutta, con GLM y con PGLM. En un método multipaso, como BDF2, el paso que cruza el salto y el siguiente se dan como el primero de la corrida. Lo que no se reconoce, como sin(T) > 0.5 o un salto de una variable del circuito, pierde medio paso en cada salto. Ejemplos: siru/corpus/corpus/inventados/salto-*.ds.

FUNCTIONS                              .d: adentro del archivo
TABLE 1
  0,0, 1,1, 2,0
ELEMENTS
 E1, GND-1 = TABLE 1 (T)              o T1(T), o XTABLE(T1, VC1)

ELEMENTS                               .ds: en un archivo de dos columnas
 EB-E1, GND-1 = Table('tabla.txt','TIEMPO','DATO',T,1)

Desde el 02/10/2026 un .ds también acepta la forma de SCEPTRE, con la tabla adentro del archivo: en FUNCTIONS TABLE 1 y debajo los pares (o TABLE 1, 0,0, 1,1, 2,0 en una línea), y en el valor TABLE 1 (T) o TABLE 1(TIME). La forma corta T1(T) en un .ds sólo vale si la tabla ya se leyó (antes de ELEMENTS); si no, se toma por una función. Ejemplo: siru/corpus/.../needsderiJ.ds, que da lo mismo que su .d.

Sección TABLE general (lectura textual implementada): en .d y .ds se puede incorporar una tabla al mismo documento que RESULTADOS o PARAPLOT. Slex guarda las líneas de la tabla, incluidos comentarios de cabecera y cifras, en GLOBAL.tablas del DAT sin redondearlas. La sección termina al empezar otra sección reconocida, en END o en EOF; no requiere END TABLE, DOCUMENT, nombre de archivo ni extensión. TABLE o TABLE FORMATO=CSV usan el nombre lógico SIMULADO. Para varias fuentes, usar nombres distintos: TABLE MEDIDAS FORMATO=CSV, TABLE CALCULO FORMATO=SIMUL. Los formatos textuales declarables son SIMUL, CSV y TEXTO; sin declaración se usa SIMUL. En .d, TABLE NOMBRE sin FORMATO= sigue siendo la tabla histórica de pares de SCEPTRE; en .ds, un nombre alfabético sin formato es general. El lector no interpreta las columnas: esa tarea corresponde a Tabular2. El adaptador DAT→Tabular2 y el consumo gráfico de tablas incorporadas aún faltan; por tanto el siguiente ejemplo prueba la lectura al DAT, no el dibujo automático:

TABLE
# T A B
0 20 18
1 22 19
RESULTADOS
A,B

Una entrada estándar con esas secciones seguirá siendo un único .d o .ds; el programa deberá recibir el dialecto por opción, porque stdin no tiene extensión. END conserva su sentido histórico de fin de fuente: si se usa, va después de todas las secciones que se quieran leer. Siru, Simplot y los demás consumidores deben compartir el dato producido por el mismo lector, sin una segunda gramática de tablas.

Para Simplot, PARAPLOT es una sección opcional del .ds, no un tipo de archivo independiente. El contrato de entrada comprende las siguientes organizaciones; no implica que todos los consumidores hayan implementado ya cada recorrido:

Organización Descripción
.ds autocontenido Una o más secciones TABLE, con PARAPLOT para el pedido explícito o sin PARAPLOT para el dibujo automático.
.ds y tablas externas Uno o más archivos de tablas, identificados por el documento; la fuente homónima puede ser implícita.
Entrada estándar El mismo documento textual con todas sus tablas incorporadas, antes o después de PARAPLOT. No requiere DOCUMENT ni END.

Los ejemplos ejecutables están en simplot/corpus/entradas-ds/. Las pruebas recorren Slex → DAT → Tabular2 → Simplot con archivos separados, tablas incorporadas y stdin textual. El protocolo JSON anterior sigue disponible por compatibilidad, pero el pipe actual de Siru utiliza TABLE y PARAPLOT en texto.

Contenido binario incorporado (pendiente): un .d o .ds sigue siendo texto; por eso una tabla binaria deberá codificarse, por ejemplo en base64, dentro de TABLE. El DAT debe indicar por separado el nombre lógico de la fuente, el formato original, la codificación y el contenido; no debe presentar el texto base64 como si fueran filas numéricas. El adaptador decodificará los bytes y los entregará al lector de Tabular2 con su longitud explícita. Ese lector especializado, no el lexer de Slex, interpretará POS4 u otro formato binario. Falta definir y probar la sintaxis exacta de la declaración y el delimitador del bloque codificado; este párrafo no habilita aún ninguna entrada binaria en .ds.

Nombre de la tabla producida: al ejecutar NOMBRE.ds, Siru emite TABLE NOMBRE FORMATO=SIMUL mediante --documento, sin ruta ni extensión. No toma el nombre de un archivo de salida alternativo, ni agrega sus sufijos: caso.ds sigue identificando la tabla caso aunque la salida se guarde como caso-1.simul. El pipe actual a Simplot transmite ese mismo nombre en el campo tabla de su cabecera. Los nombres conservan mayúsculas, guiones y puntos; con FORMATO= también pueden comenzar por un número. La referencia implícita histórica SIMULADO de PARAPLOT se conserva por compatibilidad. La tabla numérica .simul sigue en su formato habitual; TABLE NOMBRE es el encabezado de sección al incorporarla a un documento.

Estado del recorrido: Slex produce GLOBAL.tablas y vincula las fuentes gráficas con sus tablas incorporadas. Simplot materializa privadamente esos datos en su formato declarado y los carga mediante Tabular2; no implementa otra interpolación ni otro lector numérico. Siru emite la fuente con su tabla nombrada mediante --documento y transmite a Simplot un documento gráfico textual. Las tablas SCEPTRE de pares siguen por su ruta histórica. El binario codificado dentro de .ds continúa pendiente; los archivos externos se pueden normalizar con Tabular2 antes de incorporarlos.

El archivo tabla.txt es de tabular2: una línea #TIEMPO DATO y las filas; su ruta es relativa al .ds (o al directorio de arriba, como corría Siru). Las x tienen que ir creciendo. Table() también se puede usar adentro de una función. Ejemplos: slex/d2datdinc/pruebas/tablas.d, siru/corpus/.../tabla.ds.

Funciones en Fortran: EXTERNAL. Una función escrita en Fortran, en un .f90, .f o .for aparte (la "External Function" del manual de SCEPTRE, 2.2.2 y 2.7), se declara en FUNCTIONS con su nombre, su cantidad de argumentos (de 1 a 12) y la ruta del fuente, relativa al .d o al .ds:

ELEMENTS                               .d
 E1, GND-1 = FGEN (0., 5., 20., 40., 100., 100., 300., 2., TIME)
 L2, 2-GND = FCOR (IL2, IR1, 25., 100.)
FUNCTIONS
 EXTERNAL FGEN (9) fgen.f90
 EXTERNAL FCOR (4) fcor.for

El fuente tiene que ser una FUNCTION de doble precisión, con los argumentos por referencia, que es lo normal en Fortran:

      FUNCTION FCOR(IL, IR, L0, ISAT)
      DOUBLE PRECISION FCOR, IL, IR, L0, ISAT
      FCOR = L0 / (1D0 + ((IL + IR)/ISAT)**2)
      END FUNCTION

d2datdinc lleva la declaración al .din (sección externas, con la ruta absoluta); Calcula compila el fuente con gfortran -shared -fPIC -O2 a un .so en ~/.cache/calcula/externas, lo vuelve a compilar si el fuente cambia, lo carga y llama a fgen_, el nombre en minúsculas con el _ que le pone gfortran. También acepta un .so ya compilado como ruta. Hace falta gfortran donde se corre, y CALCULA_EXTERNAS=1 en el entorno: es código de afuera, y Calcula no lo carga sin ese permiso. Por eso Puyuspa, que corre archivos de cualquiera, no ejecuta un ejemplo con funciones externas salvo que se lo instale en el servidor. Los mensajes de error están en la sección 13. Ejemplo: siru/corpus/corpus/fortran/subprograma.d, con fgen.f90 y fcor.f90.

ETABLE: una tabla en un archivo aparte, por número. Es la forma de SCEPTRE y Simusol: ETABLE(N, X, Y, V, M) es la tabla número N, interpolada en V, con las abscisas en la columna X y los valores en la columna Y (contadas desde 0) y el método M (1 lineal, 2 spline). Qué archivo es cada número lo dice etable.txt, junto al archivo, con una línea número archivo por tabla:

DEFINED PARAMETERS                     con_FOR.d
PP = X1(ETABLE(2,0,2,TIME,2))

2 con_FOR.etable                       etable.txt

siru la tiene de dos maneras. La normal: no hay que declarar nada; libdin la traduce a tabla('con_FOR.etable','0','2',t,2) de Calcula (desde calcula 6.0-34, que acepta las columnas por número). La de Fortran: si el archivo la declara EXTERNAL ETABLE (5) RUTA/tabular2/fortran/etable.f90, se llama a esa función —la misma que enlaza SCEPTRE—, con CALCULA_EXTERNAS=1. Las dos dan lo mismo. Ejemplos: siru/corpus/corpus/fortran/con_FOR_1.d (la normal) y con_FOR_1.ds (la de Fortran).

Un archivo sin circuito ni estados que pide una corrida —una tabla o una función a lo largo del tiempo, como esos— se resuelve punto por punto, con el paso de SIRU_PASO, o el de MAXIMUM STEP SIZE en un .d, o la milésima parte del tiempo final (11); la salida lleva el tiempo y los OUTPUTS.

10. Ecuaciones propias, estados propios, parámetros

Un circuito puede traer ecuaciones además de las suyas, y un archivo puede no tener circuito y ser sólo ecuaciones.

Un sistema sin circuito:

CIRCUIT_DESCRIPTION
  y'' = -y
VARIABLES
DY1=0
DY2=0
EQUATIONS
DY1-Y2
DY2+Y1
OUTPUTS
T:Y1,Y2
DEFINED_PARAMETERS
T=0
TIEMPOFINAL=3
Y1=1
Y2=0
RUN_CONTROLS
RK=[12]
CONTROL_EQUATIONS
T<TIEMPOFINAL
END

Ejemplos: slex/d2datdinc/pruebas/propias.d, parametros-propios.d, nucleo.d, nulo.d.

11. La corrida

Composición de subflujos (SPLIT)

Se declara cómo avanzar cada subproblema, no solamente su derivada. Para el oscilador Q'=P, P'=-Q, A mueve Q manteniendo P y B mueve P manteniendo Q. En RUN_CONTROLS de un .ds:

SPLIT=[2]
SPLIT_AUTONOMO=[1]
SPLIT_EXACTOS=[1]
SPLIT_A=[Q,Q+SPLIT_H*P,P,P]
SPLIT_B=[Q,Q,P,P-SPLIT_H*Q]
SIRU_PASO=[0.1]
SIRU_ADAPT=[0]
Selector Orden de ejecución de subavances Orden esperado con subflujos exactos suaves
SPLIT=[1] A(h), luego B(h) 1 (Lie–Trotter)
SPLIT=[2] A(h/2), luego B(h), luego A(h/2) 2 (Strang)

Cada lista debe incluir una expresión para todos los estados, incluso los que se conservan. Las expresiones de un mismo mapa se evalúan simultáneamente sobre su estado de entrada. SPLIT_H es la duración de ese subavance: no es el tiempo físico ni el paso completo. Se permite aritmética + - * / ^ y paréntesis con estados y parámetros constantes. No se admiten referencias al tiempo, derivadas, variables algebraicas, funciones o tablas en estos mapas iniciales.

SPLIT_AUTONOMO=[1] y SPLIT_EXACTOS=[1] son declaraciones del autor: los mapas deben ser flujos exactos de las partes del modelo y valer la identidad con duración cero. El programa verifica forma, nombres y capacidades, no demuestra esas propiedades matemáticas. Reemplazarlos por un Euler aproximado puede perder el orden dos de Strang. El modelo residual completo se conserva y Calcula lo resuelve en los estados intermedios; debe ser válido allí.

En .d se escriben SPLIT AUTONOMO, SPLIT EXACTOS, SPLIT A, SPLIT B (con espacios), y los controles habituales STARTING STEP SIZE y SIRU ADAPTIVE STEP = 0. El ejemplo lc-strang.d declara mapas de QC1, la carga que libdin usa como estado, aunque pide VC1 como salida; C=L=1. También están oscilador-1.ds y oscilador-2.ds.

La cadena es .d/.ds → d2datdinc --din → NOMBRE-de-d2datdinc-SPLIT1.din o -SPLIT2.din → siru. El .din contiene las ecuaciones de ambos mapas y un descriptor # split v1 con su secuencia, estados y salidas; no requiere fuente, .dat ni catálogo. split_h y split_flujo son datos internos de Calcula, split_p_estado es la salida del mapa y p_estado es la salida virtual del paso completo. Los prefijos split_ y p_ están reservados.

Solo se confirma el reloj y se escribe una fila al terminar toda la secuencia. Los tiempos internos no se suman: A(h/2), B(h), A(h/2) representan un único paso físico h, no 2h. Un fallo de subflujo aborta sin publicar trayectoria parcial. El informe cuenta pasos completos, subavances y consultas; se aceptan último paso acortado y --paso-factor.

Límites: un selector, paso fijo positivo, modelo autónomo, dos flujos declarados exactos, sin adaptación, .mdin, llaves, eventos, convolución, DT/TICK, DC/AC, RERUN/CONTINUE, funciones propias o externas ni tablas internas o externas. Quedan para otra ampliación los subflujos aproximados, sus tolerancias, pasos negativos, más particiones y el tiempo no autónomo. El núcleo genérico es Siru::Composicion, y Siru::SPLIT lo conecta con el conductor transaccional y Calcula. Pruebas: prove -Ilib tests/split_nucleo.t tests/split.t.

GLM fijo o adaptativo

GLM=[1] selecciona Euler explícito, [20] BDF2 efectivo, [21] BDF2 directo y [30] Adams–Bashforth 2. Son IDs propios del catálogo GLM, no índices RK. Solo se admite uno por corrida, con .din simple, sin llaves, lazos/cortes, convoluciones ni RERUN. El artefacto generado contiene el descriptor y se ejecuta sin fuente ni .dat.

En RUN_CONTROLS de un .ds, por ejemplo:

GLM=[21]
SIRU_ADAPT=[1]
SIRU_PASO=[0.1]
SIRU_PASO_MIN=[1e-8]
SIRU_PASO_MAX=[0.2]
SIRU_ABSOLUTO=[1e-5]
SIRU_RELATIVO=[0]
SIRU_ORDEN_ERROR=[2]

En .d se usan los controles con espacios de la tabla de abajo. [0] en SIRU_ADAPT conserva el modo fijo. En adaptación, el orden del estimador debe ser 2: se compara BDF2/AB2 con un paso Euler desde el mismo estado confirmado; el arranque/Euler se comparan con dos medios pasos Euler. Se acepta siempre el candidato principal. Es una primera política conservadora, no BDF de orden variable ni una garantía de error global. Un fallo de Calcula aborta; el rechazo por tolerancia no mueve historia ni tiempo. No se admite DT/TICK dentro del modelo adaptativo.

Los .din nuevos usan contrato GLM v2; los v1 archivados conservan el paso fijo y deben regenerarse para activar adaptación. estadisticas ultima integracion: en el .informe registra intentos, aceptaciones, descartes y consultas del conductor, incluyendo las de comparación. En RERUN/CONTINUE de otros motores describe la última integración, no la suma de corridas. ROS conserva su registro estadisticas ROS:. Fórmulas, límites y ejemplos en GLM_CONTRATO.md.

Partición explícita e implícita (PGLM / IMEX)

Selector Método Orden
PGLM=[1] Euler IMEX 1
PGLM=[2] ARS(2,2,2) 2

La partición se declara en RUN_CONTROLS, junto con un paso fijo positivo:

PGLM=[2]
IMEX_EXPLICITA=[X,-X]
SIRU_PASO=[0.01]
SIRU_ADAPT=[0]

Para X'=-11*X, la parte explícita anterior es -X; la implícita queda definida como el campo completo menos la parte explícita, en este caso -10*X. No son dos corridas independientes. IMEX_EXPLICITA lleva pares estado,expresión para todos los estados reales; en un capacitor CB el estado es QC1, no VC1. Consultarlos con d2datdinc --topologia.

Regla Alcance
Expresiones de la partición Números finitos, estados, parámetros y tiempo, operadores + - * / ^ y paréntesis.
Expresiones excluidas Funciones, comas interiores, variables algebraicas, derivadas y DT. Las ecuaciones del modelo completo conservan su propio lenguaje.
Selección Una sola familia y un solo ID; no combinar PGLM con RK, GLM, ROS o SPLIT.
Paso Fijo, con último paso acortado; no adaptación ni listas de métodos.
Modelo Campo diferencial determinado por tiempo y estados; no se garantiza resolver DAE arbitrarias ni de índice alto.
Combinaciones no admitidas Llaves, lazos/cortes que requieren .mdin, convoluciones, DT y RERUN.
Forma .d IMEX EXPLICITA = [X,-X], STARTING STEP SIZE = 0.01, SIRU ADAPTIVE STEP = 0.

El .din generado conserva el descriptor y las tablas, de modo que puede ejecutarse sin la fuente ni el catálogo. La separación explícita conserva sus restricciones de estabilidad. El contrato completo y los límites están en IMEX y ARS222.

Rosenbrock (extension ROS)

ROS=[1] en RUN CONTROLS (.d) o RUN_CONTROLS (.ds) selecciona ROS2 de orden dos. Es excluyente con RK, GLM, PGLM e IMEX_EXPLICITA. SIRU ADAPTIVE STEP = 0 en .d o SIRU_ADAPT=[0] en .ds selecciona paso fijo; con 1 usa el estimador embebido ROS2 2(1), las tolerancias SIRU y los limites de paso existentes. El orden del error es 2. No admite todavia llaves, lazos/cortes, convoluciones, DT/TICK, paradas adicionales, inicializacion algebraica, analisis DC, sensibilidad, Monte Carlo, peor caso, RERUN ni CONTINUE.

El archivo generado termina en -ROS1.din y se puede ejecutar sin su fuente; incluye OUTPUTS si se pidieron. El motor consulta el campo diferencial en Calcula, calcula un Jacobiano por diferencias y resuelve las etapas lineales. No usa la numeracion RK ni supone que el Jacobiano de Newton sea el de la ecuacion diferencial. Detalles y precauciones de escalas y precision en ROS.md.

Los din nuevos usan descriptor ROS v2 fijo o v3 adaptativo, con escalas configurables y comprobacion de diferencias a dos perturbaciones; los v1 archivados conservan el comportamiento anterior. En .ds: ROS_ESCALAS=[X,1e-6,Z,1e6], ROS_ESCALA_TIEMPO=[1], ROS_DELTA=[1e-4], ROS_CONTROL_JACOBIANO=[1e-6,1e-3,3]. En .d los nombres llevan espacios en lugar de guiones bajos. Estas opciones controlan la diferenciacion numerica, no activan adaptacion temporal ni cambian la precision interna de Calcula. v3 agrega la seccion adaptacion y los errores virtuales e_estado; solo publica pasos aceptados. Fallos del campo/Jacobiano abortan, no se ocultan reduciendo el paso temporal.

Con adaptacion activa, ROS_TOLERANCIAS=[X,1e-11,1e-4,Z,10,1e-4] declara grupos estado, absoluta, relativa; en .d se llama ROS TOLERANCIAS. Los estados omitidos usan las tolerancias globales. Se guarda el mapa completo en descriptor v4, de modo que el din sigue siendo autosuficiente. No confundir estas tolerancias temporales con ROS_ESCALAS. El informe .informe incluye estadisticas ROS: en JSON: pasos aceptados/rechazados, intentos, consultas a Calcula y estado de finalizacion; las consultas del campo y de OUTPUTS se cuentan por separado. Detalles en ROS.md.

Para ROS tambien se puede elegir ROS_JACOBIANO=[SENSIBILIDADES] (en .d, ROS JACOBIANO): genera descriptor v5 y requiere un Calcula con capacidad SENS1. Este resuelve el punto y obtiene el Jacobiano reducido mediante las sensibilidades de los residuos, sin resolver otro punto por cada perturbacion. ROS_ESCALAS_RESIDUO=[Z,1] permite escalas de cualquier variable, incluidas algebraicas. Es optativo: los archivos anteriores mantienen campo_central. Funciona con paso fijo o adaptativo; sus fallos abortan sin cambio silencioso de proveedor. Limites y controles numericos en ROS.md.

Controles generales y Runge-Kutta

qué .d .ds
hasta cuándo STOP TIME = 5, o T>5 TIEMPOFINAL=5 y T<TIEMPOFINAL en CONTROL_EQUATIONS
desde cuándo START TIME = 0 (0 si no) T=0 en DEFINED_PARAMETERS
otra parada TICK>1000, VC1>0.9 en RUN CONTROLS TICK<=1000, VC1<=0.9 en CONTROL_EQUATIONS (se sigue mientras vale)
método INTEGRATION ROUTINE = TRAP (sólo TRAP, IMPLICIT, XPO, RUK) RK=[12], cualquiera de la tabla
varios métodos, rotando no RK=[18,18,11]
paso STARTING STEP SIZE = 0.05 STARTING STEP SIZE = 0.05 (desde r1890; también MINIMUM y MAXIMUM), o SIRU_PASO=[0.05]
semilla de calcula SEMILLA VL2 = 0.1 SEMILLA VL2 = 0.1, o VL2=0.1 en VARIABLES si es de una rama
paso adaptativo MINIMUM/MAXIMUM STEP SIZE, SIRU ABSOLUTE TOLERANCE, SIRU RELATIVE TOLERANCE, SIRU ERROR ORDER, SIRU ADAPTIVE STEP = 1 SIRU_PASO_MIN=[..], _PASO_MAX, _ABSOLUTO, _RELATIVO, _ORDEN_ERROR, SIRU_ADAPT=[1]
qué sale OUTPUTS con VC1, IR1 igual, o T:VC1,IR1

Hasta el 05/10/2026 los nombres que empiezan con SIRU empezaban con SIMUL2 (SIMUL2_PASO=[0.05], SIMUL2 ADAPTIVE STEP = 0). Un circuito que todavía los trae así corre igual: d2datdinc los lee como los de ahora, y con -v lo avisa.

Un .d sin INTEGRATION ROUTINE usa 13, como SCEPTRE; un .ds sin RK= usa Euler (0) y siru lo dice.

El paso, si el archivo no lo dice: la milésima parte del tiempo final, y adaptativo, que es lo que hace SCEPTRE —el programa para el que se escribieron estos archivos— cuando no le dan controles de paso. Hasta el 06/10/2026 era 0.1 fijo, un número que no tiene nada que ver con la escala de cada circuito: con él los planetas (STOP TIME = 0.1) hacían toda la corrida en un paso, auditorio (120 horas) pedía 4,3 millones de pasos y los rígidos (λ = −25, escala 0.04) no convergían. Un paso fijo hay que pedirlo: SIRU ADAPTIVE STEP = 0 (.d) o SIRU_ADAPT=[0] (.ds), y conviene dar también el paso, porque si no es esa misma milésima parte. Cualquier control de paso o de tolerancia prende la adaptación. Con adaptación y sin MAXIMUM STEP SIZE, el paso máximo es el de SCEPTRE: 2 % del tiempo final. Los métodos identificados de rk.siru (los índices no son consecutivos):

N método N método
0 Euler 10 Bogacki–Shampine
1 Euler implícito 11 Punto medio implícito
2 Punto medio explícito 12 Lobatto IIIA (trapecio; TRAP)
3 Heun 13 Lobatto IIIC, stiff (IMPLICIT, XPO)
5 Ralston 14 Lobatto IIIC*
6 Kutta 15 Runge–Kutta–Fehlberg
7 Runge–Kutta clásico (RUK) 16 Cash–Karp
17 Dormand–Prince
18 Gauss–Legendre 6

El índice 4 del catálogo histórico carece de identificación de método (No se); 8 y 9 no están definidos. Usar los índices identificados de la tabla. La numeración no expresa el orden del método. Los métodos implícitos 12 y 13 son opciones para circuitos rígidos; el resultado depende también del paso, las tolerancias y el modelo. RK=[-1] pide resolver un punto sin integrar, incluso si el modelo tiene estados: se fijan en sus valores iniciales. Véase §12.

OUTPUTS puede pedir cualquier variable del circuito (VC1, IR1, QC1, IL1, VS1), un estado propio, un parámetro, T; lo que no se pueda traducir queda anotado con - y no impide simular. Sin OUTPUTS salen los estados.

Las semillas. Calcula resuelve cada paso con Newton, y arranca de la semilla de cada incógnita: la solución del paso anterior, o al principio el valor del .din, que para las variables de las ramas es 0. Si el modelo no se puede evaluar ahí --una bobina L2 = 1/VL2 da 1/0 con VL2 = 0 (circuito-T3.ds)--, calcula falla antes de iterar. SEMILLA VL2 = 0.1 en RUN CONTROLS (un .d o un .ds, una línea por variable) le da otro punto de partida; en un .ds, también un valor en VARIABLES para la tensión o la corriente de una rama. No cambia el problema, sólo de dónde arranca Newton. Si el nombre no es una incógnita (un parámetro, un estado), se avisa por la salida de errores y se ignora.

T, DT y TICK los pone el simulador en cada paso: el tiempo, el paso en uso y la cantidad de pasos dados. Lo que el archivo les ponga (CONSTANTS DT=0.01) no fija nada.

11 bis. El punto de operación (RUN INITIAL CONDITIONS)

Como en SCEPTRE: con RUN INITIAL CONDITIONS en RUN CONTROLS (sólo en un .d), siru calcula los estados en t = 0 con las derivadas en cero —capacitores abiertos, bobinas en corto— partiendo de las condiciones iniciales del archivo como semilla, y arranca la corrida desde ahí. Con RUN INITIAL CONDITIONS ONLY escribe ese punto, una fila, y termina. Es lo que SCEPTRE llama «initial conditions calculation» (manual 2.2.5, 2.2.7), y la base de la sensibilidad, Monte Carlo y el peor caso (pendientes, PLAN_DC_RERUN.md). Ejemplo: siru/corpus/corpus/samples/a03.d.

Cuando Newton no llega al punto de operación (varios transistores, exp(38·v)), o cuando el archivo dice RUN IC VIA IMPLICIT, siru lo busca integrando, como SCEPTRE: integra el circuito con el tiempo quieto en el inicial, desde las condiciones iniciales del archivo, en tramos del largo de la corrida (hasta 20), y desde el estado de cada tramo prueba Newton sobre el sistema del punto de operación. En la pantalla: punto DC por integracion: tramo 1 (50 de tiempo), el estado se mueve 3.52 por tramo; Newton llega. El primer paso de la corrida, el instante de cada fila de salida y el equilibrio arrancan Newton de esa solución y no de las semillas del archivo. Ejemplo: siru/corpus/corpus/samples/d04.d.

11 ter. Sensibilidad (RUN SENSITIVITY)

Como en SCEPTRE (manual 2.2.8), sólo en un .d: bajo CIRCUIT DESCRIPTION una subsección SENSITIVITY con conjuntos (dependientes / independientes), y RUN SENSITIVITY en RUN CONTROLS:

SENSITIVITY
   (VC1, PABC / R1, E1)
RUN CONTROLS
   RUN SENSITIVITY

siru calcula el punto de operación DC (11 bis) y, para cada dependiente y cada independiente, la derivada parcial por diferencias centradas y la normalizada (dy/dx)(x/y), y las escribe en NOMBRE.dc, una tabla de texto. Dependientes: VC, IR, VR, IL, IE, una fuente de corriente (su corriente) o un parámetro definido (PABC). Independientes: un valor que sea un dato —una resistencia, una fuente, un parámetro definido con un número—; una rama que vale una expresión no lo es, y hay que pedir la derivada respecto de sus parámetros. Ojo: la tabla de sensibilidad de SCEPTRE no coincide con sus propias corridas (PLAN_DC_RERUN.md, paso 3); la de siru sí.

11 quater. Monte Carlo (RUN MONTE CARLO)

Como en SCEPTRE (manual 2.2.9), sólo en un .d: una subsección MONTE CARLO con conjuntos (dependientes / independientes), cotas en los independientes —R1 = 100 (90, 110) mínimo y máximo, o R1 = 100 (10) en porcentaje— y RUN MONTE CARLO = n en RUN CONTROLS (10 si no se da n):

MONTE CARLO
   (VC1, IR2 / R1, E1)
RUN CONTROLS
   RUN MONTE CARLO = 50
   INITIAL RANDOM NUMBER = 127263527
   DISTRIBUTION = UNIFORM

siru hace exactamente lo que SCEPTRE: n puntos de operación DC (11 bis) con cada independiente en media + sigma·g, media (max+min)/2, sigma (max−min)/6, g gaussiana (suma de 12 uniformes menos 6) o uniforme; el generador es el de SCEPTRE (RANDU) con su semilla, así que con la misma semilla salen las mismas muestras. Escribe en NOMBRE.mc una tabla con, por independiente y dependiente, el nominal, el mínimo, el máximo, la media y el sigma muestral (con N−1). Ojo, dos cosas heredadas de SCEPTRE: la "uniforme" cae en [media, media+sigma), no entre las cotas; y tras RUN MONTE CARLO los OUTPUTS que lista SCEPTRE son los de la última muestra, los de siru los nominales. siru/corpus/sceptre compara NOMBRE.mc con las OBSERVED STATISTICS de SCEPTRE (NOMBRE.sceptre-mc); en a07 coinciden en ocho cifras.

11 quinquies. Peor caso (RUN WORST CASE)

Como en SCEPTRE (manual 2.2.7), sólo en un .d: una subsección WORST CASE con conjuntos (dependientes / independientes), cotas en los independientes (como en Monte Carlo) y RUN WORST CASE en RUN CONTROLS:

WORST CASE
   (VCET1, VCCT1 / P1T1, P1T2, R3)
RUN CONTROLS
   RUN WORST CASE

Por cada dependiente, siru calcula el gradiente respecto de los independientes en el punto de operación nominal, lo normaliza y avanza por esa recta hasta la primera cota que toca, a favor del gradiente (HIGH) y en contra (LOW); en esos dos puntos resuelve el punto de operación. Es exactamente el método de SCEPTRE (worst.f): no pone cada independiente en su cota, sólo el más cercano llega a la suya. Escribe NOMBRE.wc: por (dependiente, independiente) el nominal, HIGH y LOW del dependiente, y el valor y el gradiente del independiente en los tres puntos; en comentarios, la distancia y la cota que toca cada extremo. Ojo: los extremos de siru no son los de SCEPTRE, porque el gradiente de SCEPTRE está mal (11 ter); en a09 los de siru son más extremos, y SCEPTRE corrido en los puntos de siru da lo mismo que siru (PLAN_DC_RERUN.md, paso 5). Con RUN WORST CASE = LOW | HIGH la corrida en el tiempo sigue con los valores de ese extremo del último dependiente (y desde su punto de operación); con NOMINAL, por omisión, con los nominales. Ojo: SCEPTRE integra con los valores contrarios (con HIGH deja los LOW y al revés; worst.f calcula HIGH y después LOW y queda lo último): siru hace lo que dice el manual.

11 sexies. Reruns (RERUN DESCRIPTION)

Como en SCEPTRE (manual 2.4), sólo en un .d: después de RUN CONTROLS, RERUN DESCRIPTION (N) con las secciones que cambian y, en cada línea, los N valores, uno por rerun:

RERUN DESCRIPTION (2)
ELEMENTS
   R1 = 9.3, 9.5
DEFINED PARAMETERS
   PF = 500, 600
INITIAL CONDITIONS
   VC1 = 1, 2
FUNCTIONS
   TABLE 1 = 0, 0, 0
            40, 1.2, .4
RUN CONTROLS
   STOP TIME = 600, 700
   INTEGRATION ROUTINE = XPO, RUK
   IC FOR RERUNS = PRECEDING RESULTS

siru corre la maestra y después cada rerun con sus cambios (elementos, parámetros, condiciones iniciales, tablas, STOP TIME, START TIME, INTEGRATION ROUTINE; lo demás se avisa y no se aplica). Cada rerun parte de las condiciones iniciales del archivo (IC FOR RERUNS = MASTER RESULTS, por omisión) o del estado final de la corrida anterior (PRECEDING RESULTS). Todo va al mismo NOMBRE.simul, un bloque por corrida con su cabecera y una línea # RERUN k/N (R1 = 9.3, STOP TIME = 600) (0 es la maestra). Para graficar una corrida con el modelo v2 debe seleccionarse explícitamente su bloque en el DAT; Tabular2 lo exporta sin mezclar las corridas. Cada bloque comienza en # Archivo. siru/corpus/sceptre compara bloque por bloque; a03 y tanque_par_1 coinciden con SCEPTRE (PLAN_DC_RERUN.md, paso 6).

11 septies. Seguir una corrida (CONTINUE, --continuar)

Una corrida terminada se sigue desde donde quedó:

siru --continuar --hasta 40 circuito.d

siru lee el estado final que dejó en circuito.informe (estado final: t=20 qc1=6.87; si no está, la corrida no terminó bien y hay que correrla de nuevo), integra de ahí hasta 40 y anexa el bloque # CONTINUE (desde t = 20, STOP TIME = 40) al mismo circuito.simul; el .informe queda con el nuevo estado final, así que se puede volver a continuar. No se recalcula el punto de operación ni las opciones DC; los valores que dejó el peor caso (WORST CASE = LOW | HIGH) se heredan. En un .d, la sección CONTINUE de SCEPTRE (manual 2.5) con sus RUN CONTROLS (STOP TIME = 2000) hace lo mismo al final de la corrida, siguiendo la última (la maestra o el último rerun):

CONTINUE
RUN CONTROLS
   STOP TIME = 2000

11 octies. El análisis en frecuencia (RUN AC)

RUN AC (manual de SCEPTRE 2.2.4) no integra en el tiempo: linealiza el circuito alrededor de su punto de operación y resuelve en frecuencia. Es un análisis de pequeña señal.

ELEMENTS
  EDC, GND-1 = 0.6                 la polarización, como siempre
  EAC, 1-2 = (0.001, 0.)           la excitación: magnitud y fase en grados
  ...
RUN CONTROLS
  RUN AC
  INITIAL FREQUENCY = 100
  FINAL FREQUENCY = 10000
  NUMBER FREQUENCY STEPS = 2       dos intervalos, o sea tres frecuencias
  TYPE FREQUENCY RUN = LOG         o LINEAR (el que se toma si no se dice)

Una fuente que vale (magnitud, fase) es la excitación. En el tiempo vale 0: es una perturbación, no una fuente de la corrida. Pueden ser varias, y sus respuestas se suman.

El punto de operación se calcula siempre, aunque el archivo no diga RUN INITIAL CONDITIONS: el análisis es alrededor de él. Si el archivo no trae STOP TIME, el análisis es toda la corrida y no hay nada en el tiempo, como con RUN INITIAL CONDITIONS ONLY.

La salida es NOMBRE.ac: una fila por frecuencia y, por cada variable de OUTPUTS, cuatro columnas, su parte real, su imaginaria, su módulo y su fase en grados. El encabezado dice la excitación y los estados.

Cómo lo hace (Siru::AC): el circuito es dq/dt = f(q, u) con las salidas y = g(q, u), y hace falta A = df/dq, B = df/du, C = dg/dq y D = dg/du. Esas derivadas salen por diferencias centradas del sistema del punto de operación, el que tiene las derivadas como datos y los estados como incógnitas: una corrida por cada dato que se mueve. No se deriva ninguna expresión. Después, para cada frecuencia, (sI − A) X = B U y Y = C X + D U, con s = j·2πf y U el fasor; el sistema complejo se resuelve por eliminación gaussiana con pivoteo.

No se usa el sistema del instante, el que tiene los estados como datos, porque en un circuito con transistores no converge: dada la carga de una juntura, hallar su tensión es el problema difícil.

Probado (tests/ac.t, los circuitos en corpus/corpus/inventados/ac-*.d): un pasabajos RC coincide con su transferencia 1/(1 + jωRC) en 6·10⁻¹¹, y un diodo polarizado, que no tiene fórmula, coincide con la corrida en el tiempo del mismo circuito excitado con 0.001·sin(2πft) en 2,5·10⁻⁵, que es el error del paso.

Lo que no hace:

PRINT EIGENVALUES, PRINT EIGENVECTORS los valores propios del circuito linealizado; se avisa
COMPLEX, NYQUIST, DEGREES, RADIANS en OUTPUTS el formato de columnas de SCEPTRE; el .ac trae siempre las cuatro
(10,4), COMPLEX en el valor el fasor dado por parte real e imaginaria en lugar de magnitud y fase
parámetros y funciones complejas lo que prueba complex.d: aritmética compleja en las expresiones

12. Un punto, sin integración: RK=[-1]

El .ds contiene la información necesaria para Calcula: incógnitas, semillas, datos conocidos, constantes, funciones y ecuaciones; si hay circuito, también sus ramas y modelos. Con RK=[-1], Siru construye el sistema, llama a Calcula para resolverlo una vez y pone sus resultados en .simul. No hace falta escribir un .din aparte, preparar una simulación temporal ni declarar un tiempo ficticio.

Aspecto Comportamiento con RK=[-1]
Lugar y escritura En RUN_CONTROLS o RUN CONTROLS, una línea RK=[-1]. Es sintaxis .ds; no escribir KR, rk=-1 ni quitar los corchetes.
Resolución Una evaluación del sistema de Calcula. Calcula puede hacer las iteraciones internas necesarias para converger.
Incógnitas Los valores de VARIABLES son semillas. Los valores finales salen de resolver las ecuaciones.
Datos Los parámetros numéricos quedan fijados en los valores dados.
Estados Si existen, se fijan en sus valores iniciales; se pueden calcular sus derivadas, pero no se avanza en el tiempo.
Controles temporales No se hace un barrido aunque permanezcan T, TIEMPOFINAL, un paso o condiciones de continuación en el archivo.
Otros análisis Este modo no lanza los barridos/análisis DC adicionales. Para esos análisis usar el modo y los controles de §11 bis–quinquies.
Salida Una fila numérica con todas las variables declaradas en el sistema enviado a Calcula, incluidos sus datos. OUTPUTS no recorta esta tabla de un punto.
Precisión Los números se copian tal como los devuelve el protocolo de Calcula, sin un segundo redondeo ni sustituir resultados ausentes por cero. Algunos números pueden mostrar muchos decimales: ésa puede ser la escritura que entrega Calcula.
Nombres Se usan los nombres del sistema generado, habitualmente en minúsculas. Si OUTPUTS conserva nombres originales distintos, se agrega la fila sceptrevars para que Simplot pueda relacionarlos con la fuente. No se duplica una fila de nombres idénticos.
Unidades Se escribe la fila de unidades sólo cuando el sistema declara alguna. Para columnas sin unidad, dentro de esa fila, se usa -; si ninguna tiene unidad, se omite toda la fila. No se inventan ??, magnitudes ni unidades a partir del nombre de una variable.
Dibujo Si hay ramas y una sección FORMAS, incluso vacía, también se solicita el SVG al paquete opcional dibuja.
Limitación El modo de un punto con llaves SB se rechaza: requiere un tratamiento de las conmutaciones que este modo no implementa.

Limitación actual: las cantidades que el lector convierte a SI no conservan necesariamente una etiqueta de unidad en cada variable del sistema generado. La migración de §3.9 debe conservar esa información e interpretar UNIDADES y RESULTADOS en Slex al construir el .dat, antes de simular. Los pedidos de salida se aplican cuando existen los resultados; no son secciones exclusivas de Simplot.

Ejemplo completo, autosuficiente, sin bibliotecas externas, circuito ni tiempo. Guardarlo como punto.ds:

CIRCUIT_DESCRIPTION
Un dato y una incognita: X al cuadrado es A.
DEFINED_PARAMETERS
A=4
VARIABLES
X=1
EQUATIONS
X^2-A
OUTPUTS
X,A
RUN_CONTROLS
RK=[-1]
END

Al ejecutar siru punto.ds, Calcula resuelve X^2=A desde la semilla X=1 y entrega la raíz positiva, aproximadamente 2. punto.simul contiene los nombres a, x, sus nombres originales A, X y una fila numérica con 4 y el resultado de Calcula. No hay columna de tiempo ni fila de unidades porque no se declararon. Si ya existe la salida, Siru conserva la anterior y usa punto-1.simul, luego punto-2.simul, etc.

La llamada automática a Simplot descrita en §2 puede presentar la tabla al terminar. Para ejecutar exclusivamente el cálculo y escribir la tabla, usar siru -nosimplot punto.ds; esto no cambia el significado de RK=[-1] ni sus resultados.

Un ejemplo real es psicro_r_srk.ds, copia de psicro_5.ds con RK=[-1] explícito. TEMP, TBH y PRES son datos; XXX, WWW y PV son incógnitas. Sus ecuaciones y funciones están en el mismo archivo. Se ejecuta desde la raíz del repositorio con:

siru siru/corpus/corpus/lolipmp/psicro_r_srk.ds

Sin RK=[-1]: un circuito sin estados y sin corrida temporal también se resuelve automáticamente en un punto, como slex/d2datdinc/pruebas/nulo.d. Si no tiene estados pero sí pide una corrida temporal, Siru puede resolver un punto por cada T de la grilla, usando la solución anterior como semilla del siguiente. Eso es un barrido y produce varias filas; no es el modo explícito RK=[-1].

13. Los mensajes, y qué hacer

Dónde aparece un error. En tres lugares, del más corto al más completo:

  1. En la pantalla, la última línea: siru: NO CONVERGE en t=78.3 (paso 783), o siru: no arranca en t=0 (paso 0).
  2. En NOMBRE.informe: resultado:, hasta: (el paso y el tiempo, contra el TIEMPOFINAL) y error:, la primera línea del motivo.
  3. En NOMBRE.log: todo, sin cortar. Cada línea dice quién la escribió: d2datdinc: ... (la traducción), calcula: ... (el sistema y el solver, y adentro de él tabular2 y las funciones externas) y al final siru: resultado: ....

siru/corpus/regenera deja el mismo NOMBRE.log al lado de cada fuente, con lo que dicen d2datdinc y clasificar al regenerarla, y siru/corpus/clasificar copia el resultado de NOMBRE.informe al .tipo (campo siru).

Los resultados del .informe:

resultado qué quiere decir
llega al final integró hasta TIEMPOFINAL (o resolvió el punto)
NO CONVERGE arrancó y en algún paso posterior al primero el solver no encontró solución; el hasta: dice dónde. Las filas hasta ahí son válidas
no arranca falló antes de integrar o en el paso 0: la traducción, la carga del sistema, o el solver en el punto inicial

Las tablas. Un error de tabla() lo detecta tabular2 y lo informa calcula, con el código, su motivo y el dato concreto:

calcula: tabla('jx','X','Y'): error -3 de tabular2: columnas mal especificadas:
la columna de abscisas (la X) tiene que crecer de una fila a la siguiente
(puede repetirse, no bajar), y las columnas pedidas tienen que existir
(la columna 0 de la tabla (la X) baja en la linea de datos 3: 1 despues de 2)

Los códigos de tabular2 (tabular2/src/table.h; el motivo lo da tb_mensaje(), el dato tb_detalle(), desde tabular2 2.0-10):

código motivo qué hacer
−1 no se pudo leer la tabla: no tiene el formato de tabular2 una línea # con los nombres de columna y después los datos
−2 no se pudo abrir el archivo ver la ruta: una relativa se busca junto al archivo que la usa
−3 la X no crece de una fila a la siguiente, o las columnas pedidas no existen ordenar la tabla; el detalle dice en qué línea baja
−4 la misma columna como X y como Y pedir dos columnas distintas
−5 datos no válidos (algo que no es número, un número de tabla repetido en etable.txt) corregir el dato
−6 argumento no válido (método distinto de 1 o 2, un número negativo) método 1 lineal o 2 spline
−7 la tabla no tiene datos en esas columnas revisar la tabla
−8 error de entrada o salida el disco, los permisos
−15 sin memoria
−888 no hay una columna con ese nombre en el encabezado usar el nombre de la línea #
−889 no se pudieron relacionar esas dos columnas la X no crece, o faltan datos

Las funciones externas (EXTERNAL NOMBRE (N) RUTA, sección 9):

mensaje qué pasa qué hacer
el .din declara funciones externas (codigo de afuera); calcula las carga solo con CALCULA_EXTERNAS=1 calcula no carga código de afuera sin permiso CALCULA_EXTERNAS=1 en el entorno
gfortran no pudo compilar RUTA el fuente tiene un error, o no hay gfortran compilarlo a mano: gfortran -shared -fPIC RUTA
la biblioteca de RUTA no tiene la funcion nombre_ el nombre del EXTERNAL no es el de la FUNCTION que coincidan
NOMBRE pide N argumentos y le dieron M la cantidad del EXTERNAL no es la del llamado corregir la N

Los demás:

mensaje qué pasa qué hacer
PENDIENTE ... algo del archivo no se pudo traducir; no se simula mirar qué es: un símbolo que no está, un control que Simul no tiene
tipo X de R: no tiene modelo en el dato un .ds sin include de la biblioteca, o un tipo que no existe agregar el include o declarar el tipo
modelo por incrementos L o C de la biblioteca vieja usar LB, CB
valor de R: no se puede traducir el simbolo X X no es rama, parámetro, función ni T declararlo
la funcion F no esta en el dato se usa sin definir en FUNCTIONS definirla
grados de libertad ... las ecuaciones propias no cierran con sus incógnitas una VARIABLE por ecuación, o una ecuación menos
aviso: los nodos 1 2 no tienen camino a la masa (GND) una parte del circuito no toca la masa (una isla) no es un error: en la isla un nodo va a potencial cero, de referencia; las tensiones y corrientes de las ramas no cambian. Si es un descuido, conectarla
los datos dados no determinan el sistema: ... incognitas que ninguna ecuacion libre siente Calcula: hay una incógnita que ninguna ecuación fija (un nodo que flota, una ecuación repetida) mirar las que nombra
no se obtuvo una solucion valida ... not making progress Newton no converge desde la semilla (diodos con mucha ganancia) semillas razonables en DEFINED PARAMETERS; método 13
la capacidad de C depende de X: en un lazo de capacitores en un lazo sólo puede depender del voltaje de capacitores (el propio u otro) o de una fuente en paralelo con uno (sección 7) sacar el lazo o la dependencia
vale (1,0), un fasor: es el analisis AC de SCEPTRE Diagnóstico de versiones antiguas sin AC Actualizar y usar el análisis AC de §11 octies; respetar sus límites.
se usa el metodo 0 un .ds sin RK= RK=[12]
para en TICK<=1000 la parada que puso el archivo es lo pedido

14. Lo que no se puede

15. PARAPLOT completo: fuentes, series, paneles y unidades

15.0 Grupos PARAPLOT y resultado GNUPLOT

Un .ds puede contener varias secciones PARAPLOT [NOMBRE]. El nombre es opcional; se conserva exactamente, incluidas mayúsculas y minúsculas. Si falta, se asigna el número de posición de esa sección entre todos los PARAPLOT, contados desde 1. Los nombres admiten letras, cifras, guion, punto y guion bajo; no espacios. Los identificadores repetidos —también la colisión entre un nombre numérico explícito y uno automático— son errores. Las órdenes de un grupo no se mezclan con las de otro; se pueden repetir los nombres de gráficos interiores en grupos distintos.

Pedido Resultado de Simplot
Primer grupo: PARAPLOT TEMPERATURAS GNUPLOT TEMPERATURAS
Segundo grupo: PARAPLOT GNUPLOT 2
Tercer grupo: PARAPLOT ESTADOS GNUPLOT ESTADOS
Ningún PARAPLOT Un único GNUPLOT 1 automático, usando las tablas.

Simplot tiene dos misiones: generar esos GNUPLOT y ejecutarlos invocando Gnuplot. Por defecto hace ambas. --no-generar conserva y ejecuta los existentes; si no hay ninguno, informa que no puede dibujar. --no-ejecutar genera sin dibujar. Ambas opciones conservan el documento sin hacer ninguna etapa. -noX solo suprime ventanas; -save guarda el documento y los SVG efectivamente producidos. Sin -save, el documento sale por stdout. Al regenerar se reemplazan los GNUPLOT anteriores.

Las secciones GNUPLOT NOMBRE van al final del documento, una tras otra. Cada cuerpo es texto Gnuplot literal, incluidos comentarios y bloques de datos; termina en el próximo encabezado GNUPLOT o en EOF. Su última línea es una receta de terminal Bash para invocar Gnuplot con ese grupo del documento (gnuplot -persist <(awk ...)). No lleva END ni END GNUPLOT. El nombre de archivo utilizado por la receta se elige con --salida; si se redirige stdout debe conservarse ese nombre. Slex almacena el texto, no lo ejecuta. Simplot separa la receta y entrega el programa directamente al ejecutable Gnuplot, sin pasar la receta a un shell. Ejecutar programas GNUPLOT recibidos exige confiar en ellos.

El DAT conserva los grupos en GLOBAL.simplots (nombre, pedido, modelo) y los programas recibidos en GLOBAL.gnuplots (nombre, texto). GLOBAL.simplot conserva el primer modelo para los consumidores anteriores. Las tablas son comunes al documento. Véanse simplot/corpus/entradas-ds/grupos.ds, solo-gnuplot.ds y tests/documento.t. La generación documental todavía no traduce todas las órdenes gráficas históricas; ese recorrido continúa disponible con las opciones de compatibilidad.

15.1 Qué se dibuja y qué archivo contiene cada cosa

FORMAS describe el esquema de ramas. PARAPLOT describe cómo representar resultados numéricos: son dos secciones independientes. El .ds conserva las instrucciones gráficas, pero una tabla externa sigue siendo un archivo externo; producir el .dat no copia sus números dentro de él.

Sección o control Efecto
OUTPUTS Solicita observables del cálculo. Si no hay descripción gráfica explícita, d2datdinc --graficos puede preparar gráficos a partir de esa lista.
RESULTADOS Pedido común de variables, nombres, magnitudes y unidades de salida, interpretado en Slex antes de simular (§3.9). Sin PARAPLOT, sus datos preparados pueden dibujarse automáticamente.
UNIDADES Declaraciones comunes de unidad de origen y magnitud; se resuelven en Slex antes de Siru, no en el graficador (§3.9).
Sin PARAPLOT Simplot dibuja con las columnas y metadatos disponibles; no exige una descripción gráfica explícita.
PARAPLOT, GRAFICOS, ACEPTAR_GRAFICOS Órdenes gráficas explícitas; normalmente reemplazan los gráficos automáticos de RESULTADOS.
GRAFICOS_ADICIONALES Agrega órdenes al final.
ANADIR_GRAFICOS=[1] en RUN_CONTROLS Conserva los gráficos automáticos y agrega los explícitos. Se aceptan también AÑADIR_GRAFICOS y AGREGAR_GRAFICOS, con 0/1 o [0]/[1].
SIMPLOT_VERSION=[1] Motor histórico, valor predeterminado.
SIMPLOT_VERSION=[2] Modelo gráfico estructurado; sólo admite las órdenes .ds enumeradas en §15.3. También se admite el valor sin corchetes.

Una orden habitual es comando OBJETO = contenido. Se escribe una por sentencia y se aplican los comentarios, inclusiones y continuaciones de .ds. La excepción nomostrar G,H no lleva =. Un archivo .paraplot independiente entra directamente en esta sección, sin necesidad de escribir su encabezado.

archivo F = datos.simul asigna el nombre simbólico F a una tabla real. Las rutas relativas se resuelven respecto del documento. Las series se escriben F,X:Y,Z: las columnas Y y Z contra X. Los índices comienzan en 1; también pueden usarse nombres de columnas. La abscisa no tiene que ser tiempo. Se pueden superponer datos calculados y medidos declarando varias fuentes.

Siru entrega a Simplot la tabla recién producida y la descripción gráfica, incluso si cambió el nombre de salida. Las fuentes externas conservan sus propias rutas. Si se ejecuta Simplot por separado, la tabla debe estar disponible; un .ds sólo con órdenes gráficas no calcula los números.

15.2 Todas las órdenes del motor histórico (v1)

Orden Escritura Significado
archivo archivo F = ensayo.simul Nombre real de la fuente.
sceptrevars sceptrevars F = T,TEMP,FLUJO Nombres de las columnas de origen, según sus metadatos.
variables variables F = Tiempo,Interior,Flujo Leyendas por columna; _ conserva el nombre de origen.
magnitudes magnitudes F = tiempo,temperatura,potencia Magnitudes asociadas; _ deja sin nombre.
unidades unidades F = s,tempC,W Unidades de las columnas; _ para una columna sin unidad. No confundir esta orden con el encabezado UNIDADES.
indices indices F = 1,3,2 Correspondencia de la lista de variables/metadatos con las columnas físicas.
unipri unipri F = horas Presentación temporal de la primera columna; requiere una unidad de origen temporal. Acepta horas, días, minutos o segundos según el vocabulario histórico.
arch_var arch_var F = base.simul,caso1.simul,caso2.simul Fuentes correspondientes a variaciones de un mismo problema; la primera coincide con archivo.
variaciones variaciones F = Base,R=2,R=3 Leyendas que distinguen esas variaciones, una por archivo.
selec selec RECORTE = F,1,0,10 Nueva fuente con filas cuya columna 1 está entre 0 y 10; no modifica el original. Admite encadenar selecciones.
lineas lineas G = F,1:2,3 Series unidas por líneas; repetir sobre G agrega series.
puntos puntos G = F,1:2 Serie de puntos, apropiada también para una única fila.
funcion funcion G = sin(x) Función de Gnuplot; no es una función de FUNCTIONS ni una ecuación de Calcula.
titulo titulo G = Evolución de la temperatura Título del gráfico.
ejes ejes G = Tiempo(s),Temperatura(tempC) Etiquetas y unidades de los ejes; prevalecen sobre las magnitudes generales.
rangox, rangoy rangox G = 0:10 Rango visible del eje; v1 usa la forma histórica con dos puntos. En v2 se escribe con coma.
mostrarjuntos mostrarjuntos PANEL = G,H Reúne varios gráficos en un cuadro.
guardar guardar G = resultado Nombre base de los archivos del gráfico.
nomostrar nomostrar G,H Prepara los gráficos, pero no los presenta individualmente, por ejemplo si se muestran en un panel.
eco, echo eco G = texto Órdenes históricas de mensajes transportadas por el lector; no describen series. Su aceptación léxica no garantiza un efecto de presentación en todas las rutas del motor.

Los nombres simbólicos de v1 se normalizan; los nombres físicos de archivos conservan mayúsculas y minúsculas. No basar un documento nuevo en abreviaturas accidentales del intérprete antiguo. Las órdenes desconocidas o incompletas son errores de lectura.

Ejemplo gráfico independiente, acompañado por una tabla datos.simul con columnas T, A y B:

PARAPLOT
archivo DATOS = datos.simul
lineas EVOLUCION = DATOS,1:2,3
titulo EVOLUCION = Dos variables contra el tiempo
ejes EVOLUCION = Tiempo(s),Amplitud
rangox EVOLUCION = 0:2
puntos FASE = DATOS,2:3
titulo FASE = B contra A
mostrarjuntos RESUMEN = EVOLUCION,FASE
nomostrar EVOLUCION,FASE

15.3 Órdenes estructuradas (v2)

Orden .ds Regla adicional de v2
archivo F = datos.simul Ruta literal; puede ir entre comillas.
lineas G = F,1:A,B / puntos G = F,T:A Nombres simples o índices físicos desde 1; órdenes repetidas acumulan series.
titulo G = Texto Título de gráfico o panel.
ejes G = Tiempo(s),Temperatura(tempC) Etiquetas; la unidad explícita pide conversión real a Tabular2.
rangox G = 0,10 / rangoy G = -1,1 Exactamente dos números finitos y crecientes; coma, no dos puntos.
mostrarjuntos P = G,H Panel vertical, sin repetir gráficos ni anidar paneles.
puntos G = F,X:Y,limites_y=YMIN:YMAX Barras verticales con límites absolutos en columnas de la misma fila.
lineas G = F,X:Y,limites_x=XMIN:XMAX,limites_y=YMIN:YMAX Límites en ambos ejes; con límites se admite una sola serie por orden.

Las palabras clave no distinguen mayúsculas, pero los identificadores de v2 sí. Las referencias adelantadas están permitidas. Los límites de barras deben ser finitos y cumplir inferior ≤ centro ≤ superior; no son deltas, porcentajes ni desviaciones que Simplot calcule. Todas las columnas involucradas deben tener unidades compatibles. Para temperaturas absolutas usar tempC, tempF o K.

RESULTADOS, UNIDADES y ANADIR_GRAFICOS también se admiten en v2. Las órdenes históricas de selección, funciones, variaciones o nomostrar no se convierten automáticamente a v2; se rechazan cuando no están implementadas. La selección de bloques de una tabla con varias corridas, las escalas logarítmicas/temporales, la inversión de ejes, las columnas de panel y los formatos tienen representación en el .dat estructurado, pero aún no tienen todas sus órdenes .ds. No inventar una palabra clave para esas prestaciones; consultar el contrato gráfico v2.

Ejemplo:

RUN_CONTROLS
SIMPLOT_VERSION=[2]
PARAPLOT
archivo DATOS = datos.simul
lineas EVOLUCION = DATOS,T:A,B
titulo EVOLUCION = Evolución
ejes EVOLUCION = Tiempo(s),Amplitud
rangox EVOLUCION = 0,2
puntos FASE = DATOS,A:B
mostrarjuntos RESUMEN = EVOLUCION,FASE

15.4 RESULTADOS, UNIDADES y conversiones

Esta explicación corresponde al procesamiento del problema y se publica también en Siru; se retira de las páginas del graficador. La sintaxis se define aquí una sola vez.

Forma abreviada Pedido común
TEMP Seleccionar la variable conservando sus atributos.
TEMP(Interior) Solicitar un nuevo nombre de salida.
TEMP(Interior,temperatura) Declarar además la magnitud.
TEMP(Interior,temperatura,tempF) Solicitar además una unidad de salida, sin redefinir el origen.

Estas secciones son comunes a toda la cadena, no parte exclusiva de PARAPLOT. Su interpretación corresponde al paso .ds → .dat en Slex, antes de simular. La regla normativa y las prioridades están en §3.9. La conversión solicitada para los resultados se aplica cuando se obtienen sus valores; no se posterga la interpretación del documento hasta Simplot.

RESULTADOS
TEMP(Interior,temperatura,tempC),FLUJO(Potencia,potencia,W)
UNIDADES
plantilla=Generico
TEMP:K,temperatura
FLUJO:W,potencia
Construcción Significado
VARIABLE(nuevo_nombre,magnitud,unidad) Solicitud común de resultado; atributos opcionales. El nombre, magnitud y unidad se conservan aunque no se genere un gráfico.
VARIABLE:unidad,magnitud Declaración de origen para el procesamiento común. La prioridad frente al número y FORMAS está en §3.9.
plantilla=Generico y reglas por prefijo Formas históricas que deben conservarse mediante compatibilidad; no autorizan una segunda interpretación física en Simplot.
Metadatos de origen Deben acompañar los valores preparados, sin reetiquetar un origen ya declarado ni convertir dos veces.
Unidad de salida Conversión de los resultados solicitada en el documento, no una decisión exclusiva del dibujo.
RESULTADO GRAFICO Sólo previsto, no implementado: excepción posterior a Siru para cambiar unidades de presentación en Simplot, sin alterar el cálculo ni la tabla original. No prioritario.

En el ejemplo, TEMP tiene origen en kelvin y se solicita como resultado en Celsius absoluto. Simplot debe recibir ese resultado ya preparado. Un rótulo «temperatura» por sí solo no transforma una columna ni permite interpretar C como Celsius. La implementación histórica todavía efectúa parte de este trabajo en Simplot: es compatibilidad pendiente de migrar, no la distribución definitiva de responsabilidades.

Escritura GNU units Significado
tempC, tempF Temperaturas absolutas, con desplazamiento de origen.
K Kelvin.
degC, degF Intervalos de temperatura; 10 degC = 18 degF = 10 K.
C, F Coulomb y farad.
s, min, W, W/(m^2*K) Unidades simples o compuestas. En coeficientes térmicos se usa K o un intervalo, no la función tempC.

Una unidad desconocida, una conversión incompatible o un origen ausente que impida convertir son errores. Los alias de algunos ejemplos antiguos (seg, gradosC) deben reemplazarse por los nombres de GNU units. La conversión la realizan Tabular2 y Unidades; Simplot no mantiene otra tabla de factores.

15.5 Un punto, varios estados y ausencia de tiempo

Para el resultado de RK=[-1], usar puntos G = F,TEMP:PV, por ejemplo. No se agrega T ni se duplican muestras para fabricar una curva. En v2 una orden lineas con una sola fila también muestra un marcador; en v1 pedir puntos explícitamente.

La opción de consola simplot --pares estado.simul representa todas las combinaciones distintas de dos columnas. Puede restringirse con --columnas TEMP,TBH,WWW; admite entre 2 y 12 columnas. Es una opción del programa, no una sentencia nueva de .ds. Las proyecciones de un conjunto de estados no implican una trayectoria temporal.

16. Resumen formal, alcance y archivos auxiliares

Esta EBNF describe la estructura del documento; las reglas detalladas de cada sección y sus restricciones semánticas están en §3–15. Las comillas indican literales, las llaves repetición y los corchetes opcionalidad. Cuando aparecen entre comillas, [ y ] son caracteres obligatorios del archivo.

documento       = { inclusion | seccion | comentario | linea_vacia } [ "END" ]
inclusion       = ( "include" | "input" | "#include" ) ruta
seccion         = encabezado fin_linea { sentencia | comentario | linea_vacia }
sentencia       = contenido ( fin_linea | ";" )
lista_control   = clave "=" "[" valor { "," valor } "]"
incognita       = nombre "=" semilla [ "D:" derivada ]
dato            = nombre "=" expresion [ "D:" derivada ]
residuo         = expresion { marca_ecuacion }
rama_ds         = tipo "-" nombre "," nodo "-" nodo "=" pieza { "&" pieza }
modelo          = tipo "(" cantidad ")" "=" campo { "," campo }
funcion         = nombre "(" argumentos_o_cantidad ")" "=" expresion
salidas         = [ abscisa ":" ] nombre { "," nombre }
orden_grafica   = comando objeto "=" valor_grafico
forma_completa  = nombre TAB forma TAB orientacion TAB numero TAB numero TAB numero TAB numero
forma_abreviada = nombre TAB forma

El cuerpo de una sección termina al reconocer el próximo encabezado; no lleva llaves. END termina la fuente actual. TAB significa el carácter de tabulación. La regla de sentencia con ; es de .ds; en .d ese carácter inicia un comentario. Las gramáticas ejecutables separan el reconocimiento léxico de la interpretación de cada sección y de la construcción del sistema; una EBNF abreviada no reemplaza sus validaciones.

Familia Comprobaciones que no basta expresar en la EBNF
Nombres Declaraciones disponibles, ausencia de ramas repetidas, incógnitas y ecuaciones compatibles.
Circuito Tipo existente, cantidad de valores del modelo, masa GND, topología y estados admisibles.
Expresiones Operadores y funciones de ExprTk, dominio numérico, semillas que permitan evaluarlas.
Integración Una familia compatible, IDs existentes, estados y derivadas, condiciones de continuación, paso y tolerancias.
Dibujo Campos de FORMAS y números finitos; una sección vacía conserva significado.
Gráficos Fuentes y columnas existentes, versión, unidades, rangos y límites coherentes.
Inclusiones y recursos Rutas válidas y recursos externos disponibles al leer o ejecutar.

La referencia corresponde al lector de este directorio. Sus fuentes de sintaxis son d2datdinc.slex, parametros.y, ecuacion.y, declaraciones.y, control.y, data.y, edef.y, piezas.y, rama.y, salidas.y, sceptre.y, expresion.y y comas.y; dato.c y userfunc.c implementan interpretación y compatibilidad. El catálogo de ramas es biblioteca/libraryori.siru; los catálogos numéricos están junto a él. El espejo web se genera desde este documento, no se mantiene una segunda gramática escrita a mano.

17. Ejemplos completos y comprobaciones

Descargar los archivos de cada fila en un mismo directorio. Los fragmentos de las secciones anteriores explican reglas; estos archivos sí son entradas completas. Trabajar sobre una copia, pues Siru escribe tablas, registros y, cuando corresponde, esquemas junto a la entrada.

Ejemplo Archivos Qué comprobar
Sólo Calcula / ExprTk expresion.ds siru -nosimplot expresion.ds: un punto con X=2; sin columna de tiempo artificial.
Función Fortran fortran.ds, cuadrado.f90 La misma ecuación y resultado mediante una función externa; requiere habilitación y compilador de §9.
RC en .d rc.d Fuente, resistencia no lineal y capacitor; integración temporal.
RC en .ds e inclusión rc.ds, biblioteca.siru El mismo modelo con tipos explícitos y biblioteca relativa.
Ecuaciones diferenciales sin ramas oscilador.ds Y1≈cos(T), Y2≈−sin(T), sin nodos ni GND; método del trapecio con paso 0.01.
Modelo propio modelo-propio.ds Resistencia cúbica: IR1=2 para VR1=8 y coeficiente 1.
Subcircuito .d subcircuito.d Modelo DIVISOR con terminales y nombres interiores; VR2T1=5.
Tabla incorporada tabla.ds Interpolación de la tabla interna: X=0.5, Y=1.
Partición IMEX imex.ds X≈exp(−11T), ARS222 con paso 0.01.
FORMAS vacía automatico.ds Solicita esquema automático y resuelve un punto.
Símbolos eléctricos divisor.ds Divisor con sus formas incorporadas; tabuladores conservados.
Símbolos térmicos termico.ds Analogía térmica y registros de ramas y nodos.
PARAPLOT histórico graficos-v1.ds, datos.simul simplot -graf=4 graficos-v1.ds: evolución, plano de fase y panel.
PARAPLOT estructurado graficos-v2.ds, datos.simul Los mismos datos con versión 2; no requiere Calcula.

Para revisar sólo la lectura, d2datdinc -v ejemplo.ds -o ejemplo.dat. Para comprobar el cálculo, ejecutar Siru; un DAT válido no garantiza que el sistema tenga solución ni que converja desde cualquier semilla. Para los ejemplos gráficos ejecutar Simplot, pues las columnas y unidades se comprueban al leer las tablas.

Fuentes y mantenimiento de la referencia

Material Función
README del lector Semántica, compatibilidad y pruebas de d2datdinc.
Manual de Siru Ejecución, integradores, análisis y diagnósticos.
Contrato PARAPLOT v1 Transporte de órdenes y responsabilidades del lector y graficador.
Contrato gráfico v2 Fuentes, series, unidades, paneles y capacidades del DAT.
IMEX, ROS, GLM Contratos y restricciones de cada familia.
Documentación oficial de ExprTk Lenguaje de expresiones y funciones de la biblioteca de Arash Partow.

La fuente de esta página está en slex/d2datdinc/doc/GRAMATICA.md; su generador, configuración de publicación y espejo están en sitio/gramatica-ds. Cuando cambie el lector o el consumidor de una sección, actualizar su sintaxis, sus límites y el ejemplo correspondiente, regenerar el espejo y comprobarlo antes de publicar.