From 3a78346ce01f3277e7c380aef867f096f2b0d5cb Mon Sep 17 00:00:00 2001
From: Martin Bauer <martin.bauer@fau.de>
Date: Wed, 5 Dec 2018 12:13:29 +0100
Subject: [PATCH] Added three-point energy to n-phase model

---
 phasefield/analytical.py | 9 ++++++++-
 phasefield/scenarios.py  | 4 +++-
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/phasefield/analytical.py b/phasefield/analytical.py
index e067c923..04141d74 100644
--- a/phasefield/analytical.py
+++ b/phasefield/analytical.py
@@ -102,7 +102,8 @@ def free_energy_functional_n_phases(num_phases=None, surface_tensions=symmetric_
                                     include_bulk=True, include_interface=True, symbolic_lambda=False,
                                     symbolic_dependent_variable=False,
                                     f1=lambda c: c ** 2 * (1 - c) ** 2,
-                                    f2=lambda c: c ** 2 * (1 - c) ** 2):
+                                    f2=lambda c: c ** 2 * (1 - c) ** 2,
+                                    triple_point_energy=0):
     r"""
     Returns a symbolic expression for the free energy of a system with N phases and
     specified surface tensions. The total free energy is the sum of a bulk and an interface component.
@@ -129,6 +130,7 @@ def free_energy_functional_n_phases(num_phases=None, surface_tensions=symmetric_
         order_parameters: explicitly
         f1: bulk energy is computed as f1(c_i) + f1(c_j) - f2(c_i + c_j)
         f2: see f2
+        triple_point_energy: term multiplying c[i]*c[j]*c[k] for i < j < k
       Parameters useful for viewing / debugging the function
         include_bulk: if false no bulk term is added
         include_interface:if false no interface contribution is added
@@ -176,6 +178,11 @@ def free_energy_functional_n_phases(num_phases=None, surface_tensions=symmetric_
     f_bulk = 3 / sp.sqrt(2) / interface_width * sum(bulk_term(i, j) for i, j in multi_sum(2, num_phases) if i != j)
     f_interface = sum(lambda_coeff(i, j) / 2 * Diff(phi[i]) * Diff(phi[j]) for i, j in multi_sum(2, num_phases - 1))
 
+    for i in range(len(phi)):
+        for j in range(i):
+            for k in range(j):
+                f_bulk += triple_point_energy * phi[i] * phi[j] * phi[k]
+
     result = 0
     if include_bulk:
         result += f_bulk
diff --git a/phasefield/scenarios.py b/phasefield/scenarios.py
index 2e3af679..955be13e 100644
--- a/phasefield/scenarios.py
+++ b/phasefield/scenarios.py
@@ -43,10 +43,12 @@ def create_n_phase_model(alpha=1, num_phases=4,
                          surface_tensions=lambda i, j: 0.005 if i != j else 0,
                          f1=lambda c: c ** 2 * (1 - c) ** 2,
                          f2=lambda c: c ** 2 * (1 - c) ** 2,
+                         triple_point_energy=0,
                          **kwargs):
     order_parameters = symbolic_order_parameters(num_phases - 1)
     free_energy = free_energy_functional_n_phases(num_phases, surface_tensions, alpha,
-                                                  order_parameters, f1=f1, f2=f2)
+                                                  order_parameters, f1=f1, f2=f2,
+                                                  triple_point_energy=triple_point_energy)
     return PhaseFieldStep(free_energy, order_parameters, **kwargs)
 
 
-- 
GitLab