Основы компьютерного моделирования физических и технических систем. Основы моделирования физических и технических систем, страница 2

InvGauss(N, A, B);

MultMatrix(A, B, E);

for I := 1 to N do

for J := 1 to N do

ShowMessage(Format('A[%d,%d]=%.3f', [I, J, B[I, J]]));

end;

//При клике мышкой

procedure TForm3.Image1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

//Поменяем координаты окружности и заново выполним тесселяцию.

CirX := X/5;

CirY := Y/5;

Button1.Click;

end;

end.

unit uModel;

interface

uses Classes, Graphics, Windows, Math, uSLAU;

type

//Класс - точка с вещественными координатами

TRealPoint = class

//Номер узла

ID: Integer;

//Внешняя сила, приложенная к узлу

ExtForceX, ExtForceY: Extended;

//Перемещения и координаты узла

DX, DY, X, Y: Extended;

//Конструктор, создающий точку

constructor Create(aID: integer; ax, ay: Extended);

end;

//Класс - линия между двумя узлами

TRealLine = class

//Начальная и конечная точка

FirstPoint, EndPoint: TRealPoint;

//Функция сравнения с другой линией

function Same(L: TRealLine): boolean;

end;

//Класс - конечный элемент (треугольник)

TTria = class

//Указатели на три угла

Points: array[1..3]of TRealPoint;

//Вектор напряжений элемента

EpsX, EpsY,GammaX: Extended;

//Функция сравнения с другим конечным элементом

function Same(T: TTria): boolean;

//Функция, возвращающая координату X I-ой точки

function X(I: Integer): Extended;

//Функция, возвращающая координату Y I-ой точки

function Y(I: Integer): Extended;

//Фунция, возвращающая матрицу жесткости

procedure KMatrix(E, v, d: Extended; var K: TMatrix);

//Функция, возвращающая матрицу градиентов

procedure BMatrix(E, v, d: Extended; var B: TMatrix);

//Функция, возвращающая площадь треугольника

function Area: Extended;

//Функция поиска точки P в списке вершин треугольника

function FindPoint(P: TRealPoint): Integer;

//Функция возвращает эквивалентное напряжение в конечном элементе

function EpsSum: Extended;

end;

//Класс модель - представляет разбитый на конечные элементы объект

TModel = class

//Списки вершин, ребер, треугольников

Vertexes, Edges, Trias: TList;

//Максимальное значение эквивалентного напряжения - служит для масштабирования изображения напряжений

Kmax: Extended;

//Конструктор - создает объект

constructor Create;

//Очищает объект

procedure Clear;

//Добавляет в модель узел с координатами aX, aY и возвращает указатель на него

function AddVertex(aX, aY: Extended): TRealPoint;

//Добавляет в модель треугольник с вершинами P1,P2,P3 и возвращает указатель на него

function AddTria(P1, P2, P3: TRealPoint): TTria;

//Рисует модель на холсте C с масштабом Scale

procedure Draw(C: TCanvas; Scale: Extended);

//Составляет систему уравнений МКЭ и решает ее методом Method

procedure SolveMKE(E, v, d: Extended; Method: TMethod);

//Функция поиска точки с заданными координатами

function FindPoint(aX, aY: Extended): TRealPoint;overload;

//Добавляет в модель грань и возвращает указатель на него

function AddEdge(FromP, Top: TRealPoint): TRealLine;

end;

implementation

{ TModel }

function TModel.AddEdge(FromP, Top: TRealPoint): TRealLine;

var

I: Integer;

begin

//Создадим новую грань

Result := TRealLine.Create;

//Установим ее начальную и конечную точку

with Result do

begin

FirstPoint := FromP;

EndPoint := ToP;

end;

//Проверим, не совпадает ли она с существующими гранями

for I := 0 to Edges.Count - 1 do

if TRealLine(Edges[I]).Same(Result) then

begin

//Если совпадает - удалим ее

Result.Free;

Result := nil;

exit

end;

//Добавим грань в список граней

Edges.Add(Result);

end;

function TModel.AddTria(P1, P2, P3: TRealPoint): TTria;

var

I: integer;

begin

//Создадим новый треугольник

Result := TTria.Create;

//Установим его вершины

with Result do

begin

Points[1] := P1;

Points[2] := P2;

Points[3] := P3;

end;

//Если площадь нулевая - удалим!

if Result.Area = 0 then

begin

Result.Free;

Result := nil;

exit

end;

//Проверим, не совпадает ли он с существующими треугольниками

for I := 0 to Trias.Count - 1 do

if TTria(Trias[I]).Same(Result) then

begin

//Если совпадает - удалим его

Result.Free;

Result := nil;

exit

end;

//Добавим в список треугольников

Trias.Add(Result);

//Добавим стороны треугольника

AddEdge(P1, P2);