SCR截面速度、氨氮比等标准及相对标准偏差计算。
程序用来处理fluent通过xyplot导出的数据,导出可以选择多个平面,可计算标准偏差SD、相对标准偏差RSD,平均速度,适用于求解多个平面
# -*- coding: utf-8 -*-
"""
Created on Wed Sep 20 20:40:30 2023
该程序用来处理fluent通过xyplot导出的数据,导出可以选择多个平面,可计算标准偏差SD、相对标准偏差RSD,平均速度,适用于求解多个平面
联系QQ:3123575367,专业SCR脱硝仿真。
@author: PS
"""
import chardet #识别文件的编码格式
#确定文件编码格式
def check_code(text):
#detect函数只需要一个 非unicode字符串参数,返回一个字典。该字典包括判断到的编码格式及判断的置信度。
with open(text, 'rb') as f:
adchar = chardet.detect(f.read())
# adchar = chardet.detect(text)
# 由于windows系统的编码有可能是Windows-1254,打印出来后还是乱码,所以不直接用adchar['encoding']编码
if adchar['encoding'] == 'gbk' or adchar['encoding'] == 'GBK' or adchar['encoding'] == 'GB2312':
return 'GB2312'
else:
return 'utf-8'
# lists_dict ={}
# for i in range(num_lists):
# lists_dict[f"list_{i}"] = []
# print(lists_dict)
# lists_dict[list_0]
#读取文件并进行计算
def read_file_text(file_url):
# num_lists = eval(input("请输入要面的数量:"))
with open(file_url, 'r',encoding=check_code(file_url)) as f0:
row_nul = 2
for i in range(row_nul):
next(f0)#跳行,跳过前两行
f0_word = f0.readlines() #读取每一行
plane_name = []
# for i in range(array.shape[0]):
ls = []
#将文本数据按照行整理到列表中
for line in f0_word:
line = line.strip('\n')#将每段的回车替换为空格
line = line.replace(')','')
words = line.split()#将字符串以空格分开
# if ls !=""
# point_num
ls.append(words)
ls = list(filter(None,ls))#删除空列表
# print(ls)
sub_lists=[] #将非字符替换成002100
for j in range(len(ls)):
try:
sub_lists.append(float(ls[j][1])) #保存每一行的第1列
except:
print(ls[j][1])
plane_name.append(ls[j][1]) #保存名字
sub_lists.append("002100") #将名字所在的位置替换成002100
print("跳出")
# break
continue
#通过特定字符分割列表
# 要分割的元素
split_element = '002100'
# 初始化结果列表
result = []
temp_list = []
# 遍历原始列表
for item in sub_lists:
if item == split_element:
# 如果遇到分割元素,将临时列表添加到结果列表,并重置临时列表
if temp_list:
result.append(temp_list)
temp_list = []
else:
# 否则,将当前元素添加到临时列表
temp_list.append(item)
# 添加最后一个子列表到结果列表
if temp_list:
result.append(temp_list)
res_rec_cv ={}#储存相对标准偏差(RSD)%
res_rec_vec ={}#储存速度
for i in range(len(plane_name)):
print("===========================")
print(plane_name[i])
y = result[i]
#计算
#计算含0的数据
mean = sum(y)/len(y)
qh =[]
for num in y:
qh.append(pow(num-mean,2))
qv = pow(sum(qh)/(len(qh)-1),0.5) #标准偏差
cv = qv/mean #相对标准偏差
print('+++++++未操作数据 +++++++')
print(f'平均值为:{round(mean,4)}')
print(f'标准偏差(SD)为:{round(qv*100,4)} %\n相对标准偏差(RSD)为:{round(cv*100,4)} %')
#计算去除0后的数据
y_no_zero = [i for i in y if i!= 0] #去除0元素
mean_no_zero = sum(y_no_zero)/len(y_no_zero)
qh_no_zero = [pow(num-mean_no_zero,2) for num in y_no_zero]
qv_no_zero = pow(sum(qh_no_zero)/(len(qh_no_zero)-1),0.5)
cv_no_zero = qv_no_zero/mean_no_zero
# res_rec_cv[plane_name[i]] = cv_no_zero*100#填充字典
# res_rec_vec[plane_name[i]] = mean_no_zero#填充字典
print('------------去除 0 数据------------')
print(f'平均值为:{round(mean_no_zero,4)}')
print(f'标准偏差(SD)为:{round(qv_no_zero*100,4)} %\n相对标准偏差(RSD)为:{round(cv_no_zero*100,4)} %')
#计算去除指定后的数据
y_no_dz = [i for i in y if i> 20] #由于近壁面效应,考虑除去改数值
mean_no_dz = sum(y_no_dz)/len(y_no_dz)
qh_no_dz = [pow(num-mean_no_dz,2) for num in y_no_dz]
qv_no_dz = pow(sum(qh_no_dz)/(len(qh_no_dz)-1),0.5)
cv_no_dz = qv_no_dz/mean_no_dz
res_rec_cv[plane_name[i]] = cv_no_dz*100#填充字典
res_rec_vec[plane_name[i]] = mean_no_dz#填充字典
print('------------去除 0 数据------------')
print(f'平均值为:{round(mean_no_zero,4)}')
print(f'标准偏差(SD)为:{round(qv_no_zero*100,4)} %\n相对标准偏差(RSD)为:{round(cv_no_zero*100,4)} %')
print("<><><><><><><><><>><><><><><")
print("相对标准偏差(RSD)%")
for key,value in res_rec_cv.items():
print(key,value,"%")
print("<><><><><><><><><>><><><><><")
print("速度平均值 m/s ")
for key,value in res_rec_vec.items():
print(key,value,"m/s")
read_file_text(r'D:\20241014-lc\CASE6-BOT\2\MODEL.xy') #只需要更改此处
#
计算结果如图: