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

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