# -*-shell-script-*- # 3D Phase Field simulation multi-phase field model test #------------------------------------------- source "scripts/Examples/Tcl/startup.tcl" #******************************************* # Definition of procedures #******************************************* proc init_single_phasefield { n size_x size_y size_z type radius } { MD++ setnolog MD++ setoverwrite MD++ srand48bytime #-------------------------------------------- # Initialization # MD++ num_fields = 1 gridsize = 0.4 model_type = 0 # MD++ NX = $size_x NY = $size_y NZ = $size_z input = \[ $type $radius \] initphasefield #-------------------------------------------- # Physical parameters MD++ U_00 = 1 EPS_00 = 1 # interaction strength MD++ Mob_GL = 1 Mob_D = 1 # kinetic coefficients # uncomment the following line to have anisotropic surface energy MD++ EPS1_00 = 0.6993 EPS2_00 = -3.6595 EPS3_00 = -1.7384 MD++ ROT_MATRIX_11 = [expr 1/sqrt(2)] ROT_MATRIX_21 = [expr -1/sqrt(2)] ROT_MATRIX_31 = [expr 0/sqrt(2)] MD++ ROT_MATRIX_12 = [expr 1/sqrt(6)] ROT_MATRIX_22 = [expr 1/sqrt(6)] ROT_MATRIX_32 = [expr -2/sqrt(6)] MD++ ROT_MATRIX_13 = [expr 1/sqrt(3)] ROT_MATRIX_23 = [expr 1/sqrt(3)] ROT_MATRIX_33 = [expr 1/sqrt(3)] } #-------------------------------------------- proc init_multi_phasefield { n size_x size_y size_z type radius height cos_theta } { MD++ setnolog MD++ setoverwrite MD++ srand48bytime #-------------------------------------------- # Initializtion # MD++ num_fields = 3 gridsize = 1 model_type = 1 MD++ MU_0 = 0 MU_1 = 0 MU_2 = 0.05 MD++ NX = $size_x NY = $size_y NZ = $size_z input = \[ $type $radius $height $cos_theta \] initphasefield #-------------------------------------------- # Physical parameters MD++ Mob_GL = 1 Mob_D = 0.2 Mob_LS = 1 Mob_LV = 1 Mob_SV = 1 MD++ Penalty_3phase = 0.5 MD++ U_00 = 2 MD++ U_11 = 1.37 MD++ U_22 = 1 MD++ EPS_00 = 2.0 MD++ EPS_11 = 1.37 MD++ EPS_22 = 1.0 MD++ EPS1_00 = 0 EPS2_00 = 0 EPS3_00 = 0 MD++ EPS1_11 = 0.6993 EPS2_11 = -3.6595 EPS3_11 = -1.7384 MD++ EPS1_22 = 0 EPS2_22 = 0 EPS3_22 = 0 MD++ ROT_MATRIX_13 = [expr 1/sqrt(2)] ROT_MATRIX_23 = [expr -1/sqrt(2)] ROT_MATRIX_33 = [expr 0/sqrt(2)] MD++ ROT_MATRIX_11 = [expr 1/sqrt(6)] ROT_MATRIX_21 = [expr 1/sqrt(6)] ROT_MATRIX_31 = [expr -2/sqrt(6)] MD++ ROT_MATRIX_12 = [expr 1/sqrt(3)] ROT_MATRIX_22 = [expr 1/sqrt(3)] ROT_MATRIX_32 = [expr 1/sqrt(3)] } #-------------------------------------------- proc openwindow { } { MD++ { # Plot Configuration # atomradius = 1.0 win_width = 600 win_height = 600 rotateangles = [ 0 90 0 1.2] color00 = pink color01 = blue backgroundcolor = gray80 #plot_threshold = [ 0.45 0.55 0.45 0.55 0.45 0.55 ] plot_threshold = [ 0.43 0.58 0.43 0.58 0.499 0.501 ] #plot_threshold = [ 0.40 0.60 0.40 0.60 0.40 0.60 ] openwin alloccolors rotate saverot plot } } #end of proc openwindow #******************************************* # Main program starts here #******************************************* # status 0: Serial # 1: OpenMP # 2: MPI # 3: CUDA # # read in status from command line argument if { $argc == 0 } { set status 0 } elseif { $argc > 0 } { set status [lindex $argv 0] } puts "status = $status" if { $argc <= 1 } { set n 0 } elseif { $argc > 1 } { set n [lindex $argv 1] } puts "n = $n" if { $status == 0 || $status == 1 || $status == 2 } { if { $n == 0 } { set size 200 # single phase field (MPF) model init_single_phasefield $n $size $size $size 4 0.3 MD++ dirname = "runs/phasefield-$status-$n" MD++ eval set FreeEnergy [MD++_Get F] puts "Free Energy = $FreeEnergy" MD++ timestep = 1e-3 dynamics_type = 2 # 0/2: non-conserved or 1: conserved MD++ plotfreq = 500 MD++ saveprop = 1 savepropfreq = 100 printfreq = 500 MD++ savecn = 1 savecnfreq = 10000 # shorten simulation MD++ totalsteps = 201 MD++ srand48bytime openpropfile run MD++ finalcnfile = phi$size-a.cn writecn MD++ sleep quit exitmd } elseif { $n == 1 } { # multi phase field (MPF) model set size 200 init_multi_phasefield $n $size $size $size 7 0.4 0.125 0.74 MD++ dirname = "runs/phasefield-$status-$n" MD++ model_type = 1 MD++ eval set FreeEnergy [MD++_Get F] puts "Free Energy = $FreeEnergy" MD++ timestep = 1e-3 dynamics_type = 8 MD++ plotfreq = 100 #500 MD++ saveprop = 1 savepropfreq = 100 printfreq = 50 #500 MD++ savecn = 1 savecnfreq = 100 # shorten simulation MD++ totalsteps = 201 savecnfreq = 1000 MD++ srand48bytime openpropfile run MD++ finalcnfile = phi$size-a.cn writecn MD++ quit exitmd } else { puts "unknown n = $n" exitmd } } elseif { $status == 3 } { if { $n == 0 } { set size 200 # single phase field (MPF) model init_single_phasefield $n $size $size $size 4 0.3 MD++ dirname = "runs/phasefield-$status-$n" MD++ model_type = 10 MD++ eval set FreeEnergy [MD++_Get F] puts "Free Energy = $FreeEnergy" MD++ timestep = 1e-3 dynamics_type = 2 # 0/2: non-conserved or 1: conserved MD++ plotfreq = 500 MD++ saveprop = 1 savepropfreq = 100 printfreq = 500 MD++ savecn = 1 savecnfreq = 10000 # shorten simulation MD++ totalsteps = 201 MD++ srand48bytime openpropfile run MD++ finalcnfile = phi$size-a.cn writecn MD++ sleep quit exitmd } elseif { $n == 1 } { # multi phase field (MPF) model set size 200 init_multi_phasefield $n $size $size $size 7 0.4 0.125 0.74 MD++ dirname = "runs/phasefield-$status-$n" MD++ model_type = 20 MD++ eval set FreeEnergy [MD++_Get F] puts "Free Energy = $FreeEnergy" MD++ timestep = 1e-3 dynamics_type = 8 MD++ plotfreq = 100 #500 MD++ saveprop = 1 savepropfreq = 100 printfreq = 50 #500 MD++ savecn = 1 savecnfreq = 100 # shorten simulation MD++ totalsteps = 201 savecnfreq = 1000 MD++ srand48bytime openpropfile run MD++ finalcnfile = phi$size-a.cn writecn MD++ quit exitmd } else { puts "unknown n = $n" exitmd } } else { puts "unknown status = $status" exitmd }