Siru en Simusol · Documentación · Manual

HECHO

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; 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.

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.

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)

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

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.

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)

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)

6. Qué quedó sin verificar