часть из работы
104 ИКАМ - Иллюстрированный каталог авиации мира. Самолеты ОКБ им. А.С.Яковлева. Як-130.
http ://www.brazd.ru/catalog/craft/russia/yako vlev/yak 13 0
105 Airbus.
Aircraft Families - Introduction A380 Family.
http ://www. airbus. com/pro duct/a3 80_backgrounder. asp
106 Flying Wing Under Study / Aviation Week, Aug. 7, 1995 pp.33 by Pierre Sparaco / Paris.
http://aero.stanford.edu/bwbfiles/AerospatialeBWB.html
107 Kroo Han Blended Wing Body New Concept in Passenger Aircraft.
http ://members .cox. net/rebid/bldwing. htm#more
108 Kroo Ilan Blended Wing Body. http://aero.stanford.edu/BWBProject.html109 Kroo Ilan C-Wing: Continuing Work. http://aero.stanford.edu/reports/nonplanarwings/moreCwing.html110 Kroo Ilan The Effect of Aircraft Size on Performance (Preliminary Draft).
http://aero.stanford.edu/bwbfiles/largeACopt.html
111 The Blended Wing Body
A Revolutionary Concept in Aircraft Design FS-2001-04-24-LaRC. http://oea.larc.nasa.gov/PAIS/BWB.html
112 The Operational and Economic Effects of New Large Airplanes on
United States Airports: Part I.
http://www.faa.gov/arp/engineering/reports/LargeAircraft/partl.htm
Приложение А Программы для расчета силового фактора G
в среде MSC NASTRAN
Приложение А.1 Настройка файла меню пользователя
Для работы с программами по расчету силового фактора G по методикам I и II было создано меню пользователя в среде MSC NASTRAN. Далее приведен листинг этого файла-меню.
POPUP "&Скрипты" BEGIN
MENUITEM "&Делитель элементов",MF:\Nastran_data\Scripts\splitter.bas" MENUITEM "Делитель &треуг. элементов", "F:\Nastran_data\Scripts\splitter_tri.bas" MENUITEM SEPARATOR
MENUITEM "&Расчет G Методика 1", "F:\Nastran_data\ Scripts\g_factorl .bas"
MENUITEM "&Расчет G Методика 2", "F:\Nastran_data\ Scripts\g_factor2.bas" END
На рисунке A.I представлено меню пользователя в момент запуска скрипта.
-oup View Help 1 Скрипты
--: 1 1 ф j g: Делитель элементов
-Ц ' 1 1 - Делитель TDevr. элементов
1 1 РЯГЧРТ и ( тпат^гнд 1
х|
У
Расчет G Стратегия 2
СИ Рисунок АЛ - Запуск программы расчета силового фактора G из меню пользователя
Приложение А.2 Листинг программы разделения мембранных элементов на мембранные и стержневые элементы (имитации подкрепленной панели) SPLITTER
Работа с этой программой имеет ряд особенностей.
Во-первых, мембранные элементы, которые будут разделены должны иметь определенную ориентацию или определенный порядок узлов. Стержневые элементы создаются по парам узлов мембранного элемента 1-2 и 3-4. Если при разбивке мембраны стержневые элементы получены с неверной ориентацией, то необходимо отменить разбивку, изменить порядок ориентации мембранного элемента и выполнить разбивку еще раз.
Во-вторых, выбранные мембраные элементы должны иметь последовательную цепочку номеров. Если в нумерации этих элементов существует разрыв, то разбивка будет выполнена только для начальной части цепочки до разрыва в нумерации.
Несложная модификация программы может выполнять разбивку трехузловых мембранных элементов, сдвиговых и изгибных элементов.
Sub Main
' Программа делитель четырехузловых элементов
' Автор: Гуменюк А.В., аспирант каф. КиПЛА СГАУ, 2002 г. (c)
' Обозначение переменных
Dim grp lst As Long
Dim ttl_group As String
Dim elem_m As Long
Dim el_grp_lst As Long
Dim el_grp_lst_rod As Long
Dim ent_el As esp_Element
Dim ent_nodel As esp_Node
Dim ent_node2 As esp_Node
Dim ent node3 As espNode
Dim ent_node4 As esp_Node
Dim propofel As esp_Property
Dim prop rod As espProperty
щ Dim flag2 As esp Flags
Dim rod_el As esp_Element
Dim elcounter As Long
Dim S_el As Double
Dim propcount As Long
Dim namerprop As String
Dim Dh As Integer
Dim go As Long
* Dim ocs As Long
Dim setID As Long
el_counter = 0
'Диалог выбора номера свойства элементов для разбиения Title$ = "Свойства для разбиения"
Prompt$ = "Введите номер свойства элементов для разбиения" Defaults = "1" Х% = 250 Y% = 300
Nf$ = InputBox (Prompts, Title$, Defaults, X%, Y%) Print "Номер свойства элементов для разбиения: "& NTS Dh = Clnt(NfS)
'Диалог выбора коэффициента Fi Reentrfi:
Title$ = "Коэффициент отношения объемов"
Prompt$ = "Введите коэффициент Fi - соотношения объемов"
Default = 0.5
Х% = 250
Y% = 300
Fi = InputBox (Prompts, TitleS, Default, X%, Y%) If Fi> 0.95 or Fi
Msg = "Неверный ввод Fi. Этот коэффициент может быть в диапазоне от 0,05 до 0,95. Рабочий диапазон Fi от 0,4 до 0,6"
Print Msg
MsgBox Msg
GoTo Reentrfi End If
Print "Коэффициент отношения объемов Fi = "& Fi Koef=(l-Fi)/Fi
' В обход предыдущей главы скрипт сам создает необходимые группы для мембранных
' и стержневых элементов
d = espDBNextEntity (Existing, Group, Before, 9999)
Print "Число групп в модели: ", d
' Печатаем число существующих в модели групп
' Создания векторов вывода
' Инициализация набора данных и векторов
lastoc = esp DBNextEntity (Existing, Out_Case, Before, 9999)
'Диалог выбора номера для нового набора результатов
TitleS = "Новый набор результатов"
Prompts = "Введите номер для нового набора результатов" prepnumber = lastoc +1
Defaults = prepnumber X% = 250 Y% = 300
N$ = InputBox (Prompts, TitleS, Defaults, X%, Y%)
setID = CLng(NS)
Title = "Разбивка на элементы"
from_program = FEMAP
anal_type = STAT
setValue = 0.0
' Создание пустого набора результатов 1
ocs = esp_OutpCreateSet (setID, from_program, anal_type, setValue, Title ) If ocs = True Then
Msg = "Создан набор результатов " + Str(setlD) Print Msg Else
Msg = "He могу создать набор результатов " + Str(setlD) Print Msg GoTo Failed End If
' Создаем вектор результатов Узел 1
ocs = esp_OutpCreateVector (setID, 20031, Other, Elem, "Узел 1" ) If ocs = True Then
Msg = "Создан вектор Узел 1 20031 " Print Msg Else
Msg = "He могу создать вектор Узел 1 20031 " Print Msg
GoTo Failed End If
' Создаем вектор результатов Узел 2
ocs = esp_OutpCreateVector (setID, 20032, Other, Elem, "Узел 2") If ocs = True Then
Msg = "Создан вектор Узел 2 20032 " Print Msg Else
Msg = "He могу создать вектор Узел 2 20032 " Print Msg GoTo Failed End If
' Создаем вектор результатов Узел 3
ocs = esp_OutpCreateVector (setID, 20033, Other, Elem, "Узел 3" ) If ocs = True Then
Msg = "Создан вектор Узел 3 20033 " Print Msg Else
Msg = "He могу создать вектор Узел 3 20033 " Print Msg GoTo Failed End If
' Создаем вектор результатов Узел 4
ocs = esp_OutpCreateVector (setID, 20034, Other, Elem, "Узел 4" ) If ocs = True Then
Msg = "Создан вектор Узел 4 20034 "
Print Msg Else
Msg = "He могу создать вектор Узел 4 20034 " Print Msg GoTo Failed End If
' Создаем вектор результатов Толщина
ocs = espOutpCreate Vector (setID, 20015, Other, Elem, "Толщина мембраны") If ocs = True Then
Msg = "Создан вектор Толщина 20015 " Print Msg Else
Msg = "He могу создать вектор Толщина 20015 " Print Msg GoTo Failed End If
' Создаем вектор результатов Площадь
ocs = espOutpCreate Vector (setID, 20010, Other, Elem, "Площадь мембраны") If ocs = True Then
Msg = "Создан вектор площади мембран 20010 " Print Msg Else
Msg = "He могу создать вектор площади мембран 20010 "
Print Msg GoTo Failed End If
' Создаем вектор результатов Длина стержня А
ocs = esp_OutpCreateVector (setID, 20035, Other, Elem, "Длина стержня А") If ocs = True Then
Msg = "Создан вектор Длина стержня А 20035 " Print Msg Else
Msg = "He могу создать вектор Длина стержня А 20035 " Print Msg GoTo Failed End If
' Создаем вектор результатов Длина стержня С
ocs = espOutpCreateVector (setID, 20036, Other, Elem, "Длина стержня С" ) If ocs = True Then
Msg = "Создан вектор Длина стержня С 20036 " Print Msg Else
Msg = "He могу создать вектор Длина стержня С 20036 " Print Msg GoTo Failed End If
' Создаем вектор результатов Площадь стержня
ocs = esp OutpCreateVector (setID, 20037, Other, Elem, "Площадь стержня") If ocs = True Then
Msg = "Создан вектор Площадь стержня 20037 " Print Msg Else
Msg = "He могу создать вектор Площадь стержня 20037 " Print Msg GoTo Failed End If
' Создаем вектор результатов Объем мембраны
ocs = esp_OutpCreateVector (setID, 20038, Other, Elem, "Объем мембраны") If ocs = True Then
Msg = "Создан вектор Объем мембраны 20038 " Print Msg Else
Msg = "He могу создать вектор Объем мембраны 20038 " Print Msg GoTo Failed End If
' Создаем вектор результатов Объем стержней
ocs = esp_OutpCreateVector (setID, 20039, Other, Elem, "Объем стержней" ) If ocs = True Then
Msg = "Создан вектор Объем стержней 20039 " Print Msg Else
Msg = "He могу создать вектор Объем стержней 20039 " Print Msg GoTo Failed End If
' Создаем вектор результатов Объем панели
ocs = espOutpCreate Vector (setID, 20040, Other, Elem, "Объем панели")
If ocs = True Then
Msg = "Создан вектор Объем панели 20040 " Print Msg Else
Msg = "He могу создать вектор Объем панели 20040 " Print Msg GoTo Failed End If
' d - номер группы для разбиения elem_m = 5
'Print "elem m = ", elem_m
esp ListClear (elem m)
go = esp_ListSelect (elem_m, Elem)
gr_cnt_r = d + 1
newgrp = esp GrpNewGroup (gr_cnt_r, "С_Стержни")' Группа для стержней
grpact = esp_GrpActivateGroup (gr_cnt_r)
Print "Группа ОСтержни создана под номером ", gr_cnt_r
gr_cnt_m = d + 2
newgrp = esp_GrpNewGroup (gr_cnt_m, "С_Мембраны")' Группа для мембран
grpact = esp GrpActivateGroup (gr_cnt_m)
Print "Группа 0_Мембраны создана под номером ", gr_cnt_m
elgrplstrod = 7
'Print "el grp lst rod = ", el_grp_lst_rod esp_ListClear (el_grp_lst_rod) el_grp_lst_m = 8
'Print "el_grp_lst_m = ", el grpjst m esp_ListClear (el_grp_lst_m)
RPT:
If go = -l Then
Print "Отмена разбивки элементов!"
GoTo FLU End If
'Шапка таблицы
'Print "№ эл, jl, j2, j3, j4, Толщина, Площадь, Дл. ст. А, Дл. ст. С, Площ. Ст., Объем Мем., Объем Стержн." elcounter = О NEL:
el_counter = esp_ListGetNextItem (elem m, el_counter) If el counter = 2147483647 Then el_counter = 1 End If
f = esp_DBGetElement (el_counter, ent_el) 'Print "el_counter = ", el counter
' Получение номера свойства элемента entel
' propofel - свойство элемента, оно необх для получения толщины ent el el_prop_ID = ent_el.Prop_ID eljyp = ent_el.type
If (el_prop_ID Dh) or ( el typ 13) Then
GoTo TPS End If
laa = esp ListAdd (el_grp_lst_m, el_counter) dd = esp PropGet (el_prop_ID, flags 1, propofel)
thickness = propofel. Vail
' получение номеров узлов ent el
eljl = entel.Nodel
t= esp_DBGetNode (eljl, ent_nodel)
elJ2 = entel.Node_2
t= esp_DBGetNode (elJ2, ent_node2)
elJ3 = ent_el.Node_3
t= espDBGetNode (elJ3, ent_node3)
elJ4 = ent_el.Node_4
t= esp DBGetNode (elJ4, ent_node4)
' Расчет длины стороны А элемента ent el
dx_a = ent_nodel .x - ent_node2.x
dy_a = ent_nodel.y - ent_node2.y
dz_a = ent_nodel .z - ent_node2.z
length_a = Sqr (dx_a*dx_a + dy_a*dy_a + dz_a*dz_a)
' Расчет длины стороны С элемента ent el
dx_c = ent_node3.x - ent_node4.x
dy_c = ent node3.y - ent_node4.y
dz_c = ent_node3.z - ent_node4.z
length_c = Sqr (dx_c*dx_c + dy_c*dy_c + dz_c*dz_c)
' Объем мембраны - V_m
' Объем размазанных стержней - V_r
' коэф Koef = V_r / V_m - учитывает отношение этих объемов ' или
' V_r = КоеР*V_m
' Площадь поперечных сечений новорожденных стержней
' F_a,c = V_r / (length_a+length_c) ' Sel = espElemGetArea (el counter)
Sel = m_area (el_counter)
V_m = S_el*thickness
V_r = KoefVm
V_p = V_r + V_m
F_r = V_r / (length_a+length_c)
' Создание свойства стержневых элементов proprod.vall = F_r
prop count = esp DBNextEntity (Existing, Prop, Before, 9999) propcount = prop_count + 1
name_rprop = "Pr_Rod_at_Membr"& Str(el_counter)
к = esp PropCreate ( prop_count, name rprop, L ROD, 1,8, 1, flag2, prop_rod )
' создание стержня Rod a rodel.type = LROD rodel.PropID = prop_count rod_el.Topology = rod_el.Node_l = ent_el.Node_l rod_el.Node_2 = ent_el.Node_2 j = esp_ElemCreate (-1, rod_el) hla = espJListAdd (el_gф_lst_rod, j)
1 создание стержня Rod_c rodel.type = LROD rod_el.Prop_ID = prop_count rod_el.Topology = 0
rod_el.Node_l = ent_el.Node_3 rod_el.Node_2 = ent_el.Node_4 j = esp_ElemCreate (-1, rod_el) hla = espListAdd (el_grp_lst_rod, j)
' Печать результатов
Print "Номер элемента:" , el_counter
'Print "Код типа элемента:", ent el.type
'Print "Свойство элемента:", entel.PropID
'Print "Его узлы:"
'Print "j 1:", ent_el.Node_l
'Print "j2:", ent_el.Node_2
'Print "j3:", ent_el.Node_3
'Print "j4:", ent_el.Node_4
'Print "Площадь мембранного элемента S:", S el
'Print "Длина стороны A:" , length_a
'Print "Длина стороны С:", length_c
'Print "Площадь поперечного сечения стержней: ", F_r
'Print Format(el_counter, "###0"), Format(ent_el.Node_l, "###0"),
Format(ent_el.Node_2, "###0"), Format(ent_el.Node_3, "###0"),
Format(ent_el.Node_4, "###0"), Format(thickness, "0.00E+00")
'Print Format(S_el, "0.O0E+0O"), Format(length_a, "0.00E+00"), Format(length_c,
"0.00E+00"), Format(F_r, "0.00E+00"), Format(V_m, "0.00E+00"), Format(V_r,
"0.00E+00")
' Заполнение векторов
opd = esp_OutpPutData (setID, 20010, el_counter, S_el) opd = esp_OutpPutData (setID, 20015, el_counter, thickness) opd = espOutpPutData (setID, 20031, el counter, ent_el.Node_l)
opd = esp OutpPutData (setID, 20032, el counter, ent_el.Node_2) opd = esp OutpPutData (setID, 20033, el_counter, ent_el.Node_3) opd = esp_OutpPutData (setID, 20034, el counter, ent_el.Node_4) opd = esp OutpPutData (setID, 20035, el counter, lengtha) opd = esp OutpPutData (setID, 20036, el_counter, length_c) opd = esp_OutpPutData (setID, 20037, el counter, F_r) opd = esp OutpPutData (setID, 20038, el counter, V_m) opd = esp OutpPutData (setID, 20039, encounter, V_r) opd = esp_OutpPutData (setID, 20040, el_counter, V_p)
ret
val
= espOutpVectorFinish
(setID, 20010)
ret
val
= esp_OutpVectorFinish
(setID, 20015)
ret
val
= espOutpVectorFinish
(setID, 20031)
ret_
val
= esp_OutpVectorFinish
(setID, 20032)
ret
val
= espOutpVectorFinish
(setID, 20033)
ret_
val
= espOutpVectorFinish
(setID, 20034)
ret_
val
= espOutpVectorFinish
(setID, 20035)
ret_
val
= espOutpVectorFinish
(setID, 20036)
ret_
val
= espOutpVectorFinish
(setID, 20037)
ret_
val
= esp_OutpVectorFinish
(setID, 20038)
ret_
val
= esp_OutpVectorFinish
(setID, 20039)
ret_
val
= espOutpVectorFinish
(setID, 20040)
TPS:
nxt_countel = el_counter + 1
elexist = esp_ListItemExist (elem_m, nxt_countel)
Ifelexist = TRUE Then GoTo NEL
End If
'Добавляем стержневые элементы в группу с номером gr_cnt_r
grpact = esp_GrpActivateGroup (gr cnt r)
'ge = esp GrpEvaluate (gr_cnt_r, TRUE)
gf = esp_GrpEntID (Elem, elj^_lst_rod, gr_cnt_r)
'Добавляем стержневые элементы в группу с номером gr cnt r
grpact = espGrpActivateGroup (grcntjn)
'ge = езрОфЕуаШаге (gr cnt m, TRUE)
gf = esp GrpEntID (Elem, el_grp_lst_m, gr_cnt_m)
'espViewAutoScale (1)
espListClear (elem_m)
espListClear (el_grp_lst_rod)
esp ListClear (el_grp_lst_m)
Print "Работа программы Splitter успешно завершена"
Failed:
FLU:
' При отказе от разбивки падаем сразу сюда End Sub
Function m_area (ele As Long) As Double
' Функция расчета площади мембранного элемента
Dim en As esp_Element
Dim ent_ndl As esp_Node
Dim ent_nd2 As esp Node
Dim ent_nd3 As esp_Node
Dim ent_nd4 As esp_Node
Dim propel As esp_Property
Dim fig As esp_Flags
Dim e_prop_ID As Long
Dim etype As Long
Dim thn As Long
Dim aa As Double
Dim bb As Double
Dim cc As Double
Dim kk As Double
Dim dd As Double
Dim ее As Double
Dim ff As Double
Dim gg As Double
f = esp DBGetElement (ele, en)
e_prop_ID = en.PropID
etype = en.type
dd = esp_PropGet (e_prop_ID, fig, propel) thn = propel. Vail
' получение номеров узлов ent el
elkl = en.Node_l
t= esp DBGetNode (el kl, ent_ndl)
el_k2 = en.Node_2
t= esp_DBGetNode (el_k2, ent_nd2)
el_k3 = en.Node_3
t= esp_DBGetNode (el_k3, ent_nd3)
el_k4 = en.Node_4
t= esp_DBGetNode (el_k4, ent_nd4)
' Получаем координаты первых трех узлов
'Первый определитель
аа = (entndl.y * ent_nd2.z)+(ent_nd2.y * ent_nd3.z)+(ent_nd3.y * entndl.z)-(ent_nd3.y * ent nd2.z)-(ent_ndl.y * ent_nd3.z)-(ent_nd2.y * ent_ndl.z) 'Второй определитель