点堆中子动力学方程求解程序

我学的是核科学与技术专业,本科和硕士期间写了不少程序,如计算堆芯中子动力学的,计算流体力学的。但多数仅针对具体问题,通用性有些不足。硕士修了一门仿真技术的课程,我的作业是求解点堆中子动力学程序,靠这个还拿了优秀。觉得这个程序还蛮通用的,对于同专业的搞个大作业,或用于毕设等或许有帮助。

详细的推导、验证过程、程序代码见:https://github.com/ikheu/point_reactor

1、概述

计算中子通量密度的瞬变特性,对反应堆动力系统的运行安全分析与仿真而言十分重要。点堆中子动力学模型是反应堆动态学中最常用的方法。

点堆中子动力学模型描述了中子密度和缓发中子先驱核浓度随时间变化的规律,基本方程如式(1)所示。由于瞬发中子寿命与缓发中子寿命间存在着数量级的差别,耦合的点堆动力学微分方程组存在着刚性,这给数值求解带来了一定困难。常规的显式方法,如欧拉法、龙格库塔法在计算该问题时会存在稳定性问题,这要求时间步长需取得很小,会带来计算耗时以及大的累计误差。针对点堆动力学方程组的刚性问题,发展了许多种处理方法,包括:(1)线性多步法,如GEAR算法及其改进形式;(2)基于积分方程的方法,如Hansen方法;(3)分段多项式逼近法,如埃尔米特插值型;(4)权重限制法;(5)指数基函数法等。

$\left\{ \begin{gathered}
\frac{{dn(t)}}{{dt}} = \frac{{\rho (t) - \beta }}{\Lambda }n(t) + \sum\limits_{i = 1}^I {{\lambda _i}{C_i}(t)} + q \hfill \\
\frac{{d{C_i}(t)}}{{dt}} = \frac{{{\beta _i}}}{\Lambda }n(t) - {\lambda _i}{C_i}(t){\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} i = 1,2,...,I \hfill \\ 
\end{gathered} \right.                 (1)$

式中,${n(t)}$为中子密度;

${{C_i}(t)}$为第i组缓发中子先驱核的浓度;

${\rho (t)}$为反应性;

$\Lambda$为中子代时间;

${{\lambda _i}}$为第i组缓发中子先驱核衰变常数;

${{\beta _i}}$为第i组缓发中子份额;

$\beta$为缓发中子的总份额;

$q$为外加中子源项。

本文使用一阶泰勒多项式积分方法求解点堆动力学方程,该方法能很好地解决方程的刚性问题,具有计算精度高、适用性好的特点。文章内容包括:探讨点堆方程的刚性问题;给出一阶泰勒多项式积分方法的推导过程及计算流程;编制计算程序,完成计算验证与相关讨论。

2 一阶泰勒多项式积分方法

详细的推导过程有些繁琐,这里只说明其中两个关键的步骤。

第一个是积分处理。合并式(1),并在$\left[ {{t_n},{t_{n + 1}}} \right]$区间内积分,可获得式(2):

$n({t_{n + 1}}) - n({t_n}) = \int_{{t_n}}^{{t_{n + 1}}} {\frac{{\rho (t)}}{\Lambda }n(t)}  - \sum\limits_{i = 1}^6 {[{C_i}({t_{n + 1}}) - {C_i}({t_n})]}  + q \cdot h              (2)$

第二个是对中子密度作一阶泰勒展开:

$n(\tau ) = n({t_{n + 1}}) + {n^,}({t_{n + 1}})(\tau  - {t_{n + 1}})                    (3)$

经过一系列的推导,可获得中子密度的表达式:

$n({t_{n + 1}}) = \frac{{n({t_n}) + q \cdot h + \sum\limits_{i = 1}^6 {{C_i}({t_n})}  - \sum\limits_{i = 1}^6 {\exp ( - {\lambda _i}h){C_i}({t_n})}  + \frac{{({F_2} - \sum\limits_{i = 1}^6 {\frac{{{\beta _i}}}{\Lambda }{G_{2,i}})} (\sum\limits_{i = 1}^6 {{\lambda _i}\exp ( - {\lambda _i}h){C_i}({t_n})}  + q)}}{{(1 - \sum\limits_{i = 1}^6 {\frac{{{\lambda _i}{\beta _i}}}{\Lambda }{G_{2,i}}} )}}}}{{1 - {F_1} + \sum\limits_{i = 1}^6 {\frac{{{\beta _i}}}{\Lambda }{G_{1,i}}}  - ({F_2} - \sum\limits_{i = 1}^6 {\frac{{{\beta _i}}}{\Lambda }{G_{2,i}})} (\frac{{\rho ({t_{n + 1}}) - \beta }}{\Lambda } + \sum\limits_{i = 1}^6 {\frac{{{\lambda _i}{\beta _i}}}{\Lambda }{G_{1,i}}} )/(1 - \sum\limits_{i = 1}^6 {\frac{{{\lambda _i}{\beta _i}}}{\Lambda }{G_{2,i}}} )}}             (4)$

截断误差是该方法的主要误差来源,可考虑更高阶数的泰勒展开,当然这会使模型更加复杂(上式已经很复杂了),求解过程也不够简便。

下图为本方法的计算流程图。

首先给出初始条件,即${t_n} = 0$时的${n(t)}$、 ${{C_i}(t)}$,确定已知项${\rho (t)}$、 ${{\lambda _i}}$、${{\beta _i}}$、$q$等;然后给定计算条件:计算时长与时间步长;逐时刻依次计算下一时刻${t_{n + 1}} = {t_n} + \Delta t$ 时的$n({t_{n + 1}})$、${n^,}({t_{n + 1}})$与${C_i}({t_{n + 1}})$,直至达到设置的计算时间。

认为反应堆初始状态是稳定的,给定初始的中子密度$n(0)$,根据式(1)可得:

$\frac{{d{C_i}(t)}}{{dt}} = 0{\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt}  \Rightarrow {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {C_i}(0) = \frac{{{\beta _i}}}{{{\lambda _i}\Lambda }}n(0)                    (5)$

使用老掉牙的Fortran90程序编制的计算程序,博客里甚至没有这个语言的着色,IT行业估计也没人用这个,所以代码就不贴了。可以在文章开头的github链接里找到。

3 计算结果

这里给出了四种反应性引入,包括正反应性阶跃、负反应性阶跃、反应性线性变化、反应性正弦变化情形下,典型热中子堆的中子密度响应曲线:

github链接中有个“点堆模型与求解.pdf”的文件,可以在其中找到计算结果与解析解的比较和分析。计算程序还适用于快中子堆的求解。

原文地址:https://www.cnblogs.com/ik-heu/p/8331794.html

时间: 2024-08-01 22:37:06

点堆中子动力学方程求解程序的相关文章

利用“三角化”计算行列式快速求解程序(验证过很多题目的,绝对准确)

#include<iostream>#include<cmath>using namespace std;void main(){ //输入行列式开始 int n,i,j,a[10][10],T[10],max[10],b[10],k,q,p; float t[10][10],c,sum=-1; cout<<"阶数:"; cin>>n; cout<<"行列式:"<<endl; for(i=1;i

【摄影测量学空间后方交会作业】求解程序

#include <stdio.h> #include<cmath>#include<iostream.h>#include<fstream.h> int main(){     double NJZ(double sum[100][100],double l[10]); double x[10],y[10],X[10],Y[10],Z[10],d,D,m,f,T,R,S,r=0,s=0,t=0; ifstream   infile; //定义输入文件类  

表达式求解程序(CPP实现)

/** *    This is a program for solve mathematical expression. Just like: *            "1+4*3/2+22*(3+2*(3-4))" * *    To solve this problem, Let us see it by a view of priority. The rules as following: *        1). the priority of plus sign is 1

c++用priority_queue实现最小堆,并求解最大的n个数

1 //c++用priority_queue实现最小堆,并求解很多数中的最大的n个数 2 #include <iostream> 3 #include <queue> 4 #include <time.h> 5 #include <vector> 6 using namespace std; 7 struct Node { 8 double value; 9 int idx; 10 Node (double v, int i): value(v), idx(

数独游戏求解程序

最近玩数独游戏,每行.每列.以及9宫格都包含1-9个数组.觉得这东西很适合用程序来求解.于是我就仿照中国象棋的暴力搜索算法(可参考我之前写的文章极大极小搜索算法),写了一个程序求解数独,直接贴代码了 /** * 模仿象棋程序的搜索算法,写一个求解数独的程序 * @author royhoo * */ public class ShuDu { private int[][] board; // 数独矩阵 private int zeroNum; // 缺失的数字个数 private int fil

导线测量求解程序

坐标的推算[精度==0.00m] 测量学平p135页,电脑算出来的与书上给出的数据分毫不差 今天测量学的实习数据处理 1:输入数据: 2:观测角误差的自动消除: 3:输入起始坐标方位角: 4:坐标方位角的自动推算: 5:坐标增量的推算: 6:坐标增量误差的自动消除: 7:起始坐标的输入: 8:其它导线点的推算: #include<iostream>#include<cmath>#include<iomanip>#define run#define pi 3.141592

ROS系统MoveIt玩转双臂机器人系列(六)--D-H逆运动学求解程序(C++)

注:本篇博文全部源码下载地址为:Git Repo. 1.  源码是在 Ubuntu14.04 + Indigo 环境下编写. 一.转换矩阵 经过上一篇博客介绍,我们已经获得了Rob一个手臂的D-H参数表,如上表所示,我们要把这些参数转换成相邻坐标系的转换矩阵,D和H两位老前辈已经推导出通用公式了,通用公式如图1,其中cθi = cos(θi) ,sθi =  sin(θi ).这是一个4x4的矩阵,它表征了相邻两个坐标系的位置和姿态两个维度的转换关系,具体说明见上一篇博文. 图1 套用图1中的公

iOS程序中的内存分配 栈区堆区全局区(转)

在计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同.一.内存分区 栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等.栈是系统数据结构,对应线程/进程是唯一的.优点是快速高效,缺点时有限制,数据不灵活.[先进后出] 栈空间分静态分配 和动态分配两种. 静态分配是编译器完成的,比如自动变量(auto)的分配. 动态分配由alloca函数完成. 栈的动态分配无需释放(是自动的),也就没有释放函数. 为可移植的程序起见,栈的动态分配操作是不

内存管理:栈区,堆区,全局区,文字常量区,程序代码区

一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其 操作方式类似于数据结构中的栈. 2.堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(static)-,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变