class ComputeAVB2 : public feasst::TrialComputeMove

This trial move is refered to as AVB2 as described in the following manuscript:

First, a target particle of type “t” is selected with a site with index site_index_t. With probability, \(P_{bias}\), a particle of type “a” with site_index_a outside the aggregation volume (AV) of site_index_t is placed inside the AV. Otherwise, site_index_a inside the AV is placed outisde the AV.

The derivation of the acceptance probability follows that as described in both TrialComputeMove and ComputeAddAVB with the following transition probabilities.

For this type of move, the potential energy of the system, U, is the only thermodynamic variable which changes. Thus, whether in the canonical ensemble or otherwise, the probability distribution,

\(\pi_i \propto e^{-\beta U_i}\)

Forward event

[reverse event]

Probability, \(\pi_{on}\)

[reverse probability, \(\pi_{no}\)]

Select particle of type t

[Select particle of type t]



Select out->in move

[Select in->out move]


\(1 - P_{bias}\)

Select site_index_a not in AV of site_index_t

[Select site_index_a in AV of site_index_t]

\(1/(N_a - N^{s,AV}_a - \delta_{ta})\)

\(1/(N^{s,AV}_a + 1)\)

Place site_index_a inside AV of site_index_t

[Place site_index_a outside AV of site_index_t]


\(1/(V - v_{AV})\)



\(min(1, \chi)\)

\([min(1, 1/\chi)]\)

where \(N_t\) is the number of particles of type t, \(v_{AV}\) is the aggregation volume, \(N^{s,AV}_a\) is the number of sites with site_index_a, in particles of type a, that are in the AV of site_index_t, \(V\) is the volume of the entire system and \(\delta_{ta}\) is the Kronecker delta as a function of the type index of the target and added particles (i.e., if add and target are of same type, then \(\delta_{ta} = 1\), otherwise \(\delta_{ta} = 0\)).

Application of local detailed balance yields the following acceptance probability for the out->in move:

\(\chi = \frac{1-P_{bias}}{P_{bias}} \frac{N_a - N^{s,AV}_a - \delta_{ta}}{N^{s,AV}_a + 1} \frac{v_{AV}}{V - v_{AV}} e^{-\beta\Delta U}\).

The in->out move can be derived by the switching the foward and reverse moves. In that case, one is no longer added to \(N^{s,AV}_a\), but to \(N_a - N^{s,AV}_a - \delta_{ta}\) instead. The resulting acceptance probability is

\(\chi = \frac{P_{bias}}{1-P_{bias}} \frac{N^{s,AV}_a}{N_a - N^{s,AV}_a - \delta_{ta} + 1} \frac{V - v_{AV}}{v_{AV}} e^{-\beta\Delta U}\).

Public Functions

ComputeAVB2(const argtype &args = argtype())


  • probability_out_to_in: probability to attempt an out->in move (default: 0.5).

  • out_to_in: true if out->in move, otherwise false.

double probability_out_to_in() const

Return the probability of an out to in move.

void perturb_and_acceptance(Criteria *criteria, System *system, Acceptance *acceptance, std::vector<TrialStage*> *stages, Random *random)

Perform the Perturbations and determine acceptance.