import matplotlib
matplotlib.rc('text', usetex=True)
import matplotlib.pyplot as plt
import numpy as np

# interface tracking profiles
N = 500
delta = 0.6
X = np.linspace(-1, 1, N)
plt.plot(X, (1 - np.tanh(4.*X/delta))/2,    # phase field tanh profiles
           X, (X + 1)/2,                      # level set distance function
           X, (1.4 + np.tanh(4.*X/delta))/4,  # composition profile
           X, X < 0, 'k--',                   # sharp interface
           linewidth=5)

# legend
plt.legend(('phase field', 'level set', 'composition', 'sharp interface'), shadow=True, loc=(0.01, 0.55))

ltext = plt.gca().get_legend().get_texts()
plt.setp(ltext[0], fontsize=20, color='b')
plt.setp(ltext[1], fontsize=20, color='g')
plt.setp(ltext[2], fontsize=20, color='r')
plt.setp(ltext[3], fontsize=20, color='k')

# the arrow
height = 0.1
offset = 0.02
plt.plot((-delta / 2., delta / 2), (height, height), 'k', linewidth=2)
plt.plot((-delta / 2, -delta / 2 + offset * 2), (height, height - offset), 'k', linewidth=2)
plt.plot((-delta / 2, -delta / 2 + offset * 2), (height, height + offset), 'k', linewidth=2)
plt.plot((delta / 2, delta / 2 - offset * 2), (height, height - offset), 'k', linewidth=2)
plt.plot((delta / 2, delta / 2 - offset * 2), (height, height + offset), 'k', linewidth=2)
plt.text(-0.06, height - 0.06, r'$\delta$', {'color': 'k', 'fontsize': 24})

# X-axis label
plt.xticks((-1, 0, 1), ('-1', '0', '1'), color='k', size=20)

# Left Y-axis labels
plt.ylabel(r'\bf{phase field} $\phi$', {'color': 'b',
                                          'fontsize': 20})
plt.yticks((0, 0.5, 1), ('0', '.5', '1'), color='k', size=20)

# Right Y-axis labels
plt.text(1.05, 0.5, r"\bf{level set} $\phi$", {'color': 'g', 'fontsize': 20},
           horizontalalignment='left',
           verticalalignment='center',
           rotation=90,
           clip_on=False)
plt.text(1.01, -0.02, "-1", {'color': 'k', 'fontsize': 20})
plt.text(1.01, 0.98, "1", {'color': 'k', 'fontsize': 20})
plt.text(1.01, 0.48, "0", {'color': 'k', 'fontsize': 20})

# level set equations
plt.text(0.1, 0.85,
           r'$|\nabla\phi| = 1,$ \newline $ \frac{\partial \phi}{\partial t}'
           r'+ U|\nabla \phi| = 0$',
           {'color': 'g', 'fontsize': 20})

# phase field equations
plt.text(0.2, 0.15,
           r'$\mathcal{F} = \int f\left( \phi, c \right) dV,$ \newline '
           r'$ \frac{ \partial \phi } { \partial t } = -M_{ \phi } '
           r'\frac{ \delta \mathcal{F} } { \delta \phi }$',
           {'color': 'b', 'fontsize': 20})

# these went wrong in pdf in a previous version
plt.text(-.9, .42, r'gamma: $\gamma$', {'color': 'r', 'fontsize': 20})
plt.text(-.9, .36, r'Omega: $\Omega$', {'color': 'b', 'fontsize': 20})

plt.show()
