{"id":430548,"date":"2024-08-28T15:00:59","date_gmt":"2024-08-28T15:00:59","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=430548"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=430548","title":{"rendered":"<span>\u041f\u043e\u0434\u0431\u043e\u0440 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0432 \u043a\u043e\u043c\u043f\u0430\u0441 3d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e fluid x3d<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u041d\u0430\u0447\u0430\u043b\u043e<\/h2>\n<p>\u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u043d\u0435 \u043f\u043e\u0434\u043a\u0438\u043d\u0443\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0442\u043e\u0440\u043e\u0438\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u0438\u043d\u0442\u043e\u0432.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/d04\/c54\/336\/d04c54336f8b3fa6221f48f752982d84.jpg\" alt=\"\u0424\u043e\u0442\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u043d\u0442\u0430\" title=\"\u0424\u043e\u0442\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u043d\u0442\u0430\" width=\"1920\" height=\"1537\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d04\/c54\/336\/d04c54336f8b3fa6221f48f752982d84.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0424\u043e\u0442\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u043d\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0432 solidworks \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u044b\u043b \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0434\u0432\u0443\u0445\u043b\u043e\u043f\u0430\u0441\u0442\u043d\u043e\u0439 \u0432\u0438\u043d\u0442 \u0441 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c\u0438 \u0443\u0433\u043b\u0430\u043c\u0438 \u0430\u0442\u0430\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/901\/5f8\/be2\/9015f8be23ff21bb947a97f7658b9a9a.png\" alt=\"\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043e\u0442 \u043e\u043d\" title=\"\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043e\u0442 \u043e\u043d\" width=\"1127\" height=\"748\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/901\/5f8\/be2\/9015f8be23ff21bb947a97f7658b9a9a.png\"\/><\/p>\n<div><figcaption>\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043e\u0442 \u043e\u043d<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u0447\u0430\u043b\u0441\u044f \u043f\u043e\u0434\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u0443\u044e \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u0433\u0434\u0435-\u0442\u043e \u0432\u044b\u0447\u0438\u0442\u0430\u043b\u0438 \u0442\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0443\u0432\u043a\u0438 \u0432\u0438\u043d\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0451, \u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0434\u0435\u043b\u044e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0443\u043c\u0435\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u0442\u044f\u0433\u0430, \u043c\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0f7\/3b3\/dd3\/0f73b3dd3c2121d008797aa17e85d8d3.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u043c\u044b \u044d\u0442\u043e \u043f\u043e\u043d\u044f\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u0438 \u0438\u0434\u0443\u0442 \u0432\u043e \u0432\u0441\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u043c\u044b \u044d\u0442\u043e \u043f\u043e\u043d\u044f\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u0438 \u0438\u0434\u0443\u0442 \u0432\u043e \u0432\u0441\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b\" width=\"1147\" height=\"641\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0f7\/3b3\/dd3\/0f73b3dd3c2121d008797aa17e85d8d3.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u043c\u044b \u044d\u0442\u043e \u043f\u043e\u043d\u044f\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u0438 \u0438\u0434\u0443\u0442 \u0432\u043e \u0432\u0441\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0438 \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u044e, \u043a\u0430\u043a \u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0438 \u0434\u0430 \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 Averaging\u00a0\u2014 \u044d\u0442\u043e \u0433\u0434\u0435 \u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u00a0\u0441\u0435\u0442\u043a\u0435, \u0432\u00a0\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0441\u0451 \u0442\u0430\u043a\u0438\u0435\u00a0\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043a\u0430\u043a\u00a0\u0438 \u0432\u043e\u00a0\u0432\u0441\u0435\u0445 \u0433\u0430\u0439\u0434\u0430\u0445. \u0422\u0430\u043a\u0436\u0435\u00a0\u0431\u044b\u043b\u043e \u043d\u0435\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u043e\u0447\u0435\u043c\u0443 5\u00a0\u0434\u044e\u0439\u043c\u043e\u0432\u044b\u0439 \u0432\u0438\u043d\u0442 \u043d\u0430 25\u00a0000\u00a0\u043e\u0431\/\u043c\u0438\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0442\u044f\u0433\u0443 \u0432 0,001\u041d.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043d\u0430\u0443\u0447\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430\u0445 \u0432\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b Sliding\u00a0\u2014 \u0432\u00a0\u043d\u0435\u043c \u0441\u0435\u0442\u043a\u0430 \u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u043c\u043e\u0434\u0435\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0446\u0438\u043b\u0438\u043d\u0434\u0440 \u0441\u0435\u0442\u043a\u0438 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0441\u0435\u0442\u043a\u0435. \u0418, \u043e\u00a0\u0447\u0443\u0434\u043e,\u00a0\u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.<\/p>\n<p>\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u043f\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u043a\u0438, \u0432\u0435\u0434\u044c \u043e\u0442 \u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u044f \u00ab\u041f\u0440\u043e\u0434\u0443\u0432\u043a\u0438 \u00bb \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u00a0\u043f\u0430\u0440\u044b \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e\u00a0\u043d\u0435\u0434\u0435\u043b\u0438 \u043d\u0435\u00a0\u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0441\u043b\u0430\u0431\u043e\u043c \u041f\u041a \u0441\u00a0intel 9 10\u00a0940\u00a0\u0438 quadro a5000, \u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b \u043e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d \u0432\u0438\u043d\u0442 \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u043c shining 3d ue pro. \u0422\u0430\u043a, \u043a \u0441\u043b\u043e\u0432\u0443, \u0443 \u043d\u0435\u0433\u043e \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f 0,01\u00a0\u043c\u043c \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d \u0440\u0435\u0432\u0435\u0440\u0441 \u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433 \u0434\u043b\u044f\u00a0\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438. \u0412\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u043a\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0434\u0443\u0432\u043a\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0433\u0440\u0430\u0444\u0438\u043a \u0442\u044f\u0433\u0438 \u043e\u0442\u00a0\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0438 \u00ab\u043f\u0440\u043e\u0434\u0443\u0432\u043a\u0443\u00bb, \u043a\u043e\u0433\u0434\u0430 \u0442\u044f\u0433\u0430 \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u0430 \u043d\u0430 \u00ab\u043f\u043e\u043b\u043a\u0443\u00bb.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f7\/03e\/64c\/7f703e64cea5fa7bc09a8484ee76f70c.png\" alt=\"\u043e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u0438\u043d\u0442 \u0441 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c\" title=\"\u043e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u0438\u043d\u0442 \u0441 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c\" width=\"954\" height=\"659\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7f7\/03e\/64c\/7f703e64cea5fa7bc09a8484ee76f70c.png\"\/><\/p>\n<div><figcaption>\u043e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u0438\u043d\u0442 \u0441 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8e7\/83f\/178\/8e783f178dcf2c70a41ba84e0de3626c.png\" alt=\"\u044e\u0413\u0440\u0430\u0444\u0438\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u044f\u0433\u0438 \u043e\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u0435\u0442\u043a\u0438\" title=\"\u044e\u0413\u0440\u0430\u0444\u0438\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u044f\u0433\u0438 \u043e\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u0435\u0442\u043a\u0438\" width=\"812\" height=\"365\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8e7\/83f\/178\/8e783f178dcf2c70a41ba84e0de3626c.png\"\/><\/p>\n<div><figcaption>\u044e\u0413\u0440\u0430\u0444\u0438\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u044f\u0433\u0438 \u043e\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u0435\u0442\u043a\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u044f\u0433\u0430 \u0432\u0438\u043d\u0442\u0430 \u043d\u0430\u00a0\u0438\u0441\u043f\u044b\u0442\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0435\u043d\u0434\u0435\u00a0\u0431\u044b\u043b\u0430 6,75\u041d \u0438 \u0442\u0443\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043a\u00a0solidworks, \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u00a0\u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u00a0\u043e\u0442\u0435\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0444\u0442\u0435, \u0438\u0437\u2011\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u043b\u0438 \u043d\u0430\u00a0\u043a\u043e\u043c\u043f\u0430\u0441, \u043d\u043e\u00a0\u0432\u00a0\u043d\u0435\u043c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c cfd \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043d\u0435\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u00ab\u043f\u0440\u043e\u0434\u0443\u0432\u0430\u0442\u044c\u00bb \u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438.\u00a0\u0411\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c open source \u043f\u0440\u043e\u0435\u043a\u0442 fluid x3d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u00a0\u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442\u00a0solidworks \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0440\u0430\u0441\u0447\u0435\u0442 \u043d\u0430\u00a0\u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0447\u0442\u043e\u00a0\u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0441\u00a0\u043d\u0435\u0434\u0435\u043b\u0438 \u0434\u043e\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0438\u043d\u0443\u0442! \u0418\u0442\u0430\u043a, \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 fluid\u00a0\u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0434\u0443\u0432\u043a\u0438 \u0432\u0438\u043d\u0442\u0430 \u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0434\u0443\u0432\u043a\u0438 \u0432\u00a0txt \u0444\u0430\u0439\u043b.<\/p>\n<pre><code class=\"cpp\">void main_setup() {  \/\/ ################################################################## define simulation box size, viscosity and volume force ################################################################### const uint memory = 3500u; \/\/ available VRAM of GPU(s) in MB const float lbm_u = 0.12f; const float box_scale = 6.0f; const float si_u = 0.17f; const float si_nu = 0.17f, si_rho = 1.0f; const float si_width = 0.3f, si_height = 0.3f, si_length = 0.3f; const float si_A = si_width * si_height + 2.0f * 0.05f * 0.03f; const float si_T = 0.25f; const float si_Lx = units.x(box_scale * si_width); const float si_Ly = units.x(box_scale * si_length); const float si_Lz = units.x(0.5f * (box_scale - 1.0f) * si_width + si_height); const uint3 lbm_N = resolution(float3(3.0f, 3.0f, 1.0f), memory); \/\/ input: simulation box aspect ratio and VRAM occupation in MB, output: grid resolution units.set_m_kg_s((float)lbm_N.y, lbm_u, 1.0f, box_scale * si_length, si_u, si_rho); print_info(\"Re = \" + to_string(to_uint(units.si_Re(si_width, si_u, si_nu)))); const float lbm_nu = units.nu(si_nu); const float si_omega = 1000u; const float lbm_omega = units.omega(si_omega); const float lbm_length = units.x(si_length); LBM lbm(lbm_N, lbm_nu); const uint lbm_T = 5000u; const uint lbm_dt = 10u; const float summa_cd = 0; float cd[10]; float avergate_cd[10]; int a = 0; float avergate = 0; int i;  const float radius = 0.25f * (float)lbm_N.x; const float3 center = float3(lbm.center().x, lbm.center().y, 0.36f * radius); \/\/ ###################################################################################### define geometry ###################################################################################### Mesh* mesh = read_stl(get_exe_path() + \"..\/stl\/33.stl\", lbm.size(), lbm.center(), float3x3(float3(0, 0, 1), radians(90.0f)), lbm_length); mesh-&gt;translate(float3(0.0f, units.x(0.5f * (0.5f * box_scale * si_length - si_width)) - mesh-&gt;pmin.y, 1.0f - mesh-&gt;pmin.z)); lbm.voxelize_mesh_on_device(mesh, TYPE_S | TYPE_X); \/\/ https:\/\/github.com\/nathanrooy\/ahmed-bluff-body-cfd\/blob\/master\/geometry\/ahmed_25deg_m.stl converted to binary const uint Nx = lbm.get_Nx(), Ny = lbm.get_Ny(), Nz = lbm.get_Nz(); parallel_for(lbm.get_N(), [&amp;](ulong n) { uint x = 0u, y = 0u, z = 0u; lbm.coordinates(n, x, y, z); \/\/if(z==0u) lbm.flags[n] = TYPE_S; \/\/if(lbm.flags[n]!=TYPE_S) lbm.u.y[n] = lbm_u; \/\/if(x==0u||x==Nx-1u||y==0u||y==Ny-1u||z==Nz-1u) lbm.flags[n] = TYPE_E; }); \/\/ ####################################################################### run simulation, export images and data ########################################################################## \/\/lbm.graphics.visualization_modes = VIS_FLAG_SURFACE | VIS_Q_CRITERION; \/\/lbm.graphics.set_camera_centered(20.0f, 30.0f, 0.0f, 1.648722f); lbm.run(0u); \/\/ initialize simulation  #if defined(FP16S) const string path = get_exe_path() + \"FP16S\/\" + to_string(memory) + \"MB\/\"; #elif defined(FP16C) const string path = get_exe_path() + \"FP16C\/\" + to_string(memory) + \"MB\/\"; #else \/\/ FP32 const string path = get_exe_path() + \"FP32\/\" + to_string(memory) + \"MB\/\"; #endif \/\/ FP32 \/\/lbm.write_status(path); \/\/write_file(path+\"Cd.dat\", \"# t\\tCd\\n\"); \/\/std::ofstream app;          \/\/ \u043f\u043e\u0442\u043e\u043a \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \/\/app.open(\"force.txt\");      \/\/ \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 while (true) { \/\/ main simulation loop while (true) { \/\/ main simulation loop \/\/if (lbm.graphics.next_frame(units.t(si_T), 5.0f)) { Clock clock; lbm.run(lbm_dt); lbm.calculate_force_on_boundaries(); lbm.F.read_from_device(); lbm.voxelize_mesh_on_device(mesh, TYPE_S, center, float3(0.0f), float3(0.0f, 0.0f, lbm_omega)); const float3 lbm_force = lbm.calculate_force_on_object(TYPE_S | TYPE_X); const float Cd = units.si_F(lbm_force.y); \/\/ expect Cd to be too large by a factor 1.3-2.0x; need wall model const float moment = units.si_F(lbm_force.x);  cd[a] = Cd; a = a +1; if (a == 10) { int a = 0; } for (i = 0; i &lt; 10; i++) { avergate = (avergate + cd[i]) \/ 10; } avergate_cd[a] = avergate; println(\"\\r\" + to_string(Cd, 3u) + \" \" + to_string(moment, 3u) + \"                                                                               \"); \/\/write_line(path+\"Cd.dat\", to_string(lbm.get_t())+\"\\t\"+to_string(Cd, 3u)+\"\\n\"); mesh-&gt;rotate(float3x3(float3(0, 0, 1), lbm_omega * (float)lbm_dt));\/\/ rotate mesh lbm.update_fields(); lbm.run(lbm_dt); std::ofstream ate; ate.open(\"force.txt\", std::ios_base::app); ate &lt;&lt; (to_string(Cd,3u) + \" \" + to_string(moment,3u)) &lt;&lt; std::endl; ate.close();  \/\/if (a &gt; 3) { \/\/if (avergate_cd[a] - avergate_cd[a - 3] &lt; 0.1 &amp;&amp; avergate_cd[a] - avergate_cd[a - 3] &gt; -0.1) { \/\/break; \/\/} \/\/}    #if defined(GRAPHICS) &amp;&amp; !defined(INTERACTIVE_GRAPHICS) \/\/lbm.graphics.write_frame(path+\"images\/\"); #endif \/\/ GRAPHICS &amp;&amp; !INTERACTIVE_GRAPHICS } lbm.run(1u); \/\/app.close(); } \/\/lbm.write_status(path); } \/**\/ \/\/}<\/code><\/pre>\n<p>https:\/\/github.com\/ProjectPhysX\/FluidX3D &#8212;  \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 fluid \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u043e\u0432\u044b\u0440\u044f\u0439\u0442\u0435\u0441\u044c \u0441\u043e\u0432\u0435\u0442\u0443\u044e<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0434\u0443\u0432\u043a\u0438 \u0432 python \u0438\u0431\u043e \u043d\u0435 \u043d\u0430 \u0447\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u043c \u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0443\u043c\u0435\u044e<\/p>\n<pre><code class=\"python\">import os import subprocess    def run():     command = [\"\u043f\u0443\u0442\u044c \u043a fluid.exe\",\"\/c\",\"runas\",'\/user:administrator',\"regedit\"]     p = subprocess.Popen(command, stdin = subprocess.PIPE)     #p.stdin.write(\"1961\")     p.communicate()           def get_result():     data = open(\"\u043f\u0443\u0442\u044c \u043a force.txt\",\"r\")     a = data.read()     a = a[:-1]     l = a.split(\"\\n\")     force = 0     moment = 0     #print(l)     for i in range(len(l)):         l[i] = l[i].split(\" \")         force += abs(float(l[i][0]))         moment += abs(float(l[i][1]))     force = round(force\/len(l),2)     moment = round(moment\/len(l),2)     a = [force,moment]     return a    def remove_dat():     os.remove(\"\u043f\u0443\u0442\u044c \u043a force.txt\")<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a \u043a\u043e\u043c\u043f\u0430\u0441\u0443. \u0422\u0430\u043c \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0449\u0435.<\/p>\n<p>\u0420\u0438\u0441\u0443\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0434\u0432\u0443\u0445\u043b\u043e\u043f\u0430\u0441\u0442\u043d\u043e\u0439 \u0432\u0438\u043d\u0442 \u043f\u043e \u0441\u0435\u0447\u0435\u043d\u0438\u044f\u043c, \u043f\u0440\u0438\u0447\u0435\u043c \u0432 \u044d\u0441\u043a\u0438\u0437\u0430\u0445 \u0434\u0435\u043b\u0430\u0435\u043c \u0443\u0433\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043d\u043e\u0441\u0438\u043c \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/72d\/7c6\/7e9\/72d7c67e94976f07b15dadb0aa1b30cd.png\" alt=\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435\" title=\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435\" width=\"1914\" height=\"883\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/72d\/7c6\/7e9\/72d7c67e94976f07b15dadb0aa1b30cd.png\"\/><\/p>\n<div><figcaption>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0440\u0430 \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f api \u043a\u043e\u043c\u043f\u0430\u0441\u0430 <\/p>\n<pre><code class=\"python\"># -*- coding: utf-8 -*- #|1  import pythoncom from win32com.client import Dispatch, gencache import KompasAPI7 import LDefin3D import MiscellaneousHelpers as MH import os def connect():      global iPart,iDocument3D,kompas_document #  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b API \u041a\u043e\u043c\u043f\u0430\u0441     kompas6_constants = gencache.EnsureModule(\"{75C9F5D0-B5B8-4526-8681-9903C567D2ED}\", 0, 1, 0).constants     kompas6_constants_3d = gencache.EnsureModule(\"{2CAF168C-7961-4B90-9DA2-701419BEEFE3}\", 0, 1, 0).constants  #  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 API5     kompas6_api5_module = gencache.EnsureModule(\"{0422828C-F174-495E-AC5D-D31014DBBE87}\", 0, 1, 0)     kompas_object = kompas6_api5_module.KompasObject(Dispatch(\"Kompas.Application.5\")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))     MH.iKompasObject  = kompas_object  #  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 API7     kompas_api7_module = gencache.EnsureModule(\"{69AC2981-37C0-4379-84FD-5DD2F3C0A520}\", 0, 1, 0)     application = kompas_api7_module.IApplication(Dispatch(\"Kompas.Application.7\")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))     MH.iApplication  = application       Documents = application.Documents #  \u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442     kompas_document = application.ActiveDocument #kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)     iDocument3D = kompas_object.ActiveDocument3D()     iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)     return iPart,iDocument3D def rebuild(iPart,iDocument3D):     iPart.RebuildModel()     iDocument3D.RebuildDocument() def export_stl():     kompas_document.SaveAs(\"path\\\\FluidX3D-master\\\\stl\\\\33.STL\") def edit_param(iPart,angle1,angle2):          global VariableCollection          VariableCollection = iPart.VariableCollection()     VariableCollection.GetByName(\"angle1\",True,True).value =  angle1     VariableCollection.GetByName(\"angle2\",True,True).value = angle2   def remove_stl():     \"\"\"     Remove existing STL file     \"\"\"     # Delete file     os.remove(\"path\\\\FluidX3D-master\\\\stl\\\\33.STL\")<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u043a\u043e\u043c\u043f\u0430\u0441\u0443, \u043c\u0435\u043d\u044f\u0435\u043c \u0434\u0432\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\/\u0443\u0434\u0430\u043b\u044f\u0435\u043c stl.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0441\u0447\u0430\u0441\u0442\u044c\u044f \u043d\u0443\u0436\u0435\u043d \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c:<\/p>\n<pre><code class=\"python\">import random import api_kompas import api_fluid  def create_obj(size,obj):                                               #\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442     obj = []     for i in range(size):         obj.append(random.randint(0,45))     return obj  def create_population(pop_size,obj_size):                               #\u0441\u043e\u0437\u0434\u0435\u043c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0435 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438     population = []     obj = []     for i in range(pop_size):         population.append(create_obj(obj_size,obj))     return population  def calc_obj(iPart,iDocument,obj):                                      #\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0442\u044f\u0433\u0443 \u0438 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430     api_kompas.edit_param(iPart,obj[0],obj[1])     api_kompas.rebuild(iPart,iDocument)     api_kompas.export_stl()     api_fluid.run()     obj.append(api_fluid.get_result()[0])     obj.append(api_fluid.get_result()[1])     api_fluid.remove_dat()     api_kompas.remove_stl()  def calc_pop(iPart,iDocument,population):                               #\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0442\u044f\u0433\u0443 \u0438 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u0438     for i in range(len(population)):         calc_obj(iPart,iDocument,population[i])  def calc_k_obj(obj):                                                    #\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u043e\u0444\u0438\u0446\u0435\u043d\u0442 \u0432\u044b\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430     obj.append(obj[len(obj)-2]\/obj[len(obj)-1])  def calc_k_pop(population):                                             #\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u043e\u0444\u0438\u0446\u0435\u043d\u0442 \u0432\u044b\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f     for i in range(len(population)):         calc_k_obj(population[i])  def sort_population(population):     for i in range(len(population)-1):         for g in range(len(population)-i-1):             if population[g][len(population[i])-1] &lt; population[g+1][len(population[i])-1]:                 population[g][len(population[i])-1],population[g+1][len(population[i])-1]  = population[g+1][len(population[i])-1],population[g][len(population[i])-1]  def get_max_k(population):     sort_population(population)     m = population[0][len(population[0])-1]     return m  def get_weight(population):                                               #\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043e\u0444\u0438\u0446\u0435\u043d\u0442\u044b \u0432\u044b\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432     weight = []     sort_population(population)     for i in range(len(population)):         weight.append(population[i][len(population[0])-1]\/get_max_k(population))     #print(weight)     return weight    def get_parents_for_new_obj(population):                                    #\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f     parents = []     sort_population(population)     parents.append(random.choices(population,weights= get_weight(population))[0])     parent = random.choices(population,weights= get_weight(population))[0]     while parents[0] == parent:         parent = random.choices(population,weights= get_weight(population))[0]     parents.append(parent)     return parents  def get_parent_for_new_population(population):                              #\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f     parents_population = []     for i in range(len(population)):         parents_population.append(get_parents_for_new_obj(population))     return parents_population  def select(parents):                                                          #\u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0430\u0435\u043c     new_obj = [0,0]          new_obj[0] = parents[0][0]     new_obj[1] = parents[1][1]     print(new_obj)     return new_obj  def select_population(parents):                                                 #\u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435     new_population = []     for i in range(len(parents)):         new_population.append(select(parents[i]))          return new_population  def mutate(population):                                                         #\u043c\u0443\u0442\u0438\u0440\u0443\u0435\u043c     for i in range(len(population)\/\/2):         for g in range(len(population[0])):             gen = random.randint(0,len(population[0])-1)             population[i][gen] = random.randint(0,45) <\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u0430\u043a, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u041d\u0435 \u0441\u043f\u043e\u0440\u044e, \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u0435\u043d, &#8212; \u0432\u0441\u0451 \u0434\u0435\u043b\u0430\u043b\u043e\u0441\u044c \u0437\u0430 \u043d\u043e\u0447\u044c \u0434\u043e \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \ud83d\ude42<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 main \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430:<\/p>\n<pre><code class=\"python\">import api_kompas import api_fluid import pythoncom from win32com.client import Dispatch, gencache import KompasAPI7 import LDefin3D import MiscellaneousHelpers as MH import exsel import time import gen_alg #  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b API \u041a\u043e\u043c\u043f\u0430\u0441 kompas6_constants = gencache.EnsureModule(\"{75C9F5D0-B5B8-4526-8681-9903C567D2ED}\", 0, 1, 0).constants kompas6_constants_3d = gencache.EnsureModule(\"{2CAF168C-7961-4B90-9DA2-701419BEEFE3}\", 0, 1, 0).constants  #  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 API5 kompas6_api5_module = gencache.EnsureModule(\"{0422828C-F174-495E-AC5D-D31014DBBE87}\", 0, 1, 0) kompas_object = kompas6_api5_module.KompasObject(Dispatch(\"Kompas.Application.5\")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch)) MH.iKompasObject  = kompas_object  #  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 API7 kompas_api7_module = gencache.EnsureModule(\"{69AC2981-37C0-4379-84FD-5DD2F3C0A520}\", 0, 1, 0) application = kompas_api7_module.IApplication(Dispatch(\"Kompas.Application.7\")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch)) MH.iApplication  = application   Documents = application.Documents #  \u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 kompas_document = application.ActiveDocument kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document) iDocument3D = kompas_object.ActiveDocument3D() iPart = iDocument3D.GetPart(LDefin3D.pTop_Part) api_kompas.connect() a = 0  populations = [] populations.append(gen_alg.create_population(10,2)) for i in range(50):     parents = []     gen_alg.calc_pop(iPart,iDocument3D,populations[i])     gen_alg.calc_k_pop(populations[i])     parents = gen_alg.get_parent_for_new_population(populations[i])     print(parents)     populations.append(gen_alg.select_population(parents))          if i-1 &lt; 50:         print(populations[i+1])         gen_alg.mutate(populations[i+1])<\/code><\/pre>\n<p>\u0414\u043e 35 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u043a\u043e\u043c\u043f\u0430\u0441\u0443, \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u0439, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u044e, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0441 \u043d\u0438\u043c \u043f\u0440\u043e\u0434\u0443\u0432\u043a\u0438, \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0442\u044f\u0433\u0443 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u043c, \u0434\u0430\u043b\u044c\u0448\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0432\u044b\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u0438\u2014 \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435 \u0438 \u044d\u0442\u043e \u0432\u0441\u0451 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u0442\u043e\u0440\u043e\u0438\u0434\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u0438\u043d\u0442\u0430\u043c.<\/p>\n<p>\u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439: \u0432 \u043f\u0438\u0442\u043e\u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438, \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0432 \u043a\u043e\u043c\u043f\u0430\u0441, \u043e\u0431\u0432\u043e\u0434\u0438\u043c \u0441\u043f\u043b\u0430\u0439\u043d\u0430\u043c\u0438, \u043d\u0430\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438, \u0441\u0448\u0438\u0432\u0430\u0435\u043c\u00a0\u2014 \u043b\u043e\u043f\u0430\u0441\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u044b.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430 \u043f\u0430\u0439\u0442\u043e\u043d:<\/p>\n<pre><code class=\"python\">def naca4(number, chord=1, angle_of_attack=0, num_points=15, angle_z = 0,x0 =0 ,y0 = 0, z0 = 0, long = 1):     # \u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u043e NACA \u043d\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435     m = int(number[0]) \/ 100.0     p = int(number[1]) \/ 10.0     t = int(number[2:]) \/ 100.0          # \u0423\u0433\u043e\u043b \u0430\u0442\u0430\u043a\u0438 \u0432 \u0440\u0430\u0434\u0438\u0430\u043d\u0430\u0445     alpha = np.radians(angle_of_attack)     beta = np.radians(angle_z)     # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 x \u043e\u0442 0 \u0434\u043e 1 \u0441 num_points \u0442\u043e\u0447\u043a\u0430\u043c\u0438     z = np.linspace(0, chord, num_points)     x =[0]     for i in range(num_points-2):         #if i&lt;= 0.5*num_points:         x.append((1-np.cos(np.pi * z[i]))\/2)                  #else:         #    x.append((1+(1-np.cos(np.pi*z[i])))\/2)       x.append(1)                  l = []     for i in x:         l.append(round(i, 2))         x = np.array(x)             # \u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u043f\u0440\u043e\u0444\u0438\u043b\u044f     yt = 5 * t * chord * (         0.2969 * np.sqrt(x\/chord)          - 0.1260 * (x\/chord)          - 0.3516 * (x\/chord)**2          + 0.2843 * (x\/chord)**3          - 0.1015 * (x\/chord)**4     )          # \u041a\u0430\u043c\u0431\u0435\u0440 \u043b\u0438\u043d\u0438\u044f     yc = np.where((x\/chord) &lt; p,                   m * (x\/chord) \/ p**2 * (2 * p - (x\/chord)),                   m * (1 - (x\/chord)) \/ (1 - p)**2 * (1 + (x\/chord) - 2 * p))          # \u0423\u0433\u043e\u043b \u043d\u0430\u043a\u043b\u043e\u043d\u0430 \u043a\u0430\u043c\u0431\u0435\u0440 \u043b\u0438\u043d\u0438\u0438     dyc_dx = np.where((x\/chord) &lt; p,                       2 * m \/ p**2 * (p - (x\/chord)),                       2 * m \/ (1 - p)**2 * (p - (x\/chord)))     theta = np.arctan(dyc_dx)          # \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0438 \u043d\u0438\u0436\u043d\u0435\u0439 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439     xu = x - yt * np.sin(theta)     yu = yc + yt * np.cos(theta)      xl = x + yt * np.sin(theta)     yl = yc - yt * np.cos(theta)     return xu,yu,xl,yl<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0431\u0435\u0437 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0438 \u0434\u0430, \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u0430 \u043a\u043e\u043d\u0446\u0430\u0445 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u043e\u0447\u0435\u043a \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0438\u0434\u0435\u0442 \u043f\u043e \u0441\u0438\u043d\u0443\u0441\u043e\u0438\u0434\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438 \u043a\u043e\u043d\u0446\u0435 \u0438\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u044d\u0442\u043e \u043f\u043b\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0418\u0442\u0430\u043a, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u044f, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432\u0435\u0440\u0447\u0435\u043d\u0438\u0435 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0422\u0443\u0442, \u044f \u0434\u0443\u043c\u0430\u044e, \u0442\u043e\u0436\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u043d\u0435\u0442\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u044e \u043f\u043e\u043b\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"python\">def naca4(number, chord=1, angle_of_attack=0, num_points=15, angle_z = 0,x0 =0 ,y0 = 0, z0 = 0, long = 1):     # \u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u043e NACA \u043d\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435     m = int(number[0]) \/ 100.0     p = int(number[1]) \/ 10.0     t = int(number[2:]) \/ 100.0          # \u0423\u0433\u043e\u043b \u0430\u0442\u0430\u043a\u0438 \u0432 \u0440\u0430\u0434\u0438\u0430\u043d\u0430\u0445     alpha = np.radians(angle_of_attack)     beta = np.radians(angle_z)     # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 x \u043e\u0442 0 \u0434\u043e 1 \u0441 num_points \u0442\u043e\u0447\u043a\u0430\u043c\u0438     z = np.linspace(0, chord, num_points)     x =[0]     for i in range(num_points-2):         #if i&lt;= 0.5*num_points:         x.append((1-np.cos(np.pi * z[i]))\/2)                  #else:         #    x.append((1+(1-np.cos(np.pi*z[i])))\/2)       x.append(1)                  l = []     for i in x:         l.append(round(i, 2))         x = np.array(x)             # \u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u043f\u0440\u043e\u0444\u0438\u043b\u044f     yt = 5 * t * chord * (         0.2969 * np.sqrt(x\/chord)          - 0.1260 * (x\/chord)          - 0.3516 * (x\/chord)**2          + 0.2843 * (x\/chord)**3          - 0.1015 * (x\/chord)**4     )          # \u041a\u0430\u043c\u0431\u0435\u0440 \u043b\u0438\u043d\u0438\u044f     yc = np.where((x\/chord) &lt; p,                   m * (x\/chord) \/ p**2 * (2 * p - (x\/chord)),                   m * (1 - (x\/chord)) \/ (1 - p)**2 * (1 + (x\/chord) - 2 * p))          # \u0423\u0433\u043e\u043b \u043d\u0430\u043a\u043b\u043e\u043d\u0430 \u043a\u0430\u043c\u0431\u0435\u0440 \u043b\u0438\u043d\u0438\u0438     dyc_dx = np.where((x\/chord) &lt; p,                       2 * m \/ p**2 * (p - (x\/chord)),                       2 * m \/ (1 - p)**2 * (p - (x\/chord)))     theta = np.arctan(dyc_dx)          # \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0438 \u043d\u0438\u0436\u043d\u0435\u0439 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439     xu = x - yt * np.sin(theta)     yu = yc + yt * np.cos(theta)      xl = x + yt * np.sin(theta)     yl = yc - yt * np.cos(theta)          # \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043d\u0430 \u0443\u0433\u043e\u043b \u0430\u0442\u0430\u043a\u0438     xu_rot = xu * np.cos(alpha) - yu * np.sin(alpha)     yu_rot = xu * np.sin(alpha) + yu * np.cos(alpha)          xl_rot = xl * np.cos(alpha) - yl * np.sin(alpha)     yl_rot = xl * np.sin(alpha) + yl * np.cos(alpha)        #\u0441\u043e\u0437\u0434\u0430\u0451\u043c 2 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b\u0435 0     zu_rot = []     zl_rot = []     for i in range(len(xu_rot)):         zu_rot.append(0)         zl_rot.append(0)     zu_rot = np.array(zu_rot)     zl_rot = np.array(zl_rot)            #\u043c\u0430\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c     xu_rot = xu_rot * long     xl_rot = xl_rot * long     yl_rot = yl_rot * long     yu_rot = yu_rot * long     zu_rot = zu_rot * long     zl_rot = zl_rot * long     x11 = xu_rot[0]     y11 = yu_rot[0]     z11 = 10     x12 = xu_rot[0] + 10     y12 = yu_rot[0]     z12 = 0     x13 = xu_rot[0]     y13 = yu_rot[0]+10     z13 = 0     x21 = xu_rot[-1]     y21 = yu_rot[-1]     z21 = 10     x22 = xu_rot[-1] + 10     y22 = yu_rot[-1]     z22 = 0     x23 = xu_rot[-1]     y23 = yu_rot[-1]+10     z23 = 0     #\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0432 x0,y0,z0     xu_rot = xu_rot + x0     xl_rot = xl_rot + x0     yl_rot = yl_rot + y0     yu_rot = yu_rot + y0     zu_rot = zu_rot + z0     zl_rot = zl_rot + z0     x11 = x11 + x0     y11 = y11 + y0     z11 = z11 + z0     x12 = x12 + x0     y12 = y12 + y0     z12 = z12 + z0     x13 = x13 + x0     y13 = y13 + y0     z13 = z13 + z0     x21 = x21 + x0     y21 = y21 + y0     z21 = z21 + z0     x22 = x22 + x0     y22 = y22 + y0     z22 = z22 + z0     x23 = x23 + x0     y23 = y23 + y0     z23 = z23 + z0     print(zl_rot)     #\u043f\u043e\u0432\u043e\u0440\u0447\u0438\u0432\u0430\u0435\u043c \u0443\u0433\u043e\u043b \u043f\u043e \u043e\u0441\u0438 z     xu_rot_z = xu_rot * np.cos(beta) - zu_rot*np.sin(beta)     zu_rot_z = xu_rot * np.sin(beta) + zu_rot*np.cos(beta)     xl_rot_z = xl_rot * np.cos(beta) - zu_rot*np.sin(beta)     zl_rot_z = xl_rot * np.sin(beta) + zl_rot*np.cos(beta)     x11_rot = x11* np.cos(beta) - z11*np.sin(beta)     z11_rot = x11* np.sin(beta) + z11*np.cos(beta)     x12_rot = x12* np.cos(beta) - z12*np.sin(beta)     z12_rot = x12* np.sin(beta) + z12*np.cos(beta)     x13_rot = x13* np.cos(beta) - z13*np.sin(beta)     z13_rot = x13* np.sin(beta) + z13*np.cos(beta)     x21_rot = x21* np.cos(beta) - z21*np.sin(beta)     z21_rot = x21* np.sin(beta) + z21*np.cos(beta)     x22_rot = x22* np.cos(beta) - z22*np.sin(beta)     z22_rot = x22* np.sin(beta) + z22*np.cos(beta)     x23_rot = x23* np.cos(beta) - z23*np.sin(beta)     z23_rot = x23* np.sin(beta) + z23*np.cos(beta)          #print(zu_rot_z)      #\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c     #plt.figure(figsize=(12, 6))     #plt.plot(xu_rot, yu_rot, 'b')     #plt.plot(xl_rot, yl_rot, 'b')     #plt.grid(True)     #plt.axis('equal')     #plt.show()     return xu_rot_z,xl_rot_z[1:15],yu_rot,yl_rot[1:15],zu_rot_z,zl_rot_z[1:15],x11_rot,y11,z11_rot,x12_rot,y12,z12_rot,x13_rot,y13,z13_rot,x21_rot,y21,z21_rot,x22_rot,y22,z22_rot,x23_rot,y23,z23_rot<\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u043a\u043e\u0433\u0434\u0430 \u0443\u00a0\u043d\u0430\u0441 \u043f\u0440\u043e\u0444\u0438\u043b\u0438, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u043a\u0440\u043e\u043c\u043a\u0438 \u0432\u0438\u043d\u0442\u0430. \u0422\u0443\u0442 \u044f \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u0441\u0442\u0430\u043b \u0432\u044b\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c\u00a0\u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0438\u0441\u0443\u044e \u0442\u043e\u0447\u043a\u0438 \u0432\u00a0\u0446\u0438\u043b\u0438\u043d\u0434\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0422\u0443\u0442 \u0442\u043e\u0436\u0435 \u0431\u0435\u0437\u00a0\u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0439.<\/p>\n<pre><code class=\"python\">def point_edge(angle_z = 0, r = 1, angle_xy = 90, height = 1, x0 = 0, z0 = 0):     alpha  = np.radians(angle_z)     beta = np.radians(angle_xy)     z = r     x = 0     z = z * np.cos(alpha) - x * np.sin(alpha)     x = z * np.sin(alpha) + x * np.cos(alpha)     z = z + z0     x = x + x0     #x = x * np.cos(beta) - z * np.sin(beta)     #z = x * np.sin(beta) + z * np.cos(beta)     y  = height     return x,y,z<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0441\u0451 \u0432 \u043a\u043e\u043c\u043f\u0430\u0441\u0435: \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438\u0434\u0435\u043c \u043f\u043e \u0442\u043e\u0447\u043a\u0430\u043c, \u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u0440\u0438\u0441\u0443\u0435\u043c:<\/p>\n<pre><code class=\"python\">def create_point_profl(xu_rot,xl_rot,yu_rot,yl_rot,zu_rot,zl_rot,kompas_document_3d):     kompas6_constants = gencache.EnsureModule(\"{75C9F5D0-B5B8-4526-8681-9903C567D2ED}\", 0, 1, 0).constants     kompas6_constants_3d = gencache.EnsureModule(\"{2CAF168C-7961-4B90-9DA2-701419BEEFE3}\", 0, 1, 0).constants     kompas_api7_module = gencache.EnsureModule(\"{69AC2981-37C0-4379-84FD-5DD2F3C0A520}\", 0, 1, 0)     application = kompas_api7_module.IApplication(Dispatch(\"Kompas.Application.7\")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))     MH.iApplication  = application      for i in range(len(xu_rot)):         iPart7 = kompas_document_3d.TopPart                   iModelContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IModelContainer.CLSID, pythoncom.IID_IDispatch)         iModelContainer = kompas_api7_module.IModelContainer(iModelContainer)         iPoints3D = iModelContainer.Points3D         iPoint3D = iPoints3D.Add()         iPoint3D.ParameterType = kompas6_constants_3d.ksPParamCoord         iPoint3D.Symbol = kompas6_constants.ksDotPoint         iPoint3D.X = xu_rot[i]         iPoint3D.Y = yu_rot[i]         iPoint3D.Z = zu_rot[i]         iPoint3D.Update()     for i in range(len(xl_rot)):         iPart7 = kompas_document_3d.TopPart                   iModelContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IModelContainer.CLSID, pythoncom.IID_IDispatch)         iModelContainer = kompas_api7_module.IModelContainer(iModelContainer)         iPoints3D = iModelContainer.Points3D         iPoint3D = iPoints3D.Add()         iPoint3D.ParameterType = kompas6_constants_3d.ksPParamCoord         iPoint3D.Symbol = kompas6_constants.ksDotPoint         iPoint3D.X = xl_rot[i]         iPoint3D.Y = yl_rot[i]         iPoint3D.Z = zl_rot[i]         iPoint3D.Update() def create_point_edge(x,y,z,kompas_document_3d):     kompas6_constants = gencache.EnsureModule(\"{75C9F5D0-B5B8-4526-8681-9903C567D2ED}\", 0, 1, 0).constants     kompas6_constants_3d = gencache.EnsureModule(\"{2CAF168C-7961-4B90-9DA2-701419BEEFE3}\", 0, 1, 0).constants     kompas_api7_module = gencache.EnsureModule(\"{69AC2981-37C0-4379-84FD-5DD2F3C0A520}\", 0, 1, 0)     application = kompas_api7_module.IApplication(Dispatch(\"Kompas.Application.7\")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))     MH.iApplication  = application      iPart7 = kompas_document_3d.TopPart     iModelContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IModelContainer.CLSID, pythoncom.IID_IDispatch)     iModelContainer = kompas_api7_module.IModelContainer(iModelContainer)     iPoints3D = iModelContainer.Points3D     iPoint3D = iPoints3D.Add()     iPoint3D.ParameterType = kompas6_constants_3d.ksPParamCoord     iPoint3D.Symbol = kompas6_constants.ksDotPoint     iPoint3D.X = x     iPoint3D.Y = y     iPoint3D.Z = z     iPoint3D.Update()<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u043a\u043e\u043c\u043f\u0430\u0441\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c0c\/b48\/a61\/c0cb48a610da252ac30b0c8ad678e03b.png\" width=\"939\" height=\"743\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c0c\/b48\/a61\/c0cb48a610da252ac30b0c8ad678e03b.png\"\/><\/figure>\n<p>\u041d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0438, \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043b\u0438 \u0441\u043f\u043b\u0430\u0439\u043d\u0430\u043c\u0438. \u041e\u0442\u043b\u0438\u0447\u043d\u043e (\u043d\u0435 \u043e\u0447\u0435\u043d\u044c, \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b, \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u0435\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0435\u0451 \u0432\u043d\u0435\u0448\u043d\u0435\u0439).<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ef6\/15f\/4b9\/ef615f4b97e9075160caee83da0fef81.png\" alt=\"\u0447\u0442\u043e-\u0442\u043e \u043f\u043e \u0442\u0438\u043f\u0443 \u0442\u0430\u043a\u043e\u0433\u043e, \u043a\u0442\u043e \u043c\u0443\u0434\u0440\u044b\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c\" title=\"\u0447\u0442\u043e-\u0442\u043e \u043f\u043e \u0442\u0438\u043f\u0443 \u0442\u0430\u043a\u043e\u0433\u043e, \u043a\u0442\u043e \u043c\u0443\u0434\u0440\u044b\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c\" width=\"326\" height=\"715\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ef6\/15f\/4b9\/ef615f4b97e9075160caee83da0fef81.png\"\/><\/p>\n<div><figcaption>\u0447\u0442\u043e-\u0442\u043e \u043f\u043e \u0442\u0438\u043f\u0443 \u0442\u0430\u043a\u043e\u0433\u043e, \u043a\u0442\u043e \u043c\u0443\u0434\u0440\u044b\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u0442\u0430\u043a, \u0442\u0435\u043f\u0435\u0440\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. \u041d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u043e \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"python\">def edit_profl(iPart,num,xu,xl,yu,yl,zu,zl):     global VariableCollection     VariableCollection = iPart.VariableCollection()     for i in range(len(xu)):         VariableCollection.GetByName(f\"px{num}1{i+1}\",True,True).value = xu[i]         VariableCollection.GetByName(f\"py{num}1{i+1}\",True,True).value = yu[i]         VariableCollection.GetByName(f\"pz{num}1{i+1}\",True,True).value = zu[i]     for i in range(len(xl)):         VariableCollection.GetByName(f\"px{num}2{i+1}\",True,True).value = xl[i]         VariableCollection.GetByName(f\"py{num}2{i+1}\",True,True).value = yl[i]         VariableCollection.GetByName(f\"pz{num}2{i+1}\",True,True).value = zl[i]         print(f\"pz{num}2{i+1}\") def edit_cross_points(iPart,num,x11,y11,z11,x12,y12,z12,x13,y13,z13,x21,y21,z21,x22,y22,z22,x23,y23,z23):     global VariableCollection     VariableCollection = iPart.VariableCollection()     VariableCollection.GetByName(f\"xx{num}1\",True,True).value = x11     VariableCollection.GetByName(f\"xy{num}1\",True,True).value = y11     VariableCollection.GetByName(f\"xz{num}1\",True,True).value = z11     VariableCollection.GetByName(f\"yx{num}1\",True,True).value = x12     VariableCollection.GetByName(f\"yy{num}1\",True,True).value = y12     VariableCollection.GetByName(f\"yz{num}1\",True,True).value = z12     VariableCollection.GetByName(f\"zx{num}1\",True,True).value = x13     VariableCollection.GetByName(f\"zy{num}1\",True,True).value = y13     VariableCollection.GetByName(f\"zz{num}1\",True,True).value = z13     VariableCollection.GetByName(f\"xx{num}2\",True,True).value = x21     VariableCollection.GetByName(f\"xy{num}2\",True,True).value = y21     VariableCollection.GetByName(f\"xz{num}2\",True,True).value = z21     VariableCollection.GetByName(f\"yx{num}2\",True,True).value = x22     VariableCollection.GetByName(f\"yy{num}2\",True,True).value = y22     VariableCollection.GetByName(f\"yz{num}2\",True,True).value = z22     VariableCollection.GetByName(f\"zx{num}2\",True,True).value = x23     VariableCollection.GetByName(f\"zy{num}2\",True,True).value = y23     VariableCollection.GetByName(f\"zz{num}2\",True,True).value = z23  def edit_edge_points(iPart,x1,y1,z1,x2,y2,z2,edge):     global VariableCollection     VariableCollection = iPart.VariableCollection()     VariableCollection.GetByName(f\"{edge}x1\",True,True).value = x1     VariableCollection.GetByName(f\"{edge}y1\",True,True).value = y1     VariableCollection.GetByName(f\"{edge}z1\",True,True).value = z1     VariableCollection.GetByName(f\"{edge}x2\",True,True).value = x2     print(f\"{edge}x2\")     VariableCollection.GetByName(f\"{edge}y2\",True,True).value = y2     VariableCollection.GetByName(f\"{edge}z2\",True,True).value = z2 <\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 main \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u043e\u043d\u043a\u0438 \u0432\u0438\u043d\u0442\u0430:<\/p>\n<pre><code class=\"python\">import api_kompas import api_fluid import pythoncom from win32com.client import Dispatch, gencache import KompasAPI7 import LDefin3D import MiscellaneousHelpers as MH import exsel import time import points iPart,iDocument = api_kompas.connect() #xu_rot,xl_rot,yu_rot,yl_rot,zu_rot,zl_rot,x11,y11,z11,x12,y12,z12,x13,y13,z13,x21,y21,z21,x22,y22,z22,x23,y23,z23 = points.naca4(\"4812\", angle_of_attack=-5,angle_z=-45,x0=-10,y0=0,z0=0,long=20) #api_kompas.edit_profl(iPart,1,xu_rot,xl_rot,yu_rot,yl_rot,zu_rot,zl_rot) #api_kompas.edit_cross_points(iPart,1,x11,y11,z11,x12,y12,z12,x13,y13,z13,x21,y21,z21,x22,y22,z22,x23,y23,z23) #x1,y1,z1 = points.point_edge(45,20,90,3.75,xu_rot[0],zu_rot[0]) #x2,y2,z2 = points.point_edge(45,30,90,5,xu_rot[0],zu_rot[0]) #api_kompas.edit_edge_points(iPart,x1,y1,z1,x2,y2,z2,\"kdf\") #x1,y1,z1 = points.point_edge(45,20,90,3.75,xu_rot[14],zu_rot[14]) #x2,y2,z2 = points.point_edge(45,30,90,5,xu_rot[14],zu_rot[14]) #api_kompas.edit_edge_points(iPart,x1,y1,z1,x2,y2,z2,\"kdb\") #xu_rot,xl_rot,yu_rot,yl_rot,zu_rot,zl_rot,x11,y11,z11,x12,y12,z12,x13,y13,z13,x21,y21,z21,x22,y22,z22,x23,y23,z23 = points.naca4(\"4812\", angle_of_attack=-5,angle_z=45,x0=-10,y0=30,z0=0,long=20) #api_kompas.edit_profl(iPart,2,xu_rot,xl_rot,yu_rot,yl_rot,zu_rot,zl_rot) #api_kompas.edit_cross_points(iPart,2,x11,y11,z11,x12,y12,z12,x13,y13,z13,x21,y21,z21,x22,y22,z22,x23,y23,z23) #x1,y1,z1 = points.point_edge(-45,20,90,26.25,xu_rot[0],zu_rot[0]) #x2,y2,z2 = points.point_edge(-45,30,90,25,xu_rot[0],zu_rot[0]) #api_kompas.edit_edge_points(iPart,x1,y1,z1,x2,y2,z2,\"kuf\") #x1,y1,z1 = points.point_edge(-45,20,90,26.25,xu_rot[14],zu_rot[14]) #x2,y2,z2 = points.point_edge(-45,30,90,25,xu_rot[14],zu_rot[14]) #print(x1,y1,z1,x2,y2,z2) #xu_rot,xl_rot,yu_rot,yl_rot,zu_rot,zl_rot,x11,y11,z11,x12,y12,z12,x13,y13,z13,x21,y21,z21,x22,y22,z22,x23,y23,z23 = points.naca4(\"4812\", angle_of_attack=-5,angle_z=0,x0=-10,y0=50,z0=15,long=20) #api_kompas.edit_profl(iPart,3,xu_rot,xl_rot,zu_rot,zl_rot,yu_rot,yl_rot) #api_kompas.edit_cross_points(iPart,3,x11,z11,y11,x12,z12,y12,x13,z13,y13,x21,z21,y21,x22,z22,y22,x23,z23,y23) #api_kompas.edit_edge_points(iPart,x1,y1,z1,x2,y2,z2,\"kub\") #api_kompas.rebuild(iPart,iDocument) for q in range(0,45,5):     for w in range(0,45,5):         for e in range(0,15,3):             for r in range(0,15,3):                 for t in range(0,45,5):                     for y in range(0,45,5):                         for u in range(15,30,3):                             for i in range(15,30,3):                                 xu_rot,xl_rot,yu_rot,yl_rot,zu_rot,zl_rot,x11,y11,z11,x12,y12,z12,x13,y13,z13,x21,y21,z21,x22,y22,z22,x23,y23,z23 = points.naca4(\"4812\", angle_of_attack=-q,angle_z=-w,x0=-10,y0=0,z0=0,long=20)                                 api_kompas.edit_profl(iPart,1,xu_rot,xl_rot,yu_rot,yl_rot,zu_rot,zl_rot)                                 api_kompas.edit_cross_points(iPart,1,x11,y11,z11,x12,y12,z12,x13,y13,z13,x21,y21,z21,x22,y22,z22,x23,y23,z23)                                 x1,y1,z1 = points.point_edge(w,20,90,e,xu_rot[0],zu_rot[0])                                 x2,y2,z2 = points.point_edge(w,30,90,r,xu_rot[0],zu_rot[0])                                 api_kompas.edit_edge_points(iPart,x1,y1,z1,x2,y2,z2,\"kdf\")                                 x1,y1,z1 = points.point_edge(w,20,90,e,xu_rot[14],zu_rot[14])                                 x2,y2,z2 = points.point_edge(w,30,90,r,xu_rot[14],zu_rot[14])                                 api_kompas.edit_edge_points(iPart,x1,y1,z1,x2,y2,z2,\"kdb\")                                 xu_rot,xl_rot,yu_rot,yl_rot,zu_rot,zl_rot,x11,y11,z11,x12,y12,z12,x13,y13,z13,x21,y21,z21,x22,y22,z22,x23,y23,z23 = points.naca4(\"4812\", angle_of_attack=-t,angle_z=y,x0=-10,y0=30,z0=0,long=20)                                 api_kompas.edit_profl(iPart,2,xu_rot,xl_rot,yu_rot,yl_rot,zu_rot,zl_rot)                                 api_kompas.edit_cross_points(iPart,2,x11,y11,z11,x12,y12,z12,x13,y13,z13,x21,y21,z21,x22,y22,z22,x23,y23,z23)                                 x1,y1,z1 = points.point_edge(-y,20,90,u,xu_rot[0],zu_rot[0])                                 x2,y2,z2 = points.point_edge(-y,30,90,i,xu_rot[0],zu_rot[0])                                 api_kompas.edit_edge_points(iPart,x1,y1,z1,x2,y2,z2,\"kuf\")                                 x1,y1,z1 = points.point_edge(-y,20,90,u,xu_rot[14],zu_rot[14])                                 x2,y2,z2 = points.point_edge(-y,30,90,i,xu_rot[14],zu_rot[14])                                 xu_rot,xl_rot,yu_rot,yl_rot,zu_rot,zl_rot,x11,y11,z11,x12,y12,z12,x13,y13,z13,x21,y21,z21,x22,y22,z22,x23,y23,z23 = points.naca4(\"4812\", angle_of_attack=-5,angle_z=0,x0=-10,y0=50,z0=15,long=20)                                 api_kompas.edit_profl(iPart,3,xu_rot,xl_rot,zu_rot,zl_rot,yu_rot,yl_rot)                                 api_kompas.edit_cross_points(iPart,3,x11,z11,y11,x12,z12,y12,x13,z13,y13,x21,z21,y21,x22,z22,y22,x23,z23,y23)                                 api_kompas.edit_edge_points(iPart,x1,y1,z1,x2,y2,z2,\"kub\")                                 api_kompas.rebuild(iPart,iDocument)<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0433\u043e main \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443 \u0432 exsel, \u043e\u0442\u0442\u0443\u0434\u0430 \u0434\u043e\u0441\u0442\u0430\u043b \u0441\u0430\u043c\u044b\u0439 \u043b\u0443\u0447\u0448\u0438\u0439 \u0432\u0438\u043d\u0442 \u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u0442\u044f\u0433\u0430\/\u043c\u043e\u043c\u0435\u043d\u0442 \u0438 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043b \u043d\u0430 \u0444\u043e\u0442\u043e\u043f\u043e\u043b\u0438\u043c\u0435\u0440\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/569\/3f9\/230\/5693f92301bf11683ca51e7a44a6aa5c.jpg\" alt=\"\u0441\u043a\u0440\u0438\u043d \u0438\u0437 \u043a\u043e\u043c\u043f\u0430\u0441\u0430\" title=\"\u0441\u043a\u0440\u0438\u043d \u0438\u0437 \u043a\u043e\u043c\u043f\u0430\u0441\u0430\" width=\"1280\" height=\"720\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/569\/3f9\/230\/5693f92301bf11683ca51e7a44a6aa5c.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0441\u043a\u0440\u0438\u043d \u0438\u0437 \u043a\u043e\u043c\u043f\u0430\u0441\u0430<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/69e\/349\/d99\/69e349d998db7528f14d90797867ad62.jpg\" alt=\"\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0447\u0430\u0442\u0438, \u043d\u043e \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0441\u0430\u043c\u044b\u0445 \u043f\u0435\u0440\u0432\u044b\u0445 - \u0444\u043e\u0440\u043c\u0430 \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\" title=\"\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0447\u0430\u0442\u0438, \u043d\u043e \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0441\u0430\u043c\u044b\u0445 \u043f\u0435\u0440\u0432\u044b\u0445 - \u0444\u043e\u0440\u043c\u0430 \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\" width=\"591\" height=\"1280\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/69e\/349\/d99\/69e349d998db7528f14d90797867ad62.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0447\u0430\u0442\u0438, \u043d\u043e \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0441\u0430\u043c\u044b\u0445 \u043f\u0435\u0440\u0432\u044b\u0445\u00a0\u2014 \u0444\u043e\u0440\u043c\u0430 \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0418 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0432 \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u0432\u0438\u043d\u0442, \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u044e, \u0447\u0442\u043e fluid \u043e\u0448\u0438\u0431\u0441\u044f \u043f\u043e \u0442\u044f\u0433\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0430 2 \u0433\u0440\u0430\u043c\u043c\u0430 \u0438 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u0438\u043d\u0442 \u0442\u044f\u043d\u0435\u0442 \u0432 2 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0445\u043b\u043e\u043f\u0430\u0441\u0442\u043d\u043e\u0433\u043e \u0432\u0438\u043d\u0442\u0430. \u041f\u043e \u0448\u0443\u043c\u043d\u043e\u0441\u0442\u0438 \u043e\u043d \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u0448\u0443\u043c\u0430 \u043d\u0438\u0436\u0435.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0447\u0443 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u0441\u0430, \u0441\u0440\u0430\u0437\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0442\u043e\u0447\u0435\u043a \u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432 stl, \u0430 \u0442\u0430\u043a \u0432 \u043f\u043b\u0430\u043d\u0430\u0445 \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0438\u0442\u043e\u043d \u0441 \u043d\u0443\u043b\u044f \u0441\u0442\u0440\u043e\u0438\u043b \u043c\u043e\u0434\u0435\u043b\u044c, \u043d\u043e \u0438\u0434\u0435\u0439 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0432\u043e\u0434\u0443 \u043f\u043e\u043a\u0430 \u043d\u0435\u0442.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/839136\/\"> https:\/\/habr.com\/ru\/articles\/839136\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u041d\u0430\u0447\u0430\u043b\u043e<\/h2>\n<p>\u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u043d\u0435 \u043f\u043e\u0434\u043a\u0438\u043d\u0443\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0442\u043e\u0440\u043e\u0438\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u0438\u043d\u0442\u043e\u0432.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0424\u043e\u0442\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u043d\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0432 solidworks \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u044b\u043b \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0434\u0432\u0443\u0445\u043b\u043e\u043f\u0430\u0441\u0442\u043d\u043e\u0439 \u0432\u0438\u043d\u0442 \u0441 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c\u0438 \u0443\u0433\u043b\u0430\u043c\u0438 \u0430\u0442\u0430\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043e\u0442 \u043e\u043d<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u0447\u0430\u043b\u0441\u044f \u043f\u043e\u0434\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u0443\u044e \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u0433\u0434\u0435-\u0442\u043e \u0432\u044b\u0447\u0438\u0442\u0430\u043b\u0438 \u0442\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0443\u0432\u043a\u0438 \u0432\u0438\u043d\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0451, \u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0434\u0435\u043b\u044e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0443\u043c\u0435\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u0442\u044f\u0433\u0430, \u043c\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u043c\u044b \u044d\u0442\u043e \u043f\u043e\u043d\u044f\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u0438 \u0438\u0434\u0443\u0442 \u0432\u043e \u0432\u0441\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0438 \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u044e, \u043a\u0430\u043a \u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0438 \u0434\u0430 \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 Averaging\u00a0\u2014 \u044d\u0442\u043e \u0433\u0434\u0435 \u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u00a0\u0441\u0435\u0442\u043a\u0435, \u0432\u00a0\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0441\u0451 \u0442\u0430\u043a\u0438\u0435\u00a0\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043a\u0430\u043a\u00a0\u0438 \u0432\u043e\u00a0\u0432\u0441\u0435\u0445 \u0433\u0430\u0439\u0434\u0430\u0445. \u0422\u0430\u043a\u0436\u0435\u00a0\u0431\u044b\u043b\u043e \u043d\u0435\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u043e\u0447\u0435\u043c\u0443 5\u00a0\u0434\u044e\u0439\u043c\u043e\u0432\u044b\u0439 \u0432\u0438\u043d\u0442 \u043d\u0430 25\u00a0000\u00a0\u043e\u0431\/\u043c\u0438\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0442\u044f\u0433\u0443 \u0432 0,001\u041d.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043d\u0430\u0443\u0447\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430\u0445 \u0432\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b Sliding\u00a0\u2014 \u0432\u00a0\u043d\u0435\u043c \u0441\u0435\u0442\u043a\u0430 \u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u043c\u043e\u0434\u0435\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0446\u0438\u043b\u0438\u043d\u0434\u0440 \u0441\u0435\u0442\u043a\u0438 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0441\u0435\u0442\u043a\u0435. \u0418, \u043e\u00a0\u0447\u0443\u0434\u043e,\u00a0\u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u043f\u0440\u0430\u0432\u0434\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.<\/p>\n<p>\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u043f\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u043a\u0438, \u0432\u0435\u0434\u044c \u043e\u0442 \u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u044f \u00ab\u041f\u0440\u043e\u0434\u0443\u0432\u043a\u0438 \u00bb \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u00a0\u043f\u0430\u0440\u044b \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e\u00a0\u043d\u0435\u0434\u0435\u043b\u0438 \u043d\u0435\u00a0\u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0441\u043b\u0430\u0431\u043e\u043c \u041f\u041a \u0441\u00a0intel 9 10\u00a0940\u00a0\u0438 quadro a5000, \u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b \u043e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d \u0432\u0438\u043d\u0442 \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u043c shining 3d ue pro. \u0422\u0430\u043a, \u043a \u0441\u043b\u043e\u0432\u0443, \u0443 \u043d\u0435\u0433\u043e \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f 0,01\u00a0\u043c\u043c \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d \u0440\u0435\u0432\u0435\u0440\u0441 \u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433 \u0434\u043b\u044f\u00a0\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438. \u0412\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u043a\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0434\u0443\u0432\u043a\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0433\u0440\u0430\u0444\u0438\u043a \u0442\u044f\u0433\u0438 \u043e\u0442\u00a0\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0438 \u00ab\u043f\u0440\u043e\u0434\u0443\u0432\u043a\u0443\u00bb, \u043a\u043e\u0433\u0434\u0430 \u0442\u044f\u0433\u0430 \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u0430 \u043d\u0430 \u00ab\u043f\u043e\u043b\u043a\u0443\u00bb.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u043e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u0438\u043d\u0442 \u0441 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\">\n<div><figcaption>\u044e\u0413\u0440\u0430\u0444\u0438\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u044f\u0433\u0438 \u043e\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u0435\u0442\u043a\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u044f\u0433\u0430 \u0432\u0438\u043d\u0442\u0430 \u043d\u0430\u00a0\u0438\u0441\u043f\u044b\u0442\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0435\u043d\u0434\u0435\u00a0\u0431\u044b\u043b\u0430 6,75\u041d \u0438 \u0442\u0443\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043a\u00a0solidworks, \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u00a0\u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u00a0\u043e\u0442\u0435\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0444\u0442\u0435, \u0438\u0437\u2011\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u043b\u0438 \u043d\u0430\u00a0\u043a\u043e\u043c\u043f\u0430\u0441, \u043d\u043e\u00a0\u0432\u00a0\u043d\u0435\u043c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c cfd \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043d\u0435\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u00ab\u043f\u0440\u043e\u0434\u0443\u0432\u0430\u0442\u044c\u00bb \u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438.\u00a0\u0411\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c open source \u043f\u0440\u043e\u0435\u043a\u0442 fluid x3d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u00a0\u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442\u00a0solidworks \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0440\u0430\u0441\u0447\u0435\u0442 \u043d\u0430\u00a0\u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0447\u0442\u043e\u00a0\u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0441\u00a0\u043d\u0435\u0434\u0435\u043b\u0438 \u0434\u043e\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0438\u043d\u0443\u0442! \u0418\u0442\u0430\u043a, \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 fluid\u00a0\u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0434\u0443\u0432\u043a\u0438 \u0432\u0438\u043d\u0442\u0430 \u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0434\u0443\u0432\u043a\u0438 \u0432\u00a0txt \u0444\u0430\u0439\u043b.<\/p>\n<pre><code class=\"cpp\">void main_setup() {  \/\/ ################################################################## define simulation box size, viscosity and volume force ################################################################### const uint memory = 3500u; \/\/ available VRAM of GPU(s) in MB const float lbm_u = 0.12f; const float box_scale = 6.0f; const float si_u = 0.17f; const float si_nu = 0.17f, si_rho = 1.0f; const float si_width = 0.3f, si_height = 0.3f, si_length = 0.3f; const float si_A = si_width * si_height + 2.0f * 0.05f * 0.03f; const float si_T = 0.25f; const float si_Lx = units.x(box_scale * si_width); const float si_Ly = units.x(box_scale * si_length); const float si_Lz = units.x(0.5f * (box_scale - 1.0f) * si_width + si_height); const uint3 lbm_N = resolution(float3(3.0f, 3.0f, 1.0f), memory); \/\/ input: simulation box aspect ratio and VRAM occupation in MB, output: grid resolution units.set_m_kg_s((float)lbm_N.y, lbm_u, 1.0f, box_scale * si_length, si_u, si_rho); print_info(\"Re = \" + to_string(to_uint(units.si_Re(si_width, si_u, si_nu)))); const float lbm_nu = units.nu(si_nu); const float si_omega = 1000u; const float lbm_omega = units.omega(si_omega); const float lbm_length = units.x(si_length); LBM lbm(lbm_N, lbm_nu); const uint lbm_T = 5000u; const uint lbm_dt = 10u; const float summa_cd = 0; float cd[10]; float avergate_cd[10]; int a = 0; float avergate = 0; int i;  const float radius = 0.25f * (float)lbm_N.x; const float3 center = float3(lbm.center().x, lbm.center().y, 0.36f * radius); \/\/ ###################################################################################### define geometry ###################################################################################### Mesh* mesh = read_stl(get_exe_path() + \"..\/stl\/33.stl\", lbm.size(), lbm.center(), float3x3(float3(0, 0, 1), radians(90.0f)), lbm_length); mesh-&gt;translate(float3(0.0f, units.x(0.5f * (0.5f * box_scale * si_length - si_width)) - mesh-&gt;pmin.y, 1.0f - mesh-&gt;pmin.z)); lbm.voxelize_mesh_on_device(mesh, TYPE_S | TYPE_X); \/\/ https:\/\/github.com\/nathanrooy\/ahmed-bluff-body-cfd\/blob\/master\/geometry\/ahmed_25deg_m.stl converted to binary const uint Nx = lbm.get_Nx(), Ny = lbm.get_Ny(), Nz = lbm.get_Nz(); parallel_for(lbm.get_N(), [&amp;](ulong n) { uint x = 0u, y = 0u, z = 0u; lbm.coordinates(n, x, y, z); \/\/if(z==0u) lbm.flags[n] = TYPE_S; \/\/if(lbm.flags[n]!=TYPE_S) lbm.u.y[n] = lbm_u; \/\/if(x==0u||x==Nx-1u||y==0u||y==Ny-1u||z==Nz-1u) lbm.flags[n] = TYPE_E; }); \/\/ ####################################################################### run simulation, export images and data ########################################################################## \/\/lbm.graphics.visualization_modes = VIS_FLAG_SURFACE | VIS_Q_CRITERION; \/\/lbm.graphics.set_camera_centered(20.0f, 30.0f, 0.0f, 1.648722f); lbm.run(0u); \/\/ initialize simulation  #if defined(FP16S) const string path = get_exe_path() + \"FP16S\/\" + to_string(memory) + \"MB\/\"; #elif defined(FP16C) const string path = get_exe_path() + \"FP16C\/\" + to_string(memory) + \"MB\/\"; #else \/\/ FP32 const string path = get_exe_path() + \"FP32\/\" + to_string(memory) + \"MB\/\"; #endif \/\/ FP32 \/\/lbm.write_status(path); \/\/write_file(path+\"Cd.dat\", \"# t\\tCd\\n\"); \/\/std::ofstream app;          \/\/ \u043f\u043e\u0442\u043e\u043a \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \/\/app.open(\"force.txt\");      \/\/ \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 while (true) { \/\/ main simulation loop while (true) { \/\/ main simulation loop \/\/if (lbm.graphics.next_frame(units.t(si_T), 5.0f)) { Clock clock; lbm.run(lbm_dt); lbm.calculate_force_on_boundaries(); lbm.F.read_from_device(); lbm.voxelize_mesh_on_device(mesh, TYPE_S, center, float3(0.0f), float3(0.0f, 0.0f, lbm_omega)); const float3 lbm_force = lbm.calculate_force_on_object(TYPE_S | TYPE_X); const float Cd = units.si_F(lbm_force.y); \/\/ expect Cd to be too large by a factor 1.3-2.0x; need wall model const float moment = units.si_F(lbm_force.x);  cd[a] = Cd; a = a +1; if (a == 10) { int a = 0; } for (i = 0; i &lt; 10; i++) { avergate = (avergate + cd[i]) \/ 10; } avergate_cd[a] = avergate; println(\"\\r\" + to_string(Cd, 3u) + \" \" + to_string(moment, 3u) + \"                                                                               \"); \/\/write_line(path+\"Cd.dat\", to_string(lbm.get_t())+\"\\t\"+to_string(Cd, 3u)+\"\\n\"); mesh-&gt;rotate(float3x3(float3(0, 0, 1), lbm_omega * (float)lbm_dt));\/\/ rotate mesh lbm.update_fields(); lbm.run(lbm_dt); std::ofstream ate; ate.open(\"force.txt\", std::ios_base::app); ate &lt;&lt; (to_string(Cd,3u) + \" \" + to_string(moment,3u)) &lt;&lt; std::endl; ate.close();  \/\/if (a &gt; 3) { \/\/if (avergate_cd[a] - avergate_cd[a - 3] &lt; 0.1 &amp;&amp; avergate_cd[a] - avergate_cd[a - 3] &gt; -0.1) { \/\/break; \/\/} \/\/}    #if defined(GRAPHICS) &amp;&amp; !defined(INTERACTIVE_GRAPHICS) \/\/lbm.graphics.write_frame(path+\"images\/\"); #endif \/\/ GRAPHICS &amp;&amp; !INTERACTIVE_GRAPHICS } lbm.run(1u); \/\/app.close(); } \/\/lbm.write_status(path); } \/**\/ \/\/}<\/code><\/pre>\n<p>https:\/\/github.com\/ProjectPhysX\/FluidX3D &#8212;  \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 fluid \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u043e\u0432\u044b\u0440\u044f\u0439\u0442\u0435\u0441\u044c \u0441\u043e\u0432\u0435\u0442\u0443\u044e<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0434\u0443\u0432\u043a\u0438 \u0432 python \u0438\u0431\u043e \u043d\u0435 \u043d\u0430 \u0447\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u043c \u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0443\u043c\u0435\u044e<\/p>\n<pre><code class=\"python\">import os import subprocess    def run():     command = [\"\u043f\u0443\u0442\u044c \u043a fluid.exe\",\"\/c\",\"runas\",'\/user:administrator',\"regedit\"]     p = subprocess.Popen(command, stdin = subprocess.PIPE)     #p.stdin.write(\"1961\")     p.communicate()           def get_result():     data = open(\"\u043f\u0443\u0442\u044c \u043a force.txt\",\"r\")     a = data.read()     a = a[:-1]     l = a.split(\"\\n\")     force = 0     moment = 0     #print(l)     for i in range(len(l)):         l[i] = l[i].split(\" \")         force += abs(float(l[i][0]))         moment += abs(float(l[i][1]))     force = round(force\/len(l),2)     moment = round(moment\/len(l),2)     a = [force,moment]     return a    def remove_dat():     os.remove(\"\u043f\u0443\u0442\u044c \u043a force.txt\")<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a \u043a\u043e\u043c\u043f\u0430\u0441\u0443. \u0422\u0430\u043c \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0449\u0435.<\/p>\n<p>\u0420\u0438\u0441\u0443\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0434\u0432\u0443\u0445\u043b\u043e\u043f\u0430\u0441\u0442\u043d\u043e\u0439 \u0432\u0438\u043d\u0442 \u043f\u043e \u0441\u0435\u0447\u0435\u043d\u0438\u044f\u043c, \u043f\u0440\u0438\u0447\u0435\u043c \u0432 \u044d\u0441\u043a\u0438\u0437\u0430\u0445 \u0434\u0435\u043b\u0430\u0435\u043c \u0443\u0433\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043d\u043e\u0441\u0438\u043c \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0440\u0430 \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f api \u043a\u043e\u043c\u043f\u0430\u0441\u0430 <\/p>\n<pre><code class=\"python\"># -*- coding: utf-8 -*- #|1  import pythoncom from win32com.client import Dispatch, gencache import KompasAPI7 import LDefin3D import MiscellaneousHelpers as MH import os def connect():      global iPart,iDocument3D,kompas_document #  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b API \u041a\u043e\u043c\u043f\u0430\u0441     kompas6_constants = gencache.EnsureModule(\"{75C9F5D0-B5B8-4526-8681-9903C567D2ED}\", 0, 1, 0).constants     kompas6_constants_3d = gencache.EnsureModule(\"{2CAF168C-7961-4B90-9DA2-701419BEEFE3}\", 0, 1, 0).constants  #  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 API5     kompas6_api5_module = gencache.EnsureModule(\"{0422828C-F174-495E-AC5D-D31014DBBE87}\", 0, 1, 0)     kompas_object = kompas6_api5_module.KompasObject(Dispatch(\"Kompas.Application.5\")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))     MH.iKompasObject  = kompas_object  #  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 API7     kompas_api7_module = gencache.EnsureModule(\"{69AC2981-37C0-4379-84FD-5DD2F3C0A520}\", 0, 1, 0)     application = kompas_api7_module.IApplication(Dispatch(\"Kompas.Application.7\")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))     MH.iApplication  = application       Documents = application.Documents #  \u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442     kompas_document = application.ActiveDocument #kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)     iDocument3D = kompas_object.ActiveDocument3D()     iPart =<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-430548","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/430548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=430548"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/430548\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=430548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=430548"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=430548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}