-
Notifications
You must be signed in to change notification settings - Fork 0
/
ExperimentoRutherford.py
111 lines (96 loc) · 4.6 KB
/
ExperimentoRutherford.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat May 8 15:16:26 2021
@author: felos
"""
import ExperimentoRutherfordFortran
import numpy as np
import multiprocessing
import math
def SimulacionOneCPU(N ,
categoria ,
z_a ,
num_laminas ,
atom_radius ,
diametro_celda ,
vel_inicial ,
max_deslocacion,
clave_proceso ):
metrica_desviaciones,metrica_num_detenidas,metrica_num_rebotadas = ExperimentoRutherfordFortran.simulacion(N,
categoria ,
z_a ,
num_laminas ,
atom_radius ,
diametro_celda ,
vel_inicial ,
max_deslocacion,
f"Resultado{clave_proceso}.txt",
verbose=False)
return metrica_desviaciones,metrica_num_detenidas,metrica_num_rebotadas
def ExperimentoNumerico(N,
cpus = 2 ,
tipo_cristal ="fcc",
z_a = 79 ,
num_laminas = 1 ,
atom_radius = 1.44e-10,
diametro_celda = 4.07e-10,
vel_inicial = 1.57e7,
max_deslocacion= 0.5):
# Hacemos parámetros compatibles.
if tipo_cristal == "pc":
categoria = 1
elif tipo_cristal == "bcc":
categoria = 2
elif tipo_cristal == "fcc":
categoria = 3
else:
raise ValueError("Los tipos de cristal disponibles son \"pc\",\"bcc\" y \"fcc\"")
metrica = 0
if cpus == 1:
# Corremos en una sola cpu.
metrica_desviaciones,metrica_num_detenidas,metrica_num_rebotadas = SimulacionOneCPU(N ,
categoria ,
z_a ,
num_laminas ,
atom_radius ,
diametro_celda ,
vel_inicial ,
max_deslocacion,
0 )
# Recopilamos Resultado
array_resultado = np.loadtxt(f"Resultado{0}.txt")
# Diccionario salida
Output = {"datos":array_resultado,"metrica":metrica}
return Output
else:
# Repartimos el trabajo entre las cpus.
tamaño_rebanada = math.floor(N/cpus)
processes = []
for i in range(cpus):
process = multiprocessing.Process(target=SimulacionOneCPU,args=(tamaño_rebanada,
categoria ,
z_a ,
num_laminas ,
atom_radius ,
diametro_celda ,
vel_inicial ,
max_deslocacion,
i ))
processes.append(process)
process.start()
for process in processes:
process.join()
# Recopilamos los resultados.
array_resultado = np.loadtxt(f"Resultado{0}.txt")
for num_resultado in range(i):
i += 1
resultado = np.loadtxt(f"Resultado{num_resultado}.txt")
try:
array_resultado = np.append(array_resultado,resultado,axis=0)
except ValueError:
pass
# Diccionario de salida.
# ! Falta sumar las desviaciones de las rebanadas.
Output = {"datos":array_resultado,"metrica":metrica}
return Output