std::size_t initialize_state (vsmc::SingleParticle<gmm_state> sp) { double mu0 = sp.particle().value().mu0(); double sd0 = sp.particle().value().sd0(); double shape0 = sp.particle().value().shape0(); double scale0 = sp.particle().value().scale0(); vsmc::cxx11::normal_distribution<> rmu(mu0, sd0); vsmc::cxx11::gamma_distribution<> rlambda(shape0, scale0); vsmc::cxx11::gamma_distribution<> rweight(1, 1); const std::size_t cn = sp.state(0).comp_num(); double sum_weight = 0; for (std::size_t d = 0; d != cn; ++d) { sp.state(0).mu(d) = rmu(sp.rng()); sp.state(0).lambda(d) = rlambda(sp.rng()); sp.state(0).weight(d) = rweight(sp.rng()); sum_weight += sp.state(0).weight(d); } for (std::size_t d = 0; d != cn; ++d) sp.state(0).weight(d) /= sum_weight; if (sp.particle().value().ordered()) sp.state(0).sort_mu(); sp.particle().value().log_target(sp.state(0)); return 0; }
void InterfaceKinetics::checkPartialEquil() { int i, irxn; vector_fp dmu(nTotalSpecies(), 0.0); vector_fp rmu(nReactions(), 0.0); vector_fp frop(nReactions(), 0.0); vector_fp rrop(nReactions(), 0.0); vector_fp netrop(nReactions(), 0.0); if (m_nrev > 0) { doublereal rt = GasConstant*thermo(0).temperature(); cout << "T = " << thermo(0).temperature() << " " << rt << endl; int n, nsp, k, ik=0; //doublereal rt = GasConstant*thermo(0).temperature(); // doublereal rrt = 1.0/rt; int np = nPhases(); doublereal delta; for (n = 0; n < np; n++) { thermo(n).getChemPotentials(DATA_PTR(dmu) + m_start[n]); nsp = thermo(n).nSpecies(); for (k = 0; k < nsp; k++) { delta = Faraday * m_phi[n] * thermo(n).charge(k); //cout << thermo(n).speciesName(k) << " " << (delta+dmu[ik])/rt << " " << dmu[ik]/rt << endl; dmu[ik] += delta; ik++; } } // compute Delta mu^ for all reversible reactions m_rxnstoich.getRevReactionDelta(m_ii, DATA_PTR(dmu), DATA_PTR(rmu)); getFwdRatesOfProgress(DATA_PTR(frop)); getRevRatesOfProgress(DATA_PTR(rrop)); getNetRatesOfProgress(DATA_PTR(netrop)); for (i = 0; i < m_nrev; i++) { irxn = m_revindex[i]; cout << "Reaction " << reactionString(irxn) << " " << rmu[irxn]/rt << endl; printf("%12.6e %12.6e %12.6e %12.6e \n", frop[irxn], rrop[irxn], netrop[irxn], netrop[irxn]/(frop[irxn] + rrop[irxn])); } } }