Cahn2dfourier: mudanças entre as edições

De Física Computacional
Ir para navegação Ir para pesquisar
(Criou página com '<source lang="python"> import numpy as np import matplotlib.pyplot as plt from scipy.fft import rfft2, irfft2, rfftfreq, fftfreq import os import time #region função Fourie...')
 
Sem resumo de edição
 
Linha 16: Linha 16:


#CONSTANTES INICIAIS
#CONSTANTES INICIAIS
#SEMENTE UTILIZADA NAS FIGURAS DA PÁGINA:
#846513 PARA O PRIMEIRO CONJUNTO
#8456 PARA O SEGUNDO CONJUNTO
seed = 8456
seed = 8456



Edição atual tal como às 18h53min de 29 de setembro de 2022

import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import rfft2, irfft2, rfftfreq, fftfreq
import os
import time

#region função Fourier
def cahnfourier2d(aa, kk2, kk4):#calculador da transformada
    cct = rfft2(aa)
    cct3 = rfft2(aa**3)
    cct = cct + difd*dt*(-kk2*(cct3 - cct) - kk4*cct)
    ccn = irfft2(cct)
    return ccn
#endregion

#CONSTANTES INICIAIS

#SEMENTE UTILIZADA NAS FIGURAS DA PÁGINA:
#846513 PARA O PRIMEIRO CONJUNTO
#8456 PARA O SEGUNDO CONJUNTO

seed = 8456

gamma = (0.01)**2

difd = 1

intervalo = 50

xmax = 1

tmax = 0.05

dt = 1.8*(10**-7)

dx = 1/128

#NORMALIZAR, 0 PRA NÃO, 1 PARA SIM
normalizar = 1

mediadesejada = 0.5
#DAQUI PRA BAIXO MELHOR NÃO MEXER

#region gerar frequências
np.random.seed(seed)

l = int((xmax/dx))

nx21 = int((l/2) + 1)

k1  = rfftfreq(l, dx/(2*np.pi))

k2 = fftfreq(l, dx/(2*np.pi))

r1, r2 = np.meshgrid(k1, k2)

p = r1**2 + r2**2

q = (p**2)*gamma
#endregion

#region cálculo de quantos arrays faltam
t = 0

u = 1

while t < tmax:#ver tamanho do array
    for i in range(intervalo):
        t = round(t + dt, int(-np.log10(dt) + 2))
    u+=1
#endregion

#region criar array e calcular média do frame inicial

cc = np.zeros((u, l, l))

cc[0] = np.random.rand(l, l)*2 - 1

media = np.sum(cc[0])/(l**2)
#endregion

#region normalizador
if normalizar == 1:
    cc[0] = (((cc[0] - media)/(1 + abs(media))) * (1-abs(mediadesejada))) + mediadesejada
else:
    mediadesejada = 10
#endregion

#region previsão de tempo
tempoini = time.time()
temp = np.copy(cc[0])
for i in range(intervalo):
    temp = cahnfourier2d(temp, p, q)
tempofinal = time.time()
tempoestimado = tempofinal + (tempofinal - tempoini)*(u-1)
#endregion

#region parte que funciona salvando coisa no pc, sem plotar ao vivo

print(f"Será um total de {u} arrays. O primeiro já está feito. Hora estimada de término: {time.ctime(tempoestimado)}. Começando...")

#region calculos
temp = np.copy(cc[0])

v = 1

t = 0

while t < tmax:#parte boa do programa
    for i in range(intervalo):
        temp = cahnfourier2d(temp, p, q)
        t = round(t + dt, int(-np.log10(dt) + 2))
    cc[v] = temp
    print(f"Array numero {v+1} de {u} feito!")
    v+=1

tempofinaleira = time.time()
diftempo = tempofinaleira - tempoestimado
print(f"Acabou!")
#endregion

#region salvar valores
np.random.seed()

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

while os.path.isdir(f"{codigo}") == True:
    print("Deu igual!")
    codigo+=1

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

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

informacoescopiaveis = f"""#valores do codigo {codigo}, normalização {normalizar} em média {mediadesejada}. Este arquivo é para caso de perder o arquivo de valores
#ou ser necessário consultar os valores.
normalizar = {normalizar}

mediadesejada = {mediadesejada}

codigo = {codigo}

seed = {seed}

gamma = {gamma}

difd = {difd}

intervalo = {intervalo}

xmax = {xmax}

t = {t}

dt = {dt}

dx = {dx}"""

valores = np.zeros(10)

valores[0], valores[1],    valores[2], valores[3], valores[4], valores[5], valores[6], valores[7], valores[8], valores[9] = (
normalizar, mediadesejada, seed,       gamma,      difd,       intervalo,  xmax,       t,          dt,         dx)

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

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

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

arquivo.write(f"{informacoescopiaveis}")

arquivo.close()
#endregion

#endregion