From 3250edd01841acfc27d1a6cef099a7109f1795d7 Mon Sep 17 00:00:00 2001
From: Simon Collignon <scllgnn@gmail.com>
Date: Tue, 20 Apr 2021 13:20:11 +0200
Subject: [PATCH] using the hermitian symmetry of the spectrum with rfft

---
 __pycache__/main.cpython-39.pyc | Bin 0 -> 1903 bytes
 main.py                         |  36 +++++++++++++++++++-------------
 2 files changed, 21 insertions(+), 15 deletions(-)
 create mode 100644 __pycache__/main.cpython-39.pyc

diff --git a/__pycache__/main.cpython-39.pyc b/__pycache__/main.cpython-39.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5c7c327ec7c3d31eb016f60d8852e45ceb1cff18
GIT binary patch
literal 1903
zcmbVM%Woq!7`Hu-OwuHMB-@9!hY{iuB&yYNL)8Lm7xqwk+2vwo6^5}VopxTe9d;X9
zgw)+*B~C~zLQ0NY0CC{7{|C}s0CCEdBM0E~OhOaN348q6-(&3G_prT2qlTdU{N<+~
z?%N3crkVK$GW0eK`6Cd97>*FtGl}q{k|(i2O^ld9EoM@iS+v4z>hLO9Rk+0*R=qO2
zgx2U1tMU4%!7Xl$NgK4A$ZN7CR)2=*GHb9V%qx7AEuRqa14kn?Ms$rYbNdowRPuan
z6VVoLvlZU@3bEC%jY4N0-{Li1Q%$zUT33LEo1^tH0#x`R>a-_-9UXRXj$fO62Fvi5
z9fbOyw7-4t*Wt6b`VYQ)`QrDVhW92IbdNfiRs>g4@oYjs;A`ounXstB*n=UrL9LL&
z3~x+nKrZnG{tp>Z<Qy}?jOV1J0og^$I7gRwAAOD=zq~L&Z!(Kn&q+YG5O5I6lH1iB
znQ?{Am~n-!uw&-*zml`{3GiRZ&GsxgW2#%gvjquhl_$-i+(Mg3naa8ip)9mEGp~Ip
zu)rDfl8x&<3R{h8PF7f#GUgP1Eu7Yd^Yl2M#_2j*H*J-zERE{6w*EIR!fxW4?KzKY
zCR@ZclNJ%uXiHpkeoQsH=yd-kG7qu^g;yOO?0HAY>kq;x3O&KxFj2fOJQb#i8>GSw
z6@0uDNOvH^r0)h{0y39{LBIu1d@kLXtD}_d2n(uC=n|a#1#R*tkVB!%b7E+sHJu8z
zhFqjFCrOfHKevRJ^m&fGoUo@bRL9Ios3`HX90xh>eS<^`e*EL%-kaSIBp0$P!#GX4
z`>8*Od7@-@kc1zD98h%+-oL;1&fPce-0Au$<6R%T>m5zK>&?7NMK|`sWG6ezTZ<Nf
z_Nob|$#o#eYGdf6Nw#s($@lmL5w}2d<I=5wu()(zz(PSWD%?hj92>eg8M)H$3BDw7
z`RsGt$I5KO)tX<ADq|?a3!<Fz(mg)7FjQ656d5g@lO@<|R997Iw2-Po$v1RiE$YT_
z;us${btzo0H;`97-Df7G+Zw+6Khhm2S7zK-!iyFXt)D9<9B}urvrMfleZmDLSxAi_
zP_zOh5d2i==UeEIQp*#<JEK+DDUn$UsjO?=k|xWA0R&&&rKYB$0g~Jl+>1J<(9zBD
z2_+{dVolrYiYQ52tJW9OIK%rY=%hx7>}~9lIuTpi+UfOl{(HUQ%Kga8BxkM)WA291
z9ade*{WM{6hZ@IR!DDOsv6po=a#Pz-D;dPu8C{J%l|`wF!jGVg^orWk*~lVQdaY3x
zew6MxQ3!r}KBwgASs4-=Lc!9QntCoHp{wg3n28tjUXL0o^ns*sTQUJvOdWuz(t!x5
yDUZ@8bKxigQ^dsCjZ-#=_&t3A<tsoO?BF^vanT7>w&AQhO@}}?>STqi;lBYsP{&^Y

literal 0
HcmV?d00001

diff --git a/main.py b/main.py
index 659d363..8681d78 100644
--- a/main.py
+++ b/main.py
@@ -11,10 +11,8 @@ xy, dx = linspace(0, 1, nn, retstep=True)
 c = 2 * random.rand(nn, nn) - 1     
 
 
-def cahn_hilliard_fdiff(it): 
-    """Cahn-Hilliard integration for it iterations using finite differences mehtod."""
-
-    global c 
+def cahn_hilliard_fdiff(it, c): 
+    """Cahn-Hilliard integration for it iterations using finite differences method."""
 
     cp = zeros((nn + 2, nn + 2))
     f = zeros((nn + 2, nn + 2))
@@ -31,32 +29,40 @@ def cahn_hilliard_fdiff(it):
         cp[1:-1, 1:-1] = cp[1:-1, 1:-1] + (dt / dx**2) * (f[0:-2, 1:-1] + f[2:, 1:-1] + f[1:-1, 0:-2] + f[1:-1, 2:] - 4 * f[1:-1, 1:-1]) 
 
     c = cp[1:-1, 1:-1]
-    
 
-def cahn_hilliard_spectral(it):
-    """Cahn-Hilliard integration for it iterations using fft spectral mehtod."""
+    return c
+    
 
-    global c 
+def cahn_hilliard_spectral(it, c):
+    """Cahn-Hilliard integration for it iterations using fft spectral method."""
 
     # wavenumbers
-    k = power(2 * pi * fft.fftfreq(nn, d=dx), 2)
-    kk = array([k,]*nn) + array([k,]*nn).transpose()
+    kr = power(2 * pi * fft.rfftfreq(nn, d=dx), 2)
+    kc = power(2 * pi * fft.fftfreq(nn, d=dx), 2)
+    kk = array([kr,]*nn) + array([kc,]*int((nn/2)+1)) .transpose()
 
     for _ in range(it): 
         
-        c = c + dt * fft.ifft2(-kk * fft.fft2( c**3 - c - a**2 * fft.ifft2(-kk * fft.fft2(c)).real)).real
+        c = c + dt * fft.irfft2(-kk * fft.rfft2( c**3 - c - a**2 * fft.irfft2(-kk * fft.rfft2(c)).real)).real
+
+    return c
 
 
 if __name__ == "__main__":
 
     tic = time.time()
     
-    # cahn_hilliard_fdiff(it)
-    cahn_hilliard_spectral(it)
+    c1 = cahn_hilliard_fdiff(it, c)
+    c2 = cahn_hilliard_spectral(it, c)
 
     toc = time.time() - tic
     
     print(f"Elapsed time is {toc} seconds.")
-
-    plt.contourf(xy, xy, c, cmap="jet")
+    
+    fig, (ax1, ax2) = plt.subplots(1, 2)
+    fig.suptitle(f"Cahn-Hilliard integration for {it} iterations ")
+    ax1.contourf(xy, xy, c1, cmap="jet")
+    ax1.set_title("Finite differences method")
+    ax2.contourf(xy, xy, c2 , cmap="jet")
+    ax2.set_title("Spectral method")
     plt.show()
-- 
GitLab