курсачи / MINOBRNAUKI_ROSSII
.docxМИНОБРНАУКИ РОССИИ
Государственное образовательное учреждение
высшего профессионального образования
Санкт-Петербургский государственный электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
ФАКУЛЬТЕТ ЭЛЕКТРОНИКИ (ФЭЛ)
КАФЕДРА Радиотехнической электроники
КУРСОВАЯ РАБОТА (ПРОЕКТ)
По дисциплине: ПРОГРАММНЫЕ СРЕДСТВА МОДЕЛИРОВАНИЯ ЭЛЕКТРОННОЙ КОМПОНЕНТНОЙ БАЗЫ
На тему: Разработка модуля программы анализа электронного прибора
(указывается обобщенная тема)
Вариант № 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 -Распределение заряда
Список литературы
Синев А.Е. Методические указания «Компьютерное моделирование и проектирование электронных приборов». Изд-во СПбГЭТУ «ЛЭТИ», 2004.
Р. Хокни, Дж. Иствуд Численное моделирование методом частиц. – М.: Мир, 1987.
Федоренко Р.П. Введение в вычислительную физику: Учебное пособие - М.: Изд-во МФТИ, 1994.
http://www.cyberforum.ru