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

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

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

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

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

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

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

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

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

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

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

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

Вариант № 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- Распределение заряда

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

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

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

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

  4. http://www.cyberforum.ru

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