File : torus_ops.adb
with Messages, Reps.Ops, Lin.Ops, Numerics.Ops.Fou;
use Messages;
pragma Elaborate_All (Messages, Lin.Ops);
package body Torus_Ops is
function IMin(I1,I2: Integer) return Integer renames Integer'Min;
function IMax(I1,I2: Integer) return Integer renames Integer'Max;
pragma Inline (Imin,Imax);
procedure ShowParam is
begin
if Trunc then
Show(" Scalar = Numeric");
else
Show(" Scalar = Interval");
end if;
Show(" Lmax =",Lmax);
Show(" Wmax =",Wmax);
Show(" Size1 =",Size1);
Show(" Size =",Size2);
Show(" SizeE =",SizeE);
Show(" Pdeg =",Pdeg);
Show(" Dho =",Dho);
Show(" DmaxCount =",DmaxCount);
Show(" ErrCount =",ErrCount);
Show(" Fourier'Size =",Fourier'Size);
Show(" Sobolev'Size =",Sobolev'Size);
Show(" Sigma =",Sigma);
Show(" Kappa =",Kappa);
end ShowParam;
procedure Show(U: in Canonical; Cut: in Rep := Zero) is
begin
Show(U.Q,Cut);
Show(U.P,Cut);
end Show;
procedure Read(Name: in String; R: in Weights; U: out Canonical; Decimal: in Boolean := True) is
begin
Read(Name & "_x",1,R,U.Q,Decimal);
Read(Name & "_z",0,R,U.P,Decimal);
end Read;
procedure Write(Name: in String; U: in Canonical; Decimal: in Boolean := True) is
begin
Write(Name & "_x",U.Q,Decimal);
Write(Name & "_z",U.P,Decimal);
end Write;
procedure Show(T: in Torus; Cut: in Rep := Zero) is
begin
Show(T.Q,Cut);
Show(T.P,Cut);
end Show;
procedure Read(Name: in String; R: in Radius; T: out Torus; Decimal: in Boolean := True) is
begin
Read(Name & "_x",1,R,T.Q,Decimal);
Read(Name & "_z",0,R,T.P,Decimal);
end Read;
procedure Write(Name: in String; T: in Torus; Decimal: in Boolean := True) is
begin
Write(Name & "_x",T.Q,Decimal);
Write(Name & "_z",T.P,Decimal);
end Write;
function Rho(T: Torus) return Radius is
begin
return Radius'Min(Rho(T.Q),Rho(T.P));
end Rho;
function Rho(U: Canonical) return Weights is
begin
return Min(Rho(U.Q),Rho(U.P));
end Rho;
procedure SetZero(R: in Radius; T: out Torus) is
begin
SetZero(1,R,T.Q);
SetZero(0,R,T.P);
end SetZero;
function "-"(T1,T2: Torus) return Torus is
T: Torus;
begin
T.Q := T1.Q-T2.Q;
T.P := T1.P-T2.P;
return T;
end "-";
function Norm(R,B: Radius; T: Torus) return Scalar is
begin
return Max(Norm(R,T.Q),B*Norm(R,T.P));
end Norm;
function NormDer(R: Weights; B: Radius; U: Canonical) return Scalar is
Rqq,Rqp,Rpq,Rpp: Scalar;
Ht: Fourier;
begin
OmegaDq(R.Q,U.Q,Ht);
Rqq := Norm(R,Ht); Show("Rqq =", Sup(Rqq));
Der3(R.P,U.Q,Ht);
Rqp := Norm(R,Ht); Show("Rqp =", Sup(Rqp));
OmegaDq(R.Q,U.P,Ht);
Rpq := Norm(R,Ht); Show("Rpq =", Sup(Rpq));
Der3(R.P,U.P,Ht);
Rpp := Norm(R,Ht); Show("Rpp =", Sup(Rpp));
return Max(Rqq+Rqp/B,B*Rpq+Rpp);
end NormDer;
function Val(Z: Scalar; U: Canonical) return Scalar is
begin
return Z+Val(Z,U.P);
end Val;
function DerVal3(Z: Scalar; U: Canonical) return Scalar is
begin
return ScalOne+DerVal3(Z,U.P);
end DerVal3;
function ValQ0(U: Canonical) return Taylor is
P: Taylor;
begin
P := ValQ0(U.P);
AddComponent(1,ScalOne,P);
return P;
end ValQ0;
procedure TmuComp(Mu: in Scalar; U1: in Canonical; U2: out Canonical) is
begin
Prod(-InvTheta,U1.Q,U2.Q);
Prod(-Theta*Mu,U1.P,U2.P);
end TmuComp;
procedure Comp(U1,U2: in Canonical; U3: out Canonical) is
Hp: Fourier;
begin
TraceEnter("Comp");
Copy(U2.P,Hp);
AddComponent(0,0,1,ScalOne,Hp);
CompOmega3(U1.Q,U1.P,U2.Q,Hp,U3.Q,U3.P);
Add(U2.Q,U3.Q);
Add(U2.P,U3.P);
TraceLeave;
end Comp;
procedure Comp(U: in Canonical; T1: in Torus; T2: out Torus) is
begin
TraceEnter("Comp");
CompOmega3(U.Q,U.P,T1.Q,T1.P,T2.Q,T2.P);
Add(T1.Q,T2.Q);
Add(T1.P,T2.P);
TraceLeave;
end Comp;
procedure TmuComp(Mu: in Scalar; T1: in Torus; T2: out Torus) is
begin
Prod(-InvTheta,T1.Q,T2.Q);
Prod(-Theta*Mu,T1.P,T2.P);
end TmuComp;
procedure TmuComp(Mu: in Scalar; T: in out Torus) is
begin
Mult(-InvTheta,T.Q);
Mult(-Theta*Mu,T.P);
end TmuComp;
procedure CompTinv(T1: in Torus; T2: out Torus) is
begin
CompTinv(T1.Q,T2.Q);
CompTinv(T1.P,T2.P);
end CompTinv;
procedure NN(Mu: in Scalar; U: in Canonical; T1: in Torus; T2: out Torus) is
T: Torus;
begin
TraceEnter("NN");
Comp(U,T1,T2);
CompTinv(T2,T);
TmuComp(Mu,T,T2);
TraceLeave;
end NN;
end Torus_Ops;