def misfit(args, n_slices, n_iterations, moho_depth, T_pot, perplex_mantle_file): cmb_depth, core_density_deficit = args core_density_deficit = core_density_deficit / 1000. if core_density_deficit < -3000. or core_density_deficit > 5000. or cmb_depth < 100.e3: misfit = 1.e12 else: mars = Planet(n_slices, moho_depth, cmb_depth, observed_mean_radius, core_density_deficit, core_Vp_fraction, T_pot, perplex_mantle_file) mars.generate_profiles( n_iterations ) misfit = np.sqrt((1. - mars.mass/observed_mass)*(1. - mars.mass/observed_mass) + (1. - mars.moment_of_inertia_factor/observed_moment)*(1. - mars.moment_of_inertia_factor/observed_moment)) print(args, misfit) return misfit
mFeO = 71.844 mMgO = 40.3044 Mg_numbers[i] = 100.*(NCFMAS_compositions[i][3]/mMgO) / ((NCFMAS_compositions[i][2]/mFeO) + (NCFMAS_compositions[i][3]/mMgO)) Si_contents[i] = NCFMAS_compositions[i][5] print('Processing composition', str(i+1)+'/'+str(len(perplex_mantle_files))+':', NCFMAS_compositions[i], Mg_numbers[i]) res = minimize(misfit, [1700.e3, 2000.e3], method='Nelder-Mead', tol=1.e4, args=(n_slices, n_iterations, moho_depth, T_pot, perplex_mantle_file)) # tol is depth in m cmb_depths[i] = res.x[0] core_density_deficits[i] = res.x[1]/1000. mars = Planet(n_slices, moho_depth, cmb_depths[i], observed_mean_radius, core_density_deficits[i], core_Vp_fraction, T_pot, perplex_mantle_file) mars.generate_profiles( n_iterations ) cmb_pressures[i] = mars.cmb_pressure cmb_temperatures[i] = mars.cmb_temperature misfits[i] = res.fun data_to_print = NCFMAS_compositions[i] data_to_print.extend([Mg_numbers[i], cmb_depths[i]/1000., cmb_pressures[i]/1.e9, cmb_temperatures[i], core_density_deficits[i], misfits[i]]) print(data_to_print) output.append(data_to_print) np.savetxt(fname=outfile, header='NCFMAS, Mg number, CMB depth, CMB pressure, CMB temperature, Core density deficit, misfit', fmt="%.4f", X=output) ''' extent = (min(Mg_numbers),max(Mg_numbers),min(Si_contents),max(Si_contents))