Расчет плоских ферм и арок. Расчетная схема фермы с принятой нумерацией узлов и стержней, страница 8

// Функция вывода сообщений об ошибках (о нулевой или вырожденной матрице)

void Singular(int why, long iStr)

{

  if( why == 0 )

     printf("Zero string %d\n", iStr);

  if( why == 1 )

     printf("Degenerative matrix. Program will divide by zero\n");

// В случае ошибки немедленно выйти из программы      

  exit(1);

}

Файл Node.cpp - реализация класса узла

#include "stdafx.h"

// Подключение файла заголовка класса узла

#include "Node.h"

// Конструктор и деструктор класса CNode

CNode::CNode()

{

}

CNode::~CNode()

{

}

// Функция назначения координат узлу

void CNode::SetCoord(double xCoord, double yCoord)

{

  x = xCoord;

  y = yCoord;

}

// Функция назначения внешних связей узлу

void CNode::SetConnection(bool xConnection, bool yConnection)

{

  supX = xConnection;

  supY = yConnection;

}

// Функция проверки наличия связи узла по направлению numberDisplacement%2 (0 - // вдоль оси 0Х, 1 - вдоль оси 0Y)

bool CNode::ThereIsConnection(long numberDisplacement)

{

  if( numberDisplacement%2 == 0 )

     return supX;

  else

     return supY;

}

Файл Rod.cpp - реализация класса стержня

#include "stdafx.h"

// Подключение файлов заголовков классов стержня, узла

#include "Rod.h"

#include "Node.h"

// Подключение библиотеки математических функций

#include <math.h>

// Импортирование глобального указателя, объявленного в другом файле - в файле

// Ferma.cpp

extern CNode *node;

// Конструктор и деструктор класса CRod

CRod::CRod()

{

}

CRod::~CRod()

{

}

// Функция назначения номеров узлам стержня (номера в глобальной системе

// координат)

void CRod::SetNodesNumber(long node1Number, long node2Number)

{

  node1 = node1Number;

  node2 = node2Number;

}

// Функция назначения геометрических и физических параметров стержня  - площадь

// и модуль упругости

void CRod::SetParam(double AkValue, double EValue)

{

  Ak = AkValue;

  E = EValue;

}

// Функция вычисления длины стержня по координатим двух его узлов. Зная

// глобальные номера узлов (переменные node1 и node2 класса CRod), можно,

// обращаясь к объектам node[i] класса CNode, узнать координаты этих узлов, а по

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

// CRod, используются объекты node[i] класса CNode, то необходимо было

// импортировать объекты node[i] строкой

// extern CNode *node;

// (см. выше в этом листинге) и для "пояснения" компилятору языка VC++, что из

// себя представляет класс CNode, выше импорта подключить заголовочный файл

// класса CNode строкой

// #include "Node.h" (также см. выше в этом листинге)

void CRod::GetLength()

{

// Вычисление квадрата проекции на ось 0Х расстояния между узлами. Быстрее

// воспользоваться умножением, чем функцией pow() возведения в степень

lk = (node[ node2 ].x-node[ node1 ].x)*(node[ node2 ].x-node[ node1 ].x);

// Теперь прибавление квадрата проекции на ось 0Y расстояния между узлами, в

// результате переменная lk содержит квадрат этого расстояния

  lk += (node[ node2 ].y-node[ node1 ].y)*(node[ node2 ].y-node[ node1 ].y);

// Вычисление расстояния между узлами

  lk = sqrt( lk );

}

// Функция вычисления угла наклона стержня к горизонтальной оси 0Х. Угол равен арктангенсу отношения проекций расстояния между узлами на оси 0Y и 0Х

void CRod::GetAngle()

{

// Если из выражения для omega убрать явное приведение величин проекций к

// вещественному числу, то при знаменателе равном нулю будет выдана ошибка о

// делении целого числа на ноль и программа завершится. Соответственно

// правильное значение угла наклона стержня в PI/2 радиан вычислено не будет

  omega = atan2( double(node[ node2 ].y -  node[ node1 ].y),

double(node[ node2 ].x -  node[ node1 ].x) );

}

// Функция заполнения собственной матрицы жесткости стержня в глобальной системе // координат

void CRod::FillSelfMatrix()

{

// Вычисление повторяющегося коэффициента E*Ak/lk в матрице |k|, квадратов

// косинуса и синуса угла наклона стержня, произведения косинуса угла наклона

// на синус

double koef=E*Ak/lk, c2=cos(omega)*cos(omega), s2=sin(omega)*sin(omega),

sc=sin(omega)*cos(omega);

// Матрица |k| имеет размерность 4х4 элемента. Вычисляем ее коэффициенты по

// строкам