home *** CD-ROM | disk | FTP | other *** search
/ Programmer's ROM - The Computer Language Library / programmersrom.iso / ada / piwg / z000009.ada < prev    next >
Encoding:
Text File  |  1988-05-03  |  12.7 KB  |  408 lines

  1. with PHYSICAL_UNITS_BASIC ; use PHYSICAL_UNITS_BASIC ;
  2. with PHYSICAL_UNITS_MECHANICAL ; use PHYSICAL_UNITS_MECHANICAL ;
  3. with PHYSICAL_UNITS_ELECTRICAL ; use PHYSICAL_UNITS_ELECTRICAL ;
  4. with PHYSICAL_UNITS_OTHER ; use PHYSICAL_UNITS_OTHER ;
  5.  
  6. -- This package defines operators needed to evaluate equations of
  7. -- physics using dimensional and units checking. Only MKS units
  8. -- are used. A conversion package is available to convert from
  9. -- other metric units and English units to the MKS units.
  10. --
  11. -- This package is not complete. Completeness would imply all
  12. -- possible operators that combine physical dimensions and yeild
  13. -- other physical dimensions. Users can provide local definitions
  14. -- or this package can be augmented.
  15. --
  16.  
  17. package MKS_PHYSICS_ELECTRICAL is
  18.  
  19.   function "/" ( LEFT : VOLTAGE_VOLT ;
  20.                  RIGHT : CURRENT_AMPERE ) return RESISTANCE_OHM ;
  21.  
  22.   function "/" ( LEFT : CURRENT_AMPERE ;
  23.                  RIGHT : VOLTAGE_VOLT ) return CONDUCTANCE_MHO ;
  24.  
  25.   function "/" ( LEFT : VOLTAGE_VOLT ;
  26.                  RIGHT : RESISTANCE_OHM ) return CURRENT_AMPERE ;
  27.  
  28.   function "*" ( LEFT : RESISTANCE_OHM ;
  29.                  RIGHT : CURRENT_AMPERE ) return VOLTAGE_VOLT ;
  30.  
  31.   function "*" ( LEFT : CURRENT_AMPERE ;
  32.                  RIGHT : RESISTANCE_OHM ) return VOLTAGE_VOLT ;
  33.  
  34.   function "*" ( LEFT : INDUCTANCE_HENRY ;
  35.                  RIGHT : AMPERE_PER_SECOND ) return VOLTAGE_VOLT ;
  36.  
  37.   function "/" ( LEFT : CAPACITANCE_FARAD ;
  38.                  RIGHT : VOLT_PER_SECOND ) return CURRENT_AMPERE ;
  39.  
  40.   function "/" ( LEFT : VOLTAGE_VOLT ;
  41.                  RIGHT : TIME_SECOND ) return VOLT_PER_SECOND ;
  42.  
  43.   function "/" ( LEFT : CURRENT_AMPERE ;
  44.                  RIGHT : TIME_SECOND ) return AMPERE_PER_SECOND ;
  45.  
  46.   function "*" ( LEFT : PERMITTIVITY ;
  47.                  RIGHT : LENGTH_METER ) return CAPACITANCE_FARAD ;
  48.  
  49.   function "*" ( LEFT : PERMEABILITY ;
  50.                  RIGHT : LENGTH_METER ) return INDUCTANCE_HENRY ;
  51.  
  52.   function "/" ( LEFT : CURRENT_AMPERE ;
  53.                  RIGHT : LENGTH_METER ) return MAGNETIC_INTENSITY ;
  54.  
  55.   function "/" ( LEFT : VOLTAGE_VOLT ;
  56.                  RIGHT : LENGTH_METER ) return ELECTRIC_FIELD ;
  57.  
  58.   function "*" ( LEFT : PERMITTIVITY ;
  59.                  RIGHT : ELECTRIC_FIELD ) return ELECTRIC_DISPLACEMENT ;
  60.  
  61.   function "*" ( LEFT : ELECTRIC_FIELD ;
  62.                  RIGHT : PERMITTIVITY ) return ELECTRIC_DISPLACEMENT ;
  63.  
  64.   function "*" ( LEFT : PERMEABILITY ;
  65.                  RIGHT : MAGNETIC_INTENSITY ) return MAGNETIC_FLUX_DENSITY ;
  66.  
  67.   function "*" ( LEFT : ELECTRIC_FIELD ;
  68.                  RIGHT : PERMEABILITY ) return MAGNETIC_FLUX_DENSITY ;
  69.  
  70. -- Note: Relations between power, energy, force and pressure are in
  71. --       MKS_PHYSICS_MECHANICAL. Operators to yeild power, energy,
  72. --       force and pressure ( energy density ) from electrical units
  73. --       are provided in this package
  74. --
  75.  
  76.   function "*" ( LEFT : CURRENT_AMPERE ;
  77.                  RIGHT : VOLTAGE_VOLT ) return POWER_WATT ;
  78.  
  79.   function "*" ( LEFT : VOLTAGE_VOLT ;
  80.                  RIGHT : CURRENT_AMPERE ) return POWER_WATT ;
  81.  
  82.   function "*" ( LEFT : AMPERE_SQUARED ;
  83.                  RIGHT : RESISTANCE_OHM ) return POWER_WATT ;
  84.  
  85.   function "*" ( LEFT : RESISTANCE_OHM ;
  86.                  RIGHT : AMPERE_SQUARED ) return POWER_WATT ;
  87.  
  88.   function "/" ( LEFT : VOLT_SQUARED ;
  89.                  RIGHT : RESISTANCE_OHM ) return POWER_WATT ;
  90.  
  91.   function "*" ( LEFT : CAPACITANCE_FARAD ;
  92.                  RIGHT : VOLT_SQUARED ) return ENERGY_JOULE ;
  93.  
  94.   function "*" ( LEFT : INDUCTANCE_HENRY ;
  95.                  RIGHT : AMPERE_SQUARED ) return ENERGY_JOULE ;
  96.  
  97. -- energy density (pressure) := D * E
  98.  
  99.   function "*" ( LEFT : ELECTRIC_DISPLACEMENT ;
  100.                  RIGHT : ELECTRIC_FIELD ) return PRESSURE_MKS ;
  101.  
  102.   function "*" ( LEFT : ELECTRIC_FIELD ;
  103.                  RIGHT : ELECTRIC_DISPLACEMENT ) return PRESSURE_MKS ;
  104.  
  105. -- energy density (pressure) := B * H
  106.  
  107.   function "*" ( LEFT : MAGNETIC_FLUX_DENSITY ;
  108.                  RIGHT : MAGNETIC_INTENSITY ) return PRESSURE_MKS ;
  109.  
  110.   function "*" ( LEFT : MAGNETIC_INTENSITY ;
  111.                  RIGHT : MAGNETIC_FLUX_DENSITY ) return PRESSURE_MKS ;
  112.  
  113. -- intermediate results
  114.  
  115.   function "*" ( LEFT , RIGHT : VOLTAGE_VOLT ) return VOLT_SQUARED ;
  116.  
  117.   function "**" ( LEFT : VOLTAGE_VOLT ;
  118.                   RIGHT : INTEGER ) return VOLT_SQUARED ;
  119.  
  120.   function SQRT ( LEFT : VOLT_SQUARED ) return VOLTAGE_VOLT ;
  121.  
  122.   function "*" ( LEFT , RIGHT : CURRENT_AMPERE ) return AMPERE_SQUARED ;
  123.  
  124.   function "**" ( LEFT : CURRENT_AMPERE ;
  125.                   RIGHT : INTEGER ) return AMPERE_SQUARED ;
  126.  
  127.   function SQRT ( LEFT : AMPERE_SQUARED ) return CURRENT_AMPERE ;
  128.  
  129.   pragma INLINE ( "*" , "/" , "**" , SQRT ) ;
  130. end MKS_PHYSICS_ELECTRICAL ;
  131. with REFUNCT ; use REFUNCT ;
  132. with PHYSICAL_REAL ; use PHYSICAL_REAL ;
  133.  
  134. package body MKS_PHYSICS_ELECTRICAL is
  135.  
  136.   function "/" ( LEFT : VOLTAGE_VOLT ;
  137.                  RIGHT : CURRENT_AMPERE ) return RESISTANCE_OHM is
  138.  
  139.   begin
  140.     return RESISTANCE_OHM'  --
  141.         ( DIMENSION( UNDIMENSION( LEFT ) / UNDIMENSION ( RIGHT ))) ;
  142.   end "/" ;
  143.  
  144.   function "/" ( LEFT : CURRENT_AMPERE ;
  145.                  RIGHT : VOLTAGE_VOLT ) return CONDUCTANCE_MHO is
  146.  
  147.   begin
  148.     return CONDUCTANCE_MHO'  --
  149.         ( DIMENSION( UNDIMENSION( LEFT ) / UNDIMENSION ( RIGHT ))) ;
  150.   end "/" ;
  151.  
  152.   function "/" ( LEFT : VOLTAGE_VOLT ;
  153.                  RIGHT : RESISTANCE_OHM ) return CURRENT_AMPERE is
  154.  
  155.   begin
  156.     return CURRENT_AMPERE'  --
  157.         ( DIMENSION( UNDIMENSION( LEFT ) / UNDIMENSION ( RIGHT ))) ;
  158.   end "/" ;
  159.  
  160.   function "*" ( LEFT : RESISTANCE_OHM ;
  161.                  RIGHT : CURRENT_AMPERE ) return VOLTAGE_VOLT is
  162.  
  163.   begin
  164.     return VOLTAGE_VOLT'  --
  165.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  166.   end "*" ;
  167.  
  168.   function "*" ( LEFT : CURRENT_AMPERE ;
  169.                  RIGHT : RESISTANCE_OHM ) return VOLTAGE_VOLT is
  170.  
  171.   begin
  172.     return VOLTAGE_VOLT'  --
  173.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  174.   end "*" ;
  175.  
  176.   function "*" ( LEFT : INDUCTANCE_HENRY ;
  177.                  RIGHT : AMPERE_PER_SECOND ) return VOLTAGE_VOLT is
  178.  
  179.   begin
  180.     return VOLTAGE_VOLT'  --
  181.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  182.   end "*" ;
  183.  
  184.   function "/" ( LEFT : CAPACITANCE_FARAD ;
  185.                  RIGHT : VOLT_PER_SECOND ) return CURRENT_AMPERE is
  186.  
  187.   begin
  188.     return CURRENT_AMPERE'  --
  189.         ( DIMENSION( UNDIMENSION( LEFT ) / UNDIMENSION ( RIGHT ))) ;
  190.   end "/" ;
  191.  
  192.   function "/" ( LEFT : VOLTAGE_VOLT ;
  193.                  RIGHT : TIME_SECOND ) return VOLT_PER_SECOND is
  194.  
  195.   begin
  196.     return VOLT_PER_SECOND'  --
  197.         ( DIMENSION( UNDIMENSION( LEFT ) / UNDIMENSION ( RIGHT ))) ;
  198.   end "/" ;
  199.  
  200.   function "/" ( LEFT : CURRENT_AMPERE ;
  201.                  RIGHT : TIME_SECOND ) return AMPERE_PER_SECOND is
  202.  
  203.   begin
  204.     return AMPERE_PER_SECOND'  --
  205.         ( DIMENSION( UNDIMENSION( LEFT ) / UNDIMENSION ( RIGHT ))) ;
  206.   end "/" ;
  207.  
  208.   function "*" ( LEFT : PERMITTIVITY ;
  209.                  RIGHT : LENGTH_METER ) return CAPACITANCE_FARAD is
  210.  
  211.   begin
  212.     return CAPACITANCE_FARAD'  --
  213.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  214.   end "*" ;
  215.  
  216.   function "*" ( LEFT : PERMEABILITY ;
  217.                  RIGHT : LENGTH_METER ) return INDUCTANCE_HENRY is
  218.  
  219.   begin
  220.     return INDUCTANCE_HENRY'  --
  221.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  222.   end "*" ;
  223.  
  224.   function "/" ( LEFT : CURRENT_AMPERE ;
  225.                  RIGHT : LENGTH_METER ) return MAGNETIC_INTENSITY is
  226.  
  227.   begin
  228.     return MAGNETIC_INTENSITY'  --
  229.         ( DIMENSION( UNDIMENSION( LEFT ) / UNDIMENSION ( RIGHT ))) ;
  230.   end "/" ;
  231.  
  232.   function "/" ( LEFT : VOLTAGE_VOLT ;
  233.                  RIGHT : LENGTH_METER ) return ELECTRIC_FIELD is
  234.  
  235.   begin
  236.     return ELECTRIC_FIELD'  --
  237.         ( DIMENSION( UNDIMENSION( LEFT ) / UNDIMENSION ( RIGHT ))) ;
  238.   end "/" ;
  239.  
  240.   function "*" ( LEFT : PERMITTIVITY ;
  241.                  RIGHT : ELECTRIC_FIELD ) return ELECTRIC_DISPLACEMENT is
  242.  
  243.   begin
  244.     return ELECTRIC_DISPLACEMENT'  --
  245.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  246.   end "*" ;
  247.  
  248.   function "*" ( LEFT : ELECTRIC_FIELD ;
  249.                  RIGHT : PERMITTIVITY ) return ELECTRIC_DISPLACEMENT is
  250.  
  251.   begin
  252.     return ELECTRIC_DISPLACEMENT'  --
  253.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  254.   end "*" ;
  255.  
  256.   function "*" ( LEFT : PERMEABILITY ;
  257.                  RIGHT : MAGNETIC_INTENSITY ) return MAGNETIC_FLUX_DENSITY is
  258.  
  259.   begin
  260.     return MAGNETIC_FLUX_DENSITY'  --
  261.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  262.   end "*" ;
  263.  
  264.   function "*" ( LEFT : ELECTRIC_FIELD ;
  265.                  RIGHT : PERMEABILITY ) return MAGNETIC_FLUX_DENSITY is
  266.  
  267.   begin
  268.     return MAGNETIC_FLUX_DENSITY'  --
  269.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  270.   end "*" ;
  271.  
  272.   function "*" ( LEFT : CURRENT_AMPERE ;
  273.                  RIGHT : VOLTAGE_VOLT ) return POWER_WATT is
  274.  
  275.   begin
  276.     return POWER_WATT'  --
  277.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  278.   end "*" ;
  279.  
  280.   function "*" ( LEFT : VOLTAGE_VOLT ;
  281.                  RIGHT : CURRENT_AMPERE ) return POWER_WATT is
  282.  
  283.   begin
  284.     return POWER_WATT'  --
  285.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  286.   end "*" ;
  287.  
  288.   function "*" ( LEFT : AMPERE_SQUARED ;
  289.                  RIGHT : RESISTANCE_OHM ) return POWER_WATT is
  290.  
  291.   begin
  292.     return POWER_WATT'  --
  293.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  294.   end "*" ;
  295.  
  296.   function "*" ( LEFT : RESISTANCE_OHM ;
  297.                  RIGHT : AMPERE_SQUARED ) return POWER_WATT is
  298.  
  299.   begin
  300.     return POWER_WATT'  --
  301.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  302.   end "*" ;
  303.  
  304.   function "/" ( LEFT : VOLT_SQUARED ;
  305.                  RIGHT : RESISTANCE_OHM ) return POWER_WATT is
  306.  
  307.   begin
  308.     return POWER_WATT'  --
  309.         ( DIMENSION( UNDIMENSION( LEFT ) / UNDIMENSION ( RIGHT ))) ;
  310.   end "/" ;
  311.  
  312.   function "*" ( LEFT : CAPACITANCE_FARAD ;
  313.                  RIGHT : VOLT_SQUARED ) return ENERGY_JOULE is
  314.  
  315.   begin
  316.     return ENERGY_JOULE'  --
  317.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  318.   end "*" ;
  319.  
  320.   function "*" ( LEFT : INDUCTANCE_HENRY ;
  321.                  RIGHT : AMPERE_SQUARED ) return ENERGY_JOULE is
  322.  
  323.   begin
  324.     return ENERGY_JOULE'  --
  325.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  326.   end "*" ;
  327.  
  328.   function "*" ( LEFT : ELECTRIC_DISPLACEMENT ;
  329.                  RIGHT : ELECTRIC_FIELD ) return PRESSURE_MKS is
  330.  
  331.   begin
  332.     return PRESSURE_MKS'  --
  333.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  334.   end "*" ;
  335.  
  336.   function "*" ( LEFT : ELECTRIC_FIELD ;
  337.                  RIGHT : ELECTRIC_DISPLACEMENT ) return PRESSURE_MKS is
  338.  
  339.   begin
  340.     return PRESSURE_MKS'  --
  341.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  342.   end "*" ;
  343.  
  344.   function "*" ( LEFT : MAGNETIC_FLUX_DENSITY ;
  345.                  RIGHT : MAGNETIC_INTENSITY ) return PRESSURE_MKS is
  346.  
  347.   begin
  348.     return PRESSURE_MKS'  --
  349.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  350.   end "*" ;
  351.  
  352.   function "*" ( LEFT : MAGNETIC_INTENSITY ;
  353.                  RIGHT : MAGNETIC_FLUX_DENSITY ) return PRESSURE_MKS is
  354.  
  355.   begin
  356.     return PRESSURE_MKS'  --
  357.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  358.   end "*" ;
  359.  
  360.   function "*" ( LEFT , RIGHT : VOLTAGE_VOLT ) return VOLT_SQUARED is
  361.  
  362.   begin
  363.     return VOLT_SQUARED'  --
  364.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  365.   end "*" ;
  366.  
  367.   function "**" ( LEFT : VOLTAGE_VOLT ;
  368.                   RIGHT : INTEGER ) return VOLT_SQUARED is
  369.  
  370.   begin
  371.     if RIGHT /= 2 then
  372.       raise NUMERIC_ERROR ;
  373.     end if ;
  374.     return VOLT_SQUARED'  --
  375.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( LEFT ))) ;
  376.   end "**" ;
  377.  
  378.   function SQRT ( LEFT : VOLT_SQUARED ) return VOLTAGE_VOLT is
  379.  
  380.   begin
  381.     return VOLTAGE_VOLT' ( DIMENSION( SQRT( UNDIMENSION( LEFT )))) ;
  382.   end SQRT ;
  383.  
  384.   function "*" ( LEFT , RIGHT : CURRENT_AMPERE ) return AMPERE_SQUARED is
  385.  
  386.   begin
  387.     return AMPERE_SQUARED'  --
  388.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( RIGHT ))) ;
  389.   end "*" ;
  390.  
  391.   function "**" ( LEFT : CURRENT_AMPERE ;
  392.                   RIGHT : INTEGER ) return AMPERE_SQUARED is
  393.  
  394.   begin
  395.     if RIGHT /= 2 then
  396.       raise NUMERIC_ERROR ;
  397.     end if ;
  398.     return AMPERE_SQUARED'  --
  399.         ( DIMENSION( UNDIMENSION( LEFT ) * UNDIMENSION ( LEFT ))) ;
  400.   end "**" ;
  401.  
  402.   function SQRT ( LEFT : AMPERE_SQUARED ) return CURRENT_AMPERE is
  403.  
  404.   begin
  405.     return CURRENT_AMPERE' ( DIMENSION( SQRT( UNDIMENSION( LEFT )))) ;
  406.   end SQRT ;
  407. end MKS_PHYSICS_ELECTRICAL ;
  408.