git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@9716 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
pscrozi 2013-03-27 22:16:34 +00:00
parent c2be9deab9
commit 836502a357
2 changed files with 21 additions and 77 deletions

View File

@ -407,9 +407,7 @@ void FixGCMC::attempt_atomic_translation()
if (ngas == 0) return; if (ngas == 0) return;
int i; int i = pick_random_gas_atom();
if (regionflag) i = pick_random_gas_atom_in_region();
else i = pick_random_gas_atom();
int success = 0; int success = 0;
if (i >= 0) { if (i >= 0) {
@ -459,9 +457,7 @@ void FixGCMC::attempt_atomic_deletion()
if (ngas == 0) return; if (ngas == 0) return;
int i; int i = pick_random_gas_atom();
if (regionflag) i = pick_random_gas_atom_in_region();
else i = pick_random_gas_atom();
int success = 0; int success = 0;
if (i >= 0) { if (i >= 0) {
@ -565,9 +561,7 @@ void FixGCMC::attempt_molecule_translation()
if (ngas == 0) return; if (ngas == 0) return;
int translation_molecule; int translation_molecule = pick_random_gas_molecule();
if (regionflag) translation_molecule = pick_random_gas_molecule_in_region();
else translation_molecule = pick_random_gas_molecule();
if (translation_molecule == -1) return; if (translation_molecule == -1) return;
double energy_before_sum = molecule_energy(translation_molecule); double energy_before_sum = molecule_energy(translation_molecule);
@ -625,9 +619,7 @@ void FixGCMC::attempt_molecule_rotation()
if (ngas == 0) return; if (ngas == 0) return;
int rotation_molecule; int rotation_molecule = pick_random_gas_molecule();
if (regionflag) rotation_molecule = pick_random_gas_molecule_in_region();
else rotation_molecule = pick_random_gas_molecule();
if (rotation_molecule == -1) return; if (rotation_molecule == -1) return;
double energy_before_sum = molecule_energy(rotation_molecule); double energy_before_sum = molecule_energy(rotation_molecule);
@ -705,9 +697,7 @@ void FixGCMC::attempt_molecule_deletion()
if (ngas == 0) return; if (ngas == 0) return;
int deletion_molecule; int deletion_molecule = pick_random_gas_molecule();
if (regionflag) deletion_molecule = pick_random_gas_molecule_in_region();
else deletion_molecule = pick_random_gas_molecule();
if (deletion_molecule == -1) return; if (deletion_molecule == -1) return;
double deletion_energy_sum = molecule_energy(deletion_molecule); double deletion_energy_sum = molecule_energy(deletion_molecule);
@ -919,34 +909,6 @@ int FixGCMC::pick_random_gas_atom()
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
------------------------------------------------------------------------- */ ------------------------------------------------------------------------- */
int FixGCMC::pick_random_gas_atom_in_region()
{
int i = -1;
int i_own_candidate = 0;
int i_own_candidate_all = 0;
int region_attempt = 0;
double **x = atom->x;
while (!i_own_candidate_all) {
int iwhichglobal = static_cast<int> (ngas*random_equal->uniform());
if ((iwhichglobal >= ngas_before) &&
(iwhichglobal < ngas_before + ngas_local)) {
i_own_candidate = 1;
int iwhichlocal = iwhichglobal - ngas_before;
i = local_gas_list[iwhichlocal];
if (domain->regions[iregion]->match(x[i][0],x[i][1],x[i][2]) == 0)
i_own_candidate = 0;
}
MPI_Allreduce(&i_own_candidate,&i_own_candidate_all,1,MPI_INT,MPI_MAX,world);
region_attempt++;
if (region_attempt >= max_region_attempts) return -1;
}
return i;
}
/* ----------------------------------------------------------------------
------------------------------------------------------------------------- */
int FixGCMC::pick_random_gas_molecule() int FixGCMC::pick_random_gas_molecule()
{ {
int iwhichglobal = static_cast<int> (ngas*random_equal->uniform()); int iwhichglobal = static_cast<int> (ngas*random_equal->uniform());
@ -964,34 +926,6 @@ int FixGCMC::pick_random_gas_molecule()
return gas_molecule_id_all; return gas_molecule_id_all;
} }
/* ----------------------------------------------------------------------
------------------------------------------------------------------------- */
int FixGCMC::pick_random_gas_molecule_in_region()
{
int region_attempt = 0;
int gas_molecule_id = 0;
int gas_molecule_id_all = 0;
double **x = atom->x;
while (!gas_molecule_id_all) {
int iwhichglobal = static_cast<int> (ngas*random_equal->uniform());
if ((iwhichglobal >= ngas_before) &&
(iwhichglobal < ngas_before + ngas_local)) {
int iwhichlocal = iwhichglobal - ngas_before;
int i = local_gas_list[iwhichlocal];
if (domain->regions[iregion]->match(x[i][0],x[i][1],x[i][2]) != 0) {
gas_molecule_id = atom->molecule[i];
}
}
gas_molecule_id_all = 0;
MPI_Allreduce(&gas_molecule_id,&gas_molecule_id_all,1,MPI_INT,MPI_MAX,world);
region_attempt++;
if (region_attempt >= max_region_attempts) return -1;
}
return gas_molecule_id_all;
}
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
compute the energy of the given gas molecule in its current position compute the energy of the given gas molecule in its current position
sum across all procs that own atoms of the given molecule sum across all procs that own atoms of the given molecule
@ -1247,10 +1181,22 @@ void FixGCMC::update_gas_atoms_list()
} }
ngas_local = 0; ngas_local = 0;
for (int i = 0; i < atom->nlocal; i++) { if (regionflag) {
if (atom->mask[i] & groupbit) { for (int i = 0; i < atom->nlocal; i++) {
local_gas_list[ngas_local] = i; if (atom->mask[i] & groupbit) {
ngas_local++; double **x = atom->x;
if (domain->regions[iregion]->match(x[i][0],x[i][1],x[i][2]) == 1) {
local_gas_list[ngas_local] = i;
ngas_local++;
}
}
}
} else {
for (int i = 0; i < atom->nlocal; i++) {
if (atom->mask[i] & groupbit) {
local_gas_list[ngas_local] = i;
ngas_local++;
}
} }
} }

View File

@ -41,9 +41,7 @@ class FixGCMC : public Fix {
void attempt_molecule_insertion(); void attempt_molecule_insertion();
double energy(int, int, int, double *); double energy(int, int, int, double *);
int pick_random_gas_atom(); int pick_random_gas_atom();
int pick_random_gas_atom_in_region();
int pick_random_gas_molecule(); int pick_random_gas_molecule();
int pick_random_gas_molecule_in_region();
double molecule_energy(int); double molecule_energy(int);
void get_rotation_matrix(double, double *); void get_rotation_matrix(double, double *);
void get_model_molecule(); void get_model_molecule();