User: 模拟过程出错: No boundary conditions were applied to any surfaces! ---------------
```python
import os
import gymnasium as gym
import numpy as np
from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_vec_env
import openmc
import matplotlib.pyplot as plt

#plt.style.use(plt.style.available)
openmc.config['cross_sections'] = '/home/unknowxxs/python/data/cross_sections.xml'
class NuclearReactorEnv(gym.Env):
    def __init__(self):
        super().__init__()
        self.action_space = gym.spaces.Discrete(11)  # 控制棒位置，0-10
        
        # 观察空间：温度、功率、k_eff、控制棒位置、燃料燃耗
        self.observation_space = gym.spaces.Box(
            low=np.array([500, 0, 0.5, 0, 0]),
            high=np.array([1500, 3000, 1.5, 1, 100]),
            dtype=np.float32
        )
        
        self.max_steps = 1000
        self.current_step = 0
        self._setup_model()
        
    def _setup_model(self):
        # 设置材料
        # UO2燃料
        self.fuel = openmc.Material(name='fuel')
        self.fuel.add_nuclide('U235', 0.05)
        self.fuel.add_nuclide('U238', 0.95)
        self.fuel.add_nuclide('O16', 2.0)
        self.fuel.set_density('g/cm3', 10.0)
        self.fuel.temperature = 900  # K

        # 水冷却剂
        self.water = openmc.Material(name='water')
        self.water.add_nuclide('H1', 2)
        self.water.add_nuclide('O16', 1)
        self.water.set_density('g/cm3', 1.0)
        self.water.temperature = 600  # K

        # 控制棒 (B4C)
        self.control_rod = openmc.Material(name='control_rod')
        self.control_rod.add_nuclide('B10', 0.8)
        self.control_rod.add_nuclide('B11', 0.2)
        self.control_rod.add_nuclide('C12', 1.0)
        self.control_rod.set_density('g/cm3', 2.52)

        # 创建材料集合
        self.materials = openmc.Materials([self.fuel, self.water, self.control_rod])
        
        # 创建几何体
        # 简化的圆柱形反应堆堆芯
        cylinder = openmc.ZCylinder(r=100)
        fuel_region = -cylinder
        
        fuel_cell = openmc.Cell(fill=self.fuel, region=fuel_region)
        
        # 创建universe和geometry
        root_universe = openmc.Universe(cells=[fuel_cell])
        self.geometry = openmc.Geometry(root_universe)

    # 创建材料集合并生成 XML
        self.materials = openmc.Materials([self.fuel, self.water, self.control_rod])
        self.materials.export_to_xml()  # 生成 materials.xml
    
    # 创建几何体
    # [代码创建几何]
    
    # 创建universe和geometry并生成 XML
        root_universe = openmc.Universe(cells=[fuel_cell])
        self.geometry = openmc.Geometry(root_universe)
        self.geometry.export_to_xml()  # 生成 geometry.xml
    
    # 设置模拟参数并生成 XML
        self.settings = openmc.Settings()
        self.settings.batches = 100
        self.settings.inactive = 10
        self.settings.particles = 1000
        self.settings.temperature = {'method': 'interpolation'}
        self.settings.export_to_xml()  # 生成 settings.xml        
      
        
        
    def init_visualization(self):
        """初始化可视化图表"""
        plt.ion()  # 开启交互模式
        self.fig, self.axs = plt.subplots(2, 2, figsize=(15, 10))
        self.fig.suptitle('核反应堆运行状态监测', fontsize=16)
        
        # 初始化数据存储
        self.history = {
            'temperature': [],
            'power': [],
            'k_eff': [],
            'burnup': [],
            'control_rod': [],
            'steps': []
        }
        
        # 配置子图
        self.lines = {}
        
        # 温度和功率图
        self.axs[0, 0].set_title('温度和功率变化')
        self.axs[0, 0].set_xlabel('步数')
        self.lines['temp'], = self.axs[0, 0].plot([], [], 'r-', label='温度 (K)')
        self.lines['power'], = self.axs[0, 0].plot([], [], 'b-', label='功率 (MW)')
        self.axs[0, 0].legend()
        
        # k_eff图
        self.axs[0, 1].set_title('k_eff变化')
        self.axs[0, 1].set_xlabel('步数')
        self.lines['k_eff'], = self.axs[0, 1].plot([], [], 'g-', label='k_eff')
        self.axs[0, 1].axhline(y=1.0, color='r', linestyle='--', label='临界值')
        self.axs[0, 1].legend()
        
        # 控制棒位置图
        self.axs[1, 0].set_title('控制棒位置')
        self.axs[1, 0].set_xlabel('步数')
        self.lines['control'], = self.axs[1, 0].plot([], [], 'k-', label='控制棒位置')
        self.axs[1, 0].legend()
        
        # 燃耗图
        self.axs[1, 1].set_title('燃料燃耗')
        self.axs[1, 1].set_xlabel('步数')
        self.lines['burnup'], = self.axs[1, 1].plot([], [], 'm-', label='燃耗 (MWd/kgU)')
        self.axs[1, 1].legend()
        
        plt.tight_layout()

    def update_visualization(self):
        """更新可视化图表"""
        # 更新历史数据
        self.history['temperature'].append(self.temperature)
        self.history['power'].append(self.power)
        self.history['k_eff'].append(self.k_eff)
        self.history['burnup'].append(self.burnup)
        self.history['control_rod'].append(self.control_rod_pos)
        self.history['steps'].append(self.current_step)
        
        # 更新图表
        steps = self.history['steps']
        
        # 更新温度和功率
        self.lines['temp'].set_data(steps, self.history['temperature'])
        self.lines['power'].set_data(steps, self.history['power'])
        self.axs[0, 0].relim()
        self.axs[0, 0].autoscale_view()
        
        # 更新k_eff
        self.lines['k_eff'].set_data(steps, self.history['k_eff'])
        self.axs[0, 1].relim()
        self.axs[0, 1].autoscale_view()
        
        # 更新控制棒位置
        self.lines['control'].set_data(steps, self.history['control_rod'])
        self.axs[1, 0].relim()
        self.axs[1, 0].autoscale_view()
        
        # 更新燃耗
        self.lines['burnup'].set_data(steps, self.history['burnup'])
        self.axs[1, 1].relim()
        self.axs[1, 1].autoscale_view()
        
        plt.draw()
        plt.pause(0.01)

    def reset(self, seed=None):
        super().reset(seed=seed)
        self.current_step = 0
        self.temperature = 600  # K
        self.power = 1000      # MW
        self.k_eff = 1.0
        self.burnup = 0        # MWd/kgU
        self.control_rod_pos = 0.5
        
        # 初始化可视化
        self.init_visualization()
        
        return self._get_observation(), {}
    
    def _get_observation(self):
        return np.array([
            self.temperature,
            self.power,
            self.k_eff,
            self.control_rod_pos,
            self.burnup
        ], dtype=np.float32)
    
    def step(self, action):
        self.current_step += 1
        
        # 更新控制棒位置
        self.control_rod_pos = action / 10.0
        
        # 运行OpenMC模拟
        try:
            # 更新材料温度
            self.fuel.temperature = self.temperature
            
            # 运行临界计算
           # os.remove('/home/unknowxxs/python/statepoint.50.h5')
            result = openmc.run()
         
            
            # 获取k_eff
            with openmc.StatePoint(result) as sp:
                self.k_eff = sp.k_effective.nominal_value
                
            # 更新系统状态
            self._update_state()
            
            # 更新可视化
            self.update_visualization()
            
            # 计算奖励
            reward = self._calculate_reward()
            
            # 检查是否结束
            done = self.current_step >= self.max_steps or self._is_unsafe()
            
        except Exception as e:
            print(f"模拟过程出错: {e}")
            reward = -1000
            done = True
        
        return self._get_observation(), reward, done, False, {}
    
    def _update_state(self):
        # 基于k_eff更新功率
        power_factor = (self.k_eff - 1.0) * 5000
        self.power = np.clip(self.power + power_factor, 0, 3000)
        
        # 更新温度
        delta_temp = (self.power - 1000) * 0.1
        self.temperature = np.clip(self.temperature + delta_temp, 500, 1500)
        
        # 更新燃耗
        self.burnup += self.power * 0.001
        
    def _calculate_reward(self):
        reward = 0
        
        # 奖励稳定的运行状态
        reward -= abs(self.power - 1000) * 0.01  # 目标功率1000MW
        reward -= abs(self.k_eff - 1.0) * 100    # 目标k_eff=1
        reward -= abs(self.temperature - 900) * 0.1  # 目标温度900K
        
        # 惩罚不安全状态
        if self._is_unsafe():
            reward -= 1000
            
        return reward
    
    def _is_unsafe(self):
        return (self.temperature > 1400 or 
                self.power > 2500 or 
                self.k_eff > 1.2)

def train_agent():
    env = make_vec_env(NuclearReactorEnv, n_envs=4)
    
    model = PPO(
        "MlpPolicy",
        env,
        verbose=1,
        learning_rate=0.0003,
        n_steps=2048,
        batch_size=64,
        n_epochs=10
    )
    
    model.learn(total_timesteps=10)
    model.save("ppo_nuclear_reactor")
    
    return model

def evaluate_agent(model, num_episodes=5):
    env = NuclearReactorEnv()
    
    for episode in range(num_episodes):
        obs, _ = env.reset()
        episode_reward = 0
        done = False
        
        while not done:
            action, _ = model.predict(obs)
            obs, reward, done, _, _ = env.step(action)
            episode_reward += reward
            
            # 打印当前状态
            print(f"步骤 {env.current_step}:")
            print(f"温度: {env.temperature:.1f}K")
            print(f"功率: {env.power:.1f}MW")
            print(f"k_eff: {env.k_eff:.3f}")
            print(f"控制棒位置: {env.control_rod_pos:.2f}")
            print(f"燃耗: {env.burnup:.2f}MWd/kgU")
            print("------------------------")
        
        plt.savefig(f'episode_{episode+1}_results.png')
        print(f"Episode {episode + 1}: 总奖励 = {episode_reward:.2f}\n")
    
    plt.close('all')

model = train_agent()
print("\n评估核反应堆控制性能：")
evaluate_agent(model)

```
User: 模拟过程出错: No boundary conditions were applied to any surfaces! ---------------
```python
import os
import gymnasium as gym
import numpy as np
from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_vec_env
import openmc
import matplotlib.pyplot as plt

#plt.style.use(plt.style.available)
openmc.config['cross_sections'] = '/home/unknowxxs/python/data/cross_sections.xml'
class NuclearReactorEnv(gym.Env):
    def __init__(self):
        super().__init__()
        self.action_space = gym.spaces.Discrete(11)  # 控制棒位置，0-10
        
        # 观察空间：温度、功率、k_eff、控制棒位置、燃料燃耗
        self.observation_space = gym.spaces.Box(
            low=np.array([500, 0, 0.5, 0, 0]),
            high=np.array([1500, 3000, 1.5, 1, 100]),
            dtype=np.float32
        )
        
        self.max_steps = 1000
        self.current_step = 0
        self._setup_model()
        
    def _setup_model(self):
        # 设置材料
        # UO2燃料
        self.fuel = openmc.Material(name='fuel')
        self.fuel.add_nuclide('U235', 0.05)
        self.fuel.add_nuclide('U238', 0.95)
        self.fuel.add_nuclide('O16', 2.0)
        self.fuel.set_density('g/cm3', 10.0)
        self.fuel.temperature = 900  # K

        # 水冷却剂
        self.water = openmc.Material(name='water')
        self.water.add_nuclide('H1', 2)
        self.water.add_nuclide('O16', 1)
        self.water.set_density('g/cm3', 1.0)
        self.water.temperature = 600  # K

        # 控制棒 (B4C)
        self.control_rod = openmc.Material(name='control_rod')
        self.control_rod.add_nuclide('B10', 0.8)
        self.control_rod.add_nuclide('B11', 0.2)
        self.control_rod.add_nuclide('C12', 1.0)
        self.control_rod.set_density('g/cm3', 2.52)

        # 创建材料集合
        self.materials = openmc.Materials([self.fuel, self.water, self.control_rod])
        
        # 创建几何体
        # 简化的圆柱形反应堆堆芯
        cylinder = openmc.ZCylinder(r=100)
        fuel_region = -cylinder
        
        fuel_cell = openmc.Cell(fill=self.fuel, region=fuel_region)
        
        # 创建universe和geometry
        root_universe = openmc.Universe(cells=[fuel_cell])
        self.geometry = openmc.Geometry(root_universe)

    # 创建材料集合并生成 XML
        self.materials = openmc.Materials([self.fuel, self.water, self.control_rod])
        self.materials.export_to_xml()  # 生成 materials.xml
    
    # 创建几何体
    # [代码创建几何]
    
    # 创建universe和geometry并生成 XML
        root_universe = openmc.Universe(cells=[fuel_cell])
        self.geometry = openmc.Geometry(root_universe)
        self.geometry.export_to_xml()  # 生成 geometry.xml
    
    # 设置模拟参数并生成 XML
        self.settings = openmc.Settings()
        self.settings.batches = 100
        self.settings.inactive = 10
        self.settings.particles = 1000
        self.settings.temperature = {'method': 'interpolation'}
        self.settings.export_to_xml()  # 生成 settings.xml        
      
        
        
    def init_visualization(self):
        """初始化可视化图表"""
        plt.ion()  # 开启交互模式
        self.fig, self.axs = plt.subplots(2, 2, figsize=(15, 10))
        self.fig.suptitle('核反应堆运行状态监测', fontsize=16)
        
        # 初始化数据存储
        self.history = {
            'temperature': [],
            'power': [],
            'k_eff': [],
            'burnup': [],
            'control_rod': [],
            'steps': []
        }
        
        # 配置子图
        self.lines = {}
        
        # 温度和功率图
        self.axs[0, 0].set_title('温度和功率变化')
        self.axs[0, 0].set_xlabel('步数')
        self.lines['temp'], = self.axs[0, 0].plot([], [], 'r-', label='温度 (K)')
        self.lines['power'], = self.axs[0, 0].plot([], [], 'b-', label='功率 (MW)')
        self.axs[0, 0].legend()
        
        # k_eff图
        self.axs[0, 1].set_title('k_eff变化')
        self.axs[0, 1].set_xlabel('步数')
        self.lines['k_eff'], = self.axs[0, 1].plot([], [], 'g-', label='k_eff')
        self.axs[0, 1].axhline(y=1.0, color='r', linestyle='--', label='临界值')
        self.axs[0, 1].legend()
        
        # 控制棒位置图
        self.axs[1, 0].set_title('控制棒位置')
        self.axs[1, 0].set_xlabel('步数')
        self.lines['control'], = self.axs[1, 0].plot([], [], 'k-', label='控制棒位置')
        self.axs[1, 0].legend()
        
        # 燃耗图
        self.axs[1, 1].set_title('燃料燃耗')
        self.axs[1, 1].set_xlabel('步数')
        self.lines['burnup'], = self.axs[1, 1].plot([], [], 'm-', label='燃耗 (MWd/kgU)')
        self.axs[1, 1].legend()
        
        plt.tight_layout()

    def update_visualization(self):
        """更新可视化图表"""
        # 更新历史数据
        self.history['temperature'].append(self.temperature)
        self.history['power'].append(self.power)
        self.history['k_eff'].append(self.k_eff)
        self.history['burnup'].append(self.burnup)
        self.history['control_rod'].append(self.control_rod_pos)
        self.history['steps'].append(self.current_step)
        
        # 更新图表
        steps = self.history['steps']
        
        # 更新温度和功率
        self.lines['temp'].set_data(steps, self.history['temperature'])
        self.lines['power'].set_data(steps, self.history['power'])
        self.axs[0, 0].relim()
        self.axs[0, 0].autoscale_view()
        
        # 更新k_eff
        self.lines['k_eff'].set_data(steps, self.history['k_eff'])
        self.axs[0, 1].relim()
        self.axs[0, 1].autoscale_view()
        
        # 更新控制棒位置
        self.lines['control'].set_data(steps, self.history['control_rod'])
        self.axs[1, 0].relim()
        self.axs[1, 0].autoscale_view()
        
        # 更新燃耗
        self.lines['burnup'].set_data(steps, self.history['burnup'])
        self.axs[1, 1].relim()
        self.axs[1, 1].autoscale_view()
        
        plt.draw()
        plt.pause(0.01)

    def reset(self, seed=None):
        super().reset(seed=seed)
        self.current_step = 0
        self.temperature = 600  # K
        self.power = 1000      # MW
        self.k_eff = 1.0
        self.burnup = 0        # MWd/kgU
        self.control_rod_pos = 0.5
        
        # 初始化可视化
        self.init_visualization()
        
        return self._get_observation(), {}
    
    def _get_observation(self):
        return np.array([
            self.temperature,
            self.power,
            self.k_eff,
            self.control_rod_pos,
            self.burnup
        ], dtype=np.float32)
    
    def step(self, action):
        self.current_step += 1
        
        # 更新控制棒位置
        self.control_rod_pos = action / 10.0
        
        # 运行OpenMC模拟
        try:
            # 更新材料温度
            self.fuel.temperature = self.temperature
            
            # 运行临界计算
           # os.remove('/home/unknowxxs/python/statepoint.50.h5')
            result = openmc.run()
         
            
            # 获取k_eff
            with openmc.StatePoint(result) as sp:
                self.k_eff = sp.k_effective.nominal_value
                
            # 更新系统状态
            self._update_state()
            
            # 更新可视化
            self.update_visualization()
            
            # 计算奖励
            reward = self._calculate_reward()
            
            # 检查是否结束
            done = self.current_step >= self.max_steps or self._is_unsafe()
            
        except Exception as e:
            print(f"模拟过程出错: {e}")
            reward = -1000
            done = True
        
        return self._get_observation(), reward, done, False, {}
    
    def _update_state(self):
        # 基于k_eff更新功率
        power_factor = (self.k_eff - 1.0) * 5000
        self.power = np.clip(self.power + power_factor, 0, 3000)
        
        # 更新温度
        delta_temp = (self.power - 1000) * 0.1
        self.temperature = np.clip(self.temperature + delta_temp, 500, 1500)
        
        # 更新燃耗
        self.burnup += self.power * 0.001
        
    def _calculate_reward(self):
        reward = 0
        
        # 奖励稳定的运行状态
        reward -= abs(self.power - 1000) * 0.01  # 目标功率1000MW
        reward -= abs(self.k_eff - 1.0) * 100    # 目标k_eff=1
        reward -= abs(self.temperature - 900) * 0.1  # 目标温度900K
        
        # 惩罚不安全状态
        if self._is_unsafe():
            reward -= 1000
            
        return reward
    
    def _is_unsafe(self):
        return (self.temperature > 1400 or 
                self.power > 2500 or 
                self.k_eff > 1.2)

def train_agent():
    env = make_vec_env(NuclearReactorEnv, n_envs=4)
    
    model = PPO(
        "MlpPolicy",
        env,
        verbose=1,
        learning_rate=0.0003,
        n_steps=2048,
        batch_size=64,
        n_epochs=10
    )
    
    model.learn(total_timesteps=10)
    model.save("ppo_nuclear_reactor")
    
    return model

def evaluate_agent(model, num_episodes=5):
    env = NuclearReactorEnv()
    
    for episode in range(num_episodes):
        obs, _ = env.reset()
        episode_reward = 0
        done = False
        
        while not done:
            action, _ = model.predict(obs)
            obs, reward, done, _, _ = env.step(action)
            episode_reward += reward
            
            # 打印当前状态
            print(f"步骤 {env.current_step}:")
            print(f"温度: {env.temperature:.1f}K")
            print(f"功率: {env.power:.1f}MW")
            print(f"k_eff: {env.k_eff:.3f}")
            print(f"控制棒位置: {env.control_rod_pos:.2f}")
            print(f"燃耗: {env.burnup:.2f}MWd/kgU")
            print("------------------------")
        
        plt.savefig(f'episode_{episode+1}_results.png')
        print(f"Episode {episode + 1}: 总奖励 = {episode_reward:.2f}\n")
    
    plt.close('all')

model = train_agent()
print("\n评估核反应堆控制性能：")
evaluate_agent(model)

```
Assistant: 从错误消息 "No boundary conditions were applied to any surfaces!"（未将边界条件应用于任何表面）来看，您的OpenMC模拟可能缺少对几何表面的边界条件设置。在OpenMC中，定义几何边界条件是必需的，以确定粒子在与几何表面相互作用时的行为。

以下是一些可以尝试的步骤来解决这个问题：

1. **定义几何边界条件**：
   在定义几何体时，如果几何包含无限空间或您希望设置周边的边界行为，您需要为表面指定边界条件。例如，您可以用 `boundary_type` 参数来设置表面的边界条件。

   增加边界条件的设定到您的几何体定义中。例如，如果想定义反射边界，可以这样做：

   ```python
   cylinder = openmc.ZCylinder(r=100, boundary_type='reflective')
   ```

2. **检查几何体完整性**：
   确保几何体是闭合的，并且材料分配是在定义的区域内的，几何体需要是完整且封闭的。

3. **增加外部“盒子”**：
   在反应堆或感兴趣的区域外增加一个大尺寸的盒子，并应用“外”边界条件（如真空或反射）：

   ```python
   outer_box = openmc.model.rectangular_prism(
       width=200, height=200, boundary_type='reflective'
   )
   ```

   并在创建geometry的时候包括这个外部“盒子”：

   ```python
   outer_region = +outer_box & -cylinder
   fuel_cell = openmc.Cell(fill=self.fuel, region=outer_region)
   ```

通过以上设定，可以确保在OpenMC中的几何体中应用了正确的边界条件，从而消除这个错误。如果问题仍然存在，请确保代码中的几何和材料设置代码都已包含在内，并且没有遗漏其他所需的几何体或设置。
User: 将修改的全部代码写出来
```python
import os
import gymnasium as gym
import numpy as np
from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_vec_env
import openmc
import matplotlib.pyplot as plt

#plt.style.use(plt.style.available)
openmc.config['cross_sections'] = '/home/unknowxxs/python/data/cross_sections.xml'
class NuclearReactorEnv(gym.Env):
    def __init__(self):
        super().__init__()
        self.action_space = gym.spaces.Discrete(11)  # 控制棒位置，0-10
        
        # 观察空间：温度、功率、k_eff、控制棒位置、燃料燃耗
        self.observation_space = gym.spaces.Box(
            low=np.array([500, 0, 0.5, 0, 0]),
            high=np.array([1500, 3000, 1.5, 1, 100]),
            dtype=np.float32
        )
        
        self.max_steps = 1000
        self.current_step = 0
        self._setup_model()
        
    def _setup_model(self):
        # 设置材料
        # UO2燃料
        self.fuel = openmc.Material(name='fuel')
        self.fuel.add_nuclide('U235', 0.05)
        self.fuel.add_nuclide('U238', 0.95)
        self.fuel.add_nuclide('O16', 2.0)
        self.fuel.set_density('g/cm3', 10.0)
        self.fuel.temperature = 900  # K

        # 水冷却剂
        self.water = openmc.Material(name='water')
        self.water.add_nuclide('H1', 2)
        self.water.add_nuclide('O16', 1)
        self.water.set_density('g/cm3', 1.0)
        self.water.temperature = 600  # K

        # 控制棒 (B4C)
        self.control_rod = openmc.Material(name='control_rod')
        self.control_rod.add_nuclide('B10', 0.8)
        self.control_rod.add_nuclide('B11', 0.2)
        self.control_rod.add_nuclide('C12', 1.0)
        self.control_rod.set_density('g/cm3', 2.52)

        # 创建材料集合
        self.materials = openmc.Materials([self.fuel, self.water, self.control_rod])
        
        # 创建几何体
        # 简化的圆柱形反应堆堆芯
        cylinder = openmc.ZCylinder(r=100)
        fuel_region = -cylinder
        
        fuel_cell = openmc.Cell(fill=self.fuel, region=fuel_region)
        
        # 创建universe和geometry
        root_universe = openmc.Universe(cells=[fuel_cell])
        self.geometry = openmc.Geometry(root_universe)

    # 创建材料集合并生成 XML
        self.materials = openmc.Materials([self.fuel, self.water, self.control_rod])
        self.materials.export_to_xml()  # 生成 materials.xml
    
    # 创建几何体
    # [代码创建几何]
    
    # 创建universe和geometry并生成 XML
        root_universe = openmc.Universe(cells=[fuel_cell])
        self.geometry = openmc.Geometry(root_universe)
        self.geometry.export_to_xml()  # 生成 geometry.xml
    
    # 设置模拟参数并生成 XML
        self.settings = openmc.Settings()
        self.settings.batches = 100
        self.settings.inactive = 10
        self.settings.particles = 1000
        self.settings.temperature = {'method': 'interpolation'}
        self.settings.export_to_xml()  # 生成 settings.xml        
      
        
        
    def init_visualization(self):
        """初始化可视化图表"""
        plt.ion()  # 开启交互模式
        self.fig, self.axs = plt.subplots(2, 2, figsize=(15, 10))
        self.fig.suptitle('核反应堆运行状态监测', fontsize=16)
        
        # 初始化数据存储
        self.history = {
            'temperature': [],
            'power': [],
            'k_eff': [],
            'burnup': [],
            'control_rod': [],
            'steps': []
        }
        
        # 配置子图
        self.lines = {}
        
        # 温度和功率图
        self.axs[0, 0].set_title('温度和功率变化')
        self.axs[0, 0].set_xlabel('步数')
        self.lines['temp'], = self.axs[0, 0].plot([], [], 'r-', label='温度 (K)')
        self.lines['power'], = self.axs[0, 0].plot([], [], 'b-', label='功率 (MW)')
        self.axs[0, 0].legend()
        
        # k_eff图
        self.axs[0, 1].set_title('k_eff变化')
        self.axs[0, 1].set_xlabel('步数')
        self.lines['k_eff'], = self.axs[0, 1].plot([], [], 'g-', label='k_eff')
        self.axs[0, 1].axhline(y=1.0, color='r', linestyle='--', label='临界值')
        self.axs[0, 1].legend()
        
        # 控制棒位置图
        self.axs[1, 0].set_title('控制棒位置')
        self.axs[1, 0].set_xlabel('步数')
        self.lines['control'], = self.axs[1, 0].plot([], [], 'k-', label='控制棒位置')
        self.axs[1, 0].legend()
        
        # 燃耗图
        self.axs[1, 1].set_title('燃料燃耗')
        self.axs[1, 1].set_xlabel('步数')
        self.lines['burnup'], = self.axs[1, 1].plot([], [], 'm-', label='燃耗 (MWd/kgU)')
        self.axs[1, 1].legend()
        
        plt.tight_layout()

    def update_visualization(self):
        """更新可视化图表"""
        # 更新历史数据
        self.history['temperature'].append(self.temperature)
        self.history['power'].append(self.power)
        self.history['k_eff'].append(self.k_eff)
        self.history['burnup'].append(self.burnup)
        self.history['control_rod'].append(self.control_rod_pos)
        self.history['steps'].append(self.current_step)
        
        # 更新图表
        steps = self.history['steps']
        
        # 更新温度和功率
        self.lines['temp'].set_data(steps, self.history['temperature'])
        self.lines['power'].set_data(steps, self.history['power'])
        self.axs[0, 0].relim()
        self.axs[0, 0].autoscale_view()
        
        # 更新k_eff
        self.lines['k_eff'].set_data(steps, self.history['k_eff'])
        self.axs[0, 1].relim()
        self.axs[0, 1].autoscale_view()
        
        # 更新控制棒位置
        self.lines['control'].set_data(steps, self.history['control_rod'])
        self.axs[1, 0].relim()
        self.axs[1, 0].autoscale_view()
        
        # 更新燃耗
        self.lines['burnup'].set_data(steps, self.history['burnup'])
        self.axs[1, 1].relim()
        self.axs[1, 1].autoscale_view()
        
        plt.draw()
        plt.pause(0.01)

    def reset(self, seed=None):
        super().reset(seed=seed)
        self.current_step = 0
        self.temperature = 600  # K
        self.power = 1000      # MW
        self.k_eff = 1.0
        self.burnup = 0        # MWd/kgU
        self.control_rod_pos = 0.5
        
        # 初始化可视化
        self.init_visualization()
        
        return self._get_observation(), {}
    
    def _get_observation(self):
        return np.array([
            self.temperature,
            self.power,
            self.k_eff,
            self.control_rod_pos,
            self.burnup
        ], dtype=np.float32)
    
    def step(self, action):
        self.current_step += 1
        
        # 更新控制棒位置
        self.control_rod_pos = action / 10.0
        
        # 运行OpenMC模拟
        try:
            # 更新材料温度
            self.fuel.temperature = self.temperature
            
            # 运行临界计算
           # os.remove('/home/unknowxxs/python/statepoint.50.h5')
            result = openmc.run()
         
            
            # 获取k_eff
            with openmc.StatePoint(result) as sp:
                self.k_eff = sp.k_effective.nominal_value
                
            # 更新系统状态
            self._update_state()
            
            # 更新可视化
            self.update_visualization()
            
            # 计算奖励
            reward = self._calculate_reward()
            
            # 检查是否结束
            done = self.current_step >= self.max_steps or self._is_unsafe()
            
        except Exception as e:
            print(f"模拟过程出错: {e}")
            reward = -1000
            done = True
        
        return self._get_observation(), reward, done, False, {}
    
    def _update_state(self):
        # 基于k_eff更新功率
        power_factor = (self.k_eff - 1.0) * 5000
        self.power = np.clip(self.power + power_factor, 0, 3000)
        
        # 更新温度
        delta_temp = (self.power - 1000) * 0.1
        self.temperature = np.clip(self.temperature + delta_temp, 500, 1500)
        
        # 更新燃耗
        self.burnup += self.power * 0.001
        
    def _calculate_reward(self):
        reward = 0
        
        # 奖励稳定的运行状态
        reward -= abs(self.power - 1000) * 0.01  # 目标功率1000MW
        reward -= abs(self.k_eff - 1.0) * 100    # 目标k_eff=1
        reward -= abs(self.temperature - 900) * 0.1  # 目标温度900K
        
        # 惩罚不安全状态
        if self._is_unsafe():
            reward -= 1000
            
        return reward
    
    def _is_unsafe(self):
        return (self.temperature > 1400 or 
                self.power > 2500 or 
                self.k_eff > 1.2)

def train_agent():
    env = make_vec_env(NuclearReactorEnv, n_envs=4)
    
    model = PPO(
        "MlpPolicy",
        env,
        verbose=1,
        learning_rate=0.0003,
        n_steps=2048,
        batch_size=64,
        n_epochs=10
    )
    
    model.learn(total_timesteps=10)
    model.save("ppo_nuclear_reactor")
    
    return model

def evaluate_agent(model, num_episodes=5):
    env = NuclearReactorEnv()
    
    for episode in range(num_episodes):
        obs, _ = env.reset()
        episode_reward = 0
        done = False
        
        while not done:
            action, _ = model.predict(obs)
            obs, reward, done, _, _ = env.step(action)
            episode_reward += reward
            
            # 打印当前状态
            print(f"步骤 {env.current_step}:")
            print(f"温度: {env.temperature:.1f}K")
            print(f"功率: {env.power:.1f}MW")
            print(f"k_eff: {env.k_eff:.3f}")
            print(f"控制棒位置: {env.control_rod_pos:.2f}")
            print(f"燃耗: {env.burnup:.2f}MWd/kgU")
            print("------------------------")
        
        plt.savefig(f'episode_{episode+1}_results.png')
        print(f"Episode {episode + 1}: 总奖励 = {episode_reward:.2f}\n")
    
    plt.close('all')

model = train_agent()
print("\n评估核反应堆控制性能：")
evaluate_agent(model)

```
User: 将刚才没输出完成的接上
```python
import os
import gymnasium as gym
import numpy as np
from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_vec_env
import openmc
import matplotlib.pyplot as plt

#plt.style.use(plt.style.available)
openmc.config['cross_sections'] = '/home/unknowxxs/python/data/cross_sections.xml'
class NuclearReactorEnv(gym.Env):
    def __init__(self):
        super().__init__()
        self.action_space = gym.spaces.Discrete(11)  # 控制棒位置，0-10
        
        # 观察空间：温度、功率、k_eff、控制棒位置、燃料燃耗
        self.observation_space = gym.spaces.Box(
            low=np.array([500, 0, 0.5, 0, 0]),
            high=np.array([1500, 3000, 1.5, 1, 100]),
            dtype=np.float32
        )
        
        self.max_steps = 1000
        self.current_step = 0
        self._setup_model()
        
    def _setup_model(self):
        # 设置材料
        # UO2燃料
        self.fuel = openmc.Material(name='fuel')
        self.fuel.add_nuclide('U235', 0.05)
        self.fuel.add_nuclide('U238', 0.95)
        self.fuel.add_nuclide('O16', 2.0)
        self.fuel.set_density('g/cm3', 10.0)
        self.fuel.temperature = 900  # K

        # 水冷却剂
        self.water = openmc.Material(name='water')
        self.water.add_nuclide('H1', 2)
        self.water.add_nuclide('O16', 1)
        self.water.set_density('g/cm3', 1.0)
        self.water.temperature = 600  # K

        # 控制棒 (B4C)
        self.control_rod = openmc.Material(name='control_rod')
        self.control_rod.add_nuclide('B10', 0.8)
        self.control_rod.add_nuclide('B11', 0.2)
        self.control_rod.add_nuclide('C12', 1.0)
        self.control_rod.set_density('g/cm3', 2.52)

        # 创建材料集合
        self.materials = openmc.Materials([self.fuel, self.water, self.control_rod])
        
        # 创建几何体
        # 简化的圆柱形反应堆堆芯
        cylinder = openmc.ZCylinder(r=100)
        fuel_region = -cylinder
        
        fuel_cell = openmc.Cell(fill=self.fuel, region=fuel_region)
        
        # 创建universe和geometry
        root_universe = openmc.Universe(cells=[fuel_cell])
        self.geometry = openmc.Geometry(root_universe)

    # 创建材料集合并生成 XML
        self.materials = openmc.Materials([self.fuel, self.water, self.control_rod])
        self.materials.export_to_xml()  # 生成 materials.xml
    
    # 创建几何体
    # [代码创建几何]
    
    # 创建universe和geometry并生成 XML
        root_universe = openmc.Universe(cells=[fuel_cell])
        self.geometry = openmc.Geometry(root_universe)
        self.geometry.export_to_xml()  # 生成 geometry.xml
    
    # 设置模拟参数并生成 XML
        self.settings = openmc.Settings()
        self.settings.batches = 100
        self.settings.inactive = 10
        self.settings.particles = 1000
        self.settings.temperature = {'method': 'interpolation'}
        self.settings.export_to_xml()  # 生成 settings.xml        
      
        
        
    def init_visualization(self):
        """初始化可视化图表"""
        plt.ion()  # 开启交互模式
        self.fig, self.axs = plt.subplots(2, 2, figsize=(15, 10))
        self.fig.suptitle('核反应堆运行状态监测', fontsize=16)
        
        # 初始化数据存储
        self.history = {
            'temperature': [],
            'power': [],
            'k_eff': [],
            'burnup': [],
            'control_rod': [],
            'steps': []
        }
        
        # 配置子图
        self.lines = {}
        
        # 温度和功率图
        self.axs[0, 0].set_title('温度和功率变化')
        self.axs[0, 0].set_xlabel('步数')
        self.lines['temp'], = self.axs[0, 0].plot([], [], 'r-', label='温度 (K)')
        self.lines['power'], = self.axs[0, 0].plot([], [], 'b-', label='功率 (MW)')
        self.axs[0, 0].legend()
        
        # k_eff图
        self.axs[0, 1].set_title('k_eff变化')
        self.axs[0, 1].set_xlabel('步数')
        self.lines['k_eff'], = self.axs[0, 1].plot([], [], 'g-', label='k_eff')
        self.axs[0, 1].axhline(y=1.0, color='r', linestyle='--', label='临界值')
        self.axs[0, 1].legend()
        
        # 控制棒位置图
        self.axs[1, 0].set_title('控制棒位置')
        self.axs[1, 0].set_xlabel('步数')
        self.lines['control'], = self.axs[1, 0].plot([], [], 'k-', label='控制棒位置')
        self.axs[1, 0].legend()
        
        # 燃耗图
        self.axs[1, 1].set_title('燃料燃耗')
        self.axs[1, 1].set_xlabel('步数')
        self.lines['burnup'], = self.axs[1, 1].plot([], [], 'm-', label='燃耗 (MWd/kgU)')
        self.axs[1, 1].legend()
        
        plt.tight_layout()

    def update_visualization(self):
        """更新可视化图表"""
        # 更新历史数据
        self.history['temperature'].append(self.temperature)
        self.history['power'].append(self.power)
        self.history['k_eff'].append(self.k_eff)
        self.history['burnup'].append(self.burnup)
        self.history['control_rod'].append(self.control_rod_pos)
        self.history['steps'].append(self.current_step)
        
        # 更新图表
        steps = self.history['steps']
        
        # 更新温度和功率
        self.lines['temp'].set_data(steps, self.history['temperature'])
        self.lines['power'].set_data(steps, self.history['power'])
        self.axs[0, 0].relim()
        self.axs[0, 0].autoscale_view()
        
        # 更新k_eff
        self.lines['k_eff'].set_data(steps, self.history['k_eff'])
        self.axs[0, 1].relim()
        self.axs[0, 1].autoscale_view()
        
        # 更新控制棒位置
        self.lines['control'].set_data(steps, self.history['control_rod'])
        self.axs[1, 0].relim()
        self.axs[1, 0].autoscale_view()
        
        # 更新燃耗
        self.lines['burnup'].set_data(steps, self.history['burnup'])
        self.axs[1, 1].relim()
        self.axs[1, 1].autoscale_view()
        
        plt.draw()
        plt.pause(0.01)

    def reset(self, seed=None):
        super().reset(seed=seed)
        self.current_step = 0
        self.temperature = 600  # K
        self.power = 1000      # MW
        self.k_eff = 1.0
        self.burnup = 0        # MWd/kgU
        self.control_rod_pos = 0.5
        
        # 初始化可视化
        self.init_visualization()
        
        return self._get_observation(), {}
    
    def _get_observation(self):
        return np.array([
            self.temperature,
            self.power,
            self.k_eff,
            self.control_rod_pos,
            self.burnup
        ], dtype=np.float32)
    
    def step(self, action):
        self.current_step += 1
        
        # 更新控制棒位置
        self.control_rod_pos = action / 10.0
        
        # 运行OpenMC模拟
        try:
            # 更新材料温度
            self.fuel.temperature = self.temperature
            
            # 运行临界计算
           # os.remove('/home/unknowxxs/python/statepoint.50.h5')
            result = openmc.run()
         
            
            # 获取k_eff
            with openmc.StatePoint(result) as sp:
                self.k_eff = sp.k_effective.nominal_value
                
            # 更新系统状态
            self._update_state()
            
            # 更新可视化
            self.update_visualization()
            
            # 计算奖励
            reward = self._calculate_reward()
            
            # 检查是否结束
            done = self.current_step >= self.max_steps or self._is_unsafe()
            
        except Exception as e:
            print(f"模拟过程出错: {e}")
            reward = -1000
            done = True
        
        return self._get_observation(), reward, done, False, {}
    
    def _update_state(self):
        # 基于k_eff更新功率
        power_factor = (self.k_eff - 1.0) * 5000
        self.power = np.clip(self.power + power_factor, 0, 3000)
        
        # 更新温度
        delta_temp = (self.power - 1000) * 0.1
        self.temperature = np.clip(self.temperature + delta_temp, 500, 1500)
        
        # 更新燃耗
        self.burnup += self.power * 0.001
        
    def _calculate_reward(self):
        reward = 0
        
        # 奖励稳定的运行状态
        reward -= abs(self.power - 1000) * 0.01  # 目标功率1000MW
        reward -= abs(self.k_eff - 1.0) * 100    # 目标k_eff=1
        reward -= abs(self.temperature - 900) * 0.1  # 目标温度900K
        
        # 惩罚不安全状态
        if self._is_unsafe():
            reward -= 1000
            
        return reward
    
    def _is_unsafe(self):
        return (self.temperature > 1400 or 
                self.power > 2500 or 
                self.k_eff > 1.2)

def train_agent():
    env = make_vec_env(NuclearReactorEnv, n_envs=4)
    
    model = PPO(
        "MlpPolicy",
        env,
        verbose=1,
        learning_rate=0.0003,
        n_steps=2048,
        batch_size=64,
        n_epochs=10
    )
    
    model.learn(total_timesteps=10)
    model.save("ppo_nuclear_reactor")
    
    return model

def evaluate_agent(model, num_episodes=5):
    env = NuclearReactorEnv()
    
    for episode in range(num_episodes):
        obs, _ = env.reset()
        episode_reward = 0
        done = False
        
        while not done:
            action, _ = model.predict(obs)
            obs, reward, done, _, _ = env.step(action)
            episode_reward += reward
            
            # 打印当前状态
            print(f"步骤 {env.current_step}:")
            print(f"温度: {env.temperature:.1f}K")
            print(f"功率: {env.power:.1f}MW")
            print(f"k_eff: {env.k_eff:.3f}")
            print(f"控制棒位置: {env.control_rod_pos:.2f}")
            print(f"燃耗: {env.burnup:.2f}MWd/kgU")
            print("------------------------")
        
        plt.savefig(f'episode_{episode+1}_results.png')
        print(f"Episode {episode + 1}: 总奖励 = {episode_reward:.2f}\n")
    
    plt.close('all')

model = train_agent()
print("\n评估核反应堆控制性能：")
evaluate_agent(model)

```
Assistant: 为了修复"模拟过程出错: No boundary conditions were applied to any surfaces!" 的问题，需要确保在OpenMC的几何中正确定义了边界条件。这里是修改后的完整代码，包括边界条件的设置：

```python
import os
import gymnasium as gym
import numpy as np
from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_vec_env
import openmc
import matplotlib.pyplot as plt

#plt.style.use(plt.style.available)
openmc.config['cross_sections'] = '/home/unknowxxs/python/data/cross_sections.xml'
class NuclearReactorEnv(gym.Env):
    def __init__(self):
        super().__init__()
        self.action_space = gym.spaces.Discrete(11)  # 控制棒位置，0-10
        
        # 观察空间：温度、功率、k_eff、控制棒位置、燃料燃耗
        self.observation_space = gym.spaces.Box(
            low=np.array([500, 0, 0.5, 0, 0]),
            high=np.array([1500, 3000, 1.5, 1, 100]),
            dtype=np.float32
        )
        
        self.max_steps = 1000
        self.current_step = 0
        self._setup_model()
        
    def _setup_model(self):
        # 设置材料
        # UO2燃料
        self.fuel = openmc.Material(name='fuel')
        self.fuel.add_nuclide('U235', 0.05)
        self.fuel.add_nuclide('U238', 0.95)
        self.fuel.add_nuclide('O16', 2.0)
        self.fuel.set_density('g/cm3', 10.0)
        self.fuel.temperature = 900  # K

        # 水冷却剂
        self.water = openmc.Material(name='water')
        self.water.add_nuclide('H1', 2)
        self.water.add_nuclide('O16', 1)
        self.water.set_density('g/cm3', 1.0)
        self.water.temperature = 600  # K

        # 控制棒 (B4C)
        self.control_rod = openmc.Material(name='control_rod')
        self.control_rod.add_nuclide('B10', 0.8)
        self.control_rod.add_nuclide('B11', 0.2)
        self.control_rod.add_nuclide('C12', 1.0)
        self.control_rod.set_density('g/cm3', 2.52)

        # 创建材料集合
        self.materials = openmc.Materials([self.fuel, self.water, self.control_rod])
        self.materials.export_to_xml()  # 生成 materials.xml

        # 创建几何体
        # 简化的圆柱形反应堆堆芯
        cylinder = openmc.ZCylinder(r=100, boundary_type='reflective')  # 增加了边界条件
        fuel_region = -cylinder
        
        fuel_cell = openmc.Cell(fill=self.fuel, region=fuel_region)
        outside_cell = openmc.Cell(region=+cylinder, fill=self.water)  # 创建外部包围物

        # 创建universe和geometry
        root_universe = openmc.Universe(cells=[fuel_cell, outside_cell])
        self.geometry = openmc.Geometry(root_universe)
        self.geometry.export_to_xml()  # 生成 geometry.xml

        # 设置模拟参数并生成 XML
        self.settings = openmc.Settings()
        self.settings.batches = 100
        self.settings.inactive = 10
        self.settings.particles = 1000
        self.settings.temperature = {'method': 'interpolation'}
        self.settings.export_to_xml()  # 生成 settings.xml
    
    def init_visualization(self):
        """初始化可视化图表"""
        plt.ion()  # 开启交互模式
        self.fig, self.axs = plt.subplots(2, 2, figsize=(15, 10))
        self.fig.suptitle('核反应堆运行状态监测', fontsize=16)
        
        # 初始化数据存储
        self.history = {
            'temperature': [],
            'power': [],
            'k_eff': [],
            'burnup': [],
            'control_rod': [],
            'steps': []
        }
        
        # 配置子图
        self.lines = {}
        
        # 温度和功率图
        self.axs[0, 0].set_title('温度和功率变化')
        self.axs[0, 0].set_xlabel('步数')
        self.lines['temp'], = self.axs[0, 0].plot([], [], 'r-', label='温度 (K)')
        self.lines['power'], = self.axs[0, 0].plot([], [], 'b-', label='功率 (MW)')
        self.axs[0, 0].legend()
        
        # k_eff图
        self.axs[0, 1].set_title('k_eff变化')
        self.axs[0, 1].set_xlabel('步数')
        self.lines['k_eff'], = self.axs[0, 1].plot([], [], 'g-', label='k_eff')
        self.axs[0, 1].axhline(y=1.0, color='r', linestyle='--', label='临界值')
        self.axs[0, 1].legend()
        
        # 控制棒位置图
        self.axs[1, 0].set_title('控制棒位置')
        self.axs[1, 0].set_xlabel('步数')
        self.lines['control'], = self.axs[1, 0].plot([], [], 'k-', label='控制棒位置')
        self.axs[1, 0].legend()
        
        # 燃耗图
        self.axs[1, 1].set_title('燃料燃耗')
        self.axs[1, 1].set_xlabel('步数')
        self.lines['burnup'], = self.axs[1, 1].plot([], [], 'm-', label='燃耗 (MWd/kgU)')
        self.axs[1, 1].legend()
        
        plt.tight_layout()

    def update_visualization(self):
        """更新可视化图表"""
        # 更新历史数据
        self.history['temperature'].append(self.temperature)
        self.history['power'].append(self.power)
        self.history['k_eff'].append(self.k_eff)
        self.history['burnup'].append(self.burnup)
        self.history['control_rod'].append(self.control_rod_pos)
        self.history['steps'].append(self.current_step)
        
        # 更新图表
        steps = self.history['steps']
        
        # 更新温度和功率
        self.lines['temp'].set_data(steps, self.history['temperature'])
        self.lines['power'].set_data(steps, self.history['power'])
        self.axs[0, 0].relim()
        self.axs[0, 0].autoscale_view()
        
        # 更新k_eff
        self.lines['k_eff'].set_data(steps, self.history['k_eff'])
        self.axs[0, 1].relim()
        self.axs[0, 1].autoscale_view()
        
        # 更新控制棒位置
        self.lines['control'].set_data(steps, self.history['control_rod'])
        self.axs[1, 0].relim()
        self.axs[1, 0].autoscale_view()
        
        # 更新燃耗
        self.lines['burnup'].set_data(steps, self.history['burnup'])
        self.axs[1, 1].relim()
        self.axs[1, 1].autoscale_view()
        
        plt.draw()
        plt.pause(0.01)

    def reset(self, seed=None):
        super().reset(seed=seed)
        self.current_step = 0
        self.temperature = 600  # K
        self.power = 1000      # MW
        self.k_eff = 1.0
        self.burnup = 0        # MWd/kgU
        self.control_rod_pos = 0.5
        
        # 初始化可视化
        self.init_visualization()
        
        return self._get_observation(), {}
    
    def _get_observation(self):
        return np.array([
            self.temperature,
            self.power,
            self.k_eff,
            self.control_rod_pos,
            self.burnup
        ], dtype=np.float32)
    
    def step(self, action):
        self.current_step += 1
        
        # 更新控制棒位置
        self.control_rod_pos = action / 10.0
        
        # 运行OpenMC模拟
        try:
            # 更新材料温度
            self.fuel.temperature = self.temperature
            
            # 运行临界计算
            result = openmc.run()
         
            # 获取k_eff
            with openmc.StatePoint(result) as sp:
                self.k_eff = sp.k_effective.nominal_value
                
            # 更新系统状态
            self._update_state()
            
            # 更新可视化
            self.update_visualization()
            
            # 计算奖励
            reward = self._calculate_reward()
            
            # 检查是否结束
            done = self.current_step >= self.max_steps or self._is_unsafe()
            
        except Exception as e:
            print(f"模拟过程出错: {e}")
            reward = -1000
            done = True
        
        return self._get_observation(), reward, done, False, {}
    
    def _update_state(self):
        # 基于k_eff更新功率
        power_factor = (self.k_eff - 1.0) * 5000
        self.power = np.clip(self.power + power_factor, 0, 3000)
        
        # 更新温度
        delta_temp = (self.power - 1000) * 0.1
        self.temperature = np.clip(self.temperature + delta_temp, 500, 1500)
        
        # 更新燃耗
        self.burnup += self.power * 0.001
        
    def _calculate_reward(self):
        reward = 0
        
        # 奖励稳定的运行状态
        reward -= abs(self.power - 1000) * 0.01  # 目标功率1000MW
        reward -= abs(self.k_eff - 1.0) * 100    # 目标k_eff=1
        reward -= abs(self.temperature - 900) * 0.1  # 目标温度900K
        
        # 惩罚不安全状态
        if self._is_unsafe():
            reward -= 1000
            
        return reward
    
    def _is_unsafe(self):
        return (self.temperature > 1400 or 
                self.power > 2500 or 
                self.k_eff > 1.2)

def train_agent():
    env = make_vec_env(NuclearReactorEnv, n_envs=4)
    
    model = PPO(
        "MlpPolicy",
        env,
        verbose=1,
        learning_rate=0.0003,
        n_steps=2048,
        batch_size=64,
        n_epochs=10
    )
    
    model.learn(total_timesteps=10)
    model.save("ppo_nuclear_reactor")
    
    return model

def evaluate_agent(model, num_episodes=5):
    env = NuclearReactorEnv()
    
    for episode in range(num_episodes):
        obs, _ = env.reset()
        episode_reward = 0
        done = False
        
        while not done:
            action, _ = model.predict(obs)
            obs, reward, done, _, _ = env.step(action)
            episode_reward += reward
            
            # 打印当前状态
            print(f"步骤 {env.current_step}:")
            print(f"温度: {env.temperature:.1f}K")
            print(f"功率: {env.power:.1f}MW")
            print(f"k_eff: {env.k_eff:.3f}")
            print(f"控制棒位置: {env.control_rod_pos:.2f}")
            print(f"燃耗: {env.burnup:.2f}MWd/kgU")
            print("------------------------")
        
        plt.savefig(f'episode_{episode+1}_results.png')
        print(f"Episode {episode + 1}: 总奖励 = {episode_reward:.2f}\n")
    
    plt.close('all')

model = train_agent()
print("\n评估核反应堆控制性能：")
evaluate_agent(model)
```

在这个版本中，我在创建圆柱体的时候增加了边界条件 `boundary_type='reflective'`。这样可以防止错误 "No boundary conditions were applied to any surfaces!" 的发生。这样为几何体定义了合适的边界条件以确保模拟的粒子行为是完整的。
User:  ERROR: Nuclear data library does not contain cross sections for U235 at or near
        900.000000 K.
```python
import os
import gymnasium as gym
import numpy as np
from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_vec_env
import openmc
import matplotlib.pyplot as plt

#plt.style.use(plt.style.available)
openmc.config['cross_sections'] = '/home/unknowxxs/python/data/cross_sections.xml'
class NuclearReactorEnv(gym.Env):
    def __init__(self):
        super().__init__()
        self.action_space = gym.spaces.Discrete(11)  # 控制棒位置，0-10
        
        # 观察空间：温度、功率、k_eff、控制棒位置、燃料燃耗
        self.observation_space = gym.spaces.Box(
            low=np.array([500, 0, 0.5, 0, 0]),
            high=np.array([1500, 3000, 1.5, 1, 100]),
            dtype=np.float32
        )
        
        self.max_steps = 1000
        self.current_step = 0
        self._setup_model()
        
    def _setup_model(self):
        # 设置材料
        # UO2燃料
        self.fuel = openmc.Material(name='fuel')
        self.fuel.add_nuclide('U235', 0.05)
        self.fuel.add_nuclide('U238', 0.95)
        self.fuel.add_nuclide('O16', 2.0)
        self.fuel.set_density('g/cm3', 10.0)
        self.fuel.temperature = 900  # K

        # 水冷却剂
        self.water = openmc.Material(name='water')
        self.water.add_nuclide('H1', 2)
        self.water.add_nuclide('O16', 1)
        self.water.set_density('g/cm3', 1.0)
        self.water.temperature = 600  # K

        # 控制棒 (B4C)
        self.control_rod = openmc.Material(name='control_rod')
        self.control_rod.add_nuclide('B10', 0.8)
        self.control_rod.add_nuclide('B11', 0.2)
        self.control_rod.add_nuclide('C12', 1.0)
        self.control_rod.set_density('g/cm3', 2.52)

        # 创建材料集合
        self.materials = openmc.Materials([self.fuel, self.water, self.control_rod])
        
        # 创建几何体
        # 简化的圆柱形反应堆堆芯
        cylinder = openmc.ZCylinder(r=100)
        fuel_region = -cylinder
        
        fuel_cell = openmc.Cell(fill=self.fuel, region=fuel_region)
        
        # 创建universe和geometry
        root_universe = openmc.Universe(cells=[fuel_cell])
        self.geometry = openmc.Geometry(root_universe)

    # 创建材料集合并生成 XML
        self.materials = openmc.Materials([self.fuel, self.water, self.control_rod])
        self.materials.export_to_xml()  # 生成 materials.xml
    
    # 创建几何体
    # [代码创建几何]
    
    # 创建universe和geometry并生成 XML
        root_universe = openmc.Universe(cells=[fuel_cell])
        self.geometry = openmc.Geometry(root_universe)
        self.geometry.export_to_xml()  # 生成 geometry.xml
    
    # 设置模拟参数并生成 XML
        self.settings = openmc.Settings()
        self.settings.batches = 100
        self.settings.inactive = 10
        self.settings.particles = 1000
        self.settings.temperature = {'method': 'interpolation'}
        self.settings.export_to_xml()  # 生成 settings.xml        
      
        
        
    def init_visualization(self):
        """初始化可视化图表"""
        plt.ion()  # 开启交互模式
        self.fig, self.axs = plt.subplots(2, 2, figsize=(15, 10))
        self.fig.suptitle('核反应堆运行状态监测', fontsize=16)
        
        # 初始化数据存储
        self.history = {
            'temperature': [],
            'power': [],
            'k_eff': [],
            'burnup': [],
            'control_rod': [],
            'steps': []
        }
        
        # 配置子图
        self.lines = {}
        
        # 温度和功率图
        self.axs[0, 0].set_title('温度和功率变化')
        self.axs[0, 0].set_xlabel('步数')
        self.lines['temp'], = self.axs[0, 0].plot([], [], 'r-', label='温度 (K)')
        self.lines['power'], = self.axs[0, 0].plot([], [], 'b-', label='功率 (MW)')
        self.axs[0, 0].legend()
        
        # k_eff图
        self.axs[0, 1].set_title('k_eff变化')
        self.axs[0, 1].set_xlabel('步数')
        self.lines['k_eff'], = self.axs[0, 1].plot([], [], 'g-', label='k_eff')
        self.axs[0, 1].axhline(y=1.0, color='r', linestyle='--', label='临界值')
        self.axs[0, 1].legend()
        
        # 控制棒位置图
        self.axs[1, 0].set_title('控制棒位置')
        self.axs[1, 0].set_xlabel('步数')
        self.lines['control'], = self.axs[1, 0].plot([], [], 'k-', label='控制棒位置')
        self.axs[1, 0].legend()
        
        # 燃耗图
        self.axs[1, 1].set_title('燃料燃耗')
        self.axs[1, 1].set_xlabel('步数')
        self.lines['burnup'], = self.axs[1, 1].plot([], [], 'm-', label='燃耗 (MWd/kgU)')
        self.axs[1, 1].legend()
        
        plt.tight_layout()

    def update_visualization(self):
        """更新可视化图表"""
        # 更新历史数据
        self.history['temperature'].append(self.temperature)
        self.history['power'].append(self.power)
        self.history['k_eff'].append(self.k_eff)
        self.history['burnup'].append(self.burnup)
        self.history['control_rod'].append(self.control_rod_pos)
        self.history['steps'].append(self.current_step)
        
        # 更新图表
        steps = self.history['steps']
        
        # 更新温度和功率
        self.lines['temp'].set_data(steps, self.history['temperature'])
        self.lines['power'].set_data(steps, self.history['power'])
        self.axs[0, 0].relim()
        self.axs[0, 0].autoscale_view()
        
        # 更新k_eff
        self.lines['k_eff'].set_data(steps, self.history['k_eff'])
        self.axs[0, 1].relim()
        self.axs[0, 1].autoscale_view()
        
        # 更新控制棒位置
        self.lines['control'].set_data(steps, self.history['control_rod'])
        self.axs[1, 0].relim()
        self.axs[1, 0].autoscale_view()
        
        # 更新燃耗
        self.lines['burnup'].set_data(steps, self.history['burnup'])
        self.axs[1, 1].relim()
        self.axs[1, 1].autoscale_view()
        
        plt.draw()
        plt.pause(0.01)

    def reset(self, seed=None):
        super().reset(seed=seed)
        self.current_step = 0
        self.temperature = 600  # K
        self.power = 1000      # MW
        self.k_eff = 1.0
        self.burnup = 0        # MWd/kgU
        self.control_rod_pos = 0.5
        
        # 初始化可视化
        self.init_visualization()
        
        return self._get_observation(), {}
    
    def _get_observation(self):
        return np.array([
            self.temperature,
            self.power,
            self.k_eff,
            self.control_rod_pos,
            self.burnup
        ], dtype=np.float32)
    
    def step(self, action):
        self.current_step += 1
        
        # 更新控制棒位置
        self.control_rod_pos = action / 10.0
        
        # 运行OpenMC模拟
        try:
            # 更新材料温度
            self.fuel.temperature = self.temperature
            
            # 运行临界计算
           # os.remove('/home/unknowxxs/python/statepoint.50.h5')
            result = openmc.run()
         
            
            # 获取k_eff
            with openmc.StatePoint(result) as sp:
                self.k_eff = sp.k_effective.nominal_value
                
            # 更新系统状态
            self._update_state()
            
            # 更新可视化
            self.update_visualization()
            
            # 计算奖励
            reward = self._calculate_reward()
            
            # 检查是否结束
            done = self.current_step >= self.max_steps or self._is_unsafe()
            
        except Exception as e:
            print(f"模拟过程出错: {e}")
            reward = -1000
            done = True
        
        return self._get_observation(), reward, done, False, {}
    
    def _update_state(self):
        # 基于k_eff更新功率
        power_factor = (self.k_eff - 1.0) * 5000
        self.power = np.clip(self.power + power_factor, 0, 3000)
        
        # 更新温度
        delta_temp = (self.power - 1000) * 0.1
        self.temperature = np.clip(self.temperature + delta_temp, 500, 1500)
        
        # 更新燃耗
        self.burnup += self.power * 0.001
        
    def _calculate_reward(self):
        reward = 0
        
        # 奖励稳定的运行状态
        reward -= abs(self.power - 1000) * 0.01  # 目标功率1000MW
        reward -= abs(self.k_eff - 1.0) * 100    # 目标k_eff=1
        reward -= abs(self.temperature - 900) * 0.1  # 目标温度900K
        
        # 惩罚不安全状态
        if self._is_unsafe():
            reward -= 1000
            
        return reward
    
    def _is_unsafe(self):
        return (self.temperature > 1400 or 
                self.power > 2500 or 
                self.k_eff > 1.2)

def train_agent():
    env = make_vec_env(NuclearReactorEnv, n_envs=4)
    
    model = PPO(
        "MlpPolicy",
        env,
        verbose=1,
        learning_rate=0.0003,
        n_steps=2048,
        batch_size=64,
        n_epochs=10
    )
    
    model.learn(total_timesteps=10)
    model.save("ppo_nuclear_reactor")
    
    return model

def evaluate_agent(model, num_episodes=5):
    env = NuclearReactorEnv()
    
    for episode in range(num_episodes):
        obs, _ = env.reset()
        episode_reward = 0
        done = False
        
        while not done:
            action, _ = model.predict(obs)
            obs, reward, done, _, _ = env.step(action)
            episode_reward += reward
            
            # 打印当前状态
            print(f"步骤 {env.current_step}:")
            print(f"温度: {env.temperature:.1f}K")
            print(f"功率: {env.power:.1f}MW")
            print(f"k_eff: {env.k_eff:.3f}")
            print(f"控制棒位置: {env.control_rod_pos:.2f}")
            print(f"燃耗: {env.burnup:.2f}MWd/kgU")
            print("------------------------")
        
        plt.savefig(f'episode_{episode+1}_results.png')
        print(f"Episode {episode + 1}: 总奖励 = {episode_reward:.2f}\n")
    
    plt.close('all')

model = train_agent()
print("\n评估核反应堆控制性能：")
evaluate_agent(model)

```
Assistant: