Lstart

De Física Computacional
Revisão de 17h54min de 18 de outubro de 2022 por Leomigotto (discussão | contribs) (Criou página com '<source lang = python> import numpy as np import os #baoab 1 par 2d unidades reduzidas com maior cuidado, salva em arquivos #region funcoes def potencial(pos): forca = np...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar
import numpy as np
import os

#baoab 1 par 2d unidades reduzidas com maior cuidado, salva em arquivos
#region funcoes
def potencial(pos):
    forca = np.zeros(2)
    forca[0] = -4*alfa*(pos[0]**3) + 2*beta*pos[0]
    forca[1] = -4*alfa*(pos[1]**3) + 2*beta*pos[1]
    return forca
#endregion

#region variaveis alteraveis
intervalo = int(
#DE QUANTOS EM QUANTOS O PROGRAMA SALVA OS DADOS (EVITA ARQUIVOS EXCESSIVAMENTE PESADOS PRA TEMPOS LONGOS)
#OU DTS PEQUENOS, 1 PRA USAR TODOS
1
)
#ALFA E BETA SÃO DO CAMPO POTENCIAL
alfa = (
0
)
beta = (
0
)
gaminha = (
#RELATIVO AO RUIDO ESTOCASTICO
0.1
)
temp = (
#TEMPERATURA, 1 É EQ A 118K +-
3
)
dt = (
10**-2
)
tmax = (
500000
)
npar = (
#NUMERO DE PARTICULAS
1
)
seedinicial = (
468884114
)
'''
SEEDS DA WIKI
2135489      DT -2 GAMINHA +1
87846354     DT -2 GAMINHA 0	
459618741    DT -2 GAMINHA -1
#TEMP = 2
54684135     DT -2 GAMINHA +1
84653987465  DT -2 GAMINHA 0
9776678878   DT -2 GAMINHA -1
#TEMP = 3
7984651 	 DT -2 GAMINHA +1
4646464      DT -2 GAMINHA 0
468884114    DT -2 GAMINHA -1
'''
#endregion

print("Indo calcular constantes...")

c1 = np.exp(-gaminha*dt)

c2  = (np.sqrt(1 - np.exp(-2*gaminha*dt)))*np.sqrt(temp)

print("Constantes calculadas, hora de ver se tem npassos certos.")

npassos = int(np.round(tmax/dt))

if int(npassos%intervalo) != 0:
    print(f"Combinação npassos com intervalo não funcional, cuidado pra que o intervalo seja um inteiro que divide npassos sem ter resto")
    exit(0)

print(f"Passos ok, passos que precisam ser calculados: {npassos}")

nsalvos = int((npassos/intervalo) + 1)

print(f"{nsalvos} serão salvos (contando o primeiro).")

aleatorios = np.random.normal(0, 1, size = (npassos, 2)) * c2

xy = np.zeros((nsalvos, 2))

checar = 0

pxy = np.zeros((nsalvos, 2))

tempos = np.arange(0, tmax + dt, dt*intervalo)

salvador = int(0)

print("Tudo pronto, hora de começar!")

xyatual = xy[0]

pxyatual = pxy[0]

for i in range(0, npassos):
    #BAOAB 2D SEM PBC COM CAMPO
    #B
    pxytemp = pxyatual + dt * (potencial(xyatual))/2
    #A
    xytemp = xyatual + dt*pxytemp/2
    #O
    pxylinha = c1*pxytemp + aleatorios[i]
    #A
    xyatual = xytemp + dt*pxylinha/2
    #B
    pxyatual = pxylinha + dt * (potencial(xyatual))/2
    #FIM DO BAOAB, HORA DE SALVAR
    salvador+=1
    if salvador%intervalo == 0:
        xy[int(salvador/intervalo)] = xyatual
        pxy[int(salvador/intervalo)] = pxyatual

print("Acabou, hora de salvar!")

estadoaleatorio = np.random.get_state()

np.random.seed()

codigo = int(np.random.rand(1)*10**6)

print(f"O código será {codigo}")

while os.path.isdir(f"{codigo}") == True:
    print("Deu igual! A chance disso é baixíssima, peço perdão por ter desperdiçado sua sorte!")
    print("O programa deve corrigir isso, se essa mensagem estiver sendo repitida, há um erro grave!")
    codigo+=1

os.makedirs(f".\\#{codigo}", exist_ok = True)

print(f"Pasta única criada! Nome {codigo}")

informacoesleitura = (f"""Infos do código {codigo}
intervalo = int(
#DE QUANTOS EM QUANTOS O PROGRAMA SALVA OS DADOS (EVITA ARQUIVOS EXCESSIVAMENTE PESADOS PRA TEMPOS LONGOS)
#OU DTS PEQUENOS, 1 PRA USAR TODOS
{intervalo}
)
#ALFA E BETA SÃO DO CAMPO POTENCIAL
alfa = (
{alfa}
)
beta = (
{beta}
)
gaminha = (
#RELATIVO AO RUIDO ESTOCASTICO
{gaminha}
)
temp = (
{temp}
)
dt = (
{dt}
)
t = (
{tmax}
)
seedinicial = (
#SÓ USE DE NOVO SE FOR PRA FAZER DO ZERO IGUAL
{seedinicial}
)""")

valores = np.zeros(9)
(
valores[0],     valores[1],     valores[2],     valores[3],     valores[4],
valores[5],     valores[6],     valores[7],     valores[8]
) = (
intervalo,      alfa,           beta,           gaminha,        temp,
dt,             tmax,           npar,           seedinicial
)

print("Hora de salvar os arquivos...")

np.save(f".\\#{codigo}\\state#{codigo}.npy", estadoaleatorio, allow_pickle = True)

np.save(f".\\#{codigo}\\val#{codigo}.npy", valores)

np.save(f".\\#{codigo}\\xy#{codigo}.npy", xy)

np.save(f".\\#{codigo}\\pxy#{codigo}.npy", pxy)

arquivo = open(f".\\#{codigo}\\info#{codigo}.txt", "w")

arquivo.write(f"{informacoesleitura}")

arquivo.close()

print(f"Tudo certo! Código {codigo}.")