ВВЕДЕНРР•.
Метод конечных элементов является численным методом для дифференциальных уравнений, встречающихся РІ физике [1]. Возникновение этого метода связано СЃ решением задач космических исследований (1950 Рі.). Впервые РѕРЅ был опубликован РІ работе Тернера, Клужа, Мартина Рё РўРѕРїРїР°. Рта работа способствовала появлению РґСЂСѓРіРёС… работ; был опубликован СЂСЏРґ статей с применениями метода конечных элементов Рє задачам строительной механики Рё механики сплошных сред. Важный вклад РІ теоретическую разработку метода сделал РІ 1963 Рі. Мелош, который показал, что метод конечных элементов РјРѕР¶РЅРѕ рассматривать как РѕРґРёРЅ РёР· вариантов хорошо известного метода Рэлея-Ритца. Р’ строительной механике метод конечных элементов минимизацией потенциальной энергии позволяет свести задачу Рє системе линейных уравнений равновесия [2,3].
РћРґРЅРѕР№ РёР· существующих трудностей, возникающих РїСЂРё численной реализации решения контактных задач теории упругости методом конечных элементов (РњРљР), является решение систем линейных алгебраических уравнений (СЛАУ) большого РїРѕСЂСЏРґРєР° РІРёРґР°

Большинство существующих методов решения таких систем разработаны в предположении того, что матрица A имеет ленточную структуру, причем ширина ленты
, РіРґРµ n2 - РїРѕСЂСЏРґРѕРє
. Однако, при использовании МКРдля численного решения контактных задач возможны случаи, когда ширина ленты
В [5].
1 ОБЗОРМЕТОДОВ РЕШЕНРРЇ СЛАУ, Р’РћР—РќРКАЮЩРРҐ Р’ РњРљР
Основная идея метода конечных элементов состоит в том, что любую непрерывную величину, такую, как температура, давление и перемещение, можно аппроксимировать дискретной моделью, которая строится на множестве кусочно-непрерывных функций, определенных на конечном числе подобластей. Кусочно-непрерывные функции определяются с помощью значений непрерывной величины в конечном числе точек рассматриваемой области [1,2,3].
Р’ общем случае непрерывная величина заранее неизвестна Рё РЅСѓР¶РЅРѕ определить значения этой величины РІ некоторых внутренних точках области. Дискретную модель, однако, очень легко построить, если сначала предположить, что числовые значения этой величины РІ каждой внутренней точке области известны. После этого РјРѕР¶РЅРѕ перейти Рє общему случаю. Ртак, РїСЂРё построении конкретной модели непрерывной величины поступают следующим образом:
1. Р’ рассматриваемой области фиксируется конечное число точек. Рти точки называются узловыми точками или просто узлами.
2. Значение непрерывной величины в каждой узловой точке считается переменной, которая должна быть определена.
3. Область определения непрерывной величины разбивается РЅР° конечное число подобластей, называемых элементами. Рти элементы имеют общие узловые точки Рё РІ совокупности аппроксимируют форму области.
4 .Непрерывная величина апроксимируется на каждом элементе функцией, которая определяется с помощью узловых значений этой величины. Для каждого элемента определяется своя функция, но функции подбираются таким образом, чтобы сохранялась непрерывность величины вдоль границ элемента.
Для решения СЛАУ в МКРтребуется выбрать метод решения. Окончательное решение о применении итерационных или прямых методов решения СЛАУ необходимо принимать на основе анализа структуры исследуемой математической задачи. Прямые методы решения СЛАУ более выгодно использовать, если необходимо решать много одинаковых систем с различными правыми частями, или если матрица А не является положительно-определенной. Кроме того, существуют задачи с такой структурой матрицы, для которой прямые методы всегда предпочтительнее, чем итерационные.
Точные методы решения СЛАУ
Рассмотрим ряд точных методов решения СЛАУ [4,5].
Решение систем n-линейных уравнении с n-неизвестными по формулам Крамера.
Пусть дана система линейных уравнений, в которой число уравнений равно числу неизвестных:

Предположим, что определитель системы d не равен нулю. Если теперь заменить последовательно в определителе столбцы коэффициентов при неизвестных хj столбцом свободных членов bj, то получатся соответственно n определителей d1,...,dn.
Теорема Крамера. Система n линейных уравнений с n неизвестными, определитель которой отличен от нуля, всегда совместна и имеет единственное решение, вычисляемое по формулам:
x1=d1/d; x2=d2/d;....; xn-1=dn-1/d; xn=dn/d;
Решение произвольных систем линейных уравнений.
Пусть

произвольная система линейных уравнений, где число уравнений системы не равно числу n неизвестных. Предположим, что система (3) совместна и r
min{m,n}, тогда в матрицах А и А найдутся r линейно независимых строк, а остальные m-r строк окажутся их линейными комбинациями. Перестановкой уравнений можно добиться того, что эти r линейно независимых строк займут первые r мест.
Отсюда следует, что любое из последних m - r уравнений системы (3) можно представить как сумму первых r уравнений (которые называются линейно независимыми или базисными), взятых с некоторыми коэффициентами. Тогда система эквивалентна следующей системе r уравнений с n неизвестными

Предположим, что минор r-го порядка, составленный из коэффициентов при первых r неизвестных, отличен от нуля Мr
 0, т. е. является базисным минором. В этом случае неизвестные, коэффициенты при которых составляют базисный минор, называются базисными неизвестными, а остальные n - r - свободными неизвестными.
В каждом из уравнений системы (4) перенесем в правую часть все члены со свободными неизвестными xr+1,..., xn. Тогда получим систему, которая содержит r уравнений с r базисными неизвестными. Так как определитель этой системы есть базисный минор Mr то система имеет единственное решение относительно базисных неизвестных, которое можно найти по формулам Крамера. Давая свободным неизвестным произвольные числовые значения, получим общее решение исходной системы.
Однородная система линейных уравнений.
Пусть дана однородная система линейных уравнений n неизвестными

Так как добавление столбца из нулей не изменяет ранга матрицы системы, то на основании теоремы Кронекера - Kaneлли эта система всегда совместна и имеет, по крайней мере, нулевое решение. Если определитель системы (5) отличен от нуля и число уравнений системы равно числу неизвестных, то по теореме Крамера нулевое решение является единственным.
В том случае, когда ранг матрицы системы (5) меньше числа неизвестных, т. е. r (А)
Система (5) имеет бесчисленное множество решений. Среди этого множества есть решения, линейно независимые между собой.
Фундаментальной системой решений называются n - r линейно независимых решений однородной системы уравнений.
Метод главных элементов.
Пусть дана система n линейных уравнений с n неизвестными

расширенная матрица системы (6)
. Выберем ненулевой наибольший по модулю и не принадлежащий столбцу свободных членов элемент apq матрицы
, который называется главным элементом, и вычислим множители mi=-aiq/apq для всех строк с номерами i
p (р - я строка, содержащая главный элемент, называется главной строкой).
Далее к каждой неглавной i-й строке прибавим главную строку, умноженную на соответствующий множитель mi; для этой строки.
В результате получим новую матрицу, все элементы q-го столбца которой, кроме apq, состоят из нулей.
Отбросив этот столбец и главную p-ю получим новую матрицу, число строк и столбцов которой на единицу меньше. Повторяем те же операции с получившейся матрицей, после чего получаем новую матрицу и т.д.
Таким образом, построим последовательность матриц, последняя из которых является двучленной матрицей-строкой (главной строкой). Для определения неизвестных xi объединяем в систему все главные строки, начиная с последней.
Рзложенный метод решения системы линейных уравнений СЃ n неизвестными называется методом главных элементов. Необходимое условие его применения состоит том, что определитель матрицы РЅРµ равен нулю [6,7].
Схема Халецкого.
Пусть система линейных уравнений дана в матричном виде.
Ax=bВ В В В В (7)
Где А - квадратная матрица порядка n, а x,b - векторы столбцы.
Представим матрицу А в виде произведения нижней треугольной матрицы С и верхней треугольной матрицы В с единичной диагональю, т.е.
Рђ=РЎР’,
Где
,В 
Причем элементы сij и bij определяются по формулам:
,

Уравнение (7) можно записать в следующем виде:
CBx=b.В В В В В В В В В (9)
Произведение Bx матрицы B на вектор-столбец x является вектором-столбцом, который обозначим через y:
Bx=y.В В В В В В В (10)
Тогда уравнение (9) перепишем в виде:
Cy=b.В В В В (11)
Здесь элементы сij известны, так как матрица А системы (7) считается уже разложенной на произведение двух треугольных матриц С и В.
Перемножив матрицы в левой части равенства (11), получаем систему уравнений из которой получаем следующие формулы для определения неизвестных:

неизвестные yi удобно вычислять вместе с элементами bij.
После того как все yi определены по формулам (12), подставляем их в уравнение(10).
Так как коэффициенты bij определены (8), то значения неизвестных, начиная с последнего, вычисляем по следующим формулам:

К прямым методам, использующим свойство разреженности А, можно отнести: алгоритм минимальной степени, алгоритм минимального дефицита, древовидное блочное разбиение для асимметричного разложения, методы вложенных или параллельных сечений и др.
Метод Гаусса.
Пусть дана система
Ax = b
где А – матрица размерности m x m.
В предположении, что
, первое уравнение системы
, 
делим на коэффициент
, в результате получаем уравнение

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

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

Совокупность проведенных вычислений называется прямым ходом метода Гаусса.
РР·
-го уравнения системы (2) определяем
, РёР· (
)-го уравнения определяем
В Рё С‚.Рґ. РґРѕ
. Совокупность таких вычислений называют обратным ходом метода Гаусса.
Реализация прямого метода Гаусса требует
 арифметических операций, а обратного -
 арифметических операций.
1.2. Ртерационные методы решения СЛАУ
Метод итераций (метод последовательных приближений).
Приближенные методы решения систем линейных уравнений позволяют получать значения корней системы с заданной точностью в виде предела последовательности некоторых векторов. Процесс построения такой последовательности называется итерационным (повторяющимся).
Рффективность применения приближенных методов зависят РѕС‚ выбора начального вектора Рё быстроты сходимости процесса.
Рассмотрим метод итераций (метод последовательных приближений). Пусть дана система n линейных уравнений с n неизвестными:
РђС…=b,В В В В (14)
Предполагая, что диагональные элементы aii
 0 (i = 2, ..., n), выразим xi через первое уравнение систем x2 - через второе уравнение и т. д. В результате получим систему, эквивалентную системе (14):

Обозначим
;
, где i == 1, 2, ...,n; j == 1,2,..., n. Тогда система (15) запишется таким образом в матричной форме

Решим систему (16) методом последовательных приближений. За нулевое приближение примем столбец свободных членов. Любое (k+1)-е приближение вычисляют по формуле

Если последовательность приближений x(0),...,x(k) имеет предел
, то этот предел является решением системы (15), поскольку в силу свойства предела
, С‚.Рµ.
В [4,6].
Метод Зейделя.
Метод Зейделя представляет собой модификацию метода последовательных приближений. В методе Зейделя при вычислении (k+1)-го приближения неизвестного xi (i>1) учитываются уже найденные ранее (k+1)-е приближения неизвестных xi-1.
Пусть дана линейная система, приведенная к нормальному виду:
В В В (17)
Выбираем произвольно начальные приближения неизвестных и подставляем в первое уравнение системы (17). Полученное первое приближение подставляем во второе уравнение системы и так далее до последнего уравнения. Аналогично строим вторые, третьи и т.д. итерации.
Таким образом, предполагая, что k-е приближения
известны, методом Зейделя строим (k+1)-е приближение по следующим формулам:


РіРґРµ k=0,1,...,n

Метод Ланцоша.
Для решения СЛАУ высокого порядка (1), матрица, коэффициентов которой хранится в компактном нижеописанном виде, наиболее удобным итерационным методом является метод Ланцоша [4], схема которого имеет вид:
В В В В В (18)

РіРґРµ

Преимуществом данного метода является его высокая скорость сходимости к точному решению. Кроме того, доказано, что он обладает свойством «квадратичного окончания», т.е. для положительно определенной матрицы можно гарантировано получить точное решение при количестве итераций
. Размер требуемой памяти на каждой итерации не изменяется, т.к. не требует преобразование матрицы
. В качестве критерия остановки данного итерационного процесса обычно используют соотношение
,В В В В В В В В В В (19)
РіРґРµ
- заданная точность. В качестве другого критерия сходимости иногда удобнее использовать среднеквадратичную разность между решениями, полученными на соседних итерациях:
В В В В В В В В В В В (20)
Среднеквадратичную разность необходимо контролировать при выполнении каждых k наперед заданных итераций.
Отдельно следует рассмотреть проблему выбора начального приближения
. Доказывается, что при положительно определенной матрице
, итерационный процесс (18) всегда сходится при любом выборе начального приближения. При решении контактных задач, когда для уточнения граничных условий в зоне предполагаемого контакта требуется большое количество решений СЛАУ вида (1), в качестве начального приближения для первого расчета используется правая часть системы (1), а для каждого последующего пересчета - решение, полученное на предыдущем. Такая схема позволяет значительно сократить количество итераций, необходимых для достижения заданной точности (19) или (20) [10,11].
В 2 МЕТОДЫ КОМПАКТНОГО ХРАНЕНРРЇ РњРђРўР РЦЫ ЖЕСТКОСТР
Матрица жесткости, получающаяся РїСЂРё применении РњРљР, обладает симметричной структурой, что позволяет РІ общем случае хранить только верхнюю треугольную часть матрицы. Однако для задач СЃ большим количеством неизвестных это так Р¶Рµ РїСЂРёРІРѕРґРёС‚ Рє проблеме нехватки памяти. Предлагаемый РІ данной работе метод, позволяет хранить только ненулевые члены матрицы жесткости. Суть его заключается РІ следующем.
Первоначально, СЃ целью выявления связей каждого узла СЃ РґСЂСѓРіРёРјРё, производится анализ структуры дискретизации области РЅР° РљР. Например, для РљР - сетки, изображенной РЅР° СЂРёСЃ. 1, соответствующая структура связей будет иметь РІРёРґ:
№ узла | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
РЎРІСЏР·Рё | 1, 2, 5, 6, 7 | 1, 2, 3, 6 | 2, 3, 4, 6 | 3, 4, 5, 6, 7 | 1, 4, 5, 7 | 1, 2, 3, 4, 6, 7 | 1, 4, 5, 6, 7 |
Тогда, для хранения матрицы жесткости необходимо построчно запоминать информацию о коэффициентах, соответствующих узлам, с которыми связан данный узел. На рис. 2 приведены  матрица жесткости и ее компактное представление для сетки изображенной на рис 1 [9].
Текст подпрограммы, реализующий предложенный алгоритм анализа структуры РљР-разбиения тела, приведен РІ Приложении 1.
Данный способ компактного хранения матрицы жесткости позволяет легко его использовать совместно с каким-нибудь численным методом. Наиболее удобным для этой цели представляется использование вышеизложенного итерационного метода Ланцоша, так как на каждой итерации требуется только перемножать матрицу коэффициентов СЛАУ и заданный вектор. Следовательно, для использования предложенного метода компактного хранения СЛАУ необходимо построить прямое и обратное преобразование в первоначальную квадратную матрицу.
Пусть
– элемент первоначальной квадратной матрицы размерностью
, Р°
 - ее компактное представление. Тогда для обратного преобразования будут справедливы следующие соотношения:
,В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В (*)
где m – количество степеней свободы (m=1,2,3).
Для прямого преобразования будут справедливы соотношения, обратные к соотношениям (*).
В 3 Р§РСЛЕННЫЕ РКСПЕРРМЕНТЫ
Для проверки предлагаемого метода компактного хранения матрицы жесткости была решена задача о контактном взаимодействии оболочечной конструкции и ложемента [12] (рис. 4).
Данная задача часто возникает на практике при транспортировке или хранении с горизонтальным расположением оси оболочечные конструкции устанавливаются на круговые опоры - ложементы. Взаимодействие подкрепленных оболочечных конструкций и ложементов осуществляется через опорные шпангоуты, протяженность которых вдоль оси оболочки соизмерима с шириной ложементов и много меньше радиуса оболочки и величины зоны контакта. Данная задача решалась методом конечных элементов при помощи системы FORL [5]. Дискретная модель ложемента (в трехмерной постановке) представлена на Рис. 5.
РџСЂРё построении данной РљР-модели было использовано 880 узлов Рё 2016 РљР РІ форме тетраэдра. Полный размер матрицы жесткости для такой задачи составляет
 байт, что приблизительно равно 2,7 Мбайт оперативной памяти. Размер упакованного представления составил около 315 Кбайт.
Данная задача решалась РЅР° РР’Рњ СЃ процессором Pentium 166В Рё 32 РњР‘ РћР—РЈ РґРІСѓРјСЏ способами – методом Гаусса Рё методом Ланцоша. Сопоставление результатов решения приведено РІ Таблице 1.
  Таблица 1.
| Время решения (сек) |  |  |  |  |  |  |
Метод Гаусса | 280 | 2.2101 | -2.4608 | 1.3756 | -5.2501 | 1.7406 | -2.3489 |
Метод Ланцоша | 150 | 2.2137 | -2.4669 | 1.3904 | -5.2572 | 1.7433 | -2.3883 |
РР· Таблицы 1 легко видеть, что результаты решения СЛАУ методом Гаусса Рё методом Ланцоша хорошо согласуются между СЃРѕР±РѕР№, РїСЂРё этом время решения вторым СЃРїРѕСЃРѕР±РѕРј почти РІ РґРІР° раза меньше, чем РІ случае использования метода Гаусса.
ВЫВОДЫ.
В данной работе были рассмотрены способы компактного хранения матрицы коэффициентов системы линейных алгебраических уравнений (СЛАУ) и методы ее решения. Разработан алгоритм компактного хранения матрицы жесткости, позволяющий в несколько раз (иногда более чем в десятки раз) сократить объем требуемой памяти для хранения такой матрицы жесткости.
Классические методы хранения, учитывающие симметричную Рё ленточную структуру матриц жесткости, возникающих РїСЂРё применении метода конечных элементов (РњРљР), как правило, РЅРµ применимы РїСЂРё решении контактных задач, так как РїСЂРё РёС… решении матрицы жесткости нескольких тел объединяются РІ РѕРґРЅСѓ общую матрицу, ширина ленты которой может стремиться Рє РїРѕСЂСЏРґРєСѓ системы.
Предложенная в работе методика компактного хранения матриц коэффициентов СЛАУ и использования метода Ланцоша позволили на примере решения контактных задач добиться существенной экономии процессорного времени и затрат оперативной памяти.
РџР РЛОЖЕНРР• 1
Рсходный текст программы, реализующий анализ структуры РљР-разбиения объекта.
#include
#include
#include
#include
#include
#include "matrix.h"
#define BASE3D_4В 4
#define BASE3D_8В 8
#define BASE3D_10 10
const double Eps = 1.0E-10;
DWORD CurrentType = BASE3D_10;
void PrintHeader(void)
{
В printf("Command format: AConvert - [/Options]\n");
В printf("Switch: -t10 - Tetraedr(10)\n");
В printf("В В В В В В В -c8В - Cube(8)\n");
В printf("В В В В В В В -s4В - Shell(4)\n");
В printf("В В В В В В В -s8В - Shell(8)\n\n");
В printf("Optins: /8 - convert Tetraedr(10)->8*Tetraedr(4)\n");
В printf("В В В В В В В /6 - convert Cube(8)->6*Tetraedr(4)\n");
}
bool Output(char* fname,Vector& x,Vector& y,Vector& z, Matrix& tr, DWORD n,
В В В В В В В В В В В DWORD NumNewPoints,DWORD ntr,Matrix& Bounds,DWORD CountBn)
{
В char*В В В Label = "NTRout";
В intВ В В В В type = CurrentType,
В В В В В В В В В В type1 = (type==BASE3D_4 || type==BASE3D_10) ? 3 : 4;
В DWORDВ В В NewSize,
В В В В В В В В В В i,
В В В В В В В В В В j;
В ofstream Out;
В if (type==BASE3D_4) type1 = 3;
В else if (type==BASE3D_8) type1 = 4;
В else if (type==BASE3D_10) type1 = 6;
В Out.open(fname,ios::out | ios:: binary);
В if (Out.bad()) return true;
В Out.write((const char*)Label,6 * sizeof(char));
В if (Out.fail()) return true;
В Out.write((const char*)&type,sizeof(int));
В if (Out.fail()) return true;
В Out.write((const char*)&CountBn,sizeof(DWORD));
В if (Out.fail())
В В {
В В В В Out.close();
В В В В return true;
В В }
В Out.write((const char*)&(NewSize = n + NumNewPoints),sizeof(DWORD));
В if (Out.fail()) return true;
В Out.write((const char*)&(NumNewPoints),sizeof(DWORD));
В if (Out.fail())
В В {
В В В В Out.close();
В В В В return true;
В В }
В for (DWORD i = 0; i
В В {
В В В В Out.write((const char*)&x[i],sizeof(double));
В В В В Out.write((const char*)&y[i],sizeof(double));
В В В В Out.write((const char*)&z[i],sizeof(double));
В В В В if (Out.fail())
В В В В В {
В В В В В В В Out.close();
В В В В В В В return true;
В В В В В }
В В В }
В for (i = 0; i
В В В {
В В В В В Out.write((const char*)&x[n + i],sizeof(double));
В В В В В Out.write((const char*)&y[n + i],sizeof(double));
В В В В В if (Out.fail())
В В В В В В В {
В В В В В В В В В Out.close();
В В В В В В В В В return true;
В В В В В В В }
В В В }
В Out.write((const char*)&(ntr),sizeof(DWORD));
В if (Out.fail())
В В {
В В В В Out.close();
В В В В return true;
В В }
В for (i = 0; i
В В for (j = 0; j
В В В {
В В В В В DWORD out = tr[i][j];
В В В В В Out.write((const char*)&out,sizeof(DWORD));
В В В В В if (Out.fail())
В В В В В В В {
В В В В В В В В В Out.close();
В В В В В В В В В return true;
В В В В В В В }
В В В }
В for (i = 0; i
В В for (j = 0; j
В В В {
В В В В В DWORD out = Bounds[i][j];
В В В В В Out.write((const char*)&out,sizeof(DWORD));
В В В В В if (Out.fail())
В В В В В В В {
В В В В В В В В В Out.close();
В В В В В В В В В return true;
В В В В В В В }
В В В }
{
В //*********************
В // Create Links
В printf("Create links...\r");
В Vector Link(n),
В В В В В В В В В В В В В В В Size(n);
В Matrix Links(n,n);
В DWORDВ В В В В В В В Count;
В intВ В В В В В В В В В type = CurrentType;
В for (DWORD i = 0; i
В В {
В В В В for (DWORD j = 0; j
В В В В В for (DWORD k = 0; k
В В В В В В if (tr[j][k] == i)
В В В В В В В for (DWORD m = 0; m
В В В В В Count = 0;
В В В В В for (DWORD m = 0; m
В В В В В В if (Link[m]) Count++;
В В В В В Size[i] = Count;
В В В В В Count = 0;
В В В В В for (DWORD m = 0; m
В В В В В В if (Link[m])
В В В В В В В Links[i][Count++] = m;
В В В В В //Set zero
В В В В В Link.ReSize(n);
В В }
В // Output
В //*********************
В for (DWORD i = 0; i
В В {
В В В В DWORD Sz = Size[i];
В В В В Out.write((const char*)&Sz,sizeof(DWORD));
В В В В for (DWORD j = 0; j
В В В В В Out.write((const char*)&(Links[i][j]),sizeof(DWORD));
В В }
В //*********************
}
В printf("В В В В В В В В В В В В В В В В В В В В В В В В В В В \r");
В printf("Points: %ld\n",n);
В printf("FE:В В В В %ld\n",ntr);
В Out.close();
В return false;
}
bool Test(DWORD* a,DWORD* b)
{
В boolВ result;
В intВ В NumPoints = 3;
В if (CurrentType == BASE3D_8) NumPoints = 4;
В else if (CurrentType == BASE3D_10) NumPoints = 6;
В for (int i = 0; i
В В {
В В В В В result = false;
В В В В В for (int j = 0; j
В В В В В В if (b[j] == a[i])
В В В В В В В {
В В В В В В В В В result = true;
В В В В В В В В В break;
В В В В В В В }
В В В В В if (result == false) return false;
В В }
В return true;
}
void Convert(Vector& X,Vector& Y,Vector& Z, Matrix& FE,DWORD NumTr,Matrix& Bounds,DWORD& BnCount)
{
В intВ В В В В В В В В В cData8[6][5] = {{0,4,5,1,7},
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В {6,2,3,7,0},
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В {4,6,7,5,0},
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В {2,0,1,3,5},
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В {1,5,7,3,4},
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В {6,4,0,2,1}},
В В В В В В В В В В В В В В cData4[4][4] = {{0,1,2,3},
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В {1,3,2,0},
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В {3,0,2,1},
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В {0,3,1,2}},
В В В В В В В В В В В В В В cData10[4][7] = {{0,1,2,4,5,6,3},
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В {0,1,3,4,8,7,2},
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В {1,3,2,8,9,5,0},
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В {0,2,3,6,9,7,1}},
В В В В В В В В В В В В В В cData[6][7],
В В В В В В В В В В В В В В Data[6],
В В В В В В В В В В В В В В l,
В В В В В В В В В В В В В В Num1,
В В В В В В В В В В В В В В Num2,
В В В В В В В В В В В В В В m;
В DWORDВ В В В В В В В i,
В В В В В В В В В В В В В В j,
В В В В В В В В В В В В В В p[6],
В В В В В В В В В В В В В В pp[6],
В В В В В В В В В В В В В В Index;
В Matrix BoundList(4 * NumTr,6);
В doubleВ В В В В В В cx,
В В В В В В В В В В В В В В cy,
В В В В В В В В В В В В В В cz,
В В В В В В В В В В В В В В x1,
В В В В В В В В В В В В В В y1,
В В В В В В В В В В В В В В z1,
В В В В В В В В В В В В В В x2,
В В В В В В В В В В В В В В y2,
В В В В В В В В В В В В В В z2,
В В В В В В В В В В В В В В x3,
В В В В В В В В В В В В В В y3,
В В В В В В В В В В В В В В z3;
В Bounds.ReSize(4 * NumTr,6);
В switch (CurrentType)
В {
В В В case BASE3D_4:
В В В В В В В В Num1 = 4;
В В В В В В В В Num2 = 3;
В В В В В В В В for (l = 0; l
В В В В В В В В В for (m = 0; m
В В В В В В В В В В cData[l][m] = cData4[l][m];
В В В В В В В В break;
В В В case BASE3D_8:
В В В В В В В В Num1 = 6;
В В В В В В В В Num2 = 4;
В В В В В В В В for (l = 0; l
В В В В В В В В В for (m = 0; m
В В В В В В В В В В cData[l][m] = cData8[l][m];
В В В В В В В В break;
В В В case BASE3D_10:
В В В В В В В В Num1 = 4;
В В В В В В В В Num2 = 6;
В В В В В В В В for (l = 0; l
В В В В В В В В В for (m = 0; m
В В В В В В В В В В cData[l][m] = cData10[l][m];
В }
В printf("Create bounds...\r");
В for (i = 0; i
В for (int j = 0; j
В В if (!BoundList[i][j])
В В В {
В В В В for (l = 0; l
В В В В В p[l]В = FE[i][cData[j][l]];
В В В В for (DWORD k = i + 1; k
В В В В В for (int m = 0; m
В В В В В В if (!BoundList[k][m])
В В В В В В В {
В В В В В В В В for (int l = 0; l
В В В В В В В В В pp[l] = FE[k][cData[m][l]];
В В В В В В В В if (Test(p,pp))
В В В В В В В В В BoundList[i][j] = BoundList[k][m] = 1;
В В В В В В В }
В В В }
В for (i = 0; i
В for (j = 0; j
В В if (BoundList[i][j] == 0)
В В В {
В В В В В В В В if (CurrentType == BASE3D_4)
В В В В В В В В В {
В В В В В В В В В В В cx = X[FE[i][cData[j][3]]];
В В В В В В В В В В В cy = Y[FE[i][cData[j][3]]];
В В В В В В В В В В В cz = Z[FE[i][cData[j][3]]];
В В В В В В В В В }
В В В В В В В В else
В В В В В В В В if (CurrentType == BASE3D_10)
В В В В В В В В В {
В В В В В В В В В В В cx = X[FE[i][cData[j][6]]];
В В В В В В В В В В В cy = Y[FE[i][cData[j][6]]];
В В В В В В В В В В В cz = Z[FE[i][cData[j][6]]];
В В В В В В В В В }
В В В В В В В В else
В В В В В В В В В {
В В В В В В В В В В В cx = X[FE[i][cData[j][4]]];
В В В В В В В В В В В cy = Y[FE[i][cData[j][4]]];
В В В В В В В В В В В cz = Z[FE[i][cData[j][4]]];
В В В В В В В В В }
В В В В В x1 = X[FE[i][cData[j][0]]];
В В В В В y1 = Y[FE[i][cData[j][0]]];
В В В В В z1 = Z[FE[i][cData[j][0]]];
В В В В В x2 = X[FE[i][cData[j][1]]];
В В В В В y2 = Y[FE[i][cData[j][1]]];
В В В В В z2 = Z[FE[i][cData[j][1]]];
В В В В В x3 = X[FE[i][cData[j][2]]];
В В В В В y3 = Y[FE[i][cData[j][2]]];
В В В В В z3 = Z[FE[i][cData[j][2]]];
В В В В В for (l = 0; l
В В В В В В В Data[l] = cData[j][l];
В В В В В if ( ((cx-x1)*(y2-y1)*(z3-z1) + (cy-y1)*(z2-z1)*(x3-x1) + (y3-y1)*(cz-z1)*(x2-x1) -
В В В В В В В В В В В (x3-x1)*(y2-y1)*(cz-z1) - (y3-y1)*(z2-z1)*(cx-x1) - (cy-y1)*(z3-z1)*(x2-x1)) > 0)
В В В В В В {
В В В В В В В В if (CurrentType == BASE3D_4)
В В В В В В В В В {
В В В В В В В В В В В Data[0] = cData[j][0];
В В В В В В В В В В В Data[1] = cData[j][2];
В В В В В В В В В В В Data[2] = cData[j][1];
В В В В В В В В В }
В В В В В В В В else
В В В В В В В В if (CurrentType == BASE3D_10)
В В В В В В В В В {
В В В В В В В В В В В Data[0] = cData[j][0];
В В В В В В В В В В В Data[1] = cData[j][2];
В В В В В В В В В В В Data[2] = cData[j][1];
В В В В В В В В В В В Data[3] = cData[j][5];
В В В В В В В В В В В Data[5] = cData[j][3];
В В В В В В В В В }
В В В В В В В В else
В В В В В В В В В {
В В В В В В В В В В В Data[0] = cData[j][0];
В В В В В В В В В В В Data[1] = cData[j][3];
В В В В В В В В В В В Data[2] = cData[j][2];
В В В В В В В В В В В Data[3] = cData[j][1];
В В В В В В В В В }
В В В В В В }
В В В В В for (l = 0; l
В В В В В В Bounds[BnCount][l] = FE[i][Data[l]];
В В В В В BnCount++;
В В В }
}
void main(int argc,char** argv)
{
В В char *input1,
В В В В В В В *input2,
В В В В В В В *input3,
В В В В В В В *op = "",
В В В В В В В *sw;
В В bool CreateFile(char*,char*,char*,char*);
В В printf("ANSYS->FORL file convertor. ZSU(c) 1998.\n\n");
В В if (argc 6)
В В В {
В В В В В PrintHeader();
В В В В В return;
В В В }
В В swВ В В В = argv[1];
В В input1 = argv[2];
В В input2 = argv[3];
В В input3 = argv[4];
В В if (!strcmp(sw,"-t10"))
В В В CurrentType = BASE3D_10;
В В else
В В if (!strcmp(sw,"-c8"))
В В В CurrentType = BASE3D_8;
В В else
В В В {
В В В В В printf("Unknown switch %s\n\n",sw);
В В В В В PrintHeader();
В В В В В return;
В В В }
В В if (argc == 6)
В В В {
В В В В В op = argv[5];
В В В В В if (strcmp(op,"/8") && strcmp(op,"/6"))
В В В В В В {
В В В В В В В В printf("Unknown options %s\n\n",op);
В В В В В В В В PrintHeader();
В В В В В В В В return;
В В В В В В }
В В В }
В В if (CreateFile(input1,input2,input3,op))
В В В printf("OK\n");
}
bool CreateFile(char* fn1,char* fn2,char* fn3,char* Op)
{
В В FILEВ В В В В В В В В В *in1,
В В В В В В В В В В В В В В В В В *in2,
В В В В В В В В В В В В В В В В В *in3;
В В Vector X(1000),
В В В В В В В В В В В В В В В В В Y(1000),
В В В В В В В В В В В В В В В В В Z(1000);
В В DWORDВ В В В В В В В В NumPoints,
В В В В В В В В В В В В В В В В В NumFE,
В В В В В В В В В В В В В В В В В NumBounds = 0,
В В В В В В В В В В В В В В В В В tmp;
В В MatrixВ FE(1000,10),
В В В В В В В В В В В В В В В В В Bounds;
В В boolВ В В В В В В В В В ReadTetraedrData(char*,char*,FILE*,FILE*,Vector&,Vector&,Vector&,
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В Matrix&,DWORD&,DWORD&),
В В В В В В В В В В В В В В В В В ReadCubeData(char*,char*,FILE*,FILE*,Vector&,Vector&,Vector&,
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В Matrix&,DWORD&,DWORD&);
В В voidВ В В В В В В В В В Convert824(Matrix&,DWORD&),
В В В В В В В В В В В В В В В В В Convert1024(Matrix&,DWORD&);
В В if ((in1 = fopen(fn1,"r")) == NULL)
В В В {
В В В В В printf("Unable open file %s",fn1);
В В В В В return false;
В В В }
В В if ((in2 = fopen(fn2,"r")) == NULL)
В В В {
В В В В В printf("Unable open file %s",fn2);
В В В В В return false;
В В В }
В В if (CurrentType == BASE3D_10)
В В В {
В В В В В В if (!ReadTetraedrData(fn1,fn2,in1,in2,X,Y,Z,FE,NumPoints,NumFE)) return false;
В В В В В В if (!strcmp(Op,"/8"))
В В В В В В В {
В В В В В В В В В // Create 8*Tetraedr(4)
В В В В В В В В В Convert1024(FE,NumFE);
В В В В В В В }
В В В В В В Convert(X,Y,Z,FE,NumFE,Bounds,NumBounds);
В В В В В В return !Output(fn3,X,Y,Z,FE,NumPoints,0,NumFE,Bounds,NumBounds);
В В В }
В В if (CurrentType == BASE3D_8)
В В В {
В В В В В В if (!ReadCubeData(fn1,fn2,in1,in2,X,Y,Z,FE,NumPoints,NumFE)) return false;
В В В В В В if (!strcmp(Op,"/6"))
В В В В В В В {
В В В В В В В В В // Create 6*Tetraedr(4)
В В В В В В В В В Convert824(FE,NumFE);
В В В В В В В }
В В В В В В Convert(X,Y,Z,FE,NumFE,Bounds,NumBounds);
В В В В В В return !Output(fn3,X,Y,Z,FE,NumPoints,0,NumFE,Bounds,NumBounds);
В В В }
В return false;
}
void Convert824(Matrix& FE,DWORD& NumFE)
{
В Matrix nFE(6 * NumFE,4);
В DWORDВ data[][4] = {
В В В В В В В В В В В В В В В В В В В В В { 0,2,3,6 },
В В В В В В В В В В В В В В В В В В В В В { 4,5,1,7 },
В В В В В В В В В В В В В В В В В В В В В { 0,4,1,3 },
В В В В В В В В В В В В В В В В В В В В В { 6,7,3,4 },
В В В В В В В В В В В В В В В В В В В В В { 1,3,7,4 },
В В В В В В В В В В В В В В В В В В В В В { 0,4,6,3 }
В В В В В В В В В В В В В В В В В В В В },
В В В В В В В В Current = 0;
В for (DWORD i = 0; i
В В for (DWORD j = 0; j
В В В {
В В В В В for (DWORD k = 0; k
В В В В В nFE[Current][k] = FE[i][data[j][k]];
В В В В В Current++;
В В В }
В CurrentType = BASE3D_4;
В NumFE = Current;
В FEВ В В = nFE;
}
void Convert1024(Matrix& FE,DWORD& NumFE)
{
В Matrix nFE(8 * NumFE,4);
В DWORDВ data[][4] = {
В В В В В В В В В В В В В В В В В В В В В { 3,7,8,9 },
В В В В В В В В В В В В В В В В В В В В В { 0,4,7,6 },
В В В В В В В В В В В В В В В В В В В В В { 2,5,9,6 },
В В В В В В В В В В В В В В В В В В В В В { 7,9,8,6 },
В В В В В В В В В В В В В В В В В В В В В { 4,8,5,1 },
В В В В В В В В В В В В В В В В В В В В В { 4,5,8,6 },
В В В В В В В В В В В В В В В В В В В В В { 7,8,4,6 },
В В В В В В В В В В В В В В В В В В В В В { 8,9,5,6 }
В В В В В В В В В В В В В В В В В В В В },
В В В В В В В В Current = 0;
В for (DWORD i = 0; i
В В for (DWORD j = 0; j
В В В {
В В В В В for (DWORD k = 0; k
В В В В В nFE[Current][k] = FE[i][data[j][k]];
В В В В В Current++;
В В В }
В CurrentType = BASE3D_4;
В NumFE = Current;
В FEВ В В = nFE;
}
bool ReadTetraedrData(char* fn1,char* fn2,FILE* in1,FILE* in2,Vector& X,Vector& Y,Vector& Z,
В В В В В В В В В В В В В В В В В В В В В Matrix& FE,DWORD& NumPoints,DWORD& NumFE)
{
В В doubleВ В В В В В В В tx,
В В В В В В В В В В В В В В В В В ty,
В В В В В В В В В В В В В В В В В tz;
В В charВ В В В В В В В В В TextBuffer[1001];
В В DWORDВ В В В В В В В В Current = 0L,
В В В В В В В В В В В В В В В В В tmp;
В В while (!feof(in1))
В В В {
В В В В В if (fgets(TextBuffer,1000,in1) == NULL)
В В В В В В {
В В В В В В В В if (feof(in1)) break;
В В В В В В В В printf("Unable read file %s",fn1);
В В В В В В В В fclose(in1);
В В В В В В В В fclose(in2);
В В В В В В В В return false;
В В В В В В }
В В В В В if (sscanf(TextBuffer,"%ld %lf %lf %lf", &NumPoints,&tx,&ty,&tz) != 4) continue;
В В В В В X[Current] = tx;
В В В В В Y[Current] = ty;
В В В В В Z[Current] = tz;
В В В В В if (++Current == 999)
В В В В В В {
В В В В В В В В Vector t1 = X,
В В В В В В В В В В В В В В В В В В В В В В В t2 = Y,
В В В В В В В В В В В В В В В В В В В В В В В t3 = Z;
В В В В В В В В X.ReSize(2 * X.Size());
В В В В В В В В Y.ReSize(2 * X.Size());
В В В В В В В В Z.ReSize(2 * X.Size());
В В В В В В В В for (DWORD i = 0; i
В В В В В В В В В {
В В В В В В В В В В В X[i] = t1[i];
В В В В В В В В В В В Y[i] = t2[i];
В В В В В В В В В В В Z[i] = t3[i];
В В В В В В В В В }
В В В В В В }
В В В В В if (Current % 100 == 0)
В В В В В В printf("Line: %ld\r",Current);
В В В }
В В fclose(in1);
В В printf("В В В В В В В В В В В В В В В В В В В В В В В В В В В \r");
В В NumPoints = Current;
В В Current = 0L;
В В while (!feof(in2))
В В В {
В В В В В if (fgets(TextBuffer,1000,in2) == NULL)
В В В В В В {
В В В В В В В В if (feof(in2)) break;
В В В В В В В В printf("Unable read file %s",fn2);
В В В В В В В В fclose(in2);
В В В В В В В В return false;
В В В В В В }
В В В В В if (sscanf(TextBuffer,"%d %d %d %d %d %ld %ld %ld %ld %ld %ld %ld %ld",
В В В В В В В В В &tmp,&tmp,&tmp,&tmp,&tmp,
В В В В В В В В В &FE[Current][0],&FE[Current][1],&FE[Current][2],&FE[Current][3],
В В В В В В В В В &FE[Current][4],&FE[Current][5],&FE[Current][6],&FE[Current][7]) != 13) continue;
В В В В В if (fgets(TextBuffer,1000,in2) == NULL)
В В В В В В {
В В В В В В В В printf("Unable read file %s",fn2);
В В В В В В В В fclose(in2);
В В В В В В В В return false;
В В В В В В }
В В В В В if (sscanf(TextBuffer,"%ld %ld",&FE[Current][8],&FE[Current][9]) != 2)
В В В В В В {
В В В В В В В В printf("Unable read file %s",fn2);
В В В В В В В В fclose(in2);
В В В В В В В В return false;
В В В В В В }
{
В В В В В В if (fabs((tx = 0.5*(X[FE[Current][0] - 1] + X[FE[Current][1] - 1])) - X[FE[Current][4] - 1]) > Eps)
В В В В В В В X[FE[Current][4] - 1] = tx;
В В В В В В if (fabs((ty = 0.5*(Y[FE[Current][0] - 1] + Y[FE[Current][1] - 1])) - Y[FE[Current][4] - 1]) > Eps)
В В В В В В В В В Y[FE[Current][4] - 1] = ty;
В В В В В В if (fabs((tz = 0.5*(Z[FE[Current][0] - 1] + Z[FE[Current][1] - 1])) - Z[FE[Current][4] - 1]) > Eps)
В В В В В В В В В Z[FE[Current][4] - 1] = tz;
В В В В В В if (fabs((tx = 0.5*(X[FE[Current][2] - 1] + X[FE[Current][1] - 1])) - X[FE[Current][5] - 1]) > Eps)
В В В В В В В В В X[FE[Current][5] - 1] = tx;
В В В В В В if (fabs((ty = 0.5*(Y[FE[Current][2] - 1] + Y[FE[Current][1] - 1])) - Y[FE[Current][5] - 1]) > Eps)
В В В В В В В В В Y[FE[Current][5] - 1] = ty;
В В В В В В if (fabs((tz = 0.5*(Z[FE[Current][2] - 1] + Z[FE[Current][1] - 1])) - Z[FE[Current][5] - 1]) > Eps)
В В В В В В В В В Z[FE[Current][5] - 1] = tz;
В В В В В В if (fabs((tx = 0.5*(X[FE[Current][0] - 1] + X[FE[Current][2] - 1])) - X[FE[Current][6] - 1]) > Eps)
В В В В В В В В В X[FE[Current][6] - 1] = tx;
В В В В В В if (fabs((ty = 0.5*(Y[FE[Current][0] - 1] + Y[FE[Current][2] - 1])) - Y[FE[Current][6] - 1]) > Eps)
В В В В В В В В В Y[FE[Current][6] - 1] = ty;
В В В В В В if (fabs((tz = 0.5*(Z[FE[Current][0] - 1] + Z[FE[Current][2] - 1])) - Z[FE[Current][6] - 1]) > Eps)
В В В В В В В В В Z[FE[Current][6] - 1] = tz;
В В В В В В if (fabs((tx = 0.5*(X[FE[Current][0] - 1] + X[FE[Current][3] - 1])) - X[FE[Current][7] - 1]) > Eps)
В В В В В В В В В X[FE[Current][7] - 1] = tx;
В В В В В В if (fabs((ty = 0.5*(Y[FE[Current][0] - 1] + Y[FE[Current][3] - 1])) - Y[FE[Current][7] - 1]) > Eps)
В В В В В В В В В Y[FE[Current][7] - 1] = ty;
В В В В В В if (fabs((tz = 0.5*(Z[FE[Current][0] - 1] + Z[FE[Current][3] - 1])) - Z[FE[Current][7] - 1]) > Eps)
В В В В В В В В В Z[FE[Current][7] - 1] = tz;
В В В В В В if (fabs((tx = 0.5*(X[FE[Current][3] - 1] + X[FE[Current][1] - 1])) - X[FE[Current][8] - 1]) > Eps)
В В В В В В В В В X[FE[Current][8] - 1] = tx;
В В В В В В if (fabs((ty = 0.5*(Y[FE[Current][3] - 1] + Y[FE[Current][1] - 1])) - Y[FE[Current][8] - 1]) > Eps)
В В В В В В В В В Y[FE[Current][8] - 1] = ty;
В В В В В В if (fabs((tz = 0.5*(Z[FE[Current][3] - 1] + Z[FE[Current][1] - 1])) - Z[FE[Current][8] - 1]) > Eps)
В В В В В В В В В Z[FE[Current][8] - 1] = tz;
В В В В В В if (fabs((tx = 0.5*(X[FE[Current][3] - 1] + X[FE[Current][2] - 1])) - X[FE[Current][9] - 1]) > Eps)
В В В В В В В В В X[FE[Current][9] - 1] = tx;
В В В В В В if (fabs((ty = 0.5*(Y[FE[Current][3] - 1] + Y[FE[Current][2] - 1])) - Y[FE[Current][9] - 1]) > Eps)
В В В В В В В В В Y[FE[Current][9] - 1] = ty;
В В В В В В if (fabs((tz = 0.5*(Z[FE[Current][3] - 1] + Z[FE[Current][2] - 1])) - Z[FE[Current][9] - 1]) > Eps)
В В В В В В В В В Z[FE[Current][9] - 1] = tz;
}
В В В В В if (++Current == 999)
В В В В В В {
В В В В В В В В Matrixt = FE;
В В В В В В В В FE.ReSize(2 * FE.Size1(),10);
В В В В В В В В for (DWORD i = 0; i
В В В В В В В В В for (DWORD j = 0; j
В В В В В В В В В В FE[i][j] = t[i][j];
В В В В В В }
В В В В В if (Current % 100 == 0)
В В В В В В printf("Line: %ld\r",Current);
В В В }
В В NumFE = Current;
В В for (DWORD i = 0; i
В В В for (DWORD j = 0; j
В В В В В FE[i][j]--;
В В printf("В В В В В В В В В В В В В В В В В В В В В В В В В В В \r");
В В return true;
}
bool ReadCubeData(char* fn1,char*fn2,FILE* in1,FILE* in2,Vector& X,Vector& Y,Vector& Z,
В В В В В В В В В В В В В В В В В В В В В Matrix& FE,DWORD& NumPoints,DWORD& NumFE)
{
В В doubleВ В В В В В В В tx,
В В В В В В В В В В В В В В В В В ty,
В В В В В В В В В В В В В В В В В tz;
В В charВ В В В В В В В В В TextBuffer[1001];
В В DWORDВ В В В В В В В В Current = 0L,
В В В В В В В В В В В В В В В В В tmp;
В В while (!feof(in1))
В В В {
В В В В В if (fgets(TextBuffer,1000,in1) == NULL)
В В В В В В {
В В В В В В В В if (feof(in1)) break;
В В В В В В В В printf("Unable read file %s",fn1);
В В В В В В В В fclose(in1);
В В В В В В В В fclose(in2);
В В В В В В В В return false;
В В В В В В }
В В В В В if (sscanf(TextBuffer,"%ld %lf %lf %lf", &NumPoints,&tx,&ty,&tz) != 4) continue;
В В В В В X[Current] = tx;
В В В В В Y[Current] = ty;
В В В В В Z[Current] = tz;
В В В В В if (++Current == 999)
В В В В В В {
В В В В В В В В Vector t1 = X,
В В В В В В В В В В В В В В В В В В В В В В В t2 = Y,
В В В В В В В В В В В В В В В В В В В В В В В t3 = Z;
В В В В В В В В X.ReSize(2 * X.Size());
В В В В В В В В Y.ReSize(2 * X.Size());
В В В В В В В В Z.ReSize(2 * X.Size());
В В В В В В В В for (DWORD i = 0; i
В В В В В В В В В {
В В В В В В В В В В В X[i] = t1[i];
В В В В В В В В В В В Y[i] = t2[i];