Скачиваний:
9
Добавлен:
28.04.2022
Размер:
170.75 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Государственное образовательное учреждение

высшего профессионального образования

Санкт-Петербургский государственный электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

ФАКУЛЬТЕТ ЭЛЕКТРОНИКИ (ФЭЛ)

КАФЕДРА Радиотехнической электроники

КУРСОВАЯ РАБОТА (ПРОЕКТ)

По дисциплине: ПРОГРАММНЫЕ СРЕДСТВА МОДЕЛИРОВАНИЯ ЭЛЕКТРОННОЙ КОМПОНЕНТНОЙ БАЗЫ

На тему: Разработка модуля программы анализа электронного прибора

(указывается обобщенная тема)

Вариант № 18

Выполнил

Оценка

студентка гр.№

5201

Проверил

Синев А. Е.

Симилейская К.В.

(ФИО)

(ФИО)

Дата

САНКТ-ПЕТЕРБУРГ

2019г.

ЗАДАНИЕ на курсовую работу

По дисциплине: ПРОГРАММНЫЕ СРЕДСТВА МОДЕЛИРОВАНИЯ ЭЛЕКТРОННОЙ КОМПОНЕНТНОЙ БАЗЫ

Вариант № 4.

Название курсовой работы:

Модуль расчёта пространственного заряда CIC-методом для МКЭ.

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

Разработка алгоритма и программы на С++ для численного расчёта пространственного заряда с использованием CIC-метода для параллелепипеда.

Исходные данные:

1) Координаты и размеры ячеек-параллелепипедов.

2) Набор трубок тока в виде последовательностей отрезков прямой с заданными параметрами: – координаты концов отрезков; – распределение заряда на каждом отрезке.

Результаты работы:

1. Программа расчёта пространственного заряда. 2. Методика тестирования и отладки программы.

Литература:

1. Internet.

2. Р. Хокни, Дж. Иствуд Численное моделирование методом частиц. – М.: Мир, 1987.

Метод Cloud in Cell (CIC)

Существует несколько методов вычисления плотности заряда по координатам моделирующих частиц. Самым простым из них является метод «ближайшего пространственного узла» («nearestgridpoint» или сокращенно NGP). В этом методе полный заряд точечной частицы приписывается ближайшему узлу пространственной сетки.Эта процедура распределения заряда может быть представлена в виде схемы, изображенной на рисунке 1

Рисунок - 1

Существует схема более плавного распределения заряда по узлам сетки, которая называется методом «облаков в ячейке» («cloud-in-cell» или сокращенно CIC). В этой схеме частицы представляются «прозрачными» заряженными облаками, способными проходить друг сквозь друга. Они могут иметь любую удобную форму и распределение плотности заряда. Метод облаков сглаживает флуктуации, свойственные методу NGP.

В CIC-методе необходимо определить процедуру вычисления распределения плотности заряда в плазме, а также вычисления электрического поля, действующего на облако. Простейшим методом вычисления плотности заряда является разделение заряда облака по нескольким узлам сетки согласно процедуре «весового распределения по площадям» («area-weighted»). Следуя этой процедуре, мы определяем вклад каждой частицы в ближайшие узлы пространственной сетки пропорционально частям облака (рис.2)

Рисунок - 2

Теперь мы увидим, как такое зарядовое перераспределение дискретизируется, принимая:

Функция MOD в программном пакете MatLab нахождения числа по некоторому модулю.

MOD(X,Y) = X - n * Y, где n = floor(X/Y).

Примеры (4 различных случая, соответствующих различным комбинациям знаков делимого и делителя):

1) mod(11,7) = 4;

2) mod(-11,7) = 3

3) mod(11,-7) = -3

4) mod(-11,-7) = -4

Для случая на рисунке 2 (серая область) имеем:

Код программы в С++

#include<stdafx.h>

#include<iostream>

#include<cstdlib>

#include<math.h>

#include<stdlib.h>

usingnamespace std;

int main()

{

setlocale( LC_ALL, "Russian" );

float a,x,y,z,H,v,xp,yp,zp,I,P;

int i,j,k,l,m,n;

int num,N; // размермассива

cout <<"Сколько отрезков прямой? ";

cin >> num; // получение от пользователя количества стержней

cout <<"Сколько узлов сетки ";

cin >> N; // получение от пользователя количество узлов

cout <<"Какова скорость частиц? ";

cin >> v; // получение от пользователя скорости электронов

cout <<"Какова сила тока в отрезках ";

cin >> I; // получение от пользователя силы тока

i = j = k = 0;

cout <<"Каков шаг сетки? ";

cin >> H;

float *p_startx = newfloat[num]; // Создание памяти для массива

float *p_finishx = newfloat[num];

float *p_starty = newfloat[num];

float *p_finishy = newfloat[num];

float *p_mesh = newfloat[N];

float *l_linex = newfloat[num];

float *h_linex = newfloat[num];

float *l_liney = newfloat[num];

float *h_liney = newfloat[num];

float *p_total = newfloat[num];

float *p_charge = newfloat[num];

for (int l = 0; l < num; l++) {

// Заполнение массива и вывод значений его элементов

cout <<"Начальная координата отрезка X ";

cin >> a;

p_startx[l] = a;

cout <<"Конечная координата отрезка Y ";

cin >> a;

p_starty[l] = a;

//cout << "Введите начальную координату стержня Z ";

//cin >> a;

//p_start[n] = a;

cout <<"Начальная координата отрезка X ";

cin >> a;

p_finishx[l] = a;

cout <<"Конечная координата отрезка Y ";

cin >> a;

p_finishy[l] = a;

//cout << "Введите конечную координату стержня Z ";

//cin >> a;

//p_finish[n] = a;

l_linex[l]=sqrt((p_finishx[l] - p_startx[l])*(p_finishx[l] - p_startx[l]));

cout <<" длина отрезка по оси x "<< l <<" равно "<< l_linex[l] << endl;

l_liney[l]=sqrt((p_finishy[l] - p_starty[l])*(p_finishy[l] - p_starty[l]));

cout <<" длина отрезка по оси y "<< l <<" равно "<< l_liney[l] << endl;

//l_line[n]= ((p_start[n]-p_finish[n]) * (p_start[n]-p_finish[n])) ;

// cout << "значение длины стержня " << n << " равно " << l_line[n] << endl;

h_linex[l]= (l_linex[l]/(4*N)) ;

cout <<"шаг по оси x "<< l <<" равно "<< h_linex[l] << endl;

h_liney[l]= (l_liney[l]/(4*N)) ;

cout <<" шагпооси y "<< l <<" равно "<< h_liney[l] << endl;

//h_line[n]= (l_line[n]/N) ;

// cout << "значение длины стержня " << n << " равно " << h_line[n] << endl;

}

x = y = z = P = 0;

for (int i = 0; i < N; i++) { // циклзанулеения

for (int j= 0; j < N; j++) {

p_total[i,j,k]=0;

p_mesh[i,j,k]=0;

}

}

for (int i = 0; i < N; i++) { //в данном цикле происходит

for (int j= 0; j < N; j++) { //поиск значений попадающий в определнную ячейку

p_total[i,j,k]=0; //посхеме NGP

for (int l = 0; l < num; l++) {

for ( xp = p_startx[l], yp = p_starty[l];

yp < l_liney[l] & xp < l_linex[l];

xp = xp + h_linex[l], yp = yp + h_liney[l]) {

x=(xp-i*H);// переход от глобальной координаты к локальной

y=(yp-j*H);

if (x < H/2 && x > -(H/2)) {

if (x == H/2) {

if (y < H/2 && y > -H/2) {

if (y == H/2)

{p_mesh[i,j,k] = 0.5;}

else {p_mesh[i,j,k] = 1;}

}

else {p_mesh[i,j,k] = 0;}

}

else {

if (y < H/2 && y > -H/2) {

if (y == H/2)

{p_mesh[i,j,k] = 0.5;}

else {p_mesh[i,j,k] = 1;}

}

else {p_mesh[i,j,k] = 0;}

}

}

else {

p_mesh[i,j,k] = 0;

}

P=(I*sqrt(h_linex[l]*h_linex[l]+h_liney[l]*h_liney[l]))/(N*v*H*H*H);

//подсчет плотности пространственного заряда

//и вывод его в каждой ячейки

p_total[i,j,k] = P*p_mesh[i,j,k] + p_total[i,j,k];

}

if (h_liney[l] == 0)

break;

// условия при которых при нулевом шаге вычисления проходить не будут

if (h_linex[l] == 0)

break;

}

cout <<"значение плотности поверхностного заряда "<< i << j << k <<

" узла, равна "<< p_total[i,j,k] << endl;

}

}

system("pause");

delete [] p_startx; // очисткапамяти

delete [] p_finishx;

delete [] p_starty;

delete [] p_finishy;

delete [] l_linex;

delete [] h_linex;

delete [] l_liney;

delete [] h_liney;

delete [] p_mesh;

delete [] p_charge;

return 0;

}

Тестирование программы

Для проверки нашей программы рассмотрим 2 отрезка прямой выходящих из центра ячейки с координатами x=0, y=0

Рисунок 3- Результаты тестирования

Таблица 1. Результаты тестирования

j\i

0

1

2

3

0

0.0211

0

0

0

1

0.0046

0.0253

0

0

2

0

0.014

0.088

0

3

0

0.0046

0.0047

0

Рисунок 1 -Распределение заряда

Список литературы

  1. Синев А.Е. Методические указания «Компьютерное моделирование и проектирование электронных приборов». Изд-во СПбГЭТУ «ЛЭТИ», 2004.

  2. Р. Хокни, Дж. Иствуд Численное моделирование методом частиц. – М.: Мир, 1987.

  3. Федоренко Р.П. Введение в вычислительную физику: Учебное пособие - М.: Изд-во МФТИ, 1994.

  4. http://www.cyberforum.ru

Соседние файлы в папке курсачи