Метод магнитостатики конечных элементов на треугольниках

Страницы работы

16 страниц (Word-файл)

Содержание работы

Министерство образования и науки РФ

НГТУ

Кафедра прикладной математики

Метод конечных элементов

Лабораторная работа №2

Факультет: ПМИ

Группа: ПМ-24

Студенты:

Бергинов А.В.

Воронов А.С.

Преподаватели:

Персова М.Г.

Задорожный А.Г

Новосибирск 2006 г.

Условие задачи.

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

2.Математическая модель

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

Магнитная проницаемость

Плотность тока

Железо

Стержень

1

1000000

Воздух

1

0

Задача магнитостатики в общем виде формулируется в следующим образом:

(1)       , где  - векторный потенциал поля,  - плотность тока,  - магнитная проницаемость.

(2)       .

В соответствии с этим решение также имеет только одну ненулевую компоненту:

(3)       .

Тогда уравнение (1) можно переписать в скалярном виде:

(4)       .

Практическую ценность представляет собой не значение потенциала , а значение магнитной индукции . В соответствии с определением векторного потенциала:

(5)       .

В линейной задаче магнитная проницаемость железа постоянна для всего сердечника, в нелинейной задаче сердечник размагничивается и задается табличная зависимость .

Переходим к вариационной постановке задачи:

Решение задачи будем искать в Гильбертовом пространстве H1 с введенным скалярным произведением и порождаемой им нормой.

Домножим уравнение скалярно на функцию v0 H10

                                                                             

Методы решения задачи.

При решении линейной задачи в качестве решателя использовался метод ЛОС с предобуславливанием Холесского.

Нелинейная задача была решена методом простой итерации с использованием коэффициента релаксации.

Текст программы

Файл main.cpp

#include <conio.h>

#include <stdio.h>

#pragma hdrstop

#include "myclass.h"

void main()

{

clrscr();

field a;

SLAU my;

a.read_data();

my.formier_slau(a);

my.LOS();

my.x.print_vect("d:\\file\\res_my.txt");

printf("OK");

getch();

}

Файл const.h

#ifndef constH

#define constH

const char *FILE_XY="d:\\file\\xy.dat";

const char *FILE_INF2TR="d:\\file\\inf2tr.dat";

const char *FILE_NVTR="d:\\file\\nvtr.dat";

const char *FILE_MU="d:\\file\\mu";

const char *FILE_TOKU="d:\\file\\toku";

const char *FILE_KT1="d:\\file\\l1.dat";

const double MAX=1e60;

const double MAX_ITER=5000;

const double EPS=1e-15;

#endif


Файл myclass.h

//--------------------------------------------------------------------------#ifndef myclassH

#define myclassH

#include <math.h>

const long M=3;

//const double mu0=4.*M_PI*1e-7;

const double mu0=4.*M_PI*1e-7;

//

//--------------------------------------------------------------------------//структура - узлы сетки двумерной области

struct knot

{

double x;

double y;

};

//массив узлов сетки

struct mas_knot

{

knot *mas;

long n;

};

//-----------------------------------------------------//Локальная область

struct loc

{

long num_knot[3];//номера узлов в составе эл-та

long num_mat;//номер материала

};

//-----------------------------------------------------//массив локальных ообластей

struct mas_loc

{

loc *mas;

long n;

};

//------------------------------------------------------//Материал

struct mat

{

double toku;

double mu;

long num;

};

//------------------------------------------------------//Список материалов

struct mas_mat

{

mat *mas;

long n;

};

//1-е краевое

struct kt1

{

long num;

double a;

};

struct mas_kt1

{

kt1 *mas;

long n;

};

//------------------------------------------------------// Исходная область

class field

{

public:

mas_knot m_knot;// определяем узлы

mas_loc m_loc;// определяем локальные области

mas_mat m_mat;  // определяем список материалов

mas_kt1 m_kt1;

//можно сюда добавить краевые условия

void read_data();

double mes(long i);// Мера i-области (i=0..N-1)

double get_mu(long i);

double get_toku(long i);

};

//-------------------------------------------------------//список для эл-тов типа long

class list_long

{

public:

long el;

list_long *next;

list_long();

void add_el(long);

void del_el(long);

void free_list();

void print_list();

long get_ammount();

void copy_to_mas(long*);

};

//--------------------------------------------------------class VECTOR

{

public:

double *vect;

long n;

VECTOR();

VECTOR(long);

VECTOR(const VECTOR &a);

~VECTOR();

VECTOR operator=(VECTOR);

VECTOR operator+(VECTOR);

VECTOR operator-(VECTOR);

double operator*(VECTOR);

friend VECTOR operator*(double,VECTOR);

Информация о работе