dirac_solver 0.0.1
A Dirac ecuation Solver
Cargando...
Buscando...
Nada coincide
Referencia de la clase dirac_solver.core.DiracSolver

Clase principal que orquesta la ejecución numérica del problema de Dirac. Más...

Métodos públicos

 __init__ (self, SimulationProblem problem)
 Constructor del solver.
 
 run_simulation (self)
 Ejecuta la simulación completa de tiempo.
 
 get_psi (self)
 Obtiene el estado actual del campo espinorial.
 
 plot_probability_density (self)
 Calcula y grafica la densidad de probabilidad asociada al campo espinorial.
 

Atributos públicos

 problem
 
 integrator
 

Descripción detallada

Clase principal que orquesta la ejecución numérica del problema de Dirac.

Este solver inicializa la función de onda, comunica los datos al backend C++, ejecuta el bucle de integración temporal (FDTD) y proporciona utilidades para análisis y visualización del resultado.

Documentación de constructores y destructores

◆ __init__()

dirac_solver.core.DiracSolver.__init__ (   self,
SimulationProblem  problem 
)

Constructor del solver.

Parámetros
problemInstancia de SimulationProblem previamente configurada.
Nota
Internamente inicializa el integrador C++ (FDTDLeapfrogIntegrator).
149 def __init__(self, problem: SimulationProblem):
150 self.problem = problem
151
152 # Evaluar estado inicial sobre la malla
153 psi_0 = problem.initial_state.evaluate_on_grid(problem.grid)
154
155 # Crear grid compatible con el backend C++
156 cpp_grid = _core.Grid(problem.grid.shape, problem.grid.spacing)
157
158 # Inicializar el integrador Leapfrog de C++
159 self.integrator = _core.FDTDLeapfrogIntegrator(
160 psi_0,
161 cpp_grid,
162 problem.potential,
163 problem.boundary_condition,
164 problem.time_step,
165 electron_mass
166 )
167
168 print(f"DiracSolver inicializado con el motor C++ '{self.integrator.get_name()}'.")
169

Documentación de funciones miembro

◆ get_psi()

dirac_solver.core.DiracSolver.get_psi (   self)

Obtiene el estado actual del campo espinorial.

Devuelve
np.ndarray con la función de onda actual (espinor completo).
184 def get_psi(self):
185 return self.integrator.get_psi()
186

◆ plot_probability_density()

dirac_solver.core.DiracSolver.plot_probability_density (   self)

Calcula y grafica la densidad de probabilidad asociada al campo espinorial.

La representación visual depende de la dimensionalidad de la malla:

  • 1D: gráfico lineal
  • 2D: mapa de calor
  • 3D: nube de puntos coloreada
Atención
Puede consumir mucha memoria para mallas 3D grandes.
195 def plot_probability_density(self):
196 print("Graficando densidad de probabilidad...")
197 psi = self.get_psi()
198 rho = np.sum(psi.conj() * psi, axis=1).real
199
200 grid = self.problem.grid
201 dim = grid.dim
202
203 if dim == 1:
204 x_coords = grid.coords[:, 0]
205 plt.figure(figsize=(10, 6))
206 plt.plot(x_coords, rho)
207 plt.xlabel("Posición (z)")
208 plt.ylabel("Densidad de Probabilidad")
209 plt.title("Densidad de Probabilidad del Campo Espinorial")
210 plt.grid(True)
211 plt.show()
212 elif dim == 2:
213 shape = grid.shape
214 rho_grid = rho.reshape(shape)
215 plt.figure(figsize=(10, 8))
216 plt.imshow(rho_grid.T, origin='lower', aspect='auto',
217 extent=[grid.origin[0], grid.origin[0] + (shape[0] - 1) * grid.spacing[0],
218 grid.origin[1], grid.origin[1] + (shape[1] - 1) * grid.spacing[1]])
219 plt.colorbar(label="Densidad de Probabilidad")
220 plt.xlabel("Posición (x)")
221 plt.ylabel("Posición (y)")
222 plt.title("Densidad de Probabilidad 2D")
223 plt.show()
224 elif dim == 3:
225 fig = plt.figure(figsize=(10, 8))
226 ax = fig.add_subplot(111, projection='3d')
227 coords = grid.coords
228 x = coords[:, 0]
229 y = coords[:, 1]
230 z = coords[:, 2]
231 p = ax.scatter(x, y, z, c=rho, cmap='viridis')
232 fig.colorbar(p, label="Densidad de Probabilidad")
233 ax.set_xlabel("Posición (x)")
234 ax.set_ylabel("Posición (y)")
235 ax.set_zlabel("Posición (z)")
236 plt.title("Densidad de Probabilidad 3D")
237 plt.show()

◆ run_simulation()

dirac_solver.core.DiracSolver.run_simulation (   self)

Ejecuta la simulación completa de tiempo.

Llama iterativamente al método step() del integrador C++.

Nota
Imprime información de progreso cada 10 pasos.
173 def run_simulation(self):
174 num_steps = int(self.problem.total_time / self.problem.time_step)
175 print(f"Ejecutando simulación por {num_steps} pasos...")
176 for i in range(num_steps):
177 self.integrator.step()
178 if (i + 1) % 10 == 0:
179 print(f" Paso {i+1}/{num_steps} completado.")
180 print("Simulación finalizada.")
181

Documentación de datos miembro

◆ integrator

dirac_solver.core.DiracSolver.integrator

◆ problem

dirac_solver.core.DiracSolver.problem

La documentación de esta clase está generada del siguiente archivo: