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: