def plot_for(z, d): cs = CalcSimWrapper() ds = InputDatastore('../InputData', 'NiCu', 973) ce = ComparisonEngine(cs) D = ds.interpolated_diffusivity(10001) R = ds.interpolated_resistivity(10001) dx = 0.5 * 35e-8 ndx = 200 dt = 0.01 ndt = int(2 * 60 * 60 / 0.01) init = ones(ndx) init[ndx/2:] = 0 x = linspace(0, 25, 200) ddict = ds.interpolated_experiment_dict(x) for I in ddict.keys(): if I == 0: dv = 1 else: dv = d r = cs.emigration_factor(z, I, 973) mdl = cs.calc_simulation(D, R, init, ndt, dt, dx, r, dv) ce = ComparisonEngine(cs) lsq, shfit = ce.calibrate(mdl, ddict[I]) smdl = ce.shift_data(mdl) plot(x, ddict[I], label=str.format('Exper. (I={} A/cm^2)', I/100/100)) plot(x, smdl, label=str.format('Model. (I={} A/cm^2)', I/100/100)) legend(loc=3) show()
class CalcSimExecutor(): def __init__(self, dstore, T, ndt=defaults.simulation_tsteps, dt=defaults.simulation_dt): assert isinstance(dstore, InputDatastore) self.T = T #first, get defaults self.dx = defaults.simulation_dx self.dt = dt self.ndx = defaults.simulation_xsteps self.ndt = ndt #now we can set up the initial conditions #x in micron self.x = np.arange(0, self.ndx * self.dx, self.dx) * 1e6 self.init_cond = np.ones(self.ndx) self.init_cond[(self.ndx // 2):] = 0 #D/R vectors self.Dvector = dstore.interpolated_diffusivity(10001, T, precise=False).copy() self.Rvector = dstore.interpolated_resistivity(10001, T).copy() self.cs = CalcSimWrapper() #now we're ready to fire on demand def compute(self, z, cvf, I, direction): """ Actually runs the simulation that's been set up, with the supplied parameters. I is supplied in A/cm^2 Returns sim results as a 2 column array of x, y """ if direction == 'forward': pass elif direction == 'reverse': I = -I else: raise ValueError('Unknown direction ' + str(direction)) r = self.cs.emigration_factor(z, I * 100 * 100, self.T) outy = self.cs.calc_simulation(self.Dvector, self.Rvector, self.init_cond, self.ndt, self.dt, self.dx, r, cvf) return np.column_stack((self.x, outy))
aparser.add_argument('--cvf', type=float, required=True, help='Vacancy concentration factor') aparser.add_argument('--direction', type=str, default='forward', help='Direction of application of current') args = aparser.parse_args() accelcs = CalcSimWrapper() dstore = InputDatastore(args.inputdata, args.dataprefix, 973, args.direction) ce = ComparisonEngine(accelcs) x = np.linspace(0, 25, num=100) exper_data = dstore.interpolated_experiment_dict(x)[args.current] diffusivity = dstore.interpolated_diffusivity(10001) resistivity = dstore.interpolated_resistivity(10001) init_cond = np.ones(100) init_cond[50:] = 0 emigration_T = 973 dt = 0.05 ndt = int(2 * 60 * 60 / 0.05) dx = 25e-6 / 100 r = accelcs.emigration_factor(args.z, args.current * 100 * 100, emigration_T) simd = accelcs.calc_simulation(diffusivity, resistivity, init_cond, ndt, dt, dx, r, args.cvf) lsq, shift = ce.calibrate(simd, exper_data) shifted_simd = ce.shift_data(simd) full_simd = np.column_stack((x, shifted_simd)) full_exper = np.column_stack((x, exper_data)) dmplots.plot_sim_fit(full_simd, full_exper, args.current, args.z, args.cvf, args.direction, args.output) print('lsq = ' + str(lsq))
x = np.linspace(0, 25, num=100) dstore = InputDatastore(args.inputdata, args.dataprefix) edict = dstore.edict_for_direction(direction) accelcs = CalcSimWrapper() ce = ComparisonEngine(accelcs) diffusivity = dstore.interpolated_diffusivity(10001, args.temperature, precise=True) resistivity = dstore.interpolated_resistivity(10001, args.temperature) init_cond = np.ones(100) init_cond[50:] = 0 emigration_T = args.temperature dt = 0.05 ndt = int(2 * 60 * 60 / 0.05) dx = 25e-6 / 100 for I in result_stash.keys(): cvf_best = cvfrange[result_stash[I][zaverage_index, :].argmin()] if direction == "forward": exper_data = dstore.interpolated_experiment_dict(x, edict)[I] r = accelcs.emigration_factor(zaverage_rounded, I * 100 * 100, emigration_T) else: exper_data = dstore.interpolated_experiment_dict(x, edict)[I] r = accelcs.emigration_factor(zaverage_rounded, -I * 100 * 100, emigration_T) simd = accelcs.calc_simulation(diffusivity, resistivity, init_cond, ndt, dt, dx, r, cvf_best) lsq, shift = ce.calibrate(simd, exper_data) shifted_simd = ce.shift_data(simd) full_simd = np.column_stack((x, shifted_simd)) full_exper = np.column_stack((x, exper_data)) outfname = os.path.join(args.outputdir, str.format("SimExperComp_I{}_{}.png", I, direction)) f = dmplots.plot_sim_fit(full_simd, full_exper, I, zaverage_rounded, cvf_best, direction) c = FigureCanvasAgg(f) c.print_figure(outfname)