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
# ------------------------------------------------------------------------------------------------------------------------------------------ #
def create_ic(dict_user, dict_sample):
'''
Create initial conditions with 1 grain and an indenter.
Mesh, phase field and solute 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'])
print('Mesh size:',len(x_L),'-',len(y_L),'\n')
# ------------------------------------------------------------------------------------------------------------------------------------------ #
# Create initial phase and solute maps
print("Creating initial phase field and solute maps")
eta_map = np.zeros((dict_user['n_mesh_y'], dict_user['n_mesh_x']))
c_map = np.zeros((dict_user['n_mesh_y'], dict_user['n_mesh_x']))
# cst
R_gas = dict_user['R_cst']
Temp = dict_user['temperature']
V_m = dict_user['V_m']
# solid activity
a_s = math.exp(dict_user['pressure_applied']*V_m/(R_gas*Temp))
if dict_user['control_technique'] == 'constant':
a_s_p = a_s*(1+dict_user['control_front_factor'])
a_s_m = a_s*(1-dict_user['control_front_factor'])
# iteration on x
for i_x in range(len(x_L)):
x = x_L[i_x]
if dict_user['adapt_ic']:
# look for x in L_adapt_x_ic
i_adapt_x_ic = 0
while not (dict_user['L_adapt_x_ic'][i_adapt_x_ic] <= x and x <= dict_user['L_adapt_x_ic'][i_adapt_x_ic+1]):
i_adapt_x_ic = i_adapt_x_ic + 1
# read data
f_a_s_m = dict_user['L_adapt_as_ic'][i_adapt_x_ic]
f_a_s_p = dict_user['L_adapt_as_ic'][i_adapt_x_ic+1]
x_m = dict_user['L_adapt_x_ic'][i_adapt_x_ic]
x_p = dict_user['L_adapt_x_ic'][i_adapt_x_ic+1]
# iteration on y
for i_y in range(len(y_L)):
y = y_L[i_y]
# eta
if y <= dict_user['h_grain']-dict_user['w_int']/2 :
eta_map[-1-i_y, i_x] = 1
elif dict_user['h_grain']-dict_user['w_int']/2 < y and y < dict_user['h_grain']+dict_user['w_int']/2:
distance = y-dict_user['h_grain']
eta_map[-1-i_y, i_x] = 0.5*(1+math.cos(math.pi*(distance+dict_user['w_int']/2)/dict_user['w_int']))
elif dict_user['h_grain']+dict_user['w_int']/2 <= y :
eta_map[-1-i_y, i_x] = 0
# solute
# system at the equilibrium initialy
if dict_user['control_technique'] == 'constant':
a_s_ij = a_s_p + (a_s_m-a_s_p)*(x-x_L[0])/(x_L[-1]-x_L[0])
elif dict_user['adapt_ic']:
f_as = f_a_s_p + (f_a_s_m-f_a_s_p)*(x-x_m)/(x_p-x_m)
a_s_ij = a_s*f_as
else :
a_s_ij = a_s
if dict_user['h_grain']-dict_user['size_tube']/2 <= y and y <= dict_user['h_grain']+dict_user['size_tube']/2:
c_map[-1-i_y, i_x] = dict_user['C_eq']*a_s_ij
else :
c_map[-1-i_y, i_x] = dict_user['C_eq']
# save dict
dict_sample['eta_map'] = eta_map.copy()
dict_sample['c_map'] = c_map.copy()
dict_sample['x_L'] = x_L.copy()
dict_sample['y_L'] = y_L.copy()
Functions
def create_ic()
-
Create initial conditions with 1 grain and an indenter.
Mesh, phase field and solute maps are generated.
Expand source code
def create_ic(dict_user, dict_sample): ''' Create initial conditions with 1 grain and an indenter. Mesh, phase field and solute 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']) print('Mesh size:',len(x_L),'-',len(y_L),'\n') # ------------------------------------------------------------------------------------------------------------------------------------------ # # Create initial phase and solute maps print("Creating initial phase field and solute maps") eta_map = np.zeros((dict_user['n_mesh_y'], dict_user['n_mesh_x'])) c_map = np.zeros((dict_user['n_mesh_y'], dict_user['n_mesh_x'])) # cst R_gas = dict_user['R_cst'] Temp = dict_user['temperature'] V_m = dict_user['V_m'] # solid activity a_s = math.exp(dict_user['pressure_applied']*V_m/(R_gas*Temp)) if dict_user['control_technique'] == 'constant': a_s_p = a_s*(1+dict_user['control_front_factor']) a_s_m = a_s*(1-dict_user['control_front_factor']) # iteration on x for i_x in range(len(x_L)): x = x_L[i_x] if dict_user['adapt_ic']: # look for x in L_adapt_x_ic i_adapt_x_ic = 0 while not (dict_user['L_adapt_x_ic'][i_adapt_x_ic] <= x and x <= dict_user['L_adapt_x_ic'][i_adapt_x_ic+1]): i_adapt_x_ic = i_adapt_x_ic + 1 # read data f_a_s_m = dict_user['L_adapt_as_ic'][i_adapt_x_ic] f_a_s_p = dict_user['L_adapt_as_ic'][i_adapt_x_ic+1] x_m = dict_user['L_adapt_x_ic'][i_adapt_x_ic] x_p = dict_user['L_adapt_x_ic'][i_adapt_x_ic+1] # iteration on y for i_y in range(len(y_L)): y = y_L[i_y] # eta if y <= dict_user['h_grain']-dict_user['w_int']/2 : eta_map[-1-i_y, i_x] = 1 elif dict_user['h_grain']-dict_user['w_int']/2 < y and y < dict_user['h_grain']+dict_user['w_int']/2: distance = y-dict_user['h_grain'] eta_map[-1-i_y, i_x] = 0.5*(1+math.cos(math.pi*(distance+dict_user['w_int']/2)/dict_user['w_int'])) elif dict_user['h_grain']+dict_user['w_int']/2 <= y : eta_map[-1-i_y, i_x] = 0 # solute # system at the equilibrium initialy if dict_user['control_technique'] == 'constant': a_s_ij = a_s_p + (a_s_m-a_s_p)*(x-x_L[0])/(x_L[-1]-x_L[0]) elif dict_user['adapt_ic']: f_as = f_a_s_p + (f_a_s_m-f_a_s_p)*(x-x_m)/(x_p-x_m) a_s_ij = a_s*f_as else : a_s_ij = a_s if dict_user['h_grain']-dict_user['size_tube']/2 <= y and y <= dict_user['h_grain']+dict_user['size_tube']/2: c_map[-1-i_y, i_x] = dict_user['C_eq']*a_s_ij else : c_map[-1-i_y, i_x] = dict_user['C_eq'] # save dict dict_sample['eta_map'] = eta_map.copy() dict_sample['c_map'] = c_map.copy() dict_sample['x_L'] = x_L.copy() dict_sample['y_L'] = y_L.copy()