diff --git a/Airfoils/NACA_4412.txt b/Airfoils/NACA_4412.txt new file mode 100644 index 0000000..efc9cf5 --- /dev/null +++ b/Airfoils/NACA_4412.txt @@ -0,0 +1,40 @@ +NACA 4412 + 18. 18. + + 0.000000 0.000000 + 0.012500 0.024400 + 0.025000 0.033900 + 0.050000 0.047300 + 0.075000 0.057600 + 0.100000 0.065900 + 0.150000 0.078900 + 0.200000 0.088000 + 0.250000 0.094100 + 0.300000 0.097600 + 0.400000 0.098000 + 0.500000 0.091900 + 0.600000 0.081400 + 0.700000 0.066900 + 0.800000 0.048900 + 0.900000 0.027100 + 0.950000 0.014700 + 1.000000 0.001300 + + 0.000000 0.000000 + 0.012500 -0.014300 + 0.025000 -0.019500 + 0.050000 -0.024900 + 0.075000 -0.027400 + 0.100000 -0.028600 + 0.150000 -0.028800 + 0.200000 -0.027400 + 0.250000 -0.025000 + 0.300000 -0.022600 + 0.400000 -0.018000 + 0.500000 -0.014000 + 0.600000 -0.010000 + 0.700000 -0.006500 + 0.800000 -0.003900 + 0.900000 -0.002200 + 0.950000 -0.001600 + 1.000000 -0.001300 diff --git a/Airfoils/Polars/NACA_4412_polar_Re_100000.txt b/Airfoils/Polars/NACA_4412_polar_Re_100000.txt new file mode 100644 index 0000000..faffdd9 --- /dev/null +++ b/Airfoils/Polars/NACA_4412_polar_Re_100000.txt @@ -0,0 +1,119 @@ + + XFOIL Version 6.96 + + Calculated polar for: NACA 4412 + + 1 1 Reynolds number fixed Mach number fixed + + xtrf = 1.000 (top) 1.000 (bottom) + Mach = 0.000 Re = 0.100 e 6 Ncrit = 9.000 + + alpha CL CD CDp CM Top_Xtr Bot_Xtr + ------ -------- --------- --------- -------- -------- -------- + -9.500 -0.3426 0.10705 0.10189 -0.0379 1.0000 0.1297 + -9.250 -0.3784 0.10671 0.10171 -0.0397 1.0000 0.1327 + -9.000 -0.4173 0.10641 0.10160 -0.0391 1.0000 0.1332 + -8.750 -0.3682 0.09949 0.09457 -0.0361 1.0000 0.1363 + -8.500 -0.3611 0.09726 0.09235 -0.0338 1.0000 0.1402 + -8.250 -0.3724 0.09561 0.09079 -0.0319 1.0000 0.1442 + -8.000 -0.4032 0.09481 0.09013 -0.0296 1.0000 0.1469 + -7.750 -0.4436 0.09403 0.08951 -0.0287 1.0000 0.1481 + -7.500 -0.4819 0.09082 0.08639 -0.0339 1.0000 0.1493 + -7.250 -0.4471 0.08830 0.08388 -0.0235 1.0000 0.1526 + -7.000 -0.4480 0.08640 0.08202 -0.0209 1.0000 0.1558 + -6.750 -0.4588 0.08412 0.07980 -0.0206 1.0000 0.1600 + -6.500 -0.4847 0.07929 0.07495 -0.0287 1.0000 0.1662 + -6.250 -0.4783 0.07718 0.07290 -0.0243 1.0000 0.1680 + -6.000 -0.4744 0.07516 0.07091 -0.0219 1.0000 0.1710 + -5.750 -0.4612 0.06965 0.06522 -0.0315 0.9966 0.1830 + -5.500 -0.4309 0.06730 0.06289 -0.0316 0.9913 0.1898 + -5.250 -0.3801 0.03672 0.02954 -0.0608 0.9884 0.1054 + -5.000 -0.3390 0.03524 0.02804 -0.0644 0.9827 0.1094 + -4.750 -0.2986 0.03253 0.02478 -0.0679 0.9764 0.1116 + -4.500 -0.2547 0.03033 0.02199 -0.0716 0.9711 0.1152 + -4.250 -0.2155 0.02874 0.02008 -0.0743 0.9639 0.1211 + -4.000 -0.1732 0.02773 0.01892 -0.0774 0.9576 0.1286 + -3.750 -0.1342 0.02656 0.01755 -0.0797 0.9500 0.1373 + -3.500 -0.0916 0.02579 0.01667 -0.0827 0.9435 0.1516 + -3.250 -0.0546 0.02511 0.01596 -0.0846 0.9347 0.1675 + -3.000 -0.0135 0.02457 0.01552 -0.0873 0.9278 0.1881 + -2.750 0.0233 0.02414 0.01507 -0.0891 0.9186 0.2119 + -2.500 0.0621 0.02363 0.01470 -0.0912 0.9110 0.2389 + -2.250 0.0998 0.02306 0.01425 -0.0931 0.9024 0.2721 + -2.000 0.1378 0.02248 0.01382 -0.0950 0.8945 0.3153 + -1.750 0.1759 0.02179 0.01342 -0.0968 0.8865 0.3683 + -1.500 0.2137 0.02102 0.01305 -0.0985 0.8792 0.4420 + -1.250 0.2473 0.02001 0.01285 -0.0990 0.8713 0.6046 + -1.000 0.3011 0.01877 0.01237 -0.1014 0.8681 1.0000 + -0.750 0.3304 0.01877 0.01214 -0.1016 0.8562 1.0000 + -0.500 0.3765 0.01838 0.01153 -0.1044 0.8513 1.0000 + -0.250 0.4028 0.01841 0.01142 -0.1039 0.8387 1.0000 + 0.000 0.4335 0.01835 0.01123 -0.1041 0.8283 1.0000 + 0.250 0.4720 0.01803 0.01077 -0.1054 0.8210 1.0000 + 0.500 0.4988 0.01808 0.01072 -0.1049 0.8090 1.0000 + 0.750 0.5348 0.01782 0.01035 -0.1058 0.8013 1.0000 + 1.000 0.5631 0.01782 0.01026 -0.1055 0.7900 1.0000 + 1.250 0.5902 0.01789 0.01027 -0.1051 0.7784 1.0000 + 1.500 0.6265 0.01763 0.00990 -0.1059 0.7710 1.0000 + 1.750 0.6506 0.01784 0.01006 -0.1050 0.7582 1.0000 + 2.000 0.6774 0.01798 0.01015 -0.1045 0.7469 1.0000 + 2.250 0.7110 0.01786 0.00993 -0.1050 0.7386 1.0000 + 2.500 0.7347 0.01814 0.01020 -0.1041 0.7259 1.0000 + 2.750 0.7611 0.01836 0.01039 -0.1036 0.7150 1.0000 + 3.000 0.7929 0.01834 0.01028 -0.1038 0.7060 1.0000 + 3.250 0.8161 0.01870 0.01065 -0.1029 0.6937 1.0000 + 3.500 0.8423 0.01895 0.01090 -0.1024 0.6829 1.0000 + 3.750 0.8728 0.01902 0.01091 -0.1024 0.6736 1.0000 + 4.000 0.8957 0.01941 0.01134 -0.1015 0.6614 1.0000 + 4.250 0.9217 0.01970 0.01163 -0.1010 0.6508 1.0000 + 4.500 0.9513 0.01982 0.01170 -0.1009 0.6411 1.0000 + 4.750 0.9739 0.02025 0.01220 -0.0999 0.6291 1.0000 + 5.000 0.9995 0.02057 0.01254 -0.0994 0.6185 1.0000 + 5.250 1.0286 0.02074 0.01268 -0.0992 0.6086 1.0000 + 5.500 1.0508 0.02119 0.01322 -0.0982 0.5964 1.0000 + 5.750 1.0755 0.02148 0.01355 -0.0974 0.5844 1.0000 + 6.000 1.1016 0.02159 0.01364 -0.0966 0.5709 1.0000 + 6.250 1.1279 0.02168 0.01370 -0.0958 0.5569 1.0000 + 6.500 1.1534 0.02184 0.01386 -0.0950 0.5432 1.0000 + 6.750 1.1757 0.02207 0.01413 -0.0937 0.5281 1.0000 + 7.000 1.1987 0.02216 0.01423 -0.0924 0.5114 1.0000 + 7.250 1.2212 0.02223 0.01428 -0.0911 0.4939 1.0000 + 7.500 1.2409 0.02240 0.01449 -0.0893 0.4761 1.0000 + 7.750 1.2594 0.02262 0.01478 -0.0875 0.4582 1.0000 + 8.000 1.2769 0.02285 0.01510 -0.0854 0.4393 1.0000 + 8.250 1.2933 0.02308 0.01539 -0.0832 0.4192 1.0000 + 8.500 1.3086 0.02333 0.01564 -0.0809 0.3979 1.0000 + 8.750 1.3197 0.02372 0.01612 -0.0779 0.3730 1.0000 + 9.000 1.3281 0.02421 0.01659 -0.0746 0.3445 1.0000 + 9.250 1.3316 0.02495 0.01728 -0.0707 0.3104 1.0000 + 9.500 1.3276 0.02605 0.01816 -0.0657 0.2733 1.0000 + 9.750 1.3204 0.02765 0.01952 -0.0608 0.2346 1.0000 + 10.000 1.3127 0.02965 0.02123 -0.0564 0.2023 1.0000 + 10.250 1.3077 0.03176 0.02308 -0.0527 0.1788 1.0000 + 10.500 1.3074 0.03378 0.02497 -0.0497 0.1606 1.0000 + 10.750 1.3110 0.03571 0.02678 -0.0472 0.1474 1.0000 + 11.000 1.3189 0.03755 0.02847 -0.0451 0.1369 1.0000 + 11.250 1.3289 0.03922 0.03015 -0.0434 0.1279 1.0000 + 11.500 1.3439 0.04092 0.03184 -0.0420 0.1203 1.0000 + 11.750 1.3595 0.04250 0.03339 -0.0408 0.1136 1.0000 + 12.000 1.3787 0.04430 0.03522 -0.0399 0.1076 1.0000 + 12.250 1.3912 0.04604 0.03710 -0.0386 0.1025 1.0000 + 12.500 1.4202 0.04801 0.03893 -0.0387 0.0966 1.0000 + 12.750 1.4239 0.05002 0.04125 -0.0367 0.0932 1.0000 + 13.000 1.4319 0.05205 0.04343 -0.0351 0.0895 1.0000 + 13.250 1.4604 0.05447 0.04574 -0.0355 0.0845 1.0000 + 13.500 1.4540 0.05696 0.04860 -0.0329 0.0825 1.0000 + 13.750 1.4507 0.05963 0.05156 -0.0309 0.0802 1.0000 + 14.000 1.4512 0.06218 0.05428 -0.0294 0.0775 1.0000 + 14.250 1.4783 0.06519 0.05713 -0.0297 0.0734 1.0000 + 14.500 1.4597 0.06850 0.06082 -0.0274 0.0727 1.0000 + 14.750 1.4404 0.07234 0.06501 -0.0257 0.0720 1.0000 + 15.000 1.4201 0.07667 0.06967 -0.0247 0.0712 1.0000 + 15.250 1.3983 0.08150 0.07481 -0.0243 0.0706 1.0000 + 15.500 1.3742 0.08690 0.08051 -0.0247 0.0701 1.0000 + 15.750 1.3474 0.09302 0.08692 -0.0259 0.0699 1.0000 + 16.000 1.3171 0.10006 0.09424 -0.0282 0.0701 1.0000 + 16.250 1.2836 0.10833 0.10277 -0.0317 0.0706 1.0000 + 16.500 1.2473 0.11795 0.11263 -0.0367 0.0714 1.0000 + 16.750 1.2101 0.12886 0.12372 -0.0430 0.0723 1.0000 + 17.000 1.1753 0.14068 0.13565 -0.0500 0.0732 1.0000 diff --git a/Airfoils/Polars/NACA_4412_polar_Re_1000000.txt b/Airfoils/Polars/NACA_4412_polar_Re_1000000.txt new file mode 100644 index 0000000..97538d4 --- /dev/null +++ b/Airfoils/Polars/NACA_4412_polar_Re_1000000.txt @@ -0,0 +1,148 @@ + + XFOIL Version 6.96 + + Calculated polar for: NACA 4412 + + 1 1 Reynolds number fixed Mach number fixed + + xtrf = 1.000 (top) 1.000 (bottom) + Mach = 0.000 Re = 1.000 e 6 Ncrit = 9.000 + + alpha CL CD CDp CM Top_Xtr Bot_Xtr + ------ -------- --------- --------- -------- -------- -------- + -15.750 -0.8374 0.08373 0.08141 -0.0585 1.0000 0.0169 + -15.500 -0.9127 0.06837 0.06591 -0.0687 1.0000 0.0166 + -15.250 -1.0965 0.03328 0.03022 -0.0993 1.0000 0.0153 + -15.000 -1.1161 0.03120 0.02803 -0.0956 1.0000 0.0154 + -14.750 -1.1210 0.02977 0.02651 -0.0926 1.0000 0.0156 + -14.500 -1.1215 0.02857 0.02523 -0.0896 1.0000 0.0159 + -14.250 -1.1181 0.02751 0.02407 -0.0870 1.0000 0.0162 + -14.000 -1.0990 0.02637 0.02282 -0.0871 0.9992 0.0166 + -13.750 -1.0711 0.02533 0.02165 -0.0885 0.9979 0.0170 + -13.500 -1.0462 0.02365 0.01985 -0.0903 0.9963 0.0177 + -13.250 -1.0163 0.02288 0.01905 -0.0918 0.9951 0.0183 + -13.000 -0.9847 0.02237 0.01850 -0.0933 0.9943 0.0189 + -12.750 -0.9549 0.02183 0.01790 -0.0943 0.9930 0.0195 + -12.500 -0.9260 0.02126 0.01724 -0.0952 0.9911 0.0201 + -12.250 -0.8954 0.02078 0.01666 -0.0963 0.9894 0.0206 + -12.000 -0.8682 0.01946 0.01525 -0.0976 0.9877 0.0214 + -11.750 -0.8365 0.01894 0.01471 -0.0990 0.9866 0.0220 + -11.500 -0.8038 0.01852 0.01424 -0.1004 0.9857 0.0227 + -11.250 -0.7707 0.01808 0.01375 -0.1019 0.9849 0.0235 + -11.000 -0.7369 0.01769 0.01328 -0.1035 0.9843 0.0242 + -10.750 -0.7070 0.01745 0.01297 -0.1041 0.9819 0.0246 + -10.500 -0.6803 0.01619 0.01161 -0.1049 0.9793 0.0257 + -10.250 -0.6491 0.01569 0.01109 -0.1060 0.9775 0.0264 + -10.000 -0.6172 0.01529 0.01065 -0.1071 0.9759 0.0271 + -9.750 -0.5850 0.01491 0.01022 -0.1082 0.9742 0.0279 + -9.500 -0.5547 0.01456 0.00981 -0.1089 0.9718 0.0287 + -9.250 -0.5287 0.01426 0.00944 -0.1085 0.9665 0.0292 + -9.000 -0.5023 0.01345 0.00855 -0.1085 0.9622 0.0299 + -8.750 -0.4769 0.01285 0.00791 -0.1082 0.9574 0.0309 + -8.500 -0.4513 0.01249 0.00752 -0.1078 0.9519 0.0317 + -8.250 -0.4243 0.01214 0.00713 -0.1076 0.9474 0.0324 + -8.000 -0.3979 0.01184 0.00678 -0.1073 0.9422 0.0333 + -7.750 -0.3715 0.01155 0.00644 -0.1070 0.9363 0.0340 + -7.500 -0.3442 0.01127 0.00609 -0.1068 0.9313 0.0345 + -7.250 -0.3183 0.01080 0.00556 -0.1064 0.9249 0.0354 + -7.000 -0.2921 0.01033 0.00505 -0.1061 0.9186 0.0365 + -6.750 -0.2649 0.01003 0.00471 -0.1059 0.9125 0.0375 + -6.500 -0.2377 0.00977 0.00441 -0.1057 0.9053 0.0384 + -6.000 -0.1825 0.00935 0.00389 -0.1054 0.8910 0.0404 + -5.750 -0.1549 0.00912 0.00360 -0.1052 0.8835 0.0414 + -5.500 -0.1275 0.00880 0.00325 -0.1051 0.8751 0.0435 + -5.000 -0.0718 0.00845 0.00283 -0.1049 0.8578 0.0476 + -4.750 -0.0441 0.00824 0.00259 -0.1047 0.8488 0.0519 + -4.500 -0.0162 0.00810 0.00243 -0.1046 0.8388 0.0569 + -4.250 0.0117 0.00793 0.00228 -0.1045 0.8288 0.0655 + -4.000 0.0394 0.00780 0.00213 -0.1044 0.8184 0.0745 + -3.750 0.0674 0.00769 0.00201 -0.1044 0.8073 0.0820 + -3.500 0.0954 0.00761 0.00191 -0.1043 0.7964 0.0890 + -3.250 0.1232 0.00752 0.00180 -0.1042 0.7851 0.0977 + -3.000 0.1512 0.00745 0.00171 -0.1041 0.7733 0.1066 + -2.750 0.1791 0.00737 0.00163 -0.1040 0.7616 0.1182 + -2.500 0.2069 0.00729 0.00156 -0.1040 0.7497 0.1332 + -2.250 0.2346 0.00723 0.00150 -0.1039 0.7378 0.1502 + -2.000 0.2625 0.00715 0.00145 -0.1038 0.7254 0.1697 + -1.750 0.2903 0.00709 0.00142 -0.1038 0.7132 0.1927 + -1.500 0.3180 0.00703 0.00141 -0.1037 0.7012 0.2214 + -1.250 0.3456 0.00701 0.00139 -0.1036 0.6886 0.2466 + -1.000 0.3734 0.00697 0.00138 -0.1035 0.6754 0.2686 + -0.750 0.4012 0.00694 0.00137 -0.1035 0.6626 0.2903 + -0.500 0.4288 0.00691 0.00138 -0.1034 0.6497 0.3203 + -0.250 0.4562 0.00686 0.00139 -0.1033 0.6365 0.3629 + 0.000 0.4833 0.00678 0.00141 -0.1032 0.6232 0.4192 + 0.250 0.5102 0.00658 0.00146 -0.1031 0.6101 0.5177 + 0.500 0.5366 0.00635 0.00153 -0.1029 0.5975 0.6393 + 0.750 0.5622 0.00617 0.00160 -0.1024 0.5856 0.7449 + 1.000 0.5842 0.00594 0.00170 -0.1009 0.5740 0.8717 + 1.250 0.6163 0.00588 0.00177 -0.1014 0.5622 0.9842 + 1.500 0.6525 0.00598 0.00181 -0.1033 0.5505 1.0000 + 1.750 0.6788 0.00611 0.00186 -0.1029 0.5398 1.0000 + 2.000 0.7055 0.00622 0.00192 -0.1026 0.5294 1.0000 + 2.250 0.7325 0.00633 0.00199 -0.1024 0.5204 1.0000 + 2.500 0.7592 0.00646 0.00206 -0.1022 0.5112 1.0000 + 2.750 0.7865 0.00656 0.00213 -0.1020 0.5029 1.0000 + 3.250 0.8405 0.00681 0.00231 -0.1016 0.4847 1.0000 + 3.500 0.8672 0.00696 0.00240 -0.1014 0.4746 1.0000 + 3.750 0.8941 0.00709 0.00250 -0.1012 0.4646 1.0000 + 4.000 0.9210 0.00722 0.00260 -0.1010 0.4540 1.0000 + 4.250 0.9473 0.00739 0.00272 -0.1007 0.4426 1.0000 + 4.500 0.9734 0.00758 0.00284 -0.1004 0.4273 1.0000 + 4.750 0.9993 0.00778 0.00297 -0.1001 0.4110 1.0000 + 5.000 1.0254 0.00797 0.00311 -0.0998 0.3979 1.0000 + 5.250 1.0518 0.00813 0.00326 -0.0995 0.3861 1.0000 + 5.500 1.0777 0.00834 0.00342 -0.0992 0.3731 1.0000 + 5.750 1.1031 0.00857 0.00359 -0.0988 0.3575 1.0000 + 6.000 1.1280 0.00884 0.00379 -0.0983 0.3398 1.0000 + 6.250 1.1523 0.00914 0.00401 -0.0978 0.3207 1.0000 + 6.500 1.1761 0.00948 0.00426 -0.0971 0.2993 1.0000 + 6.750 1.1988 0.00989 0.00455 -0.0963 0.2737 1.0000 + 7.000 1.2208 0.01036 0.00488 -0.0954 0.2461 1.0000 + 7.250 1.2417 0.01089 0.00526 -0.0943 0.2173 1.0000 + 7.500 1.2614 0.01149 0.00569 -0.0931 0.1865 1.0000 + 7.750 1.2793 0.01220 0.00621 -0.0915 0.1526 1.0000 + 8.000 1.2973 0.01288 0.00672 -0.0900 0.1252 1.0000 + 8.250 1.3164 0.01345 0.00719 -0.0887 0.1065 1.0000 + 8.500 1.3346 0.01404 0.00769 -0.0872 0.0893 1.0000 + 8.750 1.3514 0.01469 0.00823 -0.0854 0.0729 1.0000 + 9.000 1.3676 0.01527 0.00875 -0.0836 0.0622 1.0000 + 9.250 1.3835 0.01581 0.00926 -0.0817 0.0563 1.0000 + 9.500 1.4004 0.01631 0.00976 -0.0799 0.0521 1.0000 + 9.750 1.4171 0.01682 0.01028 -0.0782 0.0491 1.0000 + 10.000 1.4317 0.01746 0.01091 -0.0762 0.0459 1.0000 + 10.250 1.4484 0.01797 0.01147 -0.0746 0.0442 1.0000 + 10.500 1.4653 0.01849 0.01203 -0.0731 0.0427 1.0000 + 10.750 1.4805 0.01911 0.01267 -0.0714 0.0411 1.0000 + 11.000 1.4938 0.01986 0.01343 -0.0695 0.0392 1.0000 + 11.250 1.5061 0.02069 0.01430 -0.0676 0.0376 1.0000 + 11.500 1.5221 0.02129 0.01495 -0.0662 0.0368 1.0000 + 11.750 1.5369 0.02199 0.01570 -0.0647 0.0356 1.0000 + 12.000 1.5500 0.02282 0.01656 -0.0631 0.0343 1.0000 + 12.250 1.5608 0.02382 0.01758 -0.0614 0.0330 1.0000 + 12.500 1.5688 0.02506 0.01888 -0.0594 0.0316 1.0000 + 12.750 1.5831 0.02588 0.01975 -0.0582 0.0308 1.0000 + 13.000 1.5959 0.02683 0.02075 -0.0569 0.0298 1.0000 + 13.250 1.6066 0.02796 0.02192 -0.0555 0.0286 1.0000 + 13.500 1.6141 0.02939 0.02338 -0.0540 0.0273 1.0000 + 13.750 1.6213 0.03089 0.02494 -0.0526 0.0262 1.0000 + 14.000 1.6325 0.03209 0.02620 -0.0516 0.0252 1.0000 + 14.250 1.6414 0.03354 0.02770 -0.0505 0.0241 1.0000 + 14.500 1.6474 0.03528 0.02947 -0.0493 0.0229 1.0000 + 14.750 1.6508 0.03731 0.03156 -0.0482 0.0218 1.0000 + 15.000 1.6585 0.03899 0.03332 -0.0474 0.0209 1.0000 + 15.250 1.6638 0.04096 0.03533 -0.0466 0.0198 1.0000 + 15.500 1.6661 0.04330 0.03772 -0.0458 0.0187 1.0000 + 15.750 1.6666 0.04589 0.04037 -0.0451 0.0179 1.0000 + 16.000 1.6698 0.04827 0.04284 -0.0447 0.0171 1.0000 + 16.250 1.6706 0.05099 0.04562 -0.0443 0.0164 1.0000 + 16.500 1.6692 0.05402 0.04871 -0.0440 0.0157 1.0000 + 16.750 1.6638 0.05759 0.05235 -0.0439 0.0151 1.0000 + 17.000 1.6605 0.06101 0.05587 -0.0439 0.0146 1.0000 + 17.250 1.6584 0.06435 0.05931 -0.0441 0.0142 1.0000 + 17.500 1.6548 0.06793 0.06298 -0.0444 0.0138 1.0000 + 17.750 1.6497 0.07175 0.06689 -0.0448 0.0134 1.0000 + 18.000 1.6430 0.07583 0.07106 -0.0453 0.0131 1.0000 + 18.250 1.6346 0.08024 0.07555 -0.0461 0.0128 1.0000 + 18.500 1.6237 0.08507 0.08047 -0.0470 0.0124 1.0000 + 18.750 1.6097 0.09040 0.08590 -0.0482 0.0121 1.0000 diff --git a/Airfoils/Polars/NACA_4412_polar_Re_200000.txt b/Airfoils/Polars/NACA_4412_polar_Re_200000.txt new file mode 100644 index 0000000..64d2048 --- /dev/null +++ b/Airfoils/Polars/NACA_4412_polar_Re_200000.txt @@ -0,0 +1,115 @@ + + XFOIL Version 6.96 + + Calculated polar for: NACA 4412 + + 1 1 Reynolds number fixed Mach number fixed + + xtrf = 1.000 (top) 1.000 (bottom) + Mach = 0.000 Re = 0.200 e 6 Ncrit = 9.000 + + alpha CL CD CDp CM Top_Xtr Bot_Xtr + ------ -------- --------- --------- -------- -------- -------- + -8.500 -0.4088 0.08983 0.08647 -0.0344 1.0000 0.0813 + -8.250 -0.4231 0.08831 0.08501 -0.0315 1.0000 0.0823 + -8.000 -0.4442 0.08695 0.08373 -0.0282 1.0000 0.0831 + -7.750 -0.4937 0.05313 0.04929 -0.0671 0.9865 0.0673 + -7.500 -0.4712 0.04655 0.04243 -0.0720 0.9817 0.0641 + -7.250 -0.4535 0.03731 0.03244 -0.0777 0.9755 0.0622 + -7.000 -0.4231 0.03226 0.02667 -0.0816 0.9717 0.0637 + -6.750 -0.3952 0.02910 0.02295 -0.0831 0.9655 0.0647 + -6.500 -0.3582 0.02703 0.02031 -0.0857 0.9620 0.0660 + -6.250 -0.3204 0.02462 0.01772 -0.0887 0.9600 0.0684 + -6.000 -0.2930 0.02357 0.01656 -0.0890 0.9523 0.0702 + -5.750 -0.2544 0.02238 0.01517 -0.0913 0.9489 0.0725 + -5.500 -0.2129 0.02134 0.01390 -0.0940 0.9465 0.0756 + -5.250 -0.1843 0.02032 0.01270 -0.0942 0.9393 0.0785 + -5.000 -0.1466 0.01934 0.01174 -0.0963 0.9352 0.0824 + -4.750 -0.1047 0.01855 0.01086 -0.0990 0.9326 0.0877 + -4.500 -0.0618 0.01758 0.00989 -0.1020 0.9308 0.0951 + -4.250 -0.0351 0.01719 0.00943 -0.1016 0.9217 0.1030 + -4.000 0.0030 0.01638 0.00871 -0.1036 0.9180 0.1150 + -3.750 0.0426 0.01571 0.00806 -0.1058 0.9151 0.1299 + -3.500 0.0687 0.01531 0.00771 -0.1053 0.9057 0.1437 + -3.250 0.1047 0.01477 0.00720 -0.1066 0.9011 0.1620 + -3.000 0.1342 0.01437 0.00686 -0.1068 0.8934 0.1821 + -2.750 0.1659 0.01392 0.00653 -0.1073 0.8865 0.2077 + -2.500 0.1964 0.01352 0.00623 -0.1075 0.8792 0.2377 + -2.250 0.2255 0.01312 0.00593 -0.1075 0.8706 0.2707 + -2.000 0.2541 0.01274 0.00566 -0.1074 0.8618 0.3065 + -1.750 0.2836 0.01233 0.00537 -0.1074 0.8533 0.3489 + -1.500 0.3098 0.01195 0.00520 -0.1069 0.8424 0.4005 + -1.250 0.3373 0.01136 0.00499 -0.1066 0.8336 0.5000 + -1.000 0.3583 0.01070 0.00498 -0.1046 0.8222 0.6832 + -0.500 0.4431 0.00999 0.00468 -0.1085 0.8021 1.0000 + -0.250 0.4683 0.01000 0.00456 -0.1077 0.7890 1.0000 + 0.000 0.4938 0.01005 0.00448 -0.1071 0.7758 1.0000 + 0.250 0.5198 0.01011 0.00441 -0.1065 0.7629 1.0000 + 0.500 0.5464 0.01019 0.00435 -0.1060 0.7504 1.0000 + 0.750 0.5733 0.01027 0.00429 -0.1056 0.7383 1.0000 + 1.000 0.5988 0.01039 0.00431 -0.1050 0.7246 1.0000 + 1.250 0.6247 0.01052 0.00435 -0.1045 0.7115 1.0000 + 1.500 0.6510 0.01066 0.00439 -0.1040 0.6992 1.0000 + 1.750 0.6778 0.01082 0.00443 -0.1036 0.6876 1.0000 + 2.000 0.7038 0.01097 0.00451 -0.1032 0.6752 1.0000 + 2.250 0.7297 0.01115 0.00463 -0.1027 0.6629 1.0000 + 2.500 0.7561 0.01133 0.00474 -0.1023 0.6517 1.0000 + 2.750 0.7828 0.01152 0.00483 -0.1020 0.6409 1.0000 + 3.000 0.8084 0.01171 0.00500 -0.1014 0.6289 1.0000 + 3.250 0.8345 0.01191 0.00515 -0.1010 0.6180 1.0000 + 3.500 0.8613 0.01213 0.00528 -0.1007 0.6079 1.0000 + 3.750 0.8865 0.01233 0.00549 -0.1002 0.5965 1.0000 + 4.000 0.9127 0.01256 0.00569 -0.0998 0.5863 1.0000 + 4.250 0.9390 0.01280 0.00587 -0.0995 0.5765 1.0000 + 4.500 0.9643 0.01303 0.00613 -0.0990 0.5659 1.0000 + 4.750 0.9905 0.01330 0.00636 -0.0986 0.5563 1.0000 + 5.000 1.0156 0.01352 0.00657 -0.0980 0.5448 1.0000 + 5.250 1.0396 0.01373 0.00679 -0.0972 0.5317 1.0000 + 5.500 1.0639 0.01396 0.00701 -0.0965 0.5191 1.0000 + 5.750 1.0888 0.01422 0.00724 -0.0959 0.5080 1.0000 + 6.000 1.1122 0.01444 0.00743 -0.0950 0.4940 1.0000 + 6.250 1.1342 0.01464 0.00764 -0.0938 0.4781 1.0000 + 6.500 1.1562 0.01486 0.00788 -0.0927 0.4627 1.0000 + 6.750 1.1783 0.01510 0.00815 -0.0916 0.4482 1.0000 + 7.000 1.2002 0.01536 0.00845 -0.0905 0.4333 1.0000 + 7.250 1.2215 0.01565 0.00876 -0.0893 0.4177 1.0000 + 7.500 1.2420 0.01596 0.00908 -0.0880 0.4012 1.0000 + 7.750 1.2616 0.01630 0.00943 -0.0866 0.3835 1.0000 + 8.000 1.2799 0.01670 0.00982 -0.0849 0.3635 1.0000 + 8.250 1.2967 0.01714 0.01026 -0.0831 0.3392 1.0000 + 8.500 1.3110 0.01772 0.01076 -0.0809 0.3110 1.0000 + 8.750 1.3218 0.01847 0.01138 -0.0781 0.2773 1.0000 + 9.000 1.3267 0.01944 0.01217 -0.0745 0.2406 1.0000 + 9.250 1.3283 0.02069 0.01320 -0.0706 0.1997 1.0000 + 9.500 1.3275 0.02223 0.01449 -0.0667 0.1617 1.0000 + 9.750 1.3266 0.02391 0.01597 -0.0630 0.1356 1.0000 + 10.000 1.3275 0.02555 0.01752 -0.0598 0.1187 1.0000 + 10.250 1.3289 0.02726 0.01916 -0.0569 0.1080 1.0000 + 10.500 1.3326 0.02887 0.02077 -0.0544 0.1001 1.0000 + 10.750 1.3366 0.03055 0.02249 -0.0520 0.0942 1.0000 + 11.000 1.3429 0.03209 0.02408 -0.0501 0.0890 1.0000 + 11.250 1.3438 0.03415 0.02607 -0.0479 0.0848 1.0000 + 11.500 1.3530 0.03558 0.02764 -0.0464 0.0812 1.0000 + 11.750 1.3601 0.03722 0.02934 -0.0450 0.0776 1.0000 + 12.000 1.3641 0.03917 0.03125 -0.0433 0.0746 1.0000 + 12.250 1.3713 0.04092 0.03309 -0.0418 0.0719 1.0000 + 12.500 1.3790 0.04262 0.03491 -0.0407 0.0690 1.0000 + 12.750 1.3857 0.04441 0.03676 -0.0395 0.0664 1.0000 + 13.000 1.3923 0.04629 0.03859 -0.0382 0.0639 1.0000 + 13.250 1.4001 0.04814 0.04054 -0.0369 0.0616 1.0000 + 13.500 1.4059 0.05012 0.04268 -0.0360 0.0593 1.0000 + 13.750 1.4115 0.05212 0.04477 -0.0351 0.0571 1.0000 + 14.000 1.4180 0.05407 0.04670 -0.0342 0.0549 1.0000 + 14.250 1.4266 0.05607 0.04875 -0.0329 0.0527 1.0000 + 14.500 1.4286 0.05852 0.05141 -0.0322 0.0509 1.0000 + 14.750 1.4308 0.06101 0.05404 -0.0316 0.0491 1.0000 + 15.000 1.4342 0.06336 0.05644 -0.0312 0.0473 1.0000 + 15.250 1.4467 0.06514 0.05814 -0.0297 0.0450 1.0000 + 15.500 1.4416 0.06845 0.06172 -0.0297 0.0440 1.0000 + 15.750 1.4385 0.07175 0.06524 -0.0296 0.0427 1.0000 + 16.000 1.4362 0.07501 0.06865 -0.0296 0.0414 1.0000 + 16.250 1.4351 0.07813 0.07188 -0.0298 0.0401 1.0000 + 16.500 1.4392 0.08059 0.07434 -0.0296 0.0388 1.0000 + 16.750 1.4401 0.08377 0.07759 -0.0291 0.0376 1.0000 + 17.000 1.4274 0.08864 0.08274 -0.0304 0.0369 1.0000 + 17.250 1.4151 0.09369 0.08804 -0.0318 0.0363 1.0000 diff --git a/Airfoils/Polars/NACA_4412_polar_Re_50000.txt b/Airfoils/Polars/NACA_4412_polar_Re_50000.txt new file mode 100644 index 0000000..3650d36 --- /dev/null +++ b/Airfoils/Polars/NACA_4412_polar_Re_50000.txt @@ -0,0 +1,106 @@ + + XFOIL Version 6.96 + + Calculated polar for: NACA 4412 + + 1 1 Reynolds number fixed Mach number fixed + + xtrf = 1.000 (top) 1.000 (bottom) + Mach = 0.000 Re = 0.050 e 6 Ncrit = 9.000 + + alpha CL CD CDp CM Top_Xtr Bot_Xtr + ------ -------- --------- --------- -------- -------- -------- + -9.250 -0.3484 0.11519 0.10799 -0.0307 1.0000 0.2459 + -9.000 -0.3263 0.10991 0.10270 -0.0293 1.0000 0.2536 + -8.750 -0.3430 0.10940 0.10231 -0.0284 1.0000 0.2620 + -8.500 -0.3340 0.10549 0.09844 -0.0271 1.0000 0.2680 + -8.250 -0.3380 0.10368 0.09671 -0.0255 1.0000 0.2771 + -8.000 -0.3862 0.10566 0.09896 -0.0226 1.0000 0.2805 + -7.750 -0.3424 0.09889 0.09208 -0.0219 1.0000 0.2911 + -7.500 -0.3860 0.10017 0.09361 -0.0180 1.0000 0.2969 + -7.250 -0.3576 0.09514 0.08853 -0.0169 1.0000 0.3077 + -7.000 -0.3988 0.09590 0.08951 -0.0124 1.0000 0.3135 + -6.750 -0.3812 0.09202 0.08562 -0.0104 1.0000 0.3258 + -6.500 -0.4296 0.09289 0.08673 -0.0077 1.0000 0.3315 + -6.250 -0.4111 0.08914 0.08297 -0.0042 1.0000 0.3457 + -6.000 -0.4133 0.08662 0.08052 -0.0015 1.0000 0.3557 + -5.750 -0.4339 0.08523 0.07926 0.0005 1.0000 0.3681 + -5.500 -0.4490 0.08389 0.07801 0.0021 1.0000 0.3833 + -5.250 -0.4372 0.08080 0.07495 0.0060 1.0000 0.3957 + -5.000 -0.4394 0.07850 0.07271 0.0087 1.0000 0.4103 + -4.750 -0.4076 0.05599 0.04887 -0.0396 1.0000 0.1988 + -4.500 -0.3867 0.05206 0.04465 -0.0418 1.0000 0.1939 + -4.250 -0.3630 0.04815 0.04039 -0.0444 1.0000 0.1911 + -4.000 -0.3354 0.04419 0.03592 -0.0475 1.0000 0.1881 + -3.750 -0.3092 0.04146 0.03274 -0.0493 1.0000 0.1908 + -3.500 -0.2800 0.03898 0.02952 -0.0515 1.0000 0.1969 + -3.250 -0.2589 0.03764 0.02820 -0.0515 1.0000 0.2030 + -3.000 -0.2321 0.03627 0.02629 -0.0526 1.0000 0.2137 + -2.750 -0.2112 0.03545 0.02553 -0.0525 1.0000 0.2250 + -2.500 -0.1884 0.03470 0.02464 -0.0528 1.0000 0.2394 + -2.250 -0.1656 0.03410 0.02391 -0.0531 1.0000 0.2564 + -2.000 -0.1432 0.03369 0.02338 -0.0533 1.0000 0.2769 + -1.750 -0.1176 0.03335 0.02302 -0.0542 0.9988 0.3012 + -1.500 -0.0654 0.03317 0.02283 -0.0594 0.9883 0.3463 + -1.250 -0.0158 0.03295 0.02274 -0.0639 0.9776 0.4048 + -1.000 0.0297 0.03258 0.02279 -0.0676 0.9671 0.4910 + -0.750 0.0671 0.03154 0.02306 -0.0683 0.9582 0.6968 + -0.500 0.1031 0.03143 0.02286 -0.0702 0.9435 1.0000 + -0.250 0.1469 0.03237 0.02333 -0.0742 0.9312 1.0000 + 0.000 0.1804 0.03318 0.02384 -0.0763 0.9178 1.0000 + 0.250 0.2127 0.03403 0.02444 -0.0782 0.9051 1.0000 + 0.500 0.2476 0.03490 0.02509 -0.0804 0.8929 1.0000 + 0.750 0.2900 0.03575 0.02574 -0.0836 0.8821 1.0000 + 1.000 0.3166 0.03657 0.02643 -0.0844 0.8694 1.0000 + 1.250 0.3420 0.03746 0.02721 -0.0850 0.8570 1.0000 + 1.500 0.3718 0.03836 0.02800 -0.0862 0.8458 1.0000 + 1.750 0.4130 0.03909 0.02862 -0.0888 0.8357 1.0000 + 2.000 0.4299 0.04014 0.02962 -0.0881 0.8232 1.0000 + 2.250 0.4529 0.04117 0.03059 -0.0883 0.8118 1.0000 + 2.500 0.4924 0.04188 0.03125 -0.0905 0.8022 1.0000 + 2.750 0.5095 0.04305 0.03239 -0.0899 0.7903 1.0000 + 3.000 0.5279 0.04426 0.03358 -0.0894 0.7788 1.0000 + 3.250 0.5662 0.04496 0.03427 -0.0912 0.7696 1.0000 + 3.500 0.5815 0.04627 0.03560 -0.0904 0.7577 1.0000 + 3.750 0.5962 0.04773 0.03705 -0.0896 0.7465 1.0000 + 4.000 0.6350 0.04832 0.03768 -0.0911 0.7370 1.0000 + 4.250 0.6464 0.04992 0.03930 -0.0901 0.7251 1.0000 + 4.500 0.6592 0.05153 0.04095 -0.0891 0.7135 1.0000 + 4.750 0.6949 0.05221 0.04167 -0.0901 0.7038 1.0000 + 5.000 0.7094 0.05375 0.04328 -0.0893 0.6918 1.0000 + 5.250 0.7169 0.05575 0.04532 -0.0880 0.6799 1.0000 + 5.500 0.7421 0.05688 0.04651 -0.0879 0.6689 1.0000 + 5.750 0.7723 0.05768 0.04742 -0.0881 0.6579 1.0000 + 6.000 0.7737 0.06012 0.04991 -0.0865 0.6450 1.0000 + 6.250 0.7860 0.06203 0.05189 -0.0857 0.6330 1.0000 + 6.500 0.8168 0.06274 0.05272 -0.0856 0.6214 1.0000 + 6.750 0.8415 0.06375 0.05385 -0.0851 0.6091 1.0000 + 7.000 0.8430 0.06634 0.05651 -0.0836 0.5952 1.0000 + 7.250 0.8513 0.06850 0.05876 -0.0825 0.5813 1.0000 + 7.500 0.8671 0.07004 0.06040 -0.0814 0.5669 1.0000 + 7.750 0.8865 0.07116 0.06166 -0.0802 0.5517 1.0000 + 8.000 0.9081 0.07193 0.06256 -0.0789 0.5355 1.0000 + 8.250 0.9309 0.07238 0.06316 -0.0773 0.5186 1.0000 + 8.500 0.9547 0.07259 0.06354 -0.0755 0.5015 1.0000 + 8.750 0.9857 0.07176 0.06289 -0.0734 0.4840 1.0000 + 9.000 1.2725 0.04155 0.03319 -0.0743 0.4435 1.0000 + 9.250 1.2985 0.04001 0.03163 -0.0714 0.4108 1.0000 + 9.500 1.3102 0.03953 0.03112 -0.0674 0.3762 1.0000 + 9.750 1.3184 0.03942 0.03081 -0.0631 0.3384 1.0000 + 10.000 1.3248 0.03991 0.03091 -0.0590 0.3012 1.0000 + 10.250 1.3265 0.04130 0.03202 -0.0549 0.2702 1.0000 + 10.500 1.3283 0.04312 0.03369 -0.0514 0.2452 1.0000 + 10.750 1.3401 0.04512 0.03548 -0.0492 0.2231 1.0000 + 11.000 1.3527 0.04742 0.03778 -0.0474 0.2062 1.0000 + 11.250 1.3686 0.04976 0.04008 -0.0460 0.1920 1.0000 + 11.500 1.3924 0.05231 0.04258 -0.0457 0.1796 1.0000 + 11.750 1.3929 0.05510 0.04569 -0.0429 0.1727 1.0000 + 12.000 1.4092 0.05796 0.04860 -0.0420 0.1644 1.0000 + 12.250 1.3997 0.06112 0.05211 -0.0387 0.1604 1.0000 + 12.500 1.4298 0.06425 0.05517 -0.0393 0.1521 1.0000 + 12.750 1.4065 0.06782 0.05914 -0.0353 0.1508 1.0000 + 13.000 1.3810 0.07194 0.06362 -0.0321 0.1498 1.0000 + 13.250 1.3520 0.07677 0.06876 -0.0299 0.1493 1.0000 + 13.500 1.3181 0.08256 0.07484 -0.0288 0.1496 1.0000 + 13.750 1.2801 0.08958 0.08211 -0.0292 0.1505 1.0000 + 14.000 1.2403 0.09792 0.09061 -0.0311 0.1517 1.0000 diff --git a/Airfoils/Polars/NACA_4412_polar_Re_500000.txt b/Airfoils/Polars/NACA_4412_polar_Re_500000.txt new file mode 100644 index 0000000..567a133 --- /dev/null +++ b/Airfoils/Polars/NACA_4412_polar_Re_500000.txt @@ -0,0 +1,131 @@ + + XFOIL Version 6.96 + + Calculated polar for: NACA 4412 + + 1 1 Reynolds number fixed Mach number fixed + + xtrf = 1.000 (top) 1.000 (bottom) + Mach = 0.000 Re = 0.500 e 6 Ncrit = 9.000 + + alpha CL CD CDp CM Top_Xtr Bot_Xtr + ------ -------- --------- --------- -------- -------- -------- + -12.250 -0.8284 0.04176 0.03861 -0.0832 1.0000 0.0246 + -12.000 -0.8522 0.03908 0.03574 -0.0799 1.0000 0.0247 + -11.750 -0.8699 0.03540 0.03185 -0.0776 0.9997 0.0251 + -11.500 -0.8415 0.03435 0.03082 -0.0796 0.9977 0.0258 + -11.250 -0.8114 0.03347 0.02989 -0.0818 0.9957 0.0265 + -11.000 -0.7822 0.03202 0.02830 -0.0843 0.9939 0.0275 + -10.750 -0.7591 0.02982 0.02579 -0.0862 0.9905 0.0285 + -10.500 -0.7309 0.02822 0.02384 -0.0882 0.9877 0.0293 + -10.250 -0.7053 0.02556 0.02100 -0.0903 0.9856 0.0304 + -10.000 -0.6714 0.02497 0.02039 -0.0924 0.9843 0.0314 + -9.750 -0.6435 0.02420 0.01952 -0.0932 0.9807 0.0325 + -9.500 -0.6134 0.02311 0.01823 -0.0945 0.9778 0.0336 + -9.250 -0.5802 0.02227 0.01716 -0.0962 0.9758 0.0345 + -9.000 -0.5492 0.02031 0.01504 -0.0982 0.9742 0.0359 + -8.750 -0.5132 0.01962 0.01432 -0.1004 0.9731 0.0371 + -8.500 -0.4849 0.01894 0.01355 -0.1008 0.9683 0.0381 + -8.250 -0.4502 0.01823 0.01273 -0.1025 0.9656 0.0394 + -8.000 -0.4135 0.01756 0.01192 -0.1045 0.9637 0.0405 + -7.750 -0.3794 0.01639 0.01059 -0.1062 0.9619 0.0416 + -7.500 -0.3455 0.01547 0.00965 -0.1078 0.9602 0.0430 + -7.250 -0.3201 0.01501 0.00917 -0.1073 0.9539 0.0442 + -7.000 -0.2893 0.01445 0.00854 -0.1080 0.9502 0.0454 + -6.750 -0.2573 0.01389 0.00791 -0.1088 0.9471 0.0467 + -6.500 -0.2303 0.01351 0.00746 -0.1085 0.9415 0.0478 + -6.250 -0.2035 0.01278 0.00668 -0.1083 0.9357 0.0494 + -6.000 -0.1743 0.01225 0.00613 -0.1085 0.9314 0.0512 + -5.750 -0.1485 0.01190 0.00577 -0.1080 0.9242 0.0529 + -5.500 -0.1206 0.01155 0.00536 -0.1078 0.9180 0.0550 + -5.250 -0.0931 0.01118 0.00493 -0.1076 0.9117 0.0575 + -5.000 -0.0666 0.01079 0.00457 -0.1072 0.9038 0.0614 + -4.750 -0.0382 0.01055 0.00427 -0.1071 0.8974 0.0656 + -4.500 -0.0118 0.01018 0.00393 -0.1067 0.8884 0.0727 + -4.250 0.0161 0.00990 0.00363 -0.1066 0.8810 0.0812 + -4.000 0.0434 0.00973 0.00343 -0.1063 0.8716 0.0897 + -3.750 0.0710 0.00948 0.00321 -0.1061 0.8628 0.1006 + -3.500 0.0987 0.00929 0.00301 -0.1060 0.8534 0.1110 + -3.250 0.1262 0.00913 0.00285 -0.1058 0.8432 0.1221 + -3.000 0.1541 0.00898 0.00269 -0.1056 0.8335 0.1353 + -2.750 0.1815 0.00882 0.00255 -0.1054 0.8224 0.1520 + -2.500 0.2090 0.00867 0.00244 -0.1053 0.8113 0.1733 + -2.250 0.2366 0.00855 0.00235 -0.1051 0.8004 0.1993 + -2.000 0.2641 0.00844 0.00229 -0.1049 0.7887 0.2300 + -1.750 0.2915 0.00833 0.00224 -0.1048 0.7765 0.2579 + -1.500 0.3190 0.00826 0.00218 -0.1046 0.7645 0.2832 + -1.250 0.3463 0.00818 0.00213 -0.1044 0.7525 0.3117 + -1.000 0.3734 0.00807 0.00209 -0.1042 0.7397 0.3503 + -0.750 0.4003 0.00792 0.00208 -0.1040 0.7267 0.4055 + -0.500 0.4265 0.00766 0.00208 -0.1038 0.7141 0.5024 + -0.250 0.4513 0.00733 0.00214 -0.1031 0.7014 0.6445 + 0.000 0.4741 0.00703 0.00220 -0.1018 0.6886 0.7752 + 0.250 0.4944 0.00681 0.00229 -0.0995 0.6757 0.9086 + 0.500 0.5429 0.00683 0.00228 -0.1037 0.6616 0.9948 + 0.750 0.5727 0.00693 0.00228 -0.1041 0.6484 1.0000 + 1.000 0.5983 0.00705 0.00231 -0.1035 0.6356 1.0000 + 1.250 0.6239 0.00719 0.00235 -0.1030 0.6230 1.0000 + 1.500 0.6499 0.00731 0.00240 -0.1026 0.6104 1.0000 + 1.750 0.6761 0.00744 0.00246 -0.1022 0.5984 1.0000 + 2.000 0.7023 0.00759 0.00253 -0.1018 0.5871 1.0000 + 2.250 0.7283 0.00775 0.00260 -0.1014 0.5758 1.0000 + 2.500 0.7548 0.00788 0.00269 -0.1011 0.5646 1.0000 + 2.750 0.7811 0.00804 0.00279 -0.1007 0.5544 1.0000 + 3.000 0.8073 0.00820 0.00290 -0.1004 0.5444 1.0000 + 3.250 0.8339 0.00834 0.00302 -0.1001 0.5349 1.0000 + 3.500 0.8600 0.00854 0.00314 -0.0998 0.5260 1.0000 + 3.750 0.8867 0.00866 0.00327 -0.0995 0.5166 1.0000 + 4.000 0.9127 0.00884 0.00341 -0.0992 0.5067 1.0000 + 4.250 0.9385 0.00902 0.00355 -0.0988 0.4957 1.0000 + 4.500 0.9647 0.00917 0.00370 -0.0984 0.4849 1.0000 + 4.750 0.9903 0.00937 0.00385 -0.0980 0.4741 1.0000 + 5.000 1.0155 0.00957 0.00400 -0.0975 0.4618 1.0000 + 5.250 1.0403 0.00977 0.00416 -0.0970 0.4460 1.0000 + 5.500 1.0652 0.00997 0.00433 -0.0964 0.4309 1.0000 + 5.750 1.0906 0.01016 0.00452 -0.0960 0.4187 1.0000 + 6.000 1.1155 0.01038 0.00472 -0.0955 0.4067 1.0000 + 6.250 1.1399 0.01063 0.00495 -0.0949 0.3935 1.0000 + 6.500 1.1639 0.01090 0.00518 -0.0942 0.3784 1.0000 + 6.750 1.1875 0.01119 0.00543 -0.0935 0.3609 1.0000 + 7.000 1.2103 0.01152 0.00571 -0.0927 0.3410 1.0000 + 7.250 1.2318 0.01193 0.00603 -0.0917 0.3191 1.0000 + 7.500 1.2528 0.01238 0.00639 -0.0906 0.2935 1.0000 + 7.750 1.2718 0.01294 0.00682 -0.0892 0.2643 1.0000 + 8.000 1.2891 0.01362 0.00734 -0.0876 0.2320 1.0000 + 8.250 1.3042 0.01442 0.00794 -0.0856 0.1973 1.0000 + 8.500 1.3175 0.01531 0.00862 -0.0834 0.1607 1.0000 + 8.750 1.3282 0.01622 0.00934 -0.0807 0.1301 1.0000 + 9.000 1.3388 0.01711 0.01011 -0.0781 0.1080 1.0000 + 9.250 1.3500 0.01798 0.01089 -0.0756 0.0904 1.0000 + 9.500 1.3615 0.01884 0.01169 -0.0732 0.0782 1.0000 + 9.750 1.3735 0.01968 0.01251 -0.0709 0.0704 1.0000 + 10.000 1.3845 0.02060 0.01340 -0.0687 0.0648 1.0000 + 10.250 1.3969 0.02144 0.01429 -0.0667 0.0610 1.0000 + 10.500 1.4094 0.02230 0.01519 -0.0648 0.0580 1.0000 + 10.750 1.4184 0.02340 0.01630 -0.0626 0.0550 1.0000 + 11.000 1.4270 0.02457 0.01753 -0.0605 0.0528 1.0000 + 11.250 1.4395 0.02551 0.01855 -0.0589 0.0510 1.0000 + 11.500 1.4503 0.02659 0.01969 -0.0573 0.0492 1.0000 + 11.750 1.4584 0.02791 0.02104 -0.0555 0.0473 1.0000 + 12.000 1.4602 0.02976 0.02294 -0.0533 0.0455 1.0000 + 12.250 1.4688 0.03116 0.02443 -0.0519 0.0443 1.0000 + 12.500 1.4791 0.03246 0.02581 -0.0507 0.0429 1.0000 + 12.750 1.4875 0.03395 0.02738 -0.0495 0.0414 1.0000 + 13.000 1.4938 0.03568 0.02917 -0.0483 0.0400 1.0000 + 13.250 1.4941 0.03801 0.03154 -0.0469 0.0387 1.0000 + 13.500 1.4941 0.04045 0.03407 -0.0457 0.0375 1.0000 + 13.750 1.5030 0.04212 0.03584 -0.0450 0.0363 1.0000 + 14.000 1.5091 0.04410 0.03790 -0.0444 0.0349 1.0000 + 14.250 1.5135 0.04630 0.04017 -0.0438 0.0337 1.0000 + 14.500 1.5126 0.04913 0.04305 -0.0432 0.0326 1.0000 + 14.750 1.5064 0.05260 0.04659 -0.0426 0.0315 1.0000 + 15.000 1.5124 0.05486 0.04898 -0.0424 0.0305 1.0000 + 15.250 1.5153 0.05748 0.05169 -0.0423 0.0294 1.0000 + 15.500 1.5171 0.06031 0.05459 -0.0423 0.0283 1.0000 + 15.750 1.5155 0.06359 0.05793 -0.0425 0.0274 1.0000 + 16.000 1.5055 0.06789 0.06228 -0.0426 0.0265 1.0000 + 16.250 1.5080 0.07082 0.06534 -0.0429 0.0257 1.0000 + 16.500 1.5081 0.07407 0.06871 -0.0433 0.0248 1.0000 + 16.750 1.5068 0.07756 0.07229 -0.0439 0.0240 1.0000 + 17.000 1.5043 0.08125 0.07605 -0.0445 0.0233 1.0000 + 17.250 1.4987 0.08538 0.08024 -0.0453 0.0226 1.0000 diff --git a/B737_AVL_Tutorial/tut_mission_B737_AVL.py b/B737_AVL_Tutorial/tut_mission_B737_AVL.py index fd87ed8..f00b15a 100644 --- a/B737_AVL_Tutorial/tut_mission_B737_AVL.py +++ b/B737_AVL_Tutorial/tut_mission_B737_AVL.py @@ -8,17 +8,11 @@ # SUAVE Imports import SUAVE -assert SUAVE.__version__=='2.5.0', 'These tutorials only work with the SUAVE 2.5.0 release' +assert SUAVE.__version__=='2.5.2', 'These tutorials only work with the SUAVE 2.5.2 release' -from SUAVE.Core import Data, Units +from SUAVE.Core import Units from SUAVE.Plots.Performance.Mission_Plots import * from SUAVE.Methods.Propulsion.turbofan_sizing import turbofan_sizing -from SUAVE.Methods.Geometry.Two_Dimensional.Cross_Section.Propulsion import compute_turbofan_geometry -from SUAVE.Input_Output.Results import print_parasite_drag, \ - print_compress_drag, \ - print_engine_data, \ - print_mission_breakdown, \ - print_weight_breakdown # Python Imports import numpy as np @@ -113,7 +107,8 @@ def base_analysis(vehicle): # Aerodynamics Analysis aerodynamics = SUAVE.Analyses.Aerodynamics.AVL() aerodynamics.process.compute.lift.inviscid.settings.filenames.avl_bin_name = 'CHANGE ME TO YOUR DIRECTORY' - #aerodynamics.process.compute.lift.inviscid.settings.spanwise_vortex_density = 3 + #aerodynamics.settings.number_spanwise_vortices = 5 + #aerodynamics.settings.number_chordwise_vortices = 3 aerodynamics.geometry = vehicle analyses.append(aerodynamics) @@ -121,7 +116,7 @@ def base_analysis(vehicle): # Stability Analysis stability = SUAVE.Analyses.Stability.AVL() stability.settings.filenames.avl_bin_name = 'CHANGE ME TO YOUR DIRECTORY' - #stability.settings.spanwise_vortex_density = 3 + stability.geometry = vehicle analyses.append(stability) @@ -179,22 +174,6 @@ def vehicle_setup(): vehicle.systems.control = "fully powered" vehicle.systems.accessories = "medium range" - # ------------------------------------------------------------------ - # Landing Gear - # ------------------------------------------------------------------ - # used for noise calculations - landing_gear = SUAVE.Components.Landing_Gear.Landing_Gear() - landing_gear.tag = "main_landing_gear" - - landing_gear.main_tire_diameter = 1.12000 * Units.m - landing_gear.nose_tire_diameter = 0.6858 * Units.m - landing_gear.main_strut_length = 1.8 * Units.m - landing_gear.nose_strut_length = 1.3 * Units.m - landing_gear.main_units = 2 #number of main landing gear units - landing_gear.nose_units = 1 #number of nose landing gear - landing_gear.main_wheels = 2 #number of wheels on the main landing gear - landing_gear.nose_wheels = 2 #number of wheels on the nose landing gear - vehicle.landing_gear = landing_gear # ------------------------------------------------------------------ # Main Wing diff --git a/BWB_CFD/BWB.py b/BWB_CFD/BWB.py index a7ef16b..e2dd375 100644 --- a/BWB_CFD/BWB.py +++ b/BWB_CFD/BWB.py @@ -8,7 +8,7 @@ # ---------------------------------------------------------------------- import SUAVE -assert SUAVE.__version__=='2.5.0', 'These tutorials only work with the SUAVE 2.5.0 release' +assert SUAVE.__version__=='2.5.2', 'These tutorials only work with the SUAVE 2.5.2 release' import numpy as np import pylab as plt diff --git a/Regional_Jet_Optimization/Optimize.py b/Regional_Jet_Optimization/Optimize.py index 5f08ab4..3c31e5e 100644 --- a/Regional_Jet_Optimization/Optimize.py +++ b/Regional_Jet_Optimization/Optimize.py @@ -8,7 +8,7 @@ # ---------------------------------------------------------------------- import SUAVE -assert SUAVE.__version__=='2.5.0', 'These tutorials only work with the SUAVE 2.5.0 release' +assert SUAVE.__version__=='2.5.2', 'These tutorials only work with the SUAVE 2.5.2 release' from SUAVE.Core import Units, Data import numpy as np import Vehicles @@ -30,7 +30,7 @@ def main(): ## Base Input Values output = problem.objective() - ## Uncomment to view contours of the design space + # Uncomment to view contours of the design space #variable_sweep(problem) # Uncomment for the first optimization diff --git a/Solar_UAV_Optimization/Optimize.py b/Solar_UAV_Optimization/Optimize.py index c4b1365..bbbb5b7 100644 --- a/Solar_UAV_Optimization/Optimize.py +++ b/Solar_UAV_Optimization/Optimize.py @@ -8,7 +8,7 @@ # ---------------------------------------------------------------------- import SUAVE -assert SUAVE.__version__=='2.5.0', 'These tutorials only work with the SUAVE 2.5.0 release' +assert SUAVE.__version__=='2.5.2', 'These tutorials only work with the SUAVE 2.5.2 release' from SUAVE.Core import Units, Data import numpy as np diff --git a/Solar_UAV_Optimization/Plot_Mission.py b/Solar_UAV_Optimization/Plot_Mission.py index 8ee9c43..59f9764 100644 --- a/Solar_UAV_Optimization/Plot_Mission.py +++ b/Solar_UAV_Optimization/Plot_Mission.py @@ -19,11 +19,13 @@ def plot_mission(results,line_style='bo-'): # Plot Solar Conditions plot_solar_flux(results) - # Plot Aircraft Electronics - plot_battery_pack_conditions(results) + # Plot Aerodynamic Forces + plot_aerodynamic_forces(results, line_style) + + # Plot Aerodynamic Coefficients + plot_aerodynamic_coefficients(results, line_style) return if __name__ == '__main__': - main() plt.show() \ No newline at end of file diff --git a/Solar_UAV_Optimization/Vehicles.py b/Solar_UAV_Optimization/Vehicles.py index cbbc715..ccbc8de 100644 --- a/Solar_UAV_Optimization/Vehicles.py +++ b/Solar_UAV_Optimization/Vehicles.py @@ -205,7 +205,7 @@ def base_setup(): # Component 8 the Battery bat = SUAVE.Components.Energy.Storages.Batteries.Constant_Mass.Lithium_Ion() bat.mass_properties.mass = 3.0 * Units.kg - bat.specific_energy = 200. *Units.Wh/Units.kg + bat.specific_energy = 400. *Units.Wh/Units.kg bat.resistance = 0.003 initialize_from_mass(bat,bat.mass_properties.mass) net.battery = bat diff --git a/tut_C172.py b/tut_C172.py new file mode 100644 index 0000000..b97723c --- /dev/null +++ b/tut_C172.py @@ -0,0 +1,528 @@ +# Cessna_172.py +# +# Created: Feb 2022, E. Botero + +# ---------------------------------------------------------------------- +# Imports +# ---------------------------------------------------------------------- + +import numpy as np +import matplotlib.pyplot as plt + +import SUAVE +assert SUAVE.__version__=='2.5.2', 'These tutorials only work with the SUAVE 2.5.2 release' +from SUAVE.Core import Units + +from SUAVE.Methods.Propulsion import propeller_design +from SUAVE.Methods.Geometry.Two_Dimensional.Planform import segment_properties +from SUAVE.Plots.Performance import * + +#from SUAVE.Input_Output.OpenVSP import write + +# ---------------------------------------------------------------------- +# Main +# ---------------------------------------------------------------------- + +def main(): + + # Define internal combustion engine from Cessna Regression Aircraft + vehicle = vehicle_setup() + + #write(vehicle,'C172') + + # Setup analyses and mission + analyses = base_analysis(vehicle) + analyses.finalize() + mission = mission_setup(analyses,vehicle) + + # evaluate + results = mission.evaluate() + + plot_mission(results) + +def vehicle_setup(): + # ------------------------------------------------------------------ + # Initialize the Vehicle + # ------------------------------------------------------------------ + vehicle = SUAVE.Vehicle() + vehicle.tag = 'Cessna_172_SP' + + # ------------------------------------------------------------------ + # Vehicle-level Properties + # ------------------------------------------------------------------ + + # mass properties + vehicle.mass_properties.max_takeoff = 2550. * Units.pounds + vehicle.mass_properties.takeoff = 2550. * Units.pounds + vehicle.mass_properties.max_zero_fuel = 2555. * Units.pounds + + # envelope properties + vehicle.envelope.ultimate_load = 5.7 + vehicle.envelope.limit_load = 3.8 + + # basic parameters + vehicle.reference_area = 174. * Units.feet**2 + vehicle.passengers = 4 + + # ------------------------------------------------------------------ + # Main Wing + # ------------------------------------------------------------------ + + wing = SUAVE.Components.Wings.Main_Wing() + wing.tag = 'main_wing' + wing.sweeps.quarter_chord = 0.0 * Units.deg + wing.thickness_to_chord = 0.12 + wing.areas.reference = 174. * Units.feet**2 + wing.spans.projected = 36. * Units.feet + 1. * Units.inches + wing.chords.root = 66. * Units.inches + wing.chords.tip = 45. * Units.inches + wing.taper = wing.chords.tip/wing.chords.root + wing.aspect_ratio = wing.spans.projected**2. / wing.areas.reference + wing.twists.root = 0.0 * Units.degrees + wing.twists.tip = 0.0 * Units.degrees + wing.origin = [[80.* Units.inches,0,36.75* Units.inches]] + wing.vertical = False + wing.symmetric = True + wing.high_lift = False + wing.dynamic_pressure_ratio = 1.0 + + # Wing Segments + segment = SUAVE.Components.Wings.Segment() + segment.tag = 'Root' + segment.percent_span_location = 0.0 + segment.twist = 3. * Units.deg + segment.root_chord_percent = 1. + segment.thickness_to_chord = 0.12 + segment.dihedral_outboard = 2.5 * Units.degrees + segment.sweeps.quarter_chord = 0 + wing.append_segment(segment) + + segment = SUAVE.Components.Wings.Segment() + segment.tag = 'Break' + segment.percent_span_location = 0.531177829 + segment.twist = 2. * Units.deg + segment.root_chord_percent = 1.0 + segment.thickness_to_chord = 0.12 + segment.dihedral_outboard = 5 * Units.degrees + segment.sweeps.quarter_chord = -3. * Units.degrees + wing.append_segment(segment) + + segment = SUAVE.Components.Wings.Segment() + segment.tag = 'Tip' + segment.percent_span_location = 1. + segment.twist = 1. * Units.degrees + segment.root_chord_percent = 0.67 + segment.thickness_to_chord = 0.12 + segment.dihedral_outboard = 0. + segment.sweeps.quarter_chord = 0. + wing.append_segment(segment) + + # Fill out more segment properties automatically + wing = segment_properties(wing) + wing = SUAVE.Methods.Geometry.Two_Dimensional.Planform.wing_planform(wing) + + # add to vehicle + vehicle.append_component(wing) + + + # ------------------------------------------------------------------ + # Horizontal Stabilizer + # ------------------------------------------------------------------ + wing = SUAVE.Components.Wings.Horizontal_Tail() + wing.tag = 'horizontal_stabilizer' + wing.sweeps.quarter_chord = 19.5 * Units.deg + wing.thickness_to_chord = 0.12 + wing.spans.projected = 135. * Units.inches + wing.areas.reference = 5500 * Units.inches**2 + wing.chords.root = 55. * Units.inches + wing.chords.tip = 28. * Units.inches + wing.taper = wing.chords.tip/wing.chords.root + wing.aspect_ratio = (wing.spans.projected**2)/ wing.areas.reference + wing.twists.root = 0.0 * Units.degrees + wing.twists.tip = 0.0 * Units.degrees + wing.origin = [[253.* Units.inches,0,0]] + wing.vertical = False + wing.symmetric = True + wing.high_lift = False + wing.dynamic_pressure_ratio = 0.9 + + wing = SUAVE.Methods.Geometry.Two_Dimensional.Planform.wing_planform(wing) + + vehicle.append_component(wing) + + + # ------------------------------------------------------------------ + # Vertical Stabilizer + # ------------------------------------------------------------------ + wing = SUAVE.Components.Wings.Vertical_Tail() + wing.tag = 'vertical_stabilizer' + wing.sweeps.quarter_chord = 48. * Units.deg + wing.thickness_to_chord = 0.12 + wing.areas.reference = 3500. * Units.inches**2 + wing.spans.projected = 56. * Units.inches + wing.chords.root = 64. * Units.inches + wing.chords.tip = 30. * Units.inches + wing.taper = wing.chords.tip/wing.chords.root + wing.aspect_ratio = wing.spans.projected**2. / wing.areas.reference + wing.twists.root = 0.0 * Units.degrees + wing.twists.tip = 0.0 * Units.degrees + wing.origin = [[240.* Units.inches,0,0]] + wing.vertical = True + wing.symmetric = False + wing.t_tail = False + wing.dynamic_pressure_ratio = 1.0 + + wing = SUAVE.Methods.Geometry.Two_Dimensional.Planform.wing_planform(wing) + + vehicle.append_component(wing) + + # ------------------------------------------------------------------ + # Strut + # ------------------------------------------------------------------ + + wing = SUAVE.Components.Wings.Wing() + wing.tag = 'strut' + wing.sweeps.quarter_chord = 0. * Units.deg + wing.thickness_to_chord = 0.4 + wing.areas.reference = 660. * Units.inches**2 + wing.spans.projected = 200. * Units.inches + wing.chords.root = 6. * Units.inches + wing.chords.tip = 6. * Units.inches + wing.chords.mean_aerodynamic = 6. * Units.inches + wing.taper = wing.chords.tip/wing.chords.root + wing.aspect_ratio = wing.spans.projected**2. / wing.areas.reference + wing.twists.root = 0.0 * Units.degrees + wing.twists.tip = 0.0 * Units.degrees + wing.origin = [[80.* Units.inches,20.* Units.inches,-17.* Units.inches]] + wing.dihedral = 30.0 * Units.degrees + wing.vertical = False + wing.symmetric = True + wing.t_tail = False + wing.dynamic_pressure_ratio = 1.0 + + # add to vehicle + vehicle.append_component(wing) + + + + # ------------------------------------------------------------------ + # Fuselage + # ------------------------------------------------------------------ + + fuselage = SUAVE.Components.Fuselages.Fuselage() + fuselage.tag = 'fuselage' + fuselage.number_coach_seats = 4. + fuselage.tag = 'fuselage' + fuselage.differential_pressure = 0. + fuselage.width = 42. * Units.inches + fuselage.heights.maximum = 62. * Units.inches + fuselage.lengths.total = 326. * Units.inches + fuselage.lengths.empennage = 161. * Units.inches + fuselage.lengths.cabin = 105. * Units.inches + fuselage.lengths.structure = fuselage.lengths.total-fuselage.lengths.empennage + fuselage.mass_properties.volume = .4*fuselage.lengths.total*(np.pi/4.)*(fuselage.heights.maximum**2.) #try this as approximation + fuselage.mass_properties.internal_volume = .3*fuselage.lengths.total*(np.pi/4.)*(fuselage.heights.maximum**2.) + fuselage.areas.wetted = 20.396 + fuselage.seats_abreast = 2. + fuselage.fineness.nose = 1.6 + fuselage.fineness.tail = 2. + fuselage.lengths.nose = 60. * Units.inches + fuselage.heights.at_quarter_length = 62. * Units.inches + fuselage.heights.at_three_quarters_length = 62. * Units.inches + fuselage.heights.at_wing_root_quarter_chord = 23. * Units.inches + fuselage.areas.front_projected = fuselage.width* fuselage.heights.maximum + fuselage.effective_diameter = 50. * Units.inches + + + # Segment + segment = SUAVE.Components.Lofted_Body_Segment.Segment() + segment.tag = 'segment_0' + segment.percent_x_location = 0. + segment.percent_z_location = 16.75 /326. + segment.height = 0. * Units.inches + segment.width = 0. * Units.inches + fuselage.Segments.append(segment) + + # Segment + segment = SUAVE.Components.Lofted_Body_Segment.Segment() + segment.tag = 'segment_1' + segment.percent_x_location = 0.070433529 + segment.percent_z_location = 0.023187437 + segment.height = 28.089241 * Units.inches + segment.width = 40. * Units.inches + fuselage.Segments.append(segment) + + # Segment + segment = SUAVE.Components.Lofted_Body_Segment.Segment() + segment.tag = 'segment_2' + segment.percent_x_location = 0.16766091 + segment.percent_z_location = 0.014375532 + segment.height = 38.872257 * Units.inches + segment.width = 42. * Units.inches + fuselage.Segments.append(segment) + + # Segment + segment = SUAVE.Components.Lofted_Body_Segment.Segment() + segment.tag = 'segment_3' + segment.percent_x_location = 0.243802224 + segment.percent_z_location = 0.026573779 + segment.height = 56.19732 * Units.inches + segment.width = 42. * Units.inches + fuselage.Segments.append(segment) + + # Segment + segment = SUAVE.Components.Lofted_Body_Segment.Segment() + segment.tag = 'segment_4' + segment.percent_x_location = 0.443495521 + segment.percent_z_location = 0.015 + segment.height = 46 * Units.inches + segment.width = 42. * Units.inches + fuselage.Segments.append(segment) + + # Segment + segment = SUAVE.Components.Lofted_Body_Segment.Segment() + segment.tag = 'segment_5' + segment.percent_x_location = 0.508342393 + segment.percent_z_location = -0.000878305 + segment.height = 34.067009 * Units.inches + segment.width = 42. * Units.inches + fuselage.Segments.append(segment) + + # Segment + segment = SUAVE.Components.Lofted_Body_Segment.Segment() + segment.tag = 'segment_6' + segment.percent_x_location = 0.857801856 + segment.percent_z_location = -0.022517885 + segment.height = 15.538013 * Units.inches + segment.width = 10 * Units.inches + fuselage.Segments.append(segment) + + # add to vehicle + vehicle.append_component(fuselage) + + # ------------------------------------------------------------------ + # Piston Propeller Network + # ------------------------------------------------------------------ + + # build network + net = SUAVE.Components.Energy.Networks.Internal_Combustion_Propeller() + net.tag = 'internal_combustion' + net.number_of_engines = 1. + net.identical_propellers = True + + # the engine + engine = SUAVE.Components.Energy.Converters.Internal_Combustion_Engine() + engine.sea_level_power = 180. * Units.horsepower + engine.flat_rate_altitude = 0.0 + engine.rated_speed = 2700. * Units.rpm + engine.power_specific_fuel_consumption = 0.52 + net.engines.append(engine) + + # the prop + prop = SUAVE.Components.Energy.Converters.Propeller() + prop.number_of_blades = 2.0 + prop.origin = [[0.0,0.0,16.75 * Units.inches]] + prop.freestream_velocity = 119. * Units.knots + prop.angular_velocity = 2650. * Units.rpm + prop.tip_radius = 76./2. * Units.inches + prop.hub_radius = 8. * Units.inches + prop.design_Cl = 0.8 + prop.design_altitude = 12000. * Units.feet + prop.design_power = .64 * 180. * Units.horsepower + prop.variable_pitch = False + + prop.airfoil_geometry = ['./Airfoils/NACA_4412.txt'] + prop.airfoil_polars = [['./Airfoils/Polars/NACA_4412_polar_Re_50000.txt' , + './Airfoils/Polars/NACA_4412_polar_Re_100000.txt' , + './Airfoils/Polars/NACA_4412_polar_Re_200000.txt' , + './Airfoils/Polars/NACA_4412_polar_Re_500000.txt' , + './Airfoils/Polars/NACA_4412_polar_Re_1000000.txt' ]] + + prop.airfoil_polar_stations = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] + prop = propeller_design(prop) + + net.propellers.append(prop) + + + # add the network to the vehicle + vehicle.append_component(net) + + + # ------------------------------------------------------------------ + # Vehicle Definition Complete + # ------------------------------------------------------------------ + + return vehicle + +def configs_setup(vehicle): + # ------------------------------------------------------------------ + # Initialize Configurations + # ------------------------------------------------------------------ + configs = SUAVE.Components.Configs.Config.Container() + base_config = SUAVE.Components.Configs.Config(vehicle) + base_config.tag = 'base' + configs.append(base_config) + + # ------------------------------------------------------------------ + # Cruise Configuration + # ------------------------------------------------------------------ + config = SUAVE.Components.Configs.Config(base_config) + config.tag = 'cruise' + configs.append(config) + + return configs + + +# ---------------------------------------------------------------------- +# Define the Mission +# ---------------------------------------------------------------------- + +def mission_setup(analyses,vehicle): + + # ------------------------------------------------------------------ + # Initialize the Mission + # ------------------------------------------------------------------ + + mission = SUAVE.Analyses.Mission.Sequential_Segments() + mission.tag = 'the_mission' + + + # unpack Segments module + Segments = SUAVE.Analyses.Mission.Segments + + # base segment + base_segment = Segments.Segment() + + + + # ------------------------------------------------------------------ + # Cruise Segment: Constant Speed Constant Altitude + # ------------------------------------------------------------------ + + segment = Segments.Cruise.Constant_Speed_Constant_Altitude(base_segment) + segment.tag = "cruise" + + segment.analyses.extend( analyses ) + + segment.altitude = 12000. * Units.feet + segment.air_speed = 116. * Units.knots + segment.distance = 100 * Units.nautical_mile + + ones_row = segment.state.ones_row + segment.state.numerics.number_control_points = 16 + segment.state.unknowns.throttle = 1.0 * ones_row(1) + segment = vehicle.networks.internal_combustion.add_unknowns_and_residuals_to_segment(segment,rpm=2600) + + + segment.process.iterate.conditions.stability = SUAVE.Methods.skip + segment.process.finalize.post_process.stability = SUAVE.Methods.skip + + # add to mission + mission.append_segment(segment) + + + return mission + + +def base_analysis(vehicle): + + # ------------------------------------------------------------------ + # Initialize the Analyses + # ------------------------------------------------------------------ + analyses = SUAVE.Analyses.Vehicle() + + ## ------------------------------------------------------------------ + ## Basic Geometry Relations + #sizing = SUAVE.Analyses.Sizing.Sizing() + #sizing.features.vehicle = vehicle + #analyses.append(sizing) + + # ------------------------------------------------------------------ + # Weights + weights = SUAVE.Analyses.Weights.Weights_Transport() + weights.vehicle = vehicle + analyses.append(weights) + + # ------------------------------------------------------------------ + # Aerodynamics Analysis + + # Calculate extra drag from landing gear: + + main_wheel_width = 4. * Units.inches + main_wheel_height = 12. * Units.inches + nose_gear_height = 10. * Units.inches + nose_gear_width = 4. * Units.inches + + total_wheel = 2*main_wheel_width*main_wheel_height + nose_gear_width*nose_gear_height + + main_gear_strut_height = 2. * Units.inches + main_gear_strut_length = 24. * Units.inches + nose_gear_strut_height = 12. * Units.inches + nose_gear_strut_width = 2. * Units.inches + + total_strut = 2*main_gear_strut_height*main_gear_strut_length + nose_gear_strut_height*nose_gear_strut_width + + # total drag increment area + drag_area = 1.4*( total_wheel + total_strut) + + + aerodynamics = SUAVE.Analyses.Aerodynamics.Fidelity_Zero() + aerodynamics.geometry = vehicle + aerodynamics.settings.drag_coefficient_increment = 1.0*drag_area/vehicle.reference_area + analyses.append(aerodynamics) + + # ------------------------------------------------------------------ + # Energy + energy= SUAVE.Analyses.Energy.Energy() + energy.network = vehicle.networks #what is called throughout the mission (at every time step)) + analyses.append(energy) + + # ------------------------------------------------------------------ + # Planet Analysis + planet = SUAVE.Analyses.Planets.Planet() + analyses.append(planet) + + # ------------------------------------------------------------------ + # Atmosphere Analysis + atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() + atmosphere.features.planet = planet.features + analyses.append(atmosphere) + + # done! + return analyses + + +# ---------------------------------------------------------------------- +# Plot Mission +# ---------------------------------------------------------------------- + +def plot_mission(results,line_style='bo-'): + + # Plot Flight Conditions + plot_flight_conditions(results, line_style) + + # Plot Aerodynamic Forces + plot_aerodynamic_forces(results, line_style) + + # Plot Aerodynamic Coefficients + plot_aerodynamic_coefficients(results, line_style) + + # Drag Components + plot_drag_components(results, line_style) + + # Plot Altitude, sfc, vehicle weight + plot_altitude_sfc_weight(results, line_style) + + # Plot Velocities + plot_aircraft_velocities(results, line_style) + + return + + +# ---------------------------------------------------------------------- +# Call Main +# ---------------------------------------------------------------------- + +if __name__ == '__main__': + main() + plt.show() diff --git a/tut_concorde.py b/tut_concorde.py index 59f4ea8..74e7966 100644 --- a/tut_concorde.py +++ b/tut_concorde.py @@ -12,12 +12,11 @@ # ---------------------------------------------------------------------- import SUAVE -assert SUAVE.__version__=='2.5.0', 'These tutorials only work with the SUAVE 2.5.0 release' -from SUAVE.Core import Units, Data +assert SUAVE.__version__=='2.5.2', 'These tutorials only work with the SUAVE 2.5.2 release' +from SUAVE.Core import Units from SUAVE.Plots.Performance.Mission_Plots import * from SUAVE.Methods.Propulsion.turbojet_sizing import turbojet_sizing -import numpy as np import pylab as plt from copy import deepcopy diff --git a/tut_eVTOL.py b/tut_eVTOL.py new file mode 100644 index 0000000..fd812c2 --- /dev/null +++ b/tut_eVTOL.py @@ -0,0 +1,593 @@ +# eVTOL_tutorial.py +# +# Created: Nov 2021, E. Botero +# + +# ---------------------------------------------------------------------------------------------------------------------- +# Imports +# ---------------------------------------------------------------------------------------------------------------------- + +# pacakgee imports +import SUAVE +assert SUAVE.__version__=='2.5.2', 'These tutorials only work with the SUAVE 2.5.2 release' +import numpy as np + +# module imports +from SUAVE.Core import Units +from SUAVE.Attributes.Gases import Air +from SUAVE.Plots.Performance.Mission_Plots import * +from SUAVE.Input_Output.OpenVSP import write +from SUAVE.Methods.Geometry.Two_Dimensional.Planform import segment_properties, wing_segmented_planform, wing_planform +from SUAVE.Methods.Propulsion import propeller_design +from SUAVE.Methods.Propulsion.electric_motor_sizing import size_optimal_motor +from SUAVE.Methods.Power.Battery.Sizing import initialize_from_mass + + +from copy import deepcopy + +# ---------------------------------------------------------------------------------------------------------------------- +# Main +# ---------------------------------------------------------------------------------------------------------------------- + +def main(): + + # Setup a vehicle + vehicle = setup_vehicle() + + # export the vehicle + #write(vehicle, 'our_eVTOL') + + # Setup analyses + analyses = setup_analyses(vehicle) + analyses.finalize() #<- this builds surrogate models! + + # Setup a mission + mission = setup_mission(vehicle, analyses) + + # Evaluate the mission + results = mission.evaluate() + + # plot the mission + make_plots(results) + + return + + +# ---------------------------------------------------------------------------------------------------------------------- +# Vehicle +# ---------------------------------------------------------------------------------------------------------------------- + +def setup_vehicle(): + + # ------------------------------------------------------------------ + # Initialize the Vehicle + # ------------------------------------------------------------------ + + # Create a vehicle and set level properties + vehicle = SUAVE.Vehicle() + vehicle.tag = 'eVTOL' + + # ------------------------------------------------------------------ + # Vehicle-level Properties + # ------------------------------------------------------------------ + # mass properties + vehicle.mass_properties.takeoff = 2500. * Units.lb + vehicle.mass_properties.operating_empty = 2150. * Units.lb + vehicle.mass_properties.max_takeoff = 2500. * Units.lb + vehicle.mass_properties.max_payload = 100. * Units.lb + vehicle.mass_properties.center_of_gravity = [[2.0, 0. , 0. ]] # I made this up + + # basic parameters + vehicle.envelope.ultimate_load = 5.7 + vehicle.envelope.limit_load = 3. + + # ------------------------------------------------------------------ + # WINGS + # ------------------------------------------------------------------ + # WING PROPERTIES + wing = SUAVE.Components.Wings.Main_Wing() + wing.tag = 'main_wing' + wing.origin = [[1.5, 0., -0.5 ]] + wing.spans.projected = 35.0 * Units.feet + wing.chords.root = 3.25 * Units.feet + + # Segment + segment = SUAVE.Components.Wings.Segment() + segment.tag = 'Root' + segment.percent_span_location = 0. + segment.twist = 0. + segment.root_chord_percent = 1.5 + segment.dihedral_outboard = 1.0 * Units.degrees + segment.sweeps.quarter_chord = 8.5 * Units.degrees + segment.thickness_to_chord = 0.18 + wing.Segments.append(segment) + + # Segment + segment = SUAVE.Components.Wings.Segment() + segment.tag = 'Section_2' + segment.percent_span_location = 0.227 + segment.twist = 0. + segment.root_chord_percent = 1. + segment.dihedral_outboard = 1.0 * Units.degrees + segment.sweeps.quarter_chord = 0.0 * Units.degrees + segment.thickness_to_chord = 0.12 + wing.Segments.append(segment) + + # Segment + segment = SUAVE.Components.Wings.Segment() + segment.tag = 'Tip' + segment.percent_span_location = 1.0 + segment.twist = 0. + segment.root_chord_percent = 1.0 + segment.dihedral_outboard = 0.0 * Units.degrees + segment.sweeps.quarter_chord = 0.0 * Units.degrees + segment.thickness_to_chord = 0.12 + wing.Segments.append(segment) + + # Fill out more segment properties automatically + wing = segment_properties(wing) + wing = wing_segmented_planform(wing) + + + ## ALSO SET THE VEHICLE REFERENCE AREA + vehicle.reference_area = wing.areas.reference + + # add to vehicle + vehicle.append_component(wing) + + # Add a horizontal tail + # WING PROPERTIES + wing = SUAVE.Components.Wings.Horizontal_Tail() + wing.tag = 'horizontal_tail' + wing.areas.reference = 2.0 + wing.taper = 0.5 + wing.sweeps.quarter_chord = 20. * Units.degrees + wing.aspect_ratio = 5.0 + wing.thickness_to_chord = 0.12 + wing.dihedral = 5. * Units.degrees + wing.origin = [[5.5 , 0.0 , 0.65 ]] + + # Fill out more segment properties automatically + wing = wing_planform(wing) + + # add to vehicle + vehicle.append_component(wing) + + # Add a vertical tail + wing = SUAVE.Components.Wings.Vertical_Tail() + wing.tag = 'vertical_tail' + wing.areas.reference = 1.0 + wing.taper = 0.5 + wing.sweeps.quarter_chord = 30 * Units.degrees + wing.aspect_ratio = 2.5 + wing.thickness_to_chord = 0.12 + wing.origin = [[5.5 , 0.0 , 0.65 ]] + + # Fill out more segment properties automatically + wing = wing_planform(wing) + + # add to vehicle + vehicle.append_component(wing) + + # Add a fuseelage + + # --------------------------------------------------------------- + # FUSELAGE + # --------------------------------------------------------------- + # FUSELAGE PROPERTIES + fuselage = SUAVE.Components.Fuselages.Fuselage() + fuselage.tag = 'fuselage' + fuselage.seats_abreast = 2. + fuselage.fineness.nose = 0.88 + fuselage.fineness.tail = 1.13 + fuselage.lengths.nose = 3.2 * Units.feet + fuselage.lengths.tail = 6.4 * Units.feet + fuselage.lengths.cabin = 6.4 * Units.feet + fuselage.lengths.total = 6.0 + fuselage.width = 5.85 * Units.feet + fuselage.heights.maximum = 4.65 * Units.feet + fuselage.heights.at_quarter_length = 3.75 * Units.feet + fuselage.heights.at_wing_root_quarter_chord = 4.65 * Units.feet + fuselage.heights.at_three_quarters_length = 4.26 * Units.feet + fuselage.areas.wetted = 236. * Units.feet**2 + fuselage.areas.front_projected = 0.14 * Units.feet**2 + fuselage.effective_diameter = 5.85 * Units.feet + fuselage.differential_pressure = 0. + + # Segment + segment = SUAVE.Components.Lofted_Body_Segment.Segment() + segment.tag = 'segment_0' + segment.percent_x_location = 0. + segment.percent_z_location = -0.05 + segment.height = 0.1 + segment.width = 0.1 + fuselage.Segments.append(segment) + + # Segment + segment = SUAVE.Components.Lofted_Body_Segment.Segment() + segment.tag = 'segment_1' + segment.percent_x_location = 0.06 + segment.percent_z_location = -0.05 + segment.height = 0.52 + segment.width = 0.75 + fuselage.Segments.append(segment) + + # Segment + segment = SUAVE.Components.Lofted_Body_Segment.Segment() + segment.tag = 'segment_2' + segment.percent_x_location = 0.25 + segment.percent_z_location = -.01 + segment.height = 1.2 + segment.width = 1.43 + fuselage.Segments.append(segment) + + # Segment + segment = SUAVE.Components.Lofted_Body_Segment.Segment() + segment.tag = 'segment_3' + segment.percent_x_location = 0.475 + segment.percent_z_location = 0 + segment.height = 1.4 + segment.width = 1.4 + fuselage.Segments.append(segment) + + # Segment + segment = SUAVE.Components.Lofted_Body_Segment.Segment() + segment.tag = 'segment_4' + segment.percent_x_location = 0.75 + segment.percent_z_location = 0.06 + segment.height = 0.6 + segment.width = 0.4 + fuselage.Segments.append(segment) + + # Segment + segment = SUAVE.Components.Lofted_Body_Segment.Segment() + segment.tag = 'segment_5' + segment.percent_x_location = 1. + segment.percent_z_location = 0.1 + segment.height = 0.05 + segment.width = 0.05 + fuselage.Segments.append(segment) + + # add to vehicle + vehicle.append_component(fuselage) + + + #------------------------------------------------------------------- + # Booms + #------------------------------------------------------------------- + # Add booms for the motors + boom = SUAVE.Components.Fuselages.Fuselage() + boom.tag = 'boom_R' + boom.origin = [[0.525, 3.0, -0.35]] + boom.lengths.nose = 0.2 + boom.lengths.tail = 0.2 + boom.lengths.total = 4 + boom.width = 0.15 + boom.heights.maximum = 0.15 + boom.heights.at_quarter_length = 0.15 + boom.heights.at_three_quarters_length = 0.15 + boom.heights.at_wing_root_quarter_chord = 0.15 + boom.effective_diameter = 0.15 + boom.areas.wetted = 2*np.pi*(0.075)*3.5 + boom.areas.front_projected = np.pi*0.15 + boom.fineness.nose = 0.15/0.2 + boom.fineness.tail = 0.15/0.2 + + vehicle.append_component(boom) + + # Now attach the mirrored boom + other_boom = deepcopy(boom) + other_boom.origin[0][1] = -boom.origin[0][1] + other_boom.tag = 'boom_L' + vehicle.append_component(other_boom) + + + #------------------------------------------------------------------ + # Network + #------------------------------------------------------------------ + net = SUAVE.Components.Energy.Networks.Lift_Cruise() + net.number_of_lift_rotor_engines = 4 + net.number_of_propeller_engines = 1 + net.identical_propellers = True + net.identical_lift_rotors = True + net.voltage = 400. + + #------------------------------------------------------------------ + # Electronic Speed Controller + #------------------------------------------------------------------ + lift_rotor_esc = SUAVE.Components.Energy.Distributors.Electronic_Speed_Controller() + lift_rotor_esc.efficiency = 0.95 + net.lift_rotor_esc = lift_rotor_esc + + propeller_esc = SUAVE.Components.Energy.Distributors.Electronic_Speed_Controller() + propeller_esc.efficiency = 0.95 + net.propeller_esc = propeller_esc + + #------------------------------------------------------------------ + # Payload + #------------------------------------------------------------------ + payload = SUAVE.Components.Energy.Peripherals.Avionics() + payload.power_draw = 0. + net.payload = payload + + #------------------------------------------------------------------ + # Avionics + #------------------------------------------------------------------ + avionics = SUAVE.Components.Energy.Peripherals.Avionics() + avionics.power_draw = 300. * Units.watts + net.avionics = avionics + + #------------------------------------------------------------------ + # Design Battery + #------------------------------------------------------------------ + bat = SUAVE.Components.Energy.Storages.Batteries.Constant_Mass.Lithium_Ion_LiNiMnCoO2_18650() + bat.mass_properties.mass = 1000. * Units.lb + bat.max_voltage = net.voltage + initialize_from_mass(bat) + net.battery = bat + + #------------------------------------------------------------------ + # Design Rotors and Propellers + #------------------------------------------------------------------ + + # The tractor propeller + propeller = SUAVE.Components.Energy.Converters.Propeller() + propeller.origin = [[0,0,-0.325]] + propeller.number_of_blades = 3 + propeller.tip_radius = 0.9 + propeller.hub_radius = 0.1 + propeller.angular_velocity = 2200 * Units.rpm + propeller.freestream_velocity = 100. * Units.knots + propeller.design_Cl = 0.7 + propeller.design_altitude = 5000. * Units.feet + propeller.design_thrust = 500. * Units.lbf + propeller.airfoil_geometry = ['./Airfoils/NACA_4412.txt'] + propeller.airfoil_polars = [['./Airfoils/Polars/NACA_4412_polar_Re_50000.txt' , + './Airfoils/Polars/NACA_4412_polar_Re_100000.txt' , + './Airfoils/Polars/NACA_4412_polar_Re_200000.txt' , + './Airfoils/Polars/NACA_4412_polar_Re_500000.txt' , + './Airfoils/Polars/NACA_4412_polar_Re_1000000.txt' ]] + propeller.airfoil_polar_stations = np.zeros((20),dtype=np.int8).tolist() + propeller = propeller_design(propeller) + net.propellers.append(propeller) + + # The lift rotors + lift_rotor = SUAVE.Components.Energy.Converters.Lift_Rotor() + lift_rotor.tip_radius = 1.5 + lift_rotor.hub_radius = 0.15 + lift_rotor.number_of_blades = 4 + lift_rotor.design_tip_mach = 0.65 + lift_rotor.freestream_velocity = 500. * Units['ft/min'] + lift_rotor.angular_velocity = lift_rotor.design_tip_mach* Air().compute_speed_of_sound()/lift_rotor.tip_radius + lift_rotor.design_Cl = 0.7 + lift_rotor.design_altitude = 3000. * Units.feet + lift_rotor.design_thrust = 2500*Units.lbf/4 + lift_rotor.variable_pitch = False + lift_rotor.airfoil_geometry = ['./Airfoils/NACA_4412.txt'] + lift_rotor.airfoil_polars = [['./Airfoils/Polars/NACA_4412_polar_Re_50000.txt' , + './Airfoils/Polars/NACA_4412_polar_Re_100000.txt' , + './Airfoils/Polars/NACA_4412_polar_Re_200000.txt' , + './Airfoils/Polars/NACA_4412_polar_Re_500000.txt' , + './Airfoils/Polars/NACA_4412_polar_Re_1000000.txt' ]] + + lift_rotor.airfoil_polar_stations = np.zeros((20),dtype=np.int8).tolist() + lift_rotor = propeller_design(lift_rotor) + + # Appending rotors with different origins + rotations = [1,-1,-1,1] + origins = [[0.6, 3., -0.125] ,[4.5, 3., -0.125], + [0.6, -3., -0.125] ,[4.5, -3., -0.125]] + + for ii in range(4): + lift_rotor = deepcopy(lift_rotor) + lift_rotor.tag = 'lift_rotor' + lift_rotor.rotation = rotations[ii] + lift_rotor.origin = [origins[ii]] + net.lift_rotors.append(lift_rotor) + + + + #------------------------------------------------------------------ + # Design Motors + #------------------------------------------------------------------ + # Propeller (Thrust) motor + propeller_motor = SUAVE.Components.Energy.Converters.Motor() + propeller_motor.efficiency = 0.95 + propeller_motor.nominal_voltage = bat.max_voltage + propeller_motor.mass_properties.mass = 2.0 * Units.kg + propeller_motor.origin = propeller.origin + propeller_motor.propeller_radius = propeller.tip_radius + propeller_motor.no_load_current = 2.0 + propeller_motor = size_optimal_motor(propeller_motor,propeller) + net.propeller_motors.append(propeller_motor) + + # Rotor (Lift) Motor + lift_rotor_motor = SUAVE.Components.Energy.Converters.Motor() + lift_rotor_motor.efficiency = 0.85 + lift_rotor_motor.nominal_voltage = bat.max_voltage*3/4 + lift_rotor_motor.mass_properties.mass = 3. * Units.kg + lift_rotor_motor.origin = lift_rotor.origin + lift_rotor_motor.propeller_radius = lift_rotor.tip_radius + lift_rotor_motor.gearbox_efficiency = 1.0 + lift_rotor_motor.no_load_current = 4.0 + lift_rotor_motor = size_optimal_motor(lift_rotor_motor,lift_rotor) + + for _ in range(4): + lift_rotor_motor = deepcopy(lift_rotor_motor) + lift_rotor_motor.tag = 'motor' + net.lift_rotor_motors.append(lift_rotor_motor) + + + vehicle.append_component(net) + + + # Now account for things that have been overlooked for now: + vehicle.excrescence_area = 0.1 + + return vehicle + + +# ---------------------------------------------------------------------------------------------------------------------- +# Analyses +# ---------------------------------------------------------------------------------------------------------------------- + + +def setup_analyses(vehicle): + # ------------------------------------------------------------------ + # Initialize the Analyses + # ------------------------------------------------------------------ + analyses = SUAVE.Analyses.Vehicle() + + # ------------------------------------------------------------------ + # Weights + weights = SUAVE.Analyses.Weights.Weights_eVTOL() + weights.vehicle = vehicle + analyses.append(weights) + + # ------------------------------------------------------------------ + # Aerodynamics Analysis + aerodynamics = SUAVE.Analyses.Aerodynamics.Fidelity_Zero() + aerodynamics.geometry = vehicle + aerodynamics.settings.drag_coefficient_increment = 0.4 * vehicle.excrescence_area/vehicle.reference_area + analyses.append(aerodynamics) + + # ------------------------------------------------------------------ + # Energy + energy= SUAVE.Analyses.Energy.Energy() + energy.network = vehicle.networks + analyses.append(energy) + + # ------------------------------------------------------------------ + # Noise Analysis + noise = SUAVE.Analyses.Noise.Fidelity_One() + noise.geometry = vehicle + analyses.append(noise) + + # ------------------------------------------------------------------ + # Planet Analysis + planet = SUAVE.Analyses.Planets.Planet() + analyses.append(planet) + + # ------------------------------------------------------------------ + # Atmosphere Analysis + atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() + atmosphere.features.planet = planet.features + analyses.append(atmosphere) + + return analyses + + +# ---------------------------------------------------------------------------------------------------------------------- +# Mission +# ---------------------------------------------------------------------------------------------------------------------- + +def setup_mission(vehicle,analyses): + + # ------------------------------------------------------------------ + # Initialize the Mission + # ------------------------------------------------------------------ + mission = SUAVE.Analyses.Mission.Sequential_Segments() + mission.tag = 'the_mission' + + # unpack Segments module + Segments = SUAVE.Analyses.Mission.Segments + + # base segment + base_segment = Segments.Segment() + base_segment.state.numerics.number_control_points = 8 + base_segment.process.initialize.initialize_battery = SUAVE.Methods.Missions.Segments.Common.Energy.initialize_battery + base_segment.process.iterate.conditions.planet_position = SUAVE.Methods.skip + base_segment.process.iterate.conditions.stability = SUAVE.Methods.skip + base_segment.process.finalize.post_process.stability = SUAVE.Methods.skip + ones_row = base_segment.state.ones_row + + # ------------------------------------------------------------------ + # Hover Climb Segment + # ------------------------------------------------------------------ + segment = Segments.Hover.Climb(base_segment) + segment.tag = "hover_climb" + segment.analyses.extend(analyses) + segment.altitude_start = 0.0 * Units.ft + segment.altitude_end = 100. * Units.ft + segment.climb_rate = 200. * Units['ft/min'] + segment.battery_energy = vehicle.networks.lift_cruise.battery.max_energy*0.95 + segment.process.iterate.unknowns.mission = SUAVE.Methods.skip + segment = vehicle.networks.lift_cruise.add_lift_unknowns_and_residuals_to_segment(segment) + + # add to misison + mission.append_segment(segment) + + # ------------------------------------------------------------------ + # Second Climb Segment: Constant Speed, Constant Rate + # ------------------------------------------------------------------ + segment = Segments.Climb.Constant_Speed_Constant_Rate(base_segment) + segment.tag = 'wing_climb' + segment.analyses.extend(analyses) + segment.air_speed = 70. * Units.knots + segment.altitude_end = 3000. * Units.ft + segment.climb_rate = 500. * Units['ft/min'] + segment = vehicle.networks.lift_cruise.add_cruise_unknowns_and_residuals_to_segment(segment) + + # add to misison + mission.append_segment(segment) + + # ------------------------------------------------------------------ + # Cruise + # ------------------------------------------------------------------ + segment = Segments.Cruise.Constant_Speed_Constant_Altitude(base_segment) + segment.tag = "Cruise" + segment.analyses.extend(analyses) + segment.distance = 50. * Units.nautical_miles + segment.air_speed = 100. * Units.knots + segment = vehicle.networks.lift_cruise.add_cruise_unknowns_and_residuals_to_segment(segment) + + # add to misison + mission.append_segment(segment) + + # ------------------------------------------------------------------ + # Descent + # ------------------------------------------------------------------ + segment = Segments.Descent.Constant_Speed_Constant_Rate(base_segment) + segment.tag = "wing_descent" + segment.analyses.extend(analyses) + segment.air_speed = 100. * Units.knots + segment.altitude_end = 100 * Units.ft + segment.descent_rate = 300. * Units['ft/min'] + segment = vehicle.networks.lift_cruise.add_cruise_unknowns_and_residuals_to_segment(segment) + + # add to misison + mission.append_segment(segment) + + # ------------------------------------------------------------------ + # Hover Descent + # ------------------------------------------------------------------ + segment = Segments.Hover.Descent(base_segment) + segment.tag = "hover_descent" + segment.analyses.extend(analyses) + segment.altitude_end = 0. + segment.descent_rate = 100 * Units['ft/min'] + segment.process.iterate.unknowns.mission = SUAVE.Methods.skip + segment = vehicle.networks.lift_cruise.add_lift_unknowns_and_residuals_to_segment(segment) + + # add to misison + mission.append_segment(segment) + + return mission + +# ---------------------------------------------------------------------------------------------------------------------- +# Plots +# ---------------------------------------------------------------------------------------------------------------------- + +def make_plots(results): + + plot_flight_conditions(results) + + plot_aerodynamic_coefficients(results) + + plot_battery_pack_conditions(results) + + plot_lift_cruise_network(results) + +if __name__ == '__main__': + main() + plt.show() \ No newline at end of file diff --git a/tut_mission_B737.py b/tut_mission_B737.py index 18297bb..bad49b9 100644 --- a/tut_mission_B737.py +++ b/tut_mission_B737.py @@ -19,7 +19,7 @@ # SUAVE Imports import SUAVE -assert SUAVE.__version__=='2.5.0', 'These tutorials only work with the SUAVE 2.5.0 release' +assert SUAVE.__version__=='2.5.2', 'These tutorials only work with the SUAVE 2.5.2 release' from SUAVE.Core import Data, Units # The Data import here is a native SUAVE data structure that functions similarly to a dictionary. # However, iteration directly returns values, and values can be retrieved either with the diff --git a/tut_payload_range.py b/tut_payload_range.py index c88562b..bf607f5 100644 --- a/tut_payload_range.py +++ b/tut_payload_range.py @@ -9,14 +9,13 @@ # ---------------------------------------------------------------------- import SUAVE -assert SUAVE.__version__=='2.5.0', 'These tutorials only work with the SUAVE 2.5.0 release' -from SUAVE.Core import Units, Data +assert SUAVE.__version__=='2.5.2', 'These tutorials only work with the SUAVE 2.5.2 release' +from SUAVE.Core import Units from SUAVE.Methods.Propulsion.turbofan_sizing import turbofan_sizing from SUAVE.Methods.Performance import payload_range from SUAVE.Methods.Geometry.Two_Dimensional.Planform import wing_planform from SUAVE.Plots.Performance.Mission_Plots import * -import numpy as np import pylab as plt diff --git a/tut_solar_uav.py b/tut_solar_uav.py index 7f99db4..f6ed2d7 100644 --- a/tut_solar_uav.py +++ b/tut_solar_uav.py @@ -7,7 +7,7 @@ # Imports # ---------------------------------------------------------------------- import SUAVE -assert SUAVE.__version__=='2.5.0', 'These tutorials only work with the SUAVE 2.5.0 release' +assert SUAVE.__version__=='2.5.2', 'These tutorials only work with the SUAVE 2.5.2 release' from SUAVE.Core import Units import numpy as np @@ -272,8 +272,8 @@ def vehicle_setup(): # Component 8 the Battery bat = SUAVE.Components.Energy.Storages.Batteries.Constant_Mass.Lithium_Ion() - bat.mass_properties.mass = 90.0 * Units.kg - bat.specific_energy = 600. * Units.Wh/Units.kg + bat.mass_properties.mass = 95.0 * Units.kg + bat.specific_energy = 800. * Units.Wh/Units.kg bat.max_voltage = 130.0 initialize_from_mass(bat) net.battery = bat diff --git a/tut_tailsitter.py b/tut_tailsitter.py new file mode 100644 index 0000000..532574f --- /dev/null +++ b/tut_tailsitter.py @@ -0,0 +1,498 @@ +# QS_tutorial.py +# +# Created: Feb 2022, E. Botero +# Modified: + +#---------------------------------------------------------------------- +# Imports +# ---------------------------------------------------------------------- +import SUAVE +assert SUAVE.__version__=='2.5.2', 'These tutorials only work with the SUAVE 2.5.2 release' +from SUAVE.Core import Units + +import pylab as plt + +from copy import deepcopy +import os + +from SUAVE.Plots.Performance.Mission_Plots import * +from SUAVE.Methods.Propulsion import propeller_design +from SUAVE.Methods.Power.Battery.Sizing import initialize_from_mass +from SUAVE.Methods.Propulsion.electric_motor_sizing import size_from_kv +from SUAVE.Methods.Geometry.Two_Dimensional.Cross_Section.Airfoil.compute_airfoil_polars import compute_airfoil_polars + +# ---------------------------------------------------------------------- +# Main +# ---------------------------------------------------------------------- +def main(): + + # build the vehicle, configs, and analyses + configs, analyses = full_setup() + + configs.finalize() + analyses.finalize() + + # mission analysis + mission = analyses.missions.base + results = mission.evaluate() + + # plot results + plot_mission(results) + + return + +# ---------------------------------------------------------------------- +# Analysis Setup +# ---------------------------------------------------------------------- + +def full_setup(): + + # vehicle data + vehicle = vehicle_setup() + configs = configs_setup(vehicle) + + # vehicle analyses + configs_analyses = analyses_setup(configs) + + # mission analyses + mission = mission_setup(configs_analyses,vehicle) + missions_analyses = missions_setup(mission) + + analyses = SUAVE.Analyses.Analysis.Container() + analyses.configs = configs_analyses + analyses.missions = missions_analyses + + return configs, analyses + +# ---------------------------------------------------------------------- +# Build the Vehicle +# ---------------------------------------------------------------------- + +def vehicle_setup(): + + # ------------------------------------------------------------------ + # Initialize the Vehicle + # ------------------------------------------------------------------ + + vehicle = SUAVE.Vehicle() + vehicle.tag = 'tail_sitter' + + # ------------------------------------------------------------------ + # Vehicle-level Properties + # ------------------------------------------------------------------ + # mass properties + vehicle.mass_properties.takeoff = 0.82 * Units.kg + vehicle.mass_properties.operating_empty = 0.82 * Units.kg + vehicle.mass_properties.max_takeoff = 0.82 * Units.kg + + # basic parameters + vehicle.reference_area = 0.1668 + + # ------------------------------------------------------------------ + # Main Wing + # ------------------------------------------------------------------ + + wing = SUAVE.Components.Wings.Main_Wing() + wing.tag = 'main_wing' + + wing.areas.reference = vehicle.reference_area + wing.spans.projected = 1.03 * Units.m + wing.aspect_ratio = (wing.spans.projected**2)/wing.areas.reference + wing.sweeps.quarter_chord = 5.0 * Units.deg + wing.thickness_to_chord = 0.12 + wing.taper = 1.0 + wing.dynamic_pressure_ratio = 1.0 + wing.chords.mean_aerodynamic = 0.162 * Units.m + wing.twists.root = 0.0 * Units.degrees + wing.twists.tip = 0.0 * Units.degrees + wing.high_lift = False + wing.vertical = False + wing.symmetric = True + + # add to vehicle + vehicle.append_component(wing) + + #------------------------------------------------------------------ + # Propulsor + #------------------------------------------------------------------ + + # build network + net = SUAVE.Components.Energy.Networks.Battery_Propeller() + net.number_of_propeller_engines = 4. + net.voltage = 12.3 + net.identical_propellers = True + + # Component 1 the ESC + esc = SUAVE.Components.Energy.Distributors.Electronic_Speed_Controller() + esc.efficiency = 0.95 # Gundlach for brushless motors + net.esc = esc + + # Component 2 the Propeller + + # Design the Propeller + prop = SUAVE.Components.Energy.Converters.Propeller() + prop.number_of_blades = 2.0 + prop.freestream_velocity = 15.0 # freestream m/s + prop.angular_velocity = 7500. * Units['rpm'] + prop.tip_radius = 4. * Units.inch + prop.hub_radius = 0.125 * Units.inch + prop.design_Cl = 0.7 + prop.design_altitude = 0.1 * Units.km + prop.design_power = 200. * Units.watts + prop = propeller_design(prop) + + origins = [[0., 0.15, -0.05], [0., -0.15, -0.05], [0., .35, 0.05], [0., 0.35, 0.05]] + + + for ii in range(4): + rotor = deepcopy(prop) + rotor.tag = 'propeller' + rotor.origin = [origins[ii]] + net.propellers.append(rotor) + + # Component 3 the Motor + motor = SUAVE.Components.Energy.Converters.Motor() + motor.speed_constant = 1500. * Units['rpm'] # RPM/volt converted to (rad/s)/volt + motor = size_from_kv(motor) + motor.gear_ratio = 1. # Gear ratio + motor.gearbox_efficiency = 1. # Gear box efficiency + motor.expected_current = 10. # Expected current + motor.propeller_radius = prop.tip_radius + + for ii in range(4): + rotor_motor = deepcopy(motor) + rotor_motor.tag = 'motor' + rotor_motor.origin = [origins[ii]] + net.propeller_motors.append(rotor_motor) + + + # Component 4 the Payload + payload = SUAVE.Components.Energy.Peripherals.Payload() + payload.power_draw = 0. #Watts + payload.mass_properties.mass = 0.0 * Units.kg + net.payload = payload + + # Component 5 the Avionics + avionics = SUAVE.Components.Energy.Peripherals.Avionics() + avionics.power_draw = 2. #Watts + net.avionics = avionics + + # Component 6 the Battery + bat = SUAVE.Components.Energy.Storages.Batteries.Constant_Mass.Lithium_Ion() + bat.mass_properties.mass = 0.17 * Units.kg + bat.specific_energy = 175.*Units.Wh/Units.kg + bat.resistance = 0.003 + bat.max_voltage = 11.1 + initialize_from_mass(bat) + net.battery = bat + + # add the solar network to the vehicle + vehicle.append_component(net) + + return vehicle + + +# ---------------------------------------------------------------------- +# Define the Configurations +# --------------------------------------------------------------------- + +def configs_setup(vehicle): + + # ------------------------------------------------------------------ + # Initialize Configurations + # ------------------------------------------------------------------ + + configs = SUAVE.Components.Configs.Config.Container() + + base_config = SUAVE.Components.Configs.Config(vehicle) + base_config.tag = 'base' + configs.append(base_config) + + return configs + + +# ---------------------------------------------------------------------- +# Define the Vehicle Analyses +# ---------------------------------------------------------------------- + +def analyses_setup(configs): + + analyses = SUAVE.Analyses.Analysis.Container() + + # build a base analysis for each config + for tag,config in configs.items(): + analysis = base_analysis(config) + analyses[tag] = analysis + + return analyses + +def base_analysis(vehicle): + + # ------------------------------------------------------------------ + # Initialize the Analyses + # ------------------------------------------------------------------ + analyses = SUAVE.Analyses.Vehicle() + + # ------------------------------------------------------------------ + # Basic Geometry Relations + sizing = SUAVE.Analyses.Sizing.Sizing() + sizing.features.vehicle = vehicle + analyses.append(sizing) + + # ------------------------------------------------------------------ + # Weights + weights = SUAVE.Analyses.Weights.Weights() + weights.settings.empty_weight_method = \ + SUAVE.Methods.Weights.Correlations.UAV.empty + weights.vehicle = vehicle + analyses.append(weights) + + # ------------------------------------------------------------------ + # Aerodynamics Analysis + aerodynamics = SUAVE.Analyses.Aerodynamics.AERODAS() + aerodynamics.geometry = vehicle + aerodynamics.settings.drag_coefficient_increment = 0.0000 + aerodynamics.settings.maximum_lift_coefficient = 1.5 + analyses.append(aerodynamics) + + # ------------------------------------------------------------------ + # Energy + energy = SUAVE.Analyses.Energy.Energy() + energy.network = vehicle.networks + analyses.append(energy) + + # ------------------------------------------------------------------ + # Planet Analysis + planet = SUAVE.Analyses.Planets.Planet() + analyses.append(planet) + + # ------------------------------------------------------------------ + # Atmosphere Analysis + atmosphere = SUAVE.Analyses.Atmospheric.US_Standard_1976() + atmosphere.features.planet = planet.features + analyses.append(atmosphere) + + # done! + return analyses + +# ---------------------------------------------------------------------- +# Define the Mission +# ---------------------------------------------------------------------- +def mission_setup(analyses,vehicle): + + # ------------------------------------------------------------------ + # Initialize the Mission + # ------------------------------------------------------------------ + + mission = SUAVE.Analyses.Mission.Sequential_Segments() + mission.tag = 'The Test Mission' + + mission.atmosphere = SUAVE.Attributes.Atmospheres.Earth.US_Standard_1976() + mission.planet = SUAVE.Attributes.Planets.Earth() + + # unpack Segments module + Segments = SUAVE.Analyses.Mission.Segments + + # base segment + base_segment = Segments.Segment() + base_segment.process.initialize.initialize_battery = SUAVE.Methods.Missions.Segments.Common.Energy.initialize_battery + base_segment.process.iterate.conditions.planet_position = SUAVE.Methods.skip + base_segment.state.numerics.number_control_points = 3 + + #------------------------------------------------------------------ + # Climb Hover + #------------------------------------------------------------------ + + segment = SUAVE.Analyses.Mission.Segments.Climb.Constant_Speed_Constant_Rate(base_segment) + segment.tag = "Climb" + + # connect vehicle configuration + segment.analyses.extend(analyses.base) + + # segment attributes + ones_row = segment.state.ones_row + segment.battery_energy = vehicle.networks.battery_propeller.battery.max_energy + segment.altitude_start = 0. + segment.altitude_end = 100. * Units.m + segment.climb_rate = 3. * Units.m / Units.s + segment.air_speed = 3. * Units.m / Units.s + segment.state.unknowns.body_angle = ones_row(1) * 90. *Units.deg + + segment = vehicle.networks.battery_propeller.add_unknowns_and_residuals_to_segment(segment,\ + initial_power_coefficient = 0.1) + mission.append_segment(segment) + + # ------------------------------------------------------------------ + # Hover + # ------------------------------------------------------------------ + + segment = SUAVE.Analyses.Mission.Segments.Hover.Hover(base_segment) + segment.tag = "Hover_1" + + # connect vehicle configuration + segment.analyses.extend(analyses.base) + + # segment attributes + segment.time = 60* Units.seconds + segment.state.conditions.frames.body.inertial_rotations[:,1] = ones_row(1) * 90.*Units.deg + + segment = vehicle.networks.battery_propeller.add_unknowns_and_residuals_to_segment(segment,\ + initial_power_coefficient = 0.07) + + mission.append_segment(segment) + + # ------------------------------------------------------------------ + # Hover Transition + # ------------------------------------------------------------------ + + segment = SUAVE.Analyses.Mission.Segments.Cruise.Constant_Acceleration_Constant_Altitude(base_segment) + segment.tag = "Transition_to_Cruise" + + # connect vehicle configuration + segment.analyses.extend(analyses.base) + + # segment attributes + segment.acceleration = 1.5 * Units['m/s/s'] + segment.air_speed_initial = 0.0 + segment.air_speed_final = 15.0 + segment.altitude = 100. * Units.m + + segment = vehicle.networks.battery_propeller.add_unknowns_and_residuals_to_segment(segment,\ + initial_power_coefficient = 0.07) + + mission.append_segment(segment) + + + # ------------------------------------------------------------------ + # Cruise + # ------------------------------------------------------------------ + + segment = SUAVE.Analyses.Mission.Segments.Cruise.Constant_Speed_Constant_Altitude(base_segment) + segment.tag = "Cruise" + + # connect vehicle configuration + segment.analyses.extend(analyses.base) + + # segment attributes + segment.distance = 3. * Units.km + segment.air_speed = 15. * Units.m/Units.s + segment.altitude = 100. * Units.m + + segment = vehicle.networks.battery_propeller.add_unknowns_and_residuals_to_segment(segment,\ + initial_power_coefficient = 0.04) + + mission.append_segment(segment) + + # ------------------------------------------------------------------ + # Hover Transition + # ------------------------------------------------------------------ + + segment = SUAVE.Analyses.Mission.Segments.Cruise.Constant_Acceleration_Constant_Altitude(base_segment) + segment.tag = "Transition_to_hover" + + # connect vehicle configuration + segment.analyses.extend(analyses.base) + + # segment attributes + segment.acceleration = -0.5 * Units['m/s/s'] + segment.air_speed_initial = 15.0 + segment.air_speed_final = 0.0 + segment.altitude = 100. * Units.m + + segment = vehicle.networks.battery_propeller.add_unknowns_and_residuals_to_segment(segment,\ + initial_power_coefficient = 0.07) + + mission.append_segment(segment) + + # ------------------------------------------------------------------ + # Hover + # ------------------------------------------------------------------ + + segment = SUAVE.Analyses.Mission.Segments.Hover.Hover(base_segment) + segment.tag = "Hover_2" + + # connect vehicle configuration + segment.analyses.extend(analyses.base) + + # segment attributes + segment.time = 60* Units.seconds + segment.state.conditions.frames.body.inertial_rotations[:,1] = ones_row(1)* 90.*Units.deg + + segment = vehicle.networks.battery_propeller.add_unknowns_and_residuals_to_segment(segment,\ + initial_power_coefficient = 0.07) + + mission.append_segment(segment) + + # ------------------------------------------------------------------ + # Descent Hover + # ------------------------------------------------------------------ + + segment = SUAVE.Analyses.Mission.Segments.Hover.Descent(base_segment) + segment.tag = "Descent" + + # connect vehicle configuration + segment.analyses.extend(analyses.base) + + # segment attributes + segment.altitude_end = 0. * Units.m + segment.descent_rate = 3. * Units.m / Units.s + segment.state.conditions.frames.body.inertial_rotations[:,1] = ones_row(1)* 90.*Units.deg + + segment = vehicle.networks.battery_propeller.add_unknowns_and_residuals_to_segment(segment,\ + initial_power_coefficient = 0.06) + + mission.append_segment(segment) + + #------------------------------------------------------------------ + # Mission definition complete + #------------------------------------------------------------------- + + return mission + +def missions_setup(base_mission): + + # the mission container + missions = SUAVE.Analyses.Mission.Mission.Container() + + # ------------------------------------------------------------------ + # Base Mission + # ------------------------------------------------------------------ + + missions.base = base_mission + + # done! + return missions + +# ---------------------------------------------------------------------- +# Plot Results +# ---------------------------------------------------------------------- +def plot_mission(results): + + + # Plot Flight Conditions + plot_flight_conditions(results) + + # Plot Aerodynamic Coefficients + plot_aerodynamic_coefficients(results) + + # Plot Aircraft Flight Speed + plot_aircraft_velocities(results) + + # Plot Aircraft Electronics + plot_battery_pack_conditions(results) + + # Plot Propeller Conditions + plot_propeller_conditions(results) + + # Plot Electric Motor and Propeller Efficiencies + plot_eMotor_Prop_efficiencies(results) + + # Plot propeller Disc and Power Loading + plot_disc_power_loading(results) + + return + +if __name__ == '__main__': + main() + + plt.show() \ No newline at end of file