Cahn2dfouriercontinue

De Física Computacional
Revisão de 23h29min de 28 de setembro de 2022 por Leomigotto (discussão | contribs) (Criou página com '<source lang = "python"> import numpy as np from scipy.fft import rfft2, irfft2, rfftfreq, fftfreq import os import time #region função Fourier def cahnfourier2d(aa, kk2, kk...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar
A versão imprimível não é mais suportada e pode ter erros de renderização. Atualize os favoritos do seu navegador e use a função de impressão padrão do navegador.
import numpy as np
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

#DIGITE O CÓDIGO AQUI
codigo = (
5002
)
#DIGITE O NOVO TEMPO MAXIMO AQUI
tmax = (
6
)
#DAQUI PRA BAIXO MELHOR NÃO MEXER

#region leitura dos arquivos
valores = np.load(f".\\{codigo}\\val{codigo}.npy")

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

ccoriginal = np.load(f".\\{codigo}\\{codigo}.npy")

print("Arquivo encontrado e carregado!")
#endregion

#region gerar frequências

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
u = 1

tini = t

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

#region previsão de tempo

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

cc[0] = ccoriginal[-1]

temp = np.copy(cc[0])

tempoini = time.time()
for i in range(intervalo):
    temp = cahnfourier2d(temp, p, q)
tempofinal = time.time()
tempoestimado = tempofinal + (tempofinal - tempoini)*(u-1)

print(f"Faltam {u-1} arrays pro tempo final. Tempo estimado: +{time.ctime(tempoestimado)}")
#endregion

#region parte importante
print("Começando...")

v = 1

t = tini

while t < tmax:
    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} de {u-1} feito!")
    v+=1

#endregion

if v != u:
    print("Algo deu errado! Não salvou.")
    exit()

#region salvar arquivo e infos
print("Acabou! Hora de appendar um ao outro!")

cc = np.append(ccoriginal, cc[1:], axis = 0)

print("Appendado com sucesso!")

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

print("Pasta criada!")

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

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}"""

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

arquivo.write(f"{informacoescopiaveis}")

arquivo.close()

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)

print(f"Array impresso na pasta! Código: {codigo}")

#endregion