Запорожец  Издания 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 [ 154 ] 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

10. Знайте свою ЭВМ.

Глубокое понимание особенностей работы ЭВМ обычно более вал<но на стадии окончательной «доводки» рабочей программы. Лучше всего это сделает компетеитпый специалист по программированию, однако полезно, если и автор программы обладает некоторыми познаниями в этом вопросе.

Поясним сказанное иа примере. Отметим различие между CDC 6600 и старой IBM 1620 в отношении арифметических действий с числами разного тина. В CDC6600 числа различных типов преобразуются в числа с плаваюшей запятой, а в IBM 1620 этого ие происходит. На IBM 1620 операция 2*Х выполняется быстрее, чем операция 2.*Х, а на CDC6600 - наоборот. На IBM 1620 операция 2*Х эквивалентна Х+Х, однако на CDC6600 операция X -[- X выполняется быстрее, чем 2.*Х, поскольку операция типа сложения занимает около 0.4 мкс, а операция умножения - около 1 мкс (заметим,что X + X + X выполняется медленнее, чем 3.*Х). Время выполнения операции деления на CDC 6600 составляет приблизительно 2.9 мкс. Поэтому при расчете вклада от диффузионных членов вместо деления этих членов иа число Рейнольдса значительно эффективнее подсчитать число Рейнольдса RE, один раз вычислить величину REI, обратную числу Рейнольдса, и затем все время умножать значения диффузионных членов на эту величину. Заметим, что время выполнения операций умиожеиия и деления различно не у всех ЭВМ.

Однако иа ранних стадиях разработки программы обычно ие стоит жертвовать наглядностью программы во имя повышения ее эффективности. Кроме того, заметим, что новейшие операционные системы часто автоматически оптимизируют подобные операции. Приведенные выше примеры показывают, что при сравнении быстродействия различных численных схем и программ необходимо учитывать зависимость быстродействия от тина ЭВМ, онерационной системы и квалификации программиста.

11. Избегайте возведения в степень чисел с плаваюией запятой.

Потери времени от возведения в стенеиь чисел с илаваюшей занятой столь велики, чго их необходимо исключать уже иа ранних стадиях разработки опытной программы. На CDC 6600 умножение двух чисел с плаваюшей запятой Х*Х занимает около 1 мкс, а возведение в степень Х**2. занимает 94 мкс. Даже если X = О, то Х*2. занимает 12 мкс (заметим, однако, что для чисел с фиксированной запятой операция Х**2 эквивалентиа по



Времени выполнения операции Х*Х). Потери времени часто можно уменьшить, используя стандартную функцию SQRT; на CDC 6600 время выполнения операции Х**0.5 равно 94 мкс, а время выполнения операции SQRT(X) равно только 23 мкс.

Наиболее часто возведение в степень в газовой динамике встречается при расчете вязкости в зависимости от температу-ш. Формула Сазерленда заппсывается в виде (см., например, Шлихтинг [1968])

ц ( т \з/2 Го + S Но \tJ г + S

где Цо = и(о), а [о, Т, S - величины постоянные для данного газа. В безразмерном виде она может быть заппсана в виде функции-оператора Фортрана

Ми A*(B*T)**1.5*C/(T-f D)

где А, В, С, D - постоянные. Его же можно записать и в другом виде, алгебраически эквивалентном первому:

ми = A*SQRT (ВВ*Г3)*С/(Т + D)

где ВВ - другая постоянная. На CDC 6600 расчет по первой формуле занимает . 101.3 мкс, а по второй - 31.3 мкс. Однако при расчете по второй формуле для случая Г 1 (в ненормализованной форме) могут получиться большие промежуточные значения, что на ЭВМ с коротким машинным словом может привести к заметной потере точиостп.

В зависимости от ожидаемого интервала изменения температуры формулу Сазерленда часто можно аппроксимировать соотношением

/Ио = (Г/Го)",

где со выбирается в пределах от 0.5 до 1. Для со = 0.5 вычисление по формуле

MU = A*SQRT (В*Т)

занимает около 25 мкс. В простейшем случае со = 1 вычисление по формуле

ми = АА*Т

занимает только одну микросекунду. Но в случае ]ц = const достигается еше большая экономия времени решения всей задачи, поскольку тогда член д {\idT/дх) /дх принимает вид цдЧ/дх.

Если требуется повышенная точность, обеспечиваемая сложными зависимостями вязкости от температуры типа формулы Сазерленда, то на стадии опытной программы можно ограничиться линейной зависимостью, а требуемое более точное соотношение ввести в рабочую программу в виде подпрограммы ку-



сочно линейной или кусочно степенной (с показателем 1/2) аппроксимации на отдельных интервалах изменения температуры.

При нелинейной зависимости вязкости от температуры можно сэкономить много машинного времени, заиоминая двумерный массив величин р„ , вместо вычисления новых значений р для каждого значения Т, ,. В первом случае требуется / X / раз вычислять значения вязкости, а величины вида p,i+i/2,; находятся осреднением (p-i+i,, + Hi,,)/2. В случае же непосредственного расчета вязкости в каждом узле (г,/) вычисление р,(+/2,; либо по формуле (5.100), либо по формуле (5.101) требует в пять раз больше времени из-за необходимости расчета величин ,, i.i,±i,,, Ц(, ;±i. При отыскании только стационарного решения дальнейшая экономия машинного времени может быть достигнута путем обновления значений массива ц,,, лишь один раз примерно за 10 шагов по времени.

Аналогичные соображения применимы п к уравнению состояния сложного вида, на расчет которого может тратиться основная часть машинного времени в задачах о распространеиии ударных воли в твердых телах.

12. В рабочей программе группируйте члены с одинаковыми индексами и стремитесь оперировать с одним индексом.

Схему с разностями вперед по времени и центральными разностями ио пространственным переменным для модельного уравнения, описывающего конвективный перенос и диффузию, можно записать в виде

Соответствующий оператор на Фортране может иметь вид ZP (I) = Z (I) - С* (Z (I + 1) - Z(I - 1)) +

+ A*(Z (I+1)-2*Z(I) + Z(I-1))

Считая умножение целого числа иа действительное 2*2(1) эквивалентным сложению и оиерации с индексами (1+1) и (1 - 1) также эквивалентными сложению, получим, что оператор содержит десять операций типа сложения и два умножения, и его выполнение иа CDC6600 займет около 6 мкс. Перегруппируем теперь члены в операторе следующим образом:

ZP (I) = Drz (I) + D2 (Z (I + 1)) + D3* (Z (1-1))

Здесь Dl=(l, -2*А), D2=(A -С), D3=(A + C) найдены заранее и, следовательно, не вычисляются для каждого значения I. Оператор содержит четыре операции типа сложения и три умножения и его выполнение на CDC 6600 займет около 4.6 мкс, т. е. достигнут выигрыш по времени в 6/4.6 = 1.3 раза.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 [ 154 ] 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199