def get_profile(R): M = params.recipe['mass'] g = params.G * M / pow(R, 2.0) P = params.recipe['P_surf'] T = None phase = phases.get_phase(0, None, P, params.recipe['T_surf']) rho = phase['rho_0'] q_surf = params.recipe['q_surf_est'] layersbelow_mass = params.recipe['mass'] radius = R solution = [None] * 2 for layer_number in xrange(0, params.recipe['layers']): x = np.linspace(0, radius, params.layerpoints) layersbelow_mass = layersbelow_mass - params.recipe['layer_masses'][layer_number] define_mass_event(layersbelow_mass) layer_solution = odelay(structure_equations, [rho, g, M, P], x, events=[mass_event], args=(phase, radius, False)) # if(T is None): # uncomment this when you have T solved for and indent the next line # If this is our first iteration we don't have an initial temperature profile yet # create a constant profile of temperature T_surf. # This means phase relations won't go insane in subsequent steps T = np.zeros_like(layer_solution[0]) + params.recipe['T_surf'] solution[layer_number] = get_layer_properties(layer_solution, T, q_surf, layer_number, radius) if (layer_number < params.recipe['layers'] - 1): phase = phases.get_phase(layer_number + 1, None, P, 300) radius = solution[layer_number]['bottom_r'] P = solution[layer_number]['bottom_P'] rho = phases.vinet_density(P, phase) g = solution[layer_number]['bottom_g'] M = solution[layer_number]['bottom_m'] # Interp all my fields for use in the temperature ODE solution = interp_solution(solution) # Toss to the temperature solver return solution
def get_param_avg(layer_solution, layer_number, param): param_vals = np.zeros_like(layer_solution['r']) i = 0 if ((params.recipe['layer_' + str(layer_number)]['type']).upper() == 'GEOM'): for (r, T, P) in zip(layer_solution['r'], layer_solution['T'], layer_solution['y'][:, 3]): param_vals[i] = phases.get_phase(layer_number, None, P, T)[param] i = i + 1 return -np.trapz(param_vals * (layer_solution['r'] ** 2), x=layer_solution['r']) * 3.0 / ( layer_solution['top_r'] ** 3 - layer_solution['bottom_r'] ** 3)