Unit simul2;

interface

uses xMatDefs, FilUSR,variable,FijaPaso,FormaEc, CYTipos, cprocs, horrores;


procedure paseo;


implementation
var
	flog: text;
	OldExitProc: pointer;




procedure runc(dt:NReal);

var
   k,j:integer;

begin

{ Inicio de Euler }
(*
¿Por qué será que calculaba las entradas en el paso siguiente? 18.02.95
funcsr(t+dt); { calcula las entradas }
*)
funcsr(t); { calcula las entradas }

for k:=1 to nx-redundancia do
begin
    x[indx[k]]:=m[k+nn,n+nx+1];
	 proescindex(x[indx[k]],m[k+nn],n+1,x0,1,nx-redundancia,indx);
	 proesc(x[indx[k]],m[k+nn],n+nx+2,rf,1,nindep);
	 x[indx[k]]:=x0[indx[k]]+x[indx[k]]*dt
end;

(* Creo que redundancia siempre viene en 0 pues el método utilizado
para eliminar la redundancia en FORMAEC pone a cero esta variable.
Por consiguiente es probable que el siguiente FOR no haga nada 18.02.95.
 *)
for K:=nx-redundancia+1 to nx do
begin
    error(' simul2:runc');
    x[indx[k]]:=0;
    proescindex(x[indx[k]],m[k+nn],n+1,x,1,nx-redundancia, indx);
	 x[indx[k]]:=-x[indx[k]]-m[k+nn,n+nx+1];   {22/9/90}
end;

for k:=1 to nn do
begin
	 v[k]:=m[k,n+nx+1];
	 proescindex(v[k],m[k],n+1,x,1,nx-redundancia, indx);
	 proesc(v[k],m[k],n+nx+2,rf,1,nindep);
end;

chequeo;

end; {runc}



function igulee:boolean;
var
   k:integer;
   ac:boolean;
begin
ac:=true;
for k:=1 to ndiodos do
    ac:=ac and(dx[k]=dx0[k]);
igulee:=ac
end;




procedure paseo;

var
   nofin:boolean;
   kd: integer;



procedure bee;{busca estado estable}

procedure Trace(xc:char);
var k:integer;
begin
	write(flog, 't: ', t:8:-3,' L:');
	for k:=1 to nd do
		if dx[k] then write(flog,'1')
		else write(flog,'0');
	write(flog, 'X: ');
	for k:= 1 to nx do
		write(flog, x[k]:8:-3);
	write(flog, 'V: ');
	for k:= 1 to nn do
		write(flog, v[k]:8:-3);
	writeLN(flog,xc);
end;


begin
	dx:=dx0;   { ??????? }

	repeat
		dx0:=dx;
		if AutoTrace then Trace('/');
		ObtenerEcuaciones;
		runc(0)
	until igulee;

	if AutoTrace then Trace('*');

	dtmax:=dtmax0;      (*1990 *)
	PasoEstable(dtmax); (* 1990 *)
	dt:=dtmax;
end;{bee}

procedure CrearArchivoAutoTrace;
var
	f: text;
begin
	assign(f, 'simeep.log');
	rewrite(f);
	close(f);
end;

begin

if AutoTrace then crearArchivoAutoTrace;

v[0]:=0;
for kd:=1 to qndiodos do
	begin
	dx[kd]:=false;{inicializa los d off}
	dx0[kd]:=false
	end;


inicio;
t:=tinicial;
dimencione;
dt:=dtmax;
bee;

pesca;
nofin:=true;
dt:=dtmax;

while nofin do
	begin
	t_siguiente:=t+dt;
	runc(dt);
	if igulee then
	begin
		x0:=x;t:=t_siguiente;pesca;
		if dt<dtmax then dt:=dt*1.1;
		if dt>dtmax then dt:=dtmax;
		if t>tfinal then nofin:=false;
	end
	else
      if dt>dtmin then  dt:=dt/2
		else
		begin
			x0:=x;t:=t_siguiente;dt:=dtmax;
			bee;pesca
		end
	end

end; {paseo}


procedure CerrarFlog;
begin
	close(flog);
end;

procedure AbrirFlog;
begin
	assign(flog,'simeep.log');
	rewrite(flog);
end;


procedure AlFinal; far;
begin
	CerrarFlog;
	ExitProc:= OldExitProc;
end;

procedure AlInicio;
begin
	AbrirFlog;
	OldExitProc:= ExitProc;
	ExitProc:=@AlFinal;
end;

begin
	AlInicio;



end.(* fin simul*)

