from inverse import InverseSolver class BayesianObjectiveU(BayesianObjective): def objective(self, val, param): J_obs = sum((val[::6] - self.val_target)**2)/self.sigma_obs J_prior = sum((param - self.param_prior)**2)/self.sigma_prior**2 J = 0.5*(J_obs + J_prior) return J dirname ="base_solution" y, u, R11, R12, R22, R33, omega = load_solution_stressomega(dirname) Retau = 5.467390699999999697e+02 eqn = StressOmegaEquation(y, u, R11, R12, R22, R33, omega, Retau) eqn.writedir = "solution/stress_omega" eqn.dt = 1e2 eqn.force_boundary = False eqn.tol = 1e-5 eqn.solve() eqn_prior = copy.deepcopy(eqn) up_prior = eqn.up.copy() dns = np.loadtxt("data/DNSsol.dat") utau = Retau*eqn.nu*2.0 ydns = dns[:,0]*0.5 udns = dns[:,2]*utau f = interp1d(ydns, udns) utarget = f(eqn.y)
tol = args.tol objective = args.objective nsamples = args.nsamples sigma_obs = 1e-10 sigma_prior = 0.5 dirname ="base_solution" y, u, R11, R12, R22, R33, omega = load_solution_stressomega(dirname) eqn = StressOmegaEquation(y, u, R11, R12, R22, R33, omega, Retau) eqn.writedir = "/tmp" # first dt can be large as we restart from a good solution eqn.force_boundary = False eqn.tol = tol eqn.dt = 1e1 eqn.solve() beta_prior = np.ones_like(eqn.beta) eqn_prior = copy.deepcopy(eqn) up_prior = eqn.up.copy() Q_prior = np.zeros([np.size(eqn.q), nsamples]) sample = 0 while sample < nsamples: print "\rSampling prior %i of %i"%(sample, nsamples), sys.stdout.flush() eqn.dt = dt eqn.q[:] = eqn_prior.q[:] eqn.beta[:] = beta_prior + np.random.randn(np.size(beta_prior))*sigma_prior print np.mean(eqn.beta)
J_obs = sum((val[::6] - self.val_target[::6])**2)/self.sigma_obs**2 * abs(weight_u)**2 J_obs += sum((val[1::6] - self.val_target[1::6])**2)/self.sigma_obs**2 * abs(weight_R11)**2 J_obs += sum((val[2::6] - self.val_target[2::6])**2)/self.sigma_obs**2 * abs(weight_R12)**2 J_obs += sum((val[3::6] - self.val_target[3::6])**2)/self.sigma_obs**2 * abs(weight_R22)**2 J_obs += sum((val[4::6] - self.val_target[4::6])**2)/self.sigma_obs**2 * abs(weight_R33)**2 J_prior = sum((param - self.param_prior)**2)/self.sigma_prior**2 J = 0.5*(J_obs + J_prior) return J dirname ="base_solution" y, u, R11, R12, R22, R33, omega = load_solution_stressomega(dirname) Retau = 5.467390699999999697e+02 eqn = StressOmegaEquation(y, u, R11, R12, R22, R33, omega, Retau) eqn.writedir = "solution/stress_omega" eqn.dt = 1e0 eqn.force_boundary = False eqn.tol = 1e-5 eqn.solve() eqn_prior = copy.deepcopy(eqn) up_prior = eqn.up.copy() qtarget = np.zeros_like(eqn.q) dns, wilcox, wilcox_kw = load_data() utau = Retau*eqn.nu*2.0 ydns = dns.y*0.5 ub = dns.u*utau R11b = -(dns.ub*utau)**2 R22b = -(dns.vb*utau)**2 R33b = -(dns.wb*utau)**2