Module IC

@author: Alexandre Sac–Morane alexandre.sac-morane@uclouvain.be

This is the file where the initial conditions are defined.

Expand source code

  # -*- encoding=utf-8 -*-

  import numpy as np
  import math, skfmm

  # ------------------------------------------------------------------------------------------------------------------------------------------ #

  def create_2_spheres(dict_user, dict_sample):
      '''
      Create initial conditions with 2 spheres.
      Mesh and phase field maps are generated
      '''
      # ------------------------------------------------------------------------------------------------------------------------------------------ #
      # position of the grains

      pos_1 = [0,-dict_user['radius']]
      pos_2 = [0, dict_user['radius']]

      # ------------------------------------------------------------------------------------------------------------------------------------------ #
      # Create initial mesh
      print("Creating initial mesh")

      if dict_user['remesh']:
          # x min
          x_min_dom = 0-dict_user['radius']-dict_user['margin_mesh_domain']
          # x max
          x_max_dom = 0+dict_user['radius']+dict_user['margin_mesh_domain']
          # y min
          y_min_dom = -dict_user['radius']-dict_user['radius']-dict_user['margin_mesh_domain']
          # y max
          y_max_dom = dict_user['radius']+dict_user['radius']+dict_user['margin_mesh_domain']
          # compute the new x_L and y_L
          x_L = np.arange(x_min_dom, x_max_dom, dict_user['size_x_mesh'])
          dict_user['n_mesh_x'] = len(x_L)
          y_L = np.arange(y_min_dom, y_max_dom, dict_user['size_y_mesh'])
          dict_user['n_mesh_y'] = len(y_L)
      else :
          x_L = np.linspace(dict_user['x_min'], dict_user['x_max'], dict_user['n_mesh_x'])
          y_L = np.linspace(dict_user['y_min'], dict_user['y_max'], dict_user['n_mesh_y'])

      # ------------------------------------------------------------------------------------------------------------------------------------------ #
      # Create initial phase map

      print("Creating initial phase field maps")

      eta_1_map = np.zeros((dict_user['n_mesh_y'], dict_user['n_mesh_x']))
      eta_2_map = np.zeros((dict_user['n_mesh_y'], dict_user['n_mesh_x']))

      # iteration on x
      for i_x in range(len(x_L)):
          x = x_L[i_x]
          # iteration on y
          for i_y in range(len(y_L)):
              y = y_L[i_y]

              # distance to g1 and g2
              d_node_to_g1 = np.linalg.norm(np.array([x,y])-np.array(pos_1))
              d_node_to_g2 = np.linalg.norm(np.array([x,y])-np.array(pos_2))

              # eta 1
              if d_node_to_g1 <= dict_user['radius']-dict_user['w_int']/2 :
                  eta_1_map[-1-i_y, i_x] = 1
              elif dict_user['radius']-dict_user['w_int']/2 < d_node_to_g1 and d_node_to_g1 < dict_user['radius']+dict_user['w_int']/2:
                  eta_1_map[-1-i_y, i_x] = 0.5*(1+math.cos(math.pi*(d_node_to_g1-dict_user['radius']+dict_user['w_int']/2)/dict_user['w_int']))
              elif dict_user['radius']+dict_user['w_int']/2 <= d_node_to_g1 :
                  eta_1_map[-1-i_y, i_x] = 0

              # eta 2
              if d_node_to_g2 <= dict_user['radius']-dict_user['w_int']/2 :
                  eta_2_map[-1-i_y, i_x] = 1
              elif dict_user['radius']-dict_user['w_int']/2 < d_node_to_g2 and d_node_to_g2 < dict_user['radius']+dict_user['w_int']/2:
                  eta_2_map[-1-i_y, i_x] = 0.5*(1+math.cos(math.pi*(d_node_to_g2-dict_user['radius']+dict_user['w_int']/2)/dict_user['w_int']))
              elif dict_user['radius']+dict_user['w_int']/2 <= d_node_to_g2 :
                  eta_2_map[-1-i_y, i_x] = 0

      # save dict
      dict_sample['pos_1'] = pos_1
      dict_sample['pos_2'] = pos_2
      dict_sample['eta_1_map'] = eta_1_map
      dict_sample['eta_2_map'] = eta_2_map
      dict_sample['x_L'] = x_L
      dict_sample['y_L'] = y_L

  # ------------------------------------------------------------------------------------------------------------------------------------------ #

  def create_1_sphere(dict_user, dict_sample):
      '''
      Create initial conditions with 1 sphere.
      Mesh and phase field maps are generated
      '''
      # ------------------------------------------------------------------------------------------------------------------------------------------ #
      # position of the grains

      pos_1 = [0, dict_user['radius']]

      # ------------------------------------------------------------------------------------------------------------------------------------------ #
      # Create initial mesh
      print("Creating initial mesh")

      if dict_user['remesh']:
          # x min
          x_min_dom = 0-dict_user['radius']-dict_user['margin_mesh_domain']
          # x max
          x_max_dom = 0+dict_user['radius']+dict_user['margin_mesh_domain']
          # y min
          y_min_dom = -dict_user['plate']-dict_user['margin_mesh_domain']
          # y max
          y_max_dom = 2*dict_user['radius']+dict_user['margin_mesh_domain']
          # compute the new x_L and y_L
          x_L = np.arange(x_min_dom, x_max_dom, dict_user['size_x_mesh'])
          dict_user['n_mesh_x'] = len(x_L)
          y_L = np.arange(y_min_dom, y_max_dom, dict_user['size_y_mesh'])
          dict_user['n_mesh_y'] = len(y_L)
      else :
          x_L = np.linspace(dict_user['x_min'], dict_user['x_max'], dict_user['n_mesh_x'])
          y_L = np.linspace(dict_user['y_min'], dict_user['y_max'], dict_user['n_mesh_y'])

      # ------------------------------------------------------------------------------------------------------------------------------------------ #
      # Create initial phase map

      print("Creating initial phase field maps")

      eta_1_map = np.zeros((dict_user['n_mesh_y'], dict_user['n_mesh_x']))

      # iteration on x
      for i_x in range(len(x_L)):
          x = x_L[i_x]
          # iteration on y
          for i_y in range(len(y_L)):
              y = y_L[i_y]

              # distance to g1 and g2
              d_node_to_g1 = np.linalg.norm(np.array([x,y])-np.array(pos_1))

              # eta 1
              if d_node_to_g1 <= dict_user['radius']-dict_user['w_int']/2 :
                  eta_1_map[-1-i_y, i_x] = 1
              elif dict_user['radius']-dict_user['w_int']/2 < d_node_to_g1 and d_node_to_g1 < dict_user['radius']+dict_user['w_int']/2:
                  eta_1_map[-1-i_y, i_x] = 0.5*(1+math.cos(math.pi*(d_node_to_g1-dict_user['radius']+dict_user['w_int']/2)/dict_user['w_int']))
              elif dict_user['radius']+dict_user['w_int']/2 <= d_node_to_g1 :
                  eta_1_map[-1-i_y, i_x] = 0

      # save dict
      dict_sample['pos_1'] = pos_1
      dict_sample['eta_1_map'] = eta_1_map
      dict_sample['x_L'] = x_L
      dict_sample['y_L'] = y_L

  # ------------------------------------------------------------------------------------------------------------------------------------------ #

  def create_solute(dict_user, dict_sample):
      '''
      Create the map of the solute distribution.
      '''
      c_map = np.zeros((dict_user['n_mesh_y'], dict_user['n_mesh_x']))
      for i_x in range(len(dict_sample['x_L'])):
          for i_y in range(len(dict_sample['y_L'])):
              c_map[-1-i_y, i_x] = dict_user['C_eq'] # system at the equilibrium initialy
      # save in dict
      dict_sample['c_map'] = c_map

Functions

def create_2_spheres()

Create initial conditions with 2 spheres.

Mesh and phase field maps are generated
Expand source code

  def create_2_spheres(dict_user, dict_sample):
      '''
      Create initial conditions with 2 spheres.
      Mesh and phase field maps are generated
      '''
      # ------------------------------------------------------------------------------------------------------------------------------------------ #
      # position of the grains

      pos_1 = [0,-dict_user['radius']]
      pos_2 = [0, dict_user['radius']]

      # ------------------------------------------------------------------------------------------------------------------------------------------ #
      # Create initial mesh
      print("Creating initial mesh")

      if dict_user['remesh']:
          # x min
          x_min_dom = 0-dict_user['radius']-dict_user['margin_mesh_domain']
          # x max
          x_max_dom = 0+dict_user['radius']+dict_user['margin_mesh_domain']
          # y min
          y_min_dom = -dict_user['radius']-dict_user['radius']-dict_user['margin_mesh_domain']
          # y max
          y_max_dom = dict_user['radius']+dict_user['radius']+dict_user['margin_mesh_domain']
          # compute the new x_L and y_L
          x_L = np.arange(x_min_dom, x_max_dom, dict_user['size_x_mesh'])
          dict_user['n_mesh_x'] = len(x_L)
          y_L = np.arange(y_min_dom, y_max_dom, dict_user['size_y_mesh'])
          dict_user['n_mesh_y'] = len(y_L)
      else :
          x_L = np.linspace(dict_user['x_min'], dict_user['x_max'], dict_user['n_mesh_x'])
          y_L = np.linspace(dict_user['y_min'], dict_user['y_max'], dict_user['n_mesh_y'])

      # ------------------------------------------------------------------------------------------------------------------------------------------ #
      # Create initial phase map

      print("Creating initial phase field maps")

      eta_1_map = np.zeros((dict_user['n_mesh_y'], dict_user['n_mesh_x']))
      eta_2_map = np.zeros((dict_user['n_mesh_y'], dict_user['n_mesh_x']))

      # iteration on x
      for i_x in range(len(x_L)):
          x = x_L[i_x]
          # iteration on y
          for i_y in range(len(y_L)):
              y = y_L[i_y]

              # distance to g1 and g2
              d_node_to_g1 = np.linalg.norm(np.array([x,y])-np.array(pos_1))
              d_node_to_g2 = np.linalg.norm(np.array([x,y])-np.array(pos_2))

              # eta 1
              if d_node_to_g1 <= dict_user['radius']-dict_user['w_int']/2 :
                  eta_1_map[-1-i_y, i_x] = 1
              elif dict_user['radius']-dict_user['w_int']/2 < d_node_to_g1 and d_node_to_g1 < dict_user['radius']+dict_user['w_int']/2:
                  eta_1_map[-1-i_y, i_x] = 0.5*(1+math.cos(math.pi*(d_node_to_g1-dict_user['radius']+dict_user['w_int']/2)/dict_user['w_int']))
              elif dict_user['radius']+dict_user['w_int']/2 <= d_node_to_g1 :
                  eta_1_map[-1-i_y, i_x] = 0

              # eta 2
              if d_node_to_g2 <= dict_user['radius']-dict_user['w_int']/2 :
                  eta_2_map[-1-i_y, i_x] = 1
              elif dict_user['radius']-dict_user['w_int']/2 < d_node_to_g2 and d_node_to_g2 < dict_user['radius']+dict_user['w_int']/2:
                  eta_2_map[-1-i_y, i_x] = 0.5*(1+math.cos(math.pi*(d_node_to_g2-dict_user['radius']+dict_user['w_int']/2)/dict_user['w_int']))
              elif dict_user['radius']+dict_user['w_int']/2 <= d_node_to_g2 :
                  eta_2_map[-1-i_y, i_x] = 0

      # save dict
      dict_sample['pos_1'] = pos_1
      dict_sample['pos_2'] = pos_2
      dict_sample['eta_1_map'] = eta_1_map
      dict_sample['eta_2_map'] = eta_2_map
      dict_sample['x_L'] = x_L
      dict_sample['y_L'] = y_L
def create_1_sphere()

Create initial conditions with 1 sphere.

Mesh and phase field maps are generated
Expand source code

  def create_1_sphere(dict_user, dict_sample):
      '''
      Create initial conditions with 1 sphere.
      Mesh and phase field maps are generated
      '''
      # ------------------------------------------------------------------------------------------------------------------------------------------ #
      # position of the grains

      pos_1 = [0, dict_user['radius']]

      # ------------------------------------------------------------------------------------------------------------------------------------------ #
      # Create initial mesh
      print("Creating initial mesh")

      if dict_user['remesh']:
          # x min
          x_min_dom = 0-dict_user['radius']-dict_user['margin_mesh_domain']
          # x max
          x_max_dom = 0+dict_user['radius']+dict_user['margin_mesh_domain']
          # y min
          y_min_dom = -dict_user['plate']-dict_user['margin_mesh_domain']
          # y max
          y_max_dom = 2*dict_user['radius']+dict_user['margin_mesh_domain']
          # compute the new x_L and y_L
          x_L = np.arange(x_min_dom, x_max_dom, dict_user['size_x_mesh'])
          dict_user['n_mesh_x'] = len(x_L)
          y_L = np.arange(y_min_dom, y_max_dom, dict_user['size_y_mesh'])
          dict_user['n_mesh_y'] = len(y_L)
      else :
          x_L = np.linspace(dict_user['x_min'], dict_user['x_max'], dict_user['n_mesh_x'])
          y_L = np.linspace(dict_user['y_min'], dict_user['y_max'], dict_user['n_mesh_y'])

      # ------------------------------------------------------------------------------------------------------------------------------------------ #
      # Create initial phase map

      print("Creating initial phase field maps")

      eta_1_map = np.zeros((dict_user['n_mesh_y'], dict_user['n_mesh_x']))

      # iteration on x
      for i_x in range(len(x_L)):
          x = x_L[i_x]
          # iteration on y
          for i_y in range(len(y_L)):
              y = y_L[i_y]

              # distance to g1 and g2
              d_node_to_g1 = np.linalg.norm(np.array([x,y])-np.array(pos_1))

              # eta 1
              if d_node_to_g1 <= dict_user['radius']-dict_user['w_int']/2 :
                  eta_1_map[-1-i_y, i_x] = 1
              elif dict_user['radius']-dict_user['w_int']/2 < d_node_to_g1 and d_node_to_g1 < dict_user['radius']+dict_user['w_int']/2:
                  eta_1_map[-1-i_y, i_x] = 0.5*(1+math.cos(math.pi*(d_node_to_g1-dict_user['radius']+dict_user['w_int']/2)/dict_user['w_int']))
              elif dict_user['radius']+dict_user['w_int']/2 <= d_node_to_g1 :
                  eta_1_map[-1-i_y, i_x] = 0

      # save dict
      dict_sample['pos_1'] = pos_1
      dict_sample['eta_1_map'] = eta_1_map
      dict_sample['x_L'] = x_L
      dict_sample['y_L'] = y_L
def create_solute()

Create the map of the solute distribution.

Expand source code

  def create_solute(dict_user, dict_sample):
      '''
      Create the map of the solute distribution.
      '''
      c_map = np.zeros((dict_user['n_mesh_y'], dict_user['n_mesh_x']))
      for i_x in range(len(dict_sample['x_L'])):
          for i_y in range(len(dict_sample['y_L'])):
              c_map[-1-i_y, i_x] = dict_user['C_eq'] # system at the equilibrium initialy
      # save in dict
      dict_sample['c_map'] = c_map