Beispiel #1
0
    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]));
            }
        }
    }