Optdes Pulley Design with Satisfaction Curves, and Satisfaction and Importance Levels Most machine design texts give detailed examples of typical component or system designs. The classic reference of M.F. Spotts, "Design of Machine Elements", Prentice-Hall, 1985 presents the detailed design of a belt pulley system using enginerring analysis equations and tables of empirical or experimental design parameters. His Example 4 is given below as a set of comments. The F90 source code below that validated that example has been modified to use other tabular data employed by Dixon in a similar design. Note that the Dixon evaluations would consider the Spott's example "Unacceptable". J.R. Dixon, C. Poli, "Engineering Design and Design for Manufacturing", Field Stone Pub., 1995 went on to point out that most engineering designs involve rather fuzzy evaluations of execellent, good, fair, poor and unsatisfactory and applieds these to individual components as well as to the final overall design. While OptDes, and most optimization codes, can impose regional constraints (or upper and lower bounds) on the design variables the fuzzy decision process sub-divides those bounds into satisfaction regions using a "Satisfaction Curves" for each variable. Those curves can have various shapes (and require a case evaluation). For example, the shaft force curve may look like : Excellent | |--...---| | | | Good | |---| |-----| | | | Fair | |---| |-------| | | | Poor | | |---| | | | Bad |--+---+---+--------+--+--+---+---+---+---- 3 4 5 ... 70 80 90 100 110 120 Shaft Force (lbs / 100) With several such curves you may be tempted to use each "Excellent" set of bounds as the OptDes constraints. However, that often results in an infeasible design. Thus a better approach may be to start with "Poor" bounds on all variables and the tighten them up as various feasible designs are found. After a feasible design has been found the user can hit the "Postprocess" button (to call anapos) to evaluate, and store, the design number and satisfaction levels. Then hitting "Compute Functions" and "Hardcopy" will update the design number and save the standard "Analysis" file so that it will correlate to the post processing files. Later they can be edited to report the best group of feasible designs. Dixon Design Example -------------------- First Design Attempt Note that the number of belts starts as a real variable to find local optimums that are sensitive to that value. Then it is moved down to be an integer analysis value that is tested for nearby optimumns using the nearest high and low integers. While this first design is feasible, it includes poor elvauations. Conducting additional searches from various starting points and changing the allowable and indifference ranges based on satisfaction curve data we can raise all the satisfaction levels to good or excellent, as shown in the final design given before the appendix which contains the source listing and original validation problem. The two design functions that are listed as good are at the point dividing the good and excellent ranges, so it is even better that the first impression. Using the design parameters and satisfaction curves of Dixon our first feasible design results in the output: ------ OptdesX v. 2.0 ------ Model: Pully_Belt_System ------ First Feasible Design =========================== Variables =========================== Name Value T Map Min Max ---------------- ------------- - -- ------------- ------------- Drive dia, in 18.92298 C 1 10.00000 25.00000 Load dia, in 25.00000 C 1 10.00000 25.00000 Drive speed,rpm 1212.816 C 1 1000.000 7000.000 Number of belts 7.451821 C 1 1.000000 15.00000 Belt length, in 113.8317 C 1 100.0000 150.0000 Name Value | Name Row File ---------------- ------------- | ---------------- -- ---------- Power, hp 400.0000 | =========================== Functions ============================ Name Value O T Map Allowable Indifference ---------------- ------------- - - -- ------------- ------------- Cost, 1983 $ 1025.076 v 1 1500.000 100.0000 Belt life, hr 7999.728 > 1 8000.000 16000.00 Shaft total, lb 9000.009 < 1 9000.000 400.0000 Center dist, in 22.21099 < 1 32.00000 12.00000 Gap distance,in 0.2495000 > 1 0.2500000 0.7500000 Load speed, rpm 918.0035 < 1 918.0000 888.0000 Belt speed, fpm 6008.319 < 1 6500.000 2000.000 Name Value | Name Weight ---------------- ------------- | ---------------- --- Tension ratio 4.340412 | Tight side lb 383.0800 | Slack side lb 88.25889 | Centrifugal, lb 118.6965 | Bend force1, lb 255.2453 | Bend force2, lb 193.2000 | Shaft1force, lb 1207.760 | Shaft2force, lb 1084.836 | Peak force1, lb 757.0217 | Peak force2, lb 694.9764 | K_b table,lb/in 4830.000 | K_c table, lb 3.288000 | Q table, lb 3638.000 | x table 12.62900 | Design number 1.000000 | Half angle, deg 82.13715 | ================== Post Processing ======================= Design number = 1 Item_Name, Units Satisfaction Value ---------------- ------------- ----------------------- Cost, 1983 $ Excellent 1.0250756645950264E+03 Belt Life, hr Fair 7.9997279048566479E+03 Shaft Force, lb Good 9.0000086921174334E+03 Centers, inches Excellent 22.2109883975804721 Load pulley, rpm Poor 9.1800349271189350E+02 Belt Speed, fpm Excellent 6.0083188984962244E+03 ===================== End ================================ Best Feasible Design ------ OptdesX v. 2.0 ------ Model: Pully_Belt_System ------ Note that the number of belts is now fixed: =========================== Variables =========================== Name Value T Map Min Max ---------------- ------------- - -- ------------- ------------- Drive dia, in 20.71694 C 1 10.00000 25.00000 Load dia, in 23.57811 C 1 10.00000 25.00000 Drive speed,rpm 1033.400 C 1 1000.000 7000.000 Belt length, in 114.4649 C 1 100.0000 150.0000 Name Value | Name Row File ---------------- ------------- | ---------------- -- ---------- Power, hp 400.0000 | Number of belts 8.000000 | =========================== Functions ============================ Name Value O T Map Allowable Indifference ---------------- ------------- - - -- ------------- ------------- Cost, 1983 $ 1139.072 v 1 1500.000 100.0000 Belt life, hr 15998.35 > 1 16000.00 18000.00 Shaft total, lb 8999.975 < 1 9000.000 400.0000 Center dist, in 22.39750 < 1 32.00000 12.00000 Gap distance,in 0.2499805 > 1 0.2500000 0.7500000 Load speed, rpm 907.9981 < 1 908.0000 892.0000 Belt speed, fpm 5604.833 < 1 6500.000 2000.000 Name Value | Name Weight ---------------- ------------- | ---------------- --- Tension ratio 4.678817 | Tight side lb 374.4115 | Slack side lb 80.02269 | Centrifugal, lb 103.2897 | Bend force1, lb 233.1426 | Bend force2, lb 204.8510 | Shaft1force, lb 1124.997 | Shaft2force, lb 1068.529 | Peak force1, lb 710.8438 | Peak force2, lb 682.5522 | K_b table,lb/in 4830.000 | K_c table, lb 3.288000 | Q table, lb 3638.000 | x table 12.62900 | Design number 6.000000 | Half angle, deg 86.33787 | ================== Post Processing ======================= Design number = 6 Item_Name, Units Satisfaction Value ---------------- ------------- ----------------------- Cost, 1983 $ Excellent 1.1390718179949188E+03 Belt Life, hr Good 1.5998351856670304E+04 Shaft Force, lb Good 8.9999753775849313E+03 Centers, inches Excellent 22.3975048968380221 Load pulley, rpm Excellent 9.0799814093805753E+02 Belt Speed, fpm Excellent 5.6048325326605836E+03 ===================== End ================================ APPENDIX: Source Code and Validation Summary -------------------------------------------- The source file based on Spott's design criteria is given in the MODULE Design_Globals and the two Optdes routines anapre and anafun shown below. The current source based on Dixon's evaluation approach is given in the Optdes routine anapos, which is also given below. Anapos saves numerical and word descriptions to a series of files named post_#.out, where # is the design number < 100. Since Optdes only transmits double precision numbers to the X-window display another possible approach would be to do these evaluations in the anafun routine by converting them to a number rank 4 (Excellent) to 0 (Unacceptable) and output them through the afdsca interface. That could be inefficient since some algorithms require many calls to anafun. This way the user just checks selected designs. The other way has some merit in that it automatically saves the information in the standard Optdes process. MODULE Design_Globals ! File: belt.f90 ! References: ! 1. M.F. Spotts, "Design of Machine Elements", Prentice-Hall, 1985 ! (Chapter 6) Most 2 or 3 letter names are from Spotts' text. ! 2. J.R. Dixon, C. Poli, "Engineering Design and Design for ! Manufacturing", Field Stone Pub., 1995 (for topics of Satisfaction ! Curves, Satisfaction Level, Importance Level, Overall Evaluation) IMPLICIT NONE DOUBLE PRECISION, PARAMETER :: pi = 3.1415927d0, PiBy2 = pi / 2.d0, & PiBy12 = pi / 12.d0 DOUBLE PRECISION, PARAMETER :: To_Degrees = 180.d0 / pi DOUBLE PRECISION, PARAMETER :: Hr_per_Year = 8760.d0 DOUBLE PRECISION, PARAMETER :: ft_lb_per_Hp = 33000.d0 ! belt constants: DOUBLE PRECISION, PARAMETER :: mu = 0.512d0 ! typical friction ! validation values (example 4) !DOUBLE PRECISION, PARAMETER :: kc =1.716d0, kb = 1600.d0, & ! Q = 2038.d0, x = 11.173d0 ! current belt type tabulated data DOUBLE PRECISION, PARAMETER :: kc = 3.288d0, kb = 4830.d0, & Q = 3638.d0, x = 12.629d0 DOUBLE PRECISION :: D1, N1, D2, M, L, HP ! input DOUBLE PRECISION :: B, Gap, tb1, tb2, tc, A, angle DOUBLE PRECISION :: Ratio, t1, t2, Force1, Force2 DOUBLE PRECISION :: F1, F2, Y1, Y2 DOUBLE PRECISION :: CostB, CostP1, CostP2 ! create main post-processing group DOUBLE PRECISION :: N2, Speed, Life, Force, CD, Cost, Design END MODULE Design_Globals SUBROUTINE anapre (model_Name) !================================================================== !...subroutine ANAPRE preprocessing routine, called only once !------------------------------------------------------------------ USE Design_Globals IMPLICIT NONE CHARACTER(17), intent (out) :: model_Name ! name "12345678901234567" of the model (17 char) model_Name = "Pully_Belt_System" Design = 0 ! initialize to no design END SUBROUTINE anapre SUBROUTINE anafun !======================================================================= !...subroutine ANAFUN, called for every trial ! ********************************************************* ! REMEMBER TO HIT POSTPROCESS BUTTON AND THEN THE CALCULATE ! FUNCTIONS AND HARDCOPY BUTTON TO CORRELATE DESIGN NUMBER ! ********************************************************* !----------------------------------------------------------------------- USE Design_Globals IMPLICIT NONE !...input scalar analysis variables (AV) values for this iteration ! '123456789012345') CALL avdsca (D1, 'Drive dia, in') CALL avdsca (N1, 'Drive speed,rpm') CALL avdsca (D2, 'Load dia, in') CALL avdsca (M, 'Number of belts') ! continuous to start with CALL avdsca (L, 'Belt length, in') CALL avdsca (HP, 'Power, hp') !...compute scalar AF values !...intermediate constants (tabulated eqs are often in "funny" units) ! kinematics, RPM, Speed N2 = N1 * D1 / D2 ! load pulley rpm Speed = N1 * D1 * PiBy12 ! load pulley speed ! geometry, Centerline Distance (CD0, Pulley Gap B = L - (D1 + D2) * PiBy2 CD = (B + sqrt (B * B - 2.d0 * (D2 - D1) **2) ) * 0.25d0 Gap = CD - (D1 + D2) * 0.5d0 ! bending force parts (Spotts, Fig 6-3) tb1 = kb / D1 ; tb2 = kb / D2 ! centrifugal force part tc = kc * (Speed / 1000.d0) **2 ! half-angle of contact (radians) A = dacos (dabs ( (D1 - D2) / (2.d0 * CD) ) ) ! radians angle = A * To_Degrees ! degrees ! ratio of tight (t1) to slack (t2) forces ! belt friction law, mu = typical coeff of friction Ratio = dexp (2.d0 * A * mu) ! tight tension, t1, from power applied and tension ratio t1 = (ft_lb_per_Hp * HP) / (M * Speed * (1.d0 - 1.d0 / Ratio) ) t2 = t1 / Ratio ! shaft force resultants (lb) ! Force = (t1 + t2 + 2.d0 * tc ) * dsin (A) Force1 = (t1 + t2 + 2.d0 * (tc + tb1) ) * dsin (A) Force2 = (t1 + t2 + 2.d0 * (tc + tb2) ) * dsin (A) Force = dmax1 (Force1, Force2) * M ! peak force per pass (for each pully size, Spotts Fig 6-3) F1 = t1 + tb1 + tc ; F2 = t1 + tb2 + tc ! number of force peaks to failure (at 10**8 to 10**9 cycles) Y1 = (Q / F1) **x ; Y2 = (Q / F2) **x ! proportion of life consumed per passage = 1/Y1 + 1/Y2 ! passes per min = 12 * Speed / L, passes per hr = 720 * Speed / L ! empirical life (hr) Life = L / (720.d0 * Speed * (1.d0 / Y1 + 1.d0 / Y2) ) ! Life = Life / Hr_per_Year ! alternate ! cost 1983 $/belt: belt and two pulleys CostB = 0.47d0 * L * M CostP1 = (1.d0 + (M - 4.d0) / 10.d0) * (19.d0 + 11.3d0 * D1) CostP2 = (1.d0 + (M - 4.d0) / 10.d0) * (19.d0 + 11.3d0 * D2) Cost = (CostB + CostP1 + CostP1) !...output scalar analysis functions (AF) values ! '123456789012345' CALL afdsca (Cost, 'Cost, 1983 $') CALL afdsca (Life, 'Belt life, hr') ! or try yr CALL afdsca (Force, 'Shaft total, lb') CALL afdsca (CD, 'Center dist, in') CALL afdsca (Gap, 'Gap distance,in') ! > 0 ? CALL afdsca (angle, 'Half angle, deg') CALL afdsca (Ratio, 'Tension ratio ') CALL afdsca (t1, 'Tight side lb') CALL afdsca (t2, 'Slack side lb') CALL afdsca (tc, 'Centrifugal, lb') CALL afdsca (tb1, 'Bend force1, lb') CALL afdsca (tb2, 'Bend force2, lb') CALL afdsca (N2, 'Load speed, rpm') CALL afdsca (Speed, 'Belt speed, fpm') CALL afdsca (Force1, 'Shaft1force, lb') CALL afdsca (Force2, 'Shaft2force, lb') CALL afdsca (F1, 'Peak force1, lb') CALL afdsca (F2, 'Peak force2, lb') CALL afdsca (kb, 'K_b table,lb/in') ! parameter from table CALL afdsca (kc, 'K_c table, lb') ! parameter from table CALL afdsca (Q, 'Q table, lb') ! parameter from table CALL afdsca (x, 'x table ') ! parameter from table CALL afdsca (Design, 'Design number ') ! tie to post-processing END SUBROUTINE anafun SUBROUTINE anapos !======================================================================= !...subroutine ANAPOS, only called if "Postprocess" button is hit ! ********************************************************* ! REMEMBER TO HIT POSTPROCESS BUTTON AND THEN THE CALCULATE ! FUNCTIONS AND HARDCOPY BUTTON TO CORRELATE DESIGN NUMBER ! ********************************************************* ! Ref: J.R. Dixon, C. Poli, "Engineering Design and Design for ! Manufacturing", Field Stone Pub., 1995 (for topics of Satisfaction ! Curves, Satisfaction Level, Importance Level, Overall Evaluation) !----------------------------------------------------------------------- USE Design_Globals IMPLICIT NONE INTEGER, SAVE :: count = 0, file_id = 21 CHARACTER status * 12, number * 2, file_name * 11 ! number = count ! convert count to a string, open evaluation file for this design count = count + 1 ; Design = count WRITE (number, '(I2)') count ! internal type conversion SELECT CASE ( count ) CASE (:9) ; file_name = 'post_'//number (2:2) //'.out' CASE (10:99) ; file_name = 'post_'//number (1:2) //'.out' CASE DEFAULT ; print *, 'Resetting design count to 1' count = 0 END SELECT OPEN (unit = file_id, file = file_name, status = 'unknown') ! post-processing using Dixon Satisfaction Curve Values WRITE (file_id, * ) 'Design number = ', count WRITE (file_id, * ) 'Item_Name, Units Satisfaction Value' ! check satisfaction with Cost, $ SELECT CASE ( nint(Cost) ) Case (1:1200) ; status = 'Excellent ' Case (1201:1400) ; status = 'Good ' Case (1401:1600) ; status = 'Fair ' Case (1601:1800) ; status = 'Poor ' Case Default ; status = 'Unacceptable' END SELECT WRITE (file_id, * ) 'Cost, 1983 $ ', status, Cost ! check satisfaction with Life (hr) SELECT CASE ( nint(Life) ) Case (16000:) ; status = 'Excellent ' Case (12000:15999) ; status = 'Good ' Case (8000:11999) ; status = 'Fair ' Case Default ; status = 'Unacceptable' END SELECT WRITE (file_id, * ) 'Belt Life, hr ', status, Life ! check satisfaction with Force (lb) SELECT CASE ( nint(Force) ) Case (500:7000) ; status = 'Excellent ' Case (400:499, 7001:9000) ; status = 'Good ' Case (300:399, 9001:11000) ; status = 'Fair ' Case (11001:) ; status = 'Poor ' Case Default ; status = 'Unacceptable' END SELECT WRITE (file_id, * ) 'Shaft Force, lb ', status, Force ! check satisfaction with Center Distance, in SELECT CASE ( nint(CD) ) Case (12:32) ; status = 'Excellent ' Case Default ; status = 'Unacceptable' END SELECT WRITE (file_id, * ) 'Centers, inches ', status, CD ! check satisfaction with N2 (load rpm) SELECT CASE ( nint(N2) ) Case (891:909) ; status = 'Excellent ' Case (888:890, 910:912) ; status = 'Good ' Case (885:887, 913:915) ; status = 'Fair ' Case (882:884, 916:918) ; status = 'Poor ' Case Default ; status = 'Unacceptable' END SELECT WRITE (file_id, * ) 'Load pulley, rpm ', status, N2 ! check satisfaction with Speed SELECT CASE ( nint(Speed) ) Case (2000:6500) ; status = 'Excellent ' Case (1000:1999, 6501:7000) ; status = 'Good ' Case Default ; status = 'Unacceptable' END SELECT WRITE (file_id, * ) 'Belt Speed, fpm ', status, Speed CLOSE (file_id) ! Close this design summary END SUBROUTINE anapos ! Spotts_Ex_4.txt Validation Example ! ------ OptdesX v. 2.0 ------ Model: Pully_Belt_Syste ------ ! Spotts, "Design of Machine Elements", 1985 ! validation values (example 4) ! Tabulated: kc = 3.288d0, kb = 4830.d0, Q = 3638.d0, x = 12.629d0 ! =========================== Variables =========================== ! Name Value | Name Row File ! ---------------- ------------- | ---------------- -- ---------- ! Drive dia, in 10.00000 | ! Drive speed,rpm 1160.000 | ! Load dia, in 14.00000 | ! Number of belts 1.000000 | ! Belt length, in 70.90000 | ! Power, hp 14.40000 | ! ! =========================== Functions ============================ ! Name Value | Name Weight ! ---------------- ------------- | ---------------- --- ! Cost, 1983 $ 218.1230 | ! Belt life, hr 3903.921 | ! Shaft total, lb 595.4652 | ! Center dist, in 16.47908 | ! Gap distance,in 4.479078 | ! Half angle, deg 83.02905 | ! Tension ratio 4.410154 | ! Tight side lb 202.3623 | ! Slack side lb 45.88554 | ! Centrifugal, lb 15.82598 | ! Bend force1, lb 160.0000 | ! Bend force2, lb 114.2857 | ! Load speed, rpm 828.5714 | ! Belt speed, fpm 3036.873 | ! Shaft1force, lb 595.4652 | ! Shaft2force, lb 504.7125 | ! Peak force1, lb 378.1883 | ! Peak force2, lb 332.4740 | ! K_b table,lb/in 1600.000 | ! K_c table, lb 1.716000 | ! Q table, lb 2038.000 | ! x table 11.17300 | ! Design number 1.000000 | ! ! ===================== Post Process ===================== ! Design number = 1 ! Item_Name, Units Satisfaction Value ! Cost, 1983 $ Excellent 2.1812299999999999E+02 ! Belt Life, hr Unacceptable 3.9039212465719938E+03 ! Shaft Force, lb Excellent 5.9546522246839436E+02 ! Centers, inches Excellent 16.4790777851002943 ! Load pulley, rpm Unacceptable 8.2857142857142856E+02 ! Belt Speed, fpm Excellent 3.0368729433333333E+03 ! check syntax with f95 compiler: f95 -c belt.f90 ! create executable file named "try": ! f95 -o try belt.o /usr/site/OptdesX/lib/supportF.o -lnsl -lsocket ! then execute: OptdesX try