File : torus_ops.ads


with Ada.Text_IO, Reps, Fouriers_Init, Lin;
use Ada.Text_IO, Reps, Fouriers_Init, Lin;
with Fouriers, Fouriers.Ops, Fouriers.IO;
with Taylors, Taylors.Ops;

pragma Elaborate_All (Ada.Text_IO, Taylors.Ops, Fouriers.Ops, Fouriers.IO);

generic

  Lmax, Wmax, Pdeg: in Positive;
  Dho: in Natural;
  Sigma, Kappa: Rep;
  type Scalar is private;

  with function IsNumeric(S: Scalar) return Boolean is <>;
  with function Scal(K: Integer) return Scalar is <>;
  with function Scal(R: Rep) return Scalar is <>;
  with function Ball(R: Rep) return Scalar is <>;
  with function Ball(S: Scalar) return Scalar is <>;
  with function Err0(S: Scalar) return Boolean is <>;
  with function "<"(S1,S2: Scalar) return Boolean is <>;
  with function IntFloor(S: Scalar) return Integer is <>;
  with function IntCeiling(S: Scalar) return Integer is <>;
  with function Approx(S: Scalar) return Rep is <>;
  with function Inf(S: Scalar) return Rep is <>;
  with function Sup(S: Scalar) return Rep is <>;
  with function SupAbs(S: Scalar) return Rep is <>;
  with function "abs"(S: Scalar) return Scalar is <>;
  with function Min(S1,S2: Scalar) return Scalar is <>;
  with function Max(S1,S2: Scalar) return Scalar is <>;
  with function Cap(R: Radius; S: Scalar) return Scalar is <>;
  with function "-"(S: Scalar) return Scalar is <>;

  with function Center(S: Scalar) return Scalar is <>;
  with function Widen(S: Scalar) return Scalar is <>;
  with procedure ResetCenter(S: in out Scalar) is <>;
  with function ResetCenter(S: Scalar) return Scalar is <>;
  with procedure Split(S: in Scalar; S0,SE: out Scalar) is <>;
  with procedure ErrMult(R: in Rep; S: in out Scalar) is <>;
  with function "+"(S,T: Scalar) return Scalar is <>;
  with function "-"(S,T: Scalar) return Scalar is <>;
  with function "*"(R: Rep; S: Scalar) return Scalar is <>;
  with function "/"(S: Scalar; R: Rep) return Scalar is <>;
  with function Sqr(S: Scalar) return Scalar is <>;
  with function "*"(S,T: Scalar) return Scalar is <>;
  with function Inv(S: Scalar) return Scalar is <>;
  with function "/"(S,T: Scalar) return Scalar is <>;
  with function "**"(S: Scalar; I: Integer) return Scalar is <>;

  with function Cosh(S: Scalar) return Scalar is <>;
  with function Sinh(S: Scalar) return Scalar is <>;
  with function Exp(S: Scalar) return Scalar is <>;
  with function Log(S: Scalar) return Scalar is <>;
  with function Lambda(M,N: Integer) return Scalar is <>;

  with procedure Show(S: in Scalar; NewLine: in Boolean := True) is <>;
  with procedure Get(F: in File_Type; S: out Scalar; Decimal: in Boolean := True) is <>;
  with procedure Put(F: in File_Type; S: in Scalar; Decimal: in Boolean := True) is <>;

package Torus_Ops is

  ScalZero: constant Scalar := Scal(Zero);
  ScalOne:  constant Scalar := Scal(One);
  Theta:    constant Scalar := Lambda(1,-1);
  InvTheta: constant Scalar := Lambda(0,-1);

  package Scal_Fou is new Fouriers (Lmax => Lmax, Wmax => Wmax, Pdeg => Pdeg, Dho => Dho, Scalar => Scalar);
  package Scal_Fou_Ops is new Scal_Fou.Ops;
  package Scal_Fou_IO is new Scal_Fou.IO;
  package Scal_Tay  renames Scal_Fou.Components;
  package Scal_Tay_Ops renames Scal_Fou_Ops.Components_Ops;

  use Scal_Fou, Scal_Fou_Ops, Scal_Fou_IO, Scal_Tay, Scal_Tay_Ops;

  type Canonical is
    record
      Q: Fourier;  -- odd
      P: Fourier;  -- even
    end record;

  type Torus is
    record
      Q: Sobolev;  -- odd
      P: Sobolev;  -- even
    end record;

  procedure ShowParam;                                              -- Does what is sais
  procedure Show(U: in Canonical; Cut: in Rep := Zero);             -- Show coeffs of U  (of modulus>Cut)
  procedure Read(Name: in String; R: in Weights; U: out Canonical;
                 Decimal: in Boolean := True);                      -- Read U from file Name
  procedure Write(Name: in String;
                  U: in Canonical; Decimal: in Boolean := True);    -- Write U to file Name
  procedure Show(T: in Torus; Cut: in Rep := Zero);                 -- Show coeffs of T  (of modulus>Cut)
  procedure Read(Name: in String; R: in Radius; T: out Torus;
                 Decimal: in Boolean := True);                      -- Read T from file Name
  procedure Write(Name: in String;
                  T: in Torus; Decimal: in Boolean := True);        -- Write T to file Name

  function Rho(T: Torus) return Radius;                             -- Radius defining domain of T
  function Rho(U: Canonical) return Weights;                        -- Weights defining domain of U
  procedure SetZero(R: in Radius; T: out Torus);                    -- T := 0
  function "-"(T1,T2: Torus) return Torus;                          -- Return T1-T2
  function Norm(R,B: Radius; T: Torus) return Scalar;               -- ||T||_R

  function NormDer(R: Weights; B: Radius; U: Canonical) return Scalar; -- |DU|_R
  function Val(Z: Scalar; U: Canonical) return Scalar;              -- Z component of U(0,Z)
  function DerVal3(Z: Scalar; U: Canonical) return Scalar;          -- Z component of D_z U(0,Z)
  function ValQ0(U: Canonical) return Taylor;                       -- Z component of U(0,.)
  procedure TmuComp(Mu: in Scalar; U1: in Canonical; U2: out Canonical); -- U2 := T_mu o U1
  procedure Comp(U1,U2: in Canonical; U3: out Canonical);           -- U3 := U1 o U2
  procedure Comp(U: in Canonical; T1: in Torus; T2: out Torus);     -- T2 := U o T1

  procedure TmuComp(Mu: in Scalar; T1: in Torus; T2: out Torus);    -- T2 := T_mu o T1
  procedure TmuComp(Mu: in Scalar; T: in out Torus);                -- T := T_mu o T
  procedure CompTinv(T1: in Torus; T2: out Torus);                  -- T2 := T1 o T^{-1}

  procedure NN(Mu: in Scalar; U: in Canonical;
               T1: in Torus; T2: out Torus);                        -- Contraction NN

private

  Trunc: constant Boolean := IsNumeric(ScalZero);

end Torus_Ops;