# Lo hecho: un solo armador y el corpus caso por caso (30/09/2026)

Resumen de la tanda que va de siru r1655 a r1713 y calcula r150 a r151, con
qué se hizo, dónde está, contra qué se verificó y qué quedó sin resolver o sin
verificar. El cómo usarlo está en [MANUAL.md](MANUAL.md); el porqué de cada
decisión en `siruviejo/LLAVES.md` 12 y 13, `slex/din/README.md` 6 bis y la
bitácora de [PLAN_UN_ARMADOR.md](PLAN_UN_ARMADOR.md).

## 1. Un solo armador de ecuaciones (r1655 a r1668)

Antes había dos: `libdin` (`slex/din`, C) para el camino `.din`, y
`Siru::Mdin` (Perl) para los circuitos con llaves, lazos o cortes. Ahora
**`libdin` es el único**; siru no arma ninguna ecuación, se las pide por
`d2datdinc --din N [--llaves S1=1,S2=0]`.

| qué | dónde | revisión |
|---|---|---|
| tabla de ramas y llaves (`din_leer_con`, `--llaves`) | `slex/din/din.c`, `slex/d2datdinc/main.c` | r1657 |
| tiempo de cada etapa, `(t + c_i*dt)` escrito en el lugar | `din.c` | r1658 |
| lazos de capacitores y cortes de bobinas con la ley en derivadas | `din.c` (`grafo_nuevo`, `camino`, `degeneraciones`) | r1659 |
| equilibrio, instante y topología (`din_equilibrio`, `din_instante`, `din_topologia`, `--topologia`) | `din.c`, `main.c` | r1660 |
| un `.dat` como entrada de `d2datdinc` | `main.c` | r1663 |
| siru: un solo preparador (`Siru::Preparador`), un solo lector del `.din` (`Siru::Din`), un solo escritor (`Siru::Salida`), un solo motor de corrida (`Siru::Circuito::correr`) y un selector de caso (`Siru::Circuito::caso`) | `siru/lib/Siru/` | r1664 |
| borrados `Siru::Mdin` y `Siru::Red` | | r1665 |
| documentación: README, `din.h`, LLAVES.md 13, bitácora | | r1667, r1668 |

**Verificado:** paridad contra el armador en Perl congelado en r1655, por
columna, en los 22 archivos de caso 2 con `.patron`: iguales, peor diferencia
relativa 6e-16. Pruebas: `siru/tests` (prove) y `slex/d2datdinc/probar`.

## 2. Lo que el archivo recibe del simulador (r1669 a r1672)

`T`, `DT` y `TICK` no los fija el archivo: los pone el simulador en cada paso
(el tiempo, el paso en uso, la cantidad de pasos dados). `DTICK` no existe
más. Un circuito puede traer ecuaciones propias (`EQUATIONS` + `VARIABLES`).
Una parada de `RUN CONTROLS` sobre otra variable (`TICK>1000`) se evalúa al
empezar cada paso.

- `libdin`: r1669. siru (cuenta de pasos, paso, paradas): r1670.
- Corpus: se sacó `DT=` de 53 archivos que lo declaraban sin usarlo y `DTICK`
  de todos lados; 58 archivos, r1671.
- Resultado: los 15 archivos que habían dejado de correr con el armador único
  corren, y llegan hasta la parada que dice el archivo (antes el Perl cortaba
  en T=1 ignorándola).

## 3. Caso por caso (r1674 a r1711)

| caso | qué se hizo | ejemplo y prueba | revisión |
|---|---|---|---|
| **Capacidad que depende de su propio voltaje** (`C = 5 + 40*tabla(VCE)`, a02) | en el equilibrio su voltaje como diferencia de potenciales; en la ley del lazo se divide por `dQ/dV` numérica | `slex/d2datdinc/pruebas/capacidad-variable.d`, `tests/capacidad.t` | r1674, r1675 |
| **Los nombres de los `.mdin`** | un caso de mdin deja `NOMBRE[-bits][-rkN].mdin`, `-I.mdin`, `-E.mdin` al lado del archivo; lo que no es mdin deja `-de-d2datdinc.din` y `-ED<N>.din` en un temporal | | r1676 a r1678 |
| **Inductancia mutua** `M, L1-L2 = 299.7` (SCEPTRE) | va a `GLOBAL.mutuas`; a cada bobina se le agrega `+ M·dI_otra/dt`; en el equilibrio se conserva `L·I + M·I_otra`, también en la bobina acoplada que no está en el corte (el golpe del secundario al abrir el primario) | `pruebas/mutua.d`, `mutua-corte.d`; `tests/mutua.t`, `mutua_corte.t` | r1680, r1695, r1738 |
| **Transformador con núcleo** | devanado `MW(2) = VOLTAGE - x1 * x2` en la biblioteca; el flujo como estado propio (`VARIABLES DPHI1=0`) y la fuerza magnetomotriz como ecuación propia; `trafo.d`, `trafo2.d`, `trafo3.d`, `trafoNP.d` reescritos así; `MZZZ` comentado | `pruebas/nucleo.d`, `tests/nucleo.t` | r1683, r1695 |
| **`OUTPUTS`** | el `.simul` saca lo que pide `OUTPUTS`, en su orden; cada fila resuelve el instante | | r1684 |
| **Islas** (nodos sin camino a masa por llaves abiertas) | un nodo de cada isla a potencial cero en lugar de su ley de corrientes; corren `circuito-S`, `-SE`, `-SE1`, `-SERRORRARO` | `pruebas/isla.d`, `tests/isla.t` | r1688 |
| **Biblioteca unificada** | un solo `libraryori.siru` en `slex/d2datdinc/biblioteca`, con `SB`; los `circuito*.ds2` apuntan ahí; `L`/`C` viejos pasados a `LB`/`CB` en `circuito` y parecidos | | r1685 a r1689, r1698 |
| **Estados y parámetros propios en `DEFINED PARAMETERS`** (a13: `DPX1 = PX2`, `PDIS = PX1`) | `D<X>` hace de `X` un estado; un parámetro definido por expresión es una incógnita propia; etiquetas `XA(...)`; tablas pegadas `TABLEEX(...)` | `pruebas/parametros-propios.d`, `tests/parametros.t` | r1703 |
| **Ramas con nombre numérico** (`1, 2-3 = ...`) y mensaje claro para modelos por incrementos | | | r1704 |
| **Funciones de más de 6 argumentos** | ExprTk no las compila: `libdin` las reemplaza por su cuerpo en cada llamada, y además `Q1` de `modellib.siru` y los 11 `a11*.d` se partieron en dos | | r1705 |
| **`FUNCTIONS` de un `.ds` en Calcula** | argumentos `x,y,z`, constantes puestas en el cuerpo; psicro corre y da sus "buenos datos"; `*` explícito en 10 archivos psicro | | r1706 |
| **`Table()` adentro de una función** y Calcula corrido desde el directorio del archivo | `tabla.ds` corre | | r1707 |
| **Elemento nulo** (modelo `0`, no aporta ecuación), **`RK=[-1]`** (es un punto), **fasor `(1,0)`** (mensaje: es el análisis AC) | `engrane.d`, `girator.d`, `circuitoBBBB.ds` corren; `d01.d` dice por qué no | `pruebas/nulo.d` | r1709 |
| `XTABLE` no es etiqueta; el nombre solo de una fuente `J` en `DEFINED PARAMETERS` es su corriente | | | r1710, r1711 |

Pruebas: `siru/tests` 214 ok (`prove -Ilib tests`), `slex/d2datdinc/probar`
66 ok.

## 3 bis. El punto de operación DC (01/10/2026, r1879 a r1881)

`RUN INITIAL CONDITIONS [ONLY]` de SCEPTRE: el instante en t = 0 con las
derivadas en cero y los estados como incógnitas (`PLAN_DC_RERUN.md`, paso 0).
a03 igual a SCEPTRE en las ocho cifras. El instante se resuelve desde su
última solución, y si no converge desde las semillas del `.din`.

## 3 ter. Sensibilidad (01/10/2026, r1893 a r1909)

`d2datdinc` lee `SENSITIVITY`, `MONTE CARLO`, `WORST CASE`, las cotas y los
`RERUN`/`CONTINUE` (`GLOBAL.dc`, `cotas`, `reruns`, `continuar`, controles
`SCEPTRE_*`). `Siru::DC` calcula la sensibilidad sobre el punto DC y la
escribe en `NOMBRE.dc`. En a08 coincide con las corridas de SCEPTRE, no con su
tabla, que está mal (`PLAN_DC_RERUN.md`, paso 3).

## 3 quater. Monte Carlo (02/10/2026, r1925 a r1928)

`Siru::DC::montecarlo`, calcado de `monte.f`/`random.f` de SCEPTRE: su
generador RANDU y su semilla, media `(max+min)/2` y sigma `(max−min)/6` por
independiente, `n` puntos DC, estadísticas muestrales a `NOMBRE.mc`.
`Siru::DC::opciones` corre lo que el `.d` pide. a07 coincide con las
OBSERVED STATISTICS de SCEPTRE en las ocho cifras (`siru/corpus/sceptre` las saca
a `NOMBRE.sceptre-mc` y compara). `PLAN_DC_RERUN.md`, paso 4.

## 3 quinquies. Peor caso (02/10/2026, r1933 a r1940)

`Siru::DC::peorcaso`, calcado de `worst.f`: gradiente normalizado en el
nominal y la primera cota en cada sentido, punto DC en los dos extremos, a
`NOMBRE.wc`. En a09 los extremos de siru son más extremos que los de SCEPTRE
(el gradiente de SCEPTRE está mal); SCEPTRE corrido en los puntos de siru
(`a09wch.d`, `a09wcl.d`) da lo mismo que siru en 8 cifras. `siru/corpus/sceptre`
saca los de SCEPTRE a `NOMBRE.sceptre-wc`. `PLAN_DC_RERUN.md`, paso 5.

## 3 sexies. RERUN (02/10/2026, r1952 a r1959)

`Siru::Rerun` aplica los cambios de cada rerun al dato y
`Circuito::correr_con_reruns` corre la maestra y cada rerun desde su `.dat`,
todo en un `.simul` en bloques `#  RERUN k/N (...)` (`Salida` con `bloque` y
`anexar`; `Integrador` avisa el estado final para `IC FOR RERUNS = PRECEDING
RESULTS`). `siru/corpus/sceptre` compara bloque por bloque: a03 (4 corridas, 8
cifras) y tanque_par_1 (3 corridas) iguales a SCEPTRE. `PLAN_DC_RERUN.md`,
paso 6.

## 3 octies. CONTINUE (04/10/2026, r2001 a r2005)

`siru --continuar NOMBRE.d [--hasta T]` sigue la corrida desde el estado
final que `bin/siru` deja en `NOMBRE.informe`, otro bloque en el mismo
`.simul`; la sección `CONTINUE` de un `.d` hace lo mismo al final. Hereda
los parámetros del peor caso. `PLAN_DC_RERUN.md`, paso 7.

## 3 nonies. Lazos con capacidad ajena y punto DC con lazos (04/10/2026, r2017 a r2024)

libdin: en un lazo de capacitores la capacidad puede depender del voltaje de
otro capacitor (`CC2 = f(VCC1)`) o de la corriente de una fuente en paralelo
con un capacitor (`CE = f(JE)`), además del propio; el punto de operación DC
con lazos o cortes tiene su sistema (`din_puntodc`, `NOMBRE-D.mdin`). Lo
pedía d04.d. Verificado con `pruebas/sceptre/lazo-c-ajeno.d` contra el mismo
circuito sin lazo. De paso se vio que **SCEPTRE usa la capacidad incremental
(`I = C·dV/dt`) y siru la carga (`Q = C·V`)**: con capacidad variable
difieren (`c-variable.d`); el estado sigue siendo la carga (decisión del
autor). d04: libdin ya lo arma; el punto DC no converge (Newton, cuatro
transistores; SCEPTRE lo saca con `RUN IC VIA IMPLICIT`). MANUAL 7,
`slex/din/README.md`, `siru/corpus/README.md`.

## 3 decies. El punto DC por integración (04/10/2026, r2037 a r2048)

`RUN IC VIA IMPLICIT` (control `SCEPTRE_IC_VIA`), y también cuando Newton no
llega: `Circuito` integra con el tiempo quieto desde las condiciones
iniciales, por tramos, y desde cada estado prueba Newton sobre el sistema DC
sembrado con la última etapa del paso (`Integrador`: `al_terminar` y
`salidas.valores` reciben la solución del paso; `historia_inicial` siembra el
primer paso; el equilibrio se siembra con los estados de antes y los
potenciales del instante). d04: el punto DC llega en un tramo, salen la
sensibilidad (22 derivadas), Monte Carlo (50) y el peor caso, y la corrida
avanzaba hasta t = 2.00005 —el quiebre de `TABLE EIN`—, donde Calcula no
convergía ni partiendo el paso 20 veces.

**La causa estaba en Calcula** (6.0-30, calcula r163): el jacobiano por
diferencias usaba el paso `sqrt(eps)·|x|`, y con las corrientes de los
capacitores casi nulas del punto de operación (10⁻²⁰) la columna salía vacía:
`determina()` rechazaba el sistema desde la semilla ("incógnitas que ninguna
ecuación libre siente") y sin semilla Newton no avanzaba. Con
`sqrt(eps)·max(|x|, 1)` **d04 corre entero**: la maestra (851 filas) y los
dos reruns `RUN WORST CASE = LOW` y `HIGH` (835 y 837), cada uno con su
punto DC, sensibilidad, Monte Carlo y peor caso; 7 minutos. Para repetir a
mano un pedido que Calcula no resuelve: `SIRU_VOLCAR=DIRECTORIO` (lo deja
`Siru::Calcula`, con el `.din` al que iba).

## 3 undecies. Paso fijo que no converge, `START TIME` y la búsqueda lineal de Calcula (04/10/2026)

- **Calcula 6.0-31** (calcula r165 a r167): la búsqueda lineal de Newton es
  propia (paso entero y mitades). `gnewton` de GSL dejaba el paso en 10⁻⁵
  cuando una exponencial explotaba: el rerun 1 de a01_2 (la tabla con pico
  1.2) no pasaba de t = 58.3 en 10000 iteraciones; ahora son 14 y corre
  entero (`pruebas/sceptre/a01-tabla2.d`). `CALCULA_TRAZA=N` muestra las
  iteraciones.
- **`Integrador`: respaldo del paso fijo** (r2078): si Calcula no resuelve el
  paso de una vez, se da en 2, 4, 8... partes sembradas una con otra. En
  a01_2 no alcanzaba (fallaba la primera parte); queda como respaldo.
- **`START TIME`** (libdin r2079): la corrida arranca en el valor inicial del
  tiempo y no siempre en 0 (`pruebas/sceptre/start-time.d`, igual a SCEPTRE).

## 3 duodecies. Los que siru no corría, después del barrido (04/10/2026, r2118 a r2120)

- **El nombre de una fuente solo** en una expresión es lo que impone
  (libdin r2120): `colori.d` pasa a igual a SCEPTRE; `pru_form` y `g02`
  avanzan hasta otro error.
- **`planeta*`**: corrían hasta "problem with user-supplied function".
  Calcula 6.0-32 (calcula r168): el camino lineal daba por cumplida la marca
  `@lineal` con NaN. libdin r2119: en el sistema de integración la marca se
  calcula con los estados como incógnitas. `Integrador` r2118: un paso que
  no se resuelve se reintenta con las etapas en el valor del estado. Ahora
  corren, pero con el paso por omisión (0.1, toda la corrida en un paso) el
  resultado no sirve.
- El resto, clasificado por causa en `siru/corpus/README.md` («Contra SCEPTRE»).
- **`tanque_int_*`** (caso 1 de la revisión uno por uno): `PREND =
  PENCA/PENJ` es 0/0 en t = 0. Calcula 6.0-33 (calcula r170 a r173) resuelve
  aparte las incógnitas colgantes —las que nombra una sola ecuación— y da
  `nan` en la que no se puede calcular; `Siru::Calcula` (r2136) acepta ese
  `nan` y no lo manda de semilla. siru escribe `NaN` en esa fila y sigue,
  como SCEPTRE: `tanque_int_1` igual a SCEPTRE.
- **`pru_termistor_*`** (caso 2): una isla sin camino a la masa ya no es un
  error (libdin r2141): un nodo de la isla va a potencial cero, como con las
  islas que dejan las llaves abiertas; `--topologia` dice `islas` y siru
  avisa. `pru_termistor_1` igual a SCEPTRE. De paso: la referencia de una
  isla no se deshace en el sistema del punto DC (lo había roto r2024).
- **`con_FOR_*`** (caso 3): `ETABLE` de SCEPTRE en siru, de dos maneras
  (pedido del autor: las dos, privilegiando la primera). libdin la traduce a
  `tabla()` de Calcula con el archivo de `etable.txt` (r2143; calcula 6.0-34
  acepta las columnas por número), y si el archivo la declara `EXTERNAL` se
  usa la de Fortran, `tabular2/fortran/etable.f90` (r2148; calcula 6.0-34
  enlaza las externas con tabular2). Sin estados: un parámetro definido por
  una expresión es incógnita y no dato, la marcha toma el paso de `MAXIMUM
  STEP SIZE`, y la salida lleva el tiempo y los OUTPUTS (r2144, r2147).
  `con_FOR_2` y `_3` usan `FFFF`, una función Fortran del usuario: tienen su
  `.ds` con `EXTERNAL` (r2149). Los tres iguales a SCEPTRE, y
  `subprograma` también (`siru/corpus/sceptre` corre siru con
  `CALCULA_EXTERNAS=1`).
- **`g02`** (caso 4): `g02.ds` con `EXTERNAL FSAT`. Para armarlo hizo falta
  que un `.ds` lea la inductancia mutua `M, L1-L2 = valor` (d2datdinc
  r2172) y que el equilibrio del flujo admita inductancias que no son datos
  (libdin r2171: en el estado de antes del salto). El equilibrio sale; **el
  primer paso después del salto no convergía, y SCEPTRE arranca sin ese
  salto. Lo que se hizo después (r2176 a r2181, calcula r178):
  - **Regla de arranque** (decisión del autor): un estado que impone una
    fuente —la bobina en serie con una fuente de corriente, el capacitor en
    paralelo con una batería— y cuya condición inicial el archivo no da,
    arranca con lo que impone la fuente, sin trasvase desde cero, como
    SCEPTRE. libdin lo marca `fuente` en la sección `equilibrio`; `Circuito`
    lo aplica y lo dice (`arranque: il44 = 10 ...`). Si el archivo da la
    condición inicial hay trasvase, como siempre: `g02salto.ds` (con `IL44 =
    0` escrito) es el ejemplo difícil.
  - **Calcula 6.0-35**: Newton contra un quiebre (tabla a tramos, `ABS`) da
    el paso entero cuando ningún paso corto mejora.
  - **El tiempo dentro de una función** (libdin r2181): el cuerpo de una
    función se escribía con `TIME` en su valor inicial, como un parámetro,
    así que `EQUATION 1 (A,B,C,D) = ((A+B*DCOS(2.*PW*TIME+C))*D)` quedaba
    congelada en t = 0 y el generador no giraba: g02 coincidía con SCEPTRE
    en los primeros microsegundos y después divergía. Ahora la función que
    nombra el tiempo va en línea, con el tiempo del sistema. En el corpus
    sólo g02 tenía funciones así.

## 3 terdecies. Si los circuitos dan bien: exactas, SPICE, convergencia y los saltos (04/10/2026, r2069 a r2187)

Pedido del autor: saber no solo que los circuitos corren, sino si dan bien.
Todo está en `siru/corpus/EXACTAS.md` y `siru/corpus/SCEPTRE-distintos.md`.

- **Los seis `.ds` que corrían dando una fila** (r2069 a r2075):
  circuito-SF_1, circuito_2, circuito-SE2, eqdif y circuitoAX corrigen su
  archivo y dan la exacta. Para circuitoAX, libdin acepta
  `CARGA=0 D:IE1`, un estado cuya derivada es una variable de rama (r2073).
  circuitoCSLOCLO queda de un solo valor, que es correcto.
- **`CHANGE` de un modelo** (`MODEL X (TEMP,CHANGE P1=.975)`) se perdía si
  el paréntesis traía otra cosa antes (d2datdinc r2084). Era una de las dos
  causas de que a02 difiriera de SCEPTRE; la otra es la ley de la capacidad.
- **Las soluciones exactas** (`siru/corpus/exactas`): `red_lineal` resuelve
  cualquier circuito lineal de R, L, C, E y J sin escribir sus ecuaciones.
  Incluye fuentes controladas, senoidales y por tabla del tiempo, cortes de
  bobinas y lazos de capacitores, y el arranque desparejo conservando flujo
  y carga. Hay exacta para 83 circuitos, y siru da la exacta o el error del
  método que pide el archivo. Se verificó partiendo el paso, con orden 1 en
  los de Euler y 2 en Heun.
- **Las familias que diferían de SCEPTRE**, contra la exacta. En 12elemb,
  c01, a04, pru_pared5, Pared, circuito-mano y 6elementos se desvía SCEPTRE.
  chopped_circuito difería por su `.ds` con Euler; con `RK=[13]` da igual
  (r2152). Los tanques y a13zcorto ya daban igual.
- **SPICE contra la misma exacta** (`exactas --spice`): el `.cir` sale de
  las ramas, con `IC` en el arranque de la exacta, y ngspice-42 coincide
  con la exacta en 2e-5 o mejor. En minimum es grueso en sus primeros pasos.
- **Los saltos de las fuentes** (r2101 a r2117, r2154, r2155): un salto de
  una tabla, o de una función del tiempo como `if`, `sgn`, `mod`, `floor` o
  una función propia, con el tiempo transformado de forma lineal, es un
  punto de quiebre. El paso termina justo antes y uno mínimo lo cruza. En
  GLM, el paso que cruza y el siguiente se dan con los coeficientes de
  arranque. Antes se perdía medio paso en cada salto: el tanque pasa de
  1.3e-5 a 2.9e-10 contra la exacta. Ejemplos en
  `siru/corpus/corpus/inventados/salto-*.ds`; prueba en `tests/quiebres.t`.
- **`siru --paso-factor F`** (r2089, r2090) y **`siru/corpus/convergencia`**:
  corren con el paso y con la mitad, o un cuarto, y estiman el orden.

## 3 septies. SPICE: la marcha sin estados (03/10/2026, r1990 a r1994)

Del plan de `siru/corpus/spice/incorporar.md` quedaron hechos los puntos 1 a 5
(SFFM, `.op`, `.subckt`, `.dc`, `.meas`), todos sin tocar el núcleo salvo
una cosa: los circuitos de un `.dc` no tienen estados, y el caso 4 de
`bin/siru` escribía un solo punto aunque el archivo pidiera corrida.
Ahora `Siru::UnPunto` marcha T a paso fijo hasta TIEMPOFINAL cuando hay
CONTROL_EQUATIONS: resuelve el punto en cada T con la solución anterior
de semilla del siguiente (SEMILLAS de calcula, r158/159). La rampa del
`.dc` de cir2ds queda así hecha, y de yapa es un source stepping: el
diodo `exp(38·v)` de `siru/corpus/spice/diodo-dc` converge en los 201 puntos
del barrido, cosa que desde la semilla cero no pasa (sección 5). Sin
corrida pedida, un punto como antes.

Lo demás fue del lado de la traducción y las herramientas: cir2ds aplasta
`.subckt`/X texto a texto (recursivo, con PARAMS:), traduce SFFM y `.dc`,
y acepta `.op`; interpola ganó `avg`/`rms`/`integ` para las `.meas`; los
nombres de rama y los nodos admiten `_` (r1990: cir2ds los escribe al
aplastar, `R1_X1`, y antes se perdían sin aviso). Validaciones y números,
contra ngspice, en `siru/corpus/spice/incorporar.md`.

## 4. Calcula (r150, r151)

- r150: diagnóstico de la dirección indeterminada cuando `determina()`
  falla (vectores singulares).
- r151: **`determina()` es estructural**: busca un emparejamiento completo
  ecuación-incógnita sobre el patrón de ceros del jacobiano, en lugar del
  umbral 1e-8 sobre valores singulares, que tomaba por singular una ganancia
  de 2e5 (`EA1, GND-3 = PAO*VRIN` en a13). Si falta, dice qué incógnitas
  quedan sin ecuación y qué ecuaciones sin incógnita. Y en `raiz_metodo_fdf`
  el rescate exige que baje el mayor residuo, y rehace el paso de Newton
  cuando `gnewton` deja `x` en NaN (residuo infinito, `exp(38*v)`).
  Documentado en `MODULODINAMICO.md`, `RESOLUCION.md` y el changelog
  (6.0-26).

## 5. Qué quedó sin resolver

| archivo(s) | por qué | qué haría falta |
|---|---|---|
| `a13.d`, `a13plot.d`, `g04.d` | Newton no converge desde la semilla cero: diodos `exp(38*v)` con ganancia 2e5; el primer paso de Newton da miles de volts | continuación (source stepping / gmin) o semillas razonables |
| `siru/corpus/spice/llave-ruido-medidas` | corre pero da mal: con 68 filas para 40 ms el integrador se salta los flancos de la llave `SB` (detecta 1 de los 4 cambios de configuración del PULSE) y `v(out)` llega a ~26 V con una fuente de 5 V; ngspice da 4.9948 | detectar el cruce de la condición de la llave dentro del paso (evento) y rehacer el paso ahí, o acotar el paso cuando hay llaves cuya condición cambia rápido |
| `a13z.d`, `a13zcorto.d` | tablas con X no creciente | corregir las tablas |
| `g02.d` | función `FSAT` externa que el dato no trae | escribirla en `FUNCTIONS` |
| `d01.d` | valor `(1,0)`: análisis AC de SCEPTRE, que no existe | otra formulación |
| `circuito-T3.ds` | bobina `LNL` con `V^2`, derivada nula en `V = 0` | semilla distinta de cero |
| `11elem.ds`, `cutloop.ds`, `slex_viejos/circuitoCSLO`, `circuitoCSLO`, `circuitoCSLO2`, `circuitoCSLOCLO` | modelos de la biblioteca vieja (`L`, `C` por incrementos) o nodos inválidos | convertirlos a `LB`/`CB` (lo hace la otra sesión) |
| `circuitoBX`, `circuitoBloli` | la ecuación propia nombra una `Z` que no está en `VARIABLES` | declararla |
| `siru/corpus/PENDIENTE-funciones-exprtk.md` | la revisión completa de las `FUNCTIONS` a notación ExprTk (multiplicación implícita) | pendiente, en otra sesión |

Limitaciones: `slex/degen` y el `-madre.din` no los lee nadie. (El salto de
corriente por `M` a una bobina fuera del corte se resolvió en r1738:
`slex/d2datdinc/pruebas/mutua-corte.d`, `tests/mutua_corte.t`.) (`EC` como nombre de
elemento en a03, a13 y otros toma el tipo `EC` de la biblioteca, que es igual
a `EB`: no es un problema, a03 corre.)

### Los dos capacitores (05/10/2026, r2195 a r2197)

Pedido del autor: dos modelos distintos y al menos dos ejemplos. `CB`
(capacidad total, `Q = C·V`, estado la carga) y el nuevo `CINC` (capacidad
incremental, `I = C·dV/dt`, estado el voltaje: el de SCEPTRE). En un `.d`,
la rama cuyo nombre empieza con `CINC`. Ejemplos en
`slex/d2datdinc/pruebas/sceptre/`: `dos-capacitores.d` (en siru `VC1` = 4.737
y `VCINC2` = 6.167 en t = 4; SCEPTRE da 6.167 en los dos) y `a01-cinc.d` (el
inversor a01 con `CE` y `CC` como `CINC`: igual a SCEPTRE). Queda sin hacer:
que un `.d` de SCEPTRE tome `CINC` solo, sin cambiarle los nombres (d04, los
`a01*`, `a02*` siguen con `CB`).

### Para adelante (anotado el 04/10/2026, a pedido del autor)

- **Una ODE que no es contra el tiempo.** siru integra contra una sola
  variable independiente y la llama siempre `T` (`TIME` en un `.d`); no se
  puede declarar otra. Una ecuación en otra variable (una posición `x`) se
  escribe llamándola `T` y se integra igual, pero la salida la rotula `TIME`,
  magnitud "tiempo", unidad "s". **Idea del autor**: seguir trabajando
  siempre con `T` por dentro e indicar en el `.ds` que `T` se llama `N` para
  los resultados (el nombre, y de paso la magnitud y la unidad, de la primera
  columna del `.simul`). Así no hay que tocar libdin ni el integrador: es
  sólo el rótulo de la salida. No está hecho ni probado.
- **Variables adentro del cuerpo de una función.** libdin escribe en el
  cuerpo el valor de cada parámetro numérico que la función nombra, porque
  Calcula compila cada función sola. El tiempo ya se trata aparte (la función
  va en línea, r2181), pero con otras variables sigue mal, probado el
  04/10/2026: un **estado con condición inicial** (`VC1 = 5`) queda congelado
  en su valor inicial, sin aviso (`Q1(A) = (A*(1.+PK*VC1))` sale `(A*(1.+(0.5)*(5)))`);
  una **corriente o tensión de rama** (`IR1`) o un **parámetro definido por
  una expresión** quedan con su nombre y Calcula no compila la función ("no
  se pudo compilar la funcion q2"). Pasada como argumento (`Q1(2., VC1)`)
  anda bien. El arreglo es el mismo que el del tiempo: poner en línea toda
  función cuyo cuerpo nombre algo que no sea un argumento ni una constante.
  Esperando la decisión del autor.

- **g02, lo que falta** (anotado el 05/10/2026, a pedido del autor). `g02.ds`
  coincide con SCEPTRE y corre hasta t = 9.38 ms de 30 ms; ahí para con
  "demasiados intentos", justo después del cortocircuito de la carga (`RAL =
  TABLE 2`, de 10 a 0.01 Ω entre 9 y 9.1 ms; SCEPTRE da IL11 = 913 en 9.57
  ms). Para cerrarlo, en este orden:
  1. ver por qué el control del paso se rinde ahí: el límite de 20 intentos
     (`intentos_max`), el paso mínimo, o que la estimación del error no baja
     al achicar el paso;
  2. la lentitud: 52 minutos para 9.4 ms. El `.ds` lleva `SIRU_PASO =
     1e-5`, puesto a mano, y cada paso resuelve 441 incógnitas con varias
     vueltas de Newton;
  3. `g02salto.ds`, el ejemplo con la condición inicial difícil (`IL44 = 0`
     escrito: trasvase de flujo al arrancar, il55 a −91), que no se corrió
     con todo lo corregido.
  El estado está también en `siru/corpus/README.md` («Contra SCEPTRE»).
- **Del punto 5 (los `.d` que siru no corre), sin mirar todavía**:
  `pru_form_1/2` (un punto sin estados, "input domain error"), `c11` (valor
  no finito), `wreal` (cantidad de datos), `i14` (Calcula no carga el
  sistema), `v040` (`PL1 = X1(...)`, una inductancia por expresión).

## 6. Qué quedó sin verificar

- **Contra SCEPTRE, desde r1729 `siru/corpus/sceptre` y `regenera --sceptre`**
  (ver `siru/corpus/README.md`, «Contra SCEPTRE»). Antes no había salidas de
  SCEPTRE y ningún `.d` estaba comparado. Lo primero que dio: `6elementos`
  difiere 1–2 % y el que se desvía es SCEPTRE (siru con paso fino lo
  confirma); `a01` difiere mucho y hay que mirarlo; el resto del corpus está
  sin correr.
- Lo que sí tiene referencia: los 22 de caso 2 contra el Perl de siru
  (es Simul contra Simul); psicro contra sus "buenos datos"; capacitor
  variable, mutua, núcleo, isla, parámetros propios contra soluciones
  analíticas en `siru/tests`.
- El integrador a veces da un último paso de 2e-14 (0.1 sumado cien veces no
  llega a 10): una corrida de 0 a 10 tiene 102 filas. Ya pasaba, no se tocó.
- Los `.din`, `.simul`, `.patron` y `.tipo` congelados del corpus los regenera
  la otra sesión (`siru/corpus/regenera`); mientras tanto `compara-din` falla y no
  es error.
