def mySolve(xf,boltz_eqs,rtol,atol,verbosity=50): """Sets the main options for the ODE solver and solve the equations. Returns the array of x,y points for all components. If numerical instabilities are found, re-do the problematic part of the evolution with smaller steps""" boltz_solver = CVode(boltz_eqs) #Define solver method boltz_solver.rtol = rtol boltz_solver.atol = atol boltz_solver.verbosity = verbosity boltz_solver.linear_solver = 'SPGMR' boltz_solver.maxh = xf/300. xfinal = xf xres = [] yres = [] sw = boltz_solver.sw[:] while xfinal <= xf: try: boltz_solver.re_init(boltz_eqs.t0,boltz_eqs.y0) boltz_solver.sw = sw[:] x,y = boltz_solver.simulate(xfinal) xres += x for ypt in y: yres.append(ypt) if xfinal == xf: break #Evolution has been performed until xf -> exit except Exception,e: print e if not e.t or 'first call' in e.msg[e.value]: logger.error("Error solving equations:\n "+str(e)) return False xfinal = max(e.t*random.uniform(0.85,0.95),boltz_eqs.t0+boltz_solver.maxh) #Try again, but now only until the error logger.warning("Numerical instability found. Restarting evolution from x = " +str(boltz_eqs.t0)+" to x = "+str(xfinal)) continue xfinal = xf #In the next step try to evolve from xfinal -> xf sw = boltz_solver.sw[:] x0 = float(x[-1]) y0 = [float(yval) for yval in y[-1]] boltz_eqs.updateValues(x0,y0,sw)