курсачи / Kursovaya
.docxМИНОБРНАУКИ РОССИИ
Государственное образовательное учреждение
высшего профессионального образования
Санкт-Петербургский государственный электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
ФАКУЛЬТЕТ ЭЛЕКТРОНИКИ (ФЭЛ)
КАФЕДРА Радиотехнической электроники
КУРСОВАЯ РАБОТА (ПРОЕКТ)
По дисциплине: ПРОГРАММНЫЕ СРЕДСТВА МОДЕЛИРОВАНИЯ ЭЛЕКТРОННОЙ КОМПОНЕНТНОЙ БАЗЫ
На тему: Разработка модуля программы анализа электронного прибора
(указывается обобщенная тема)
Вариант № 4
Выполнил |
|
|
Оценка |
|
студент гр. № |
5201 |
|
Проверил |
Синев А. Е. |
|
Гребенкина М.А. |
|
|
(ФИО) |
|
(ФИО) |
|
Дата |
|
САНКТ-ПЕТЕРБУРГ
2019 г.
ЗАДАНИЕ на курсовую работу
По дисциплине: ПРОГРАММНЫЕ СРЕДСТВА МОДЕЛИРОВАНИЯ ЭЛЕКТРОННОЙ КОМПОНЕНТНОЙ БАЗЫ
Вариант № 4.
Название курсовой работы: |
Модуль расчёта пространственного заряда CIC-методом для конечно-разностной ячейки. |
Содержание работы: |
Разработка алгоритма и программы на С++ для численного расчёта пространственного заряда с использованием CIC-метода для параллелепипеда . |
Исходные данные: |
1) Координаты и размеры ячеек-параллелепипедов. 2) Набор трубок тока в виде последовательностей отрезков прямой с заданными параметрами: – координаты концов отрезков; – распределение заряда на каждом отрезке. |
Результаты работы: |
1. Программа расчёта пространственного заряда. 2. Методика тестирования и отладки программы. |
Литература: |
1. Internet. 2. Р. Хокни, Дж. Иствуд Численное моделирование методом частиц. – М.: Мир, 1987. |
Метод Cloud in Cell (CIC)
Существует несколько методов вычисления плотности заряда по координатам моделирующих частиц. Самым простым из них является метод «ближайшего пространственного узла» («nearest grid point» или сокращенно NGP). В этом методе полный заряд точечной частицы приписывается ближайшему узлу пространственной сетки. Эта процедура распределения заряда может быть представлена в виде схемы, изображенной на рисунке 1
Рисунок 1
Также есть схема более плавного распределения заряда по узлам сетки, которая называется методом «облаков в ячейке» («cloud-in-cell» или сокращенно CIC). В этой схеме частицы представляются «прозрачными» заряженными облаками, способными проходить друг сквозь друга. Они могут иметь любую удобную форму и распределение плотности заряда. Метод облаков сглаживает флуктуации, свойственные методу NGP.
В CIC-методе необходимо определить процедуру вычисления распределения плотности заряда в плазме, а также вычисления электрического поля, действующего на облако. Вклад заряда частицы в узлы сетки пропорционален части площади, попавшей в ячейку, окружающую соответствующий узел. Здесь не накладывают определенного соотношения между размерами частицы и ячейки. Простейшим методом вычисления плотности заряда является разделение заряда облака по нескольким узлам сетки согласно процедуре «весового распределения по площадям» («area-weighted»). Следуя этой процедуре, мы определяем вклад каждой частицы в ближайшие узлы пространственной сетки пропорционально частям облака (рис.2)
Рисунок 2
Код программы в С++
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <stdlib.h>
using namespace 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 = new float[num]; // Создание памяти для массива
float *p_finishx = new float[num];
float *p_starty = new float[num];
float *p_finishy = new float[num];
float *p_mesh = new float[N];
float *l_linex = new float[num];
float *h_linex = new float[num];
float *l_liney = new float[num];
float *h_liney = new float[num];
float *p_total = new float[num];
float *p_charge = new float[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 << "Конечная координата отрезка X ";
cin >> a;
p_finishx[l] = a;
cout << "Конечная координата отрезка Y ";
cin >> a;
p_finishy[l] = 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;
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;
}
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 |
Рисунок 4- Распределение заряда
Список литературы
Синев А.Е. Методические указания «Компьютерное моделирование и проектирование электронных приборов». Изд-во СПбГЭТУ «ЛЭТИ», 2004.
Р. Хокни, Дж. Иствуд Численное моделирование методом частиц. – М.: Мир, 1987.
Федоренко Р.П. Введение в вычислительную физику: Учебное пособие - М.: Изд-во МФТИ, 1994.
http://www.cyberforum.ru