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, pickle

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

def create_spheres(dict_user, dict_sample):
    '''
    Create initial conditions with spheres.
    Mesh and phase field maps are generated
    '''    
    # ------------------------------------------------------------------------------------------------------------------------------------------ #
    # Create initial mesh
    print("Creating initial mesh")

    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'])
    z_L = np.linspace(dict_user['z_min'], dict_user['z_max'], dict_user['n_mesh_z'])

    # ------------------------------------------------------------------------------------------------------------------------------------------ #
    # iterate on grains     
    print("Creating initial phase field maps")

    L_etai_map = []
    for i_grain in range(len(dict_user['L_pos_g'])):
        # position of the grains
        pos_i = dict_user['L_pos_g'][i_grain]

        # Create initial phase map  
        eta_i_map = np.zeros((dict_user['n_mesh_x'], dict_user['n_mesh_y'], dict_user['n_mesh_z']))
    
        # 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]
                # iteration on z
                for i_z in range(len(z_L)):
                    z = z_L[i_z]

                    # distance to grains
                    d_node_to_g = np.linalg.norm(np.array([x,y,z])-np.array(pos_i))

                    # compute phase variable
                    if d_node_to_g <= dict_user['radius']-dict_user['w_int']/2 :
                        eta_i_map[i_x, i_y, i_z] = 1
                    elif dict_user['radius']-dict_user['w_int']/2 < d_node_to_g and d_node_to_g < dict_user['radius']+dict_user['w_int']/2:
                        eta_i_map[i_x, i_y, i_z] = 0.5*(1+math.cos(math.pi*(d_node_to_g-dict_user['radius']+dict_user['w_int']/2)/dict_user['w_int']))
                    elif dict_user['radius']+dict_user['w_int']/2 <= d_node_to_g :
                        eta_i_map[i_x, i_y, i_z] = 0
        
        # save
        L_etai_map.append(eta_i_map)

    # save dict
    dict_sample['L_etai_map'] = L_etai_map
    dict_sample['x_L'] = x_L
    dict_sample['y_L'] = y_L
    dict_sample['z_L'] = z_L
 
# ------------------------------------------------------------------------------------------------------------------------------------------ #

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

Functions

def create_spheres()

Create initial conditions with spheres.

Mesh and phase field maps are generated.
Expand source code

def create_spheres(dict_user, dict_sample):
    '''
    Create initial conditions with spheres.
    Mesh and phase field maps are generated
    '''    
    # ------------------------------------------------------------------------------------------------------------------------------------------ #
    # Create initial mesh
    print("Creating initial mesh")

    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'])
    z_L = np.linspace(dict_user['z_min'], dict_user['z_max'], dict_user['n_mesh_z'])

    # ------------------------------------------------------------------------------------------------------------------------------------------ #
    # iterate on grains     
    print("Creating initial phase field maps")

    L_etai_map = []
    for i_grain in range(len(dict_user['L_pos_g'])):
        # position of the grains
        pos_i = dict_user['L_pos_g'][i_grain]

        # Create initial phase map  
        eta_i_map = np.zeros((dict_user['n_mesh_x'], dict_user['n_mesh_y'], dict_user['n_mesh_z']))
    
        # 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]
                # iteration on z
                for i_z in range(len(z_L)):
                    z = z_L[i_z]

                    # distance to grains
                    d_node_to_g = np.linalg.norm(np.array([x,y,z])-np.array(pos_i))

                    # compute phase variable
                    if d_node_to_g <= dict_user['radius']-dict_user['w_int']/2 :
                        eta_i_map[i_x, i_y, i_z] = 1
                    elif dict_user['radius']-dict_user['w_int']/2 < d_node_to_g and d_node_to_g < dict_user['radius']+dict_user['w_int']/2:
                        eta_i_map[i_x, i_y, i_z] = 0.5*(1+math.cos(math.pi*(d_node_to_g-dict_user['radius']+dict_user['w_int']/2)/dict_user['w_int']))
                    elif dict_user['radius']+dict_user['w_int']/2 <= d_node_to_g :
                        eta_i_map[i_x, i_y, i_z] = 0
        
        # save
        L_etai_map.append(eta_i_map)

    # save dict
    dict_sample['L_etai_map'] = L_etai_map
    dict_sample['x_L'] = x_L
    dict_sample['y_L'] = y_L
    dict_sample['z_L'] = z_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