void DCLinkNoDih::BuildNew(TrialMol& newMol, uint molIndex) { AlignBasis(newMol); double* ljWeights = data->ljWeights; double* inter = data->inter; double *real = data->real; double *self = data->self; double* corr = data->correction; uint nLJTrials = data->nLJTrialsNth; XYZArray& positions = data->positions; PRNG& prng = data->prng; for (uint trial = 0, count = nLJTrials; trial < count; ++trial) { double phi = prng.rand(M_PI * 2); positions.Set(trial, newMol.GetRectCoords(bondLength, theta, phi)); } data->axes.WrapPBC(positions, newMol.GetBox()); std::fill_n(inter, nLJTrials, 0.0); std::fill_n(self, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(corr, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); data->calc.ParticleInter(inter, real, positions, atom, molIndex, newMol.GetBox(), nLJTrials); if(DoEwald){ data->calc.SwapSelf(self, molIndex, atom, newMol.GetBox(), nLJTrials); data->calc.SwapCorrection(corr, newMol, positions, atom, newMol.GetBox(), nLJTrials); } double stepWeight = 0.0; for (uint trial = 0; trial < nLJTrials; trial++) { ljWeights[trial] = exp(-1 * data->ff.beta * (inter[trial] + real[trial] + self[trial] + corr[trial])); if(ljWeights[trial] < 10e-200) ljWeights[trial] = 0.0; stepWeight += ljWeights[trial]; } uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); double WinEnergy = inter[winner]+real[winner]+self[winner]+corr[winner]; if ( ( WinEnergy * data->ff.beta ) > (2.3*200.0) || WinEnergy * data->ff.beta < -2.303e308){ stepWeight = 0.0; inter[winner] = 0.0; real[winner] = 0.0; self[winner] = 0.0; corr[winner] = 0.0; } newMol.MultWeight(stepWeight * bendWeight); newMol.AddAtom(atom, positions[winner]); newMol.AddEnergy(Energy(bendEnergy, 0.0, inter[winner], real[winner], 0.0, self[winner], corr[winner])); }
void DCLinkNoDih::BuildOld(TrialMol& oldMol, uint molIndex) { AlignBasis(oldMol); IncorporateOld(oldMol); double* inter = data->inter; double* real = data->real; double *self = data->self; double* corr = data->correction; uint nLJTrials = data->nLJTrialsNth; XYZArray& positions = data->positions; PRNG& prng = data->prng; positions.Set(0, oldMol.AtomPosition(atom)); for (uint trial = 1, count = nLJTrials; trial < count; ++trial) { double phi = prng.rand(M_PI * 2); positions.Set(trial, oldMol.GetRectCoords(bondLength, theta, phi)); } data->axes.WrapPBC(positions, oldMol.GetBox()); std::fill_n(inter, nLJTrials, 0.0); std::fill_n(self, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(corr, nLJTrials, 0.0); data->calc.ParticleInter(inter, real, positions, atom, molIndex, oldMol.GetBox(), nLJTrials); if(DoEwald){ data->calc.SwapSelf(self, molIndex, atom, oldMol.GetBox(), nLJTrials); data->calc.SwapCorrection(corr, oldMol, positions, atom, oldMol.GetBox(), nLJTrials); } double stepWeight = 0.0; for (uint trial = 0; trial < nLJTrials; ++trial) { stepWeight += exp(-1 * data->ff.beta * (inter[trial] + real[trial] + self[trial] + corr[trial]) ); if(stepWeight < 10e-200) stepWeight = 0.0; } oldMol.MultWeight(stepWeight * bendWeight); oldMol.ConfirmOldAtom(atom); oldMol.AddEnergy(Energy(bendEnergy, 0.0, inter[0], real[0], 0.0, self[0], corr[0])); }
void DCLinkNoDih::BuildNew(TrialMol& newMol, uint molIndex) {//printf("DC Linked No dihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\n"); // printf("DCLinkNoDeh new\n"); AlignBasis(newMol); double* ljWeights = data->ljWeights; double* nonbonded_1_4 = data->nonbonded_1_4;// v1 double* inter = data->inter; uint nLJTrials = data->nLJTrialsNth; XYZArray& positions = data->positions; PRNG& prng = data->prng; for (uint trial = 0, count = nLJTrials; trial < count; ++trial) { double phi = prng.rand(M_PI * 2); positions.Set(trial, newMol.GetRectCoords(bondLength, theta, phi)); } data->axes.WrapPBC(positions, newMol.GetBox()); std::fill_n(inter, nLJTrials, 0); std::fill_n(nonbonded_1_4, nLJTrials, 0);// v1 // data->calc.ParticleInter(inter, positions, atom, molIndex, newMol.GetBox(), nLJTrials); // data->calc.GetParticleEnergyGPU(newMol.GetBox(), inter,positions, newMol.molLength, newMol.mOff, atom,newMol.molKindIndex); data->calc.GetParticleEnergy(newMol.GetBox(), inter,positions, newMol.molLength, newMol.mOff, atom,newMol.molKindIndex,nLJTrials); /* for (int trial = 0; trial < data->nLJTrials; ++trial) { printf("serial Trial %d energy=%f\n",trial,inter[trial] ); } printf("\n\n"); for (int trial = 0; trial < data->nLJTrials; ++trial) { printf("GPU Trial %d energy=%f\n",trial,inter[trial] ); } printf("===================\n\n");*/ data->calc.ParticleNonbonded_1_4(nonbonded_1_4, newMol, positions, atom, newMol.GetBox(), nLJTrials);// v1 double stepWeight = 0; double beta = data->ff.beta; for (uint trial = 0, count = nLJTrials; trial < count; ++trial) { ljWeights[trial] = exp(-data->ff.beta * (inter[trial] + nonbonded_1_4[trial]));// v1 stepWeight += ljWeights[trial]; } uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); newMol.MultWeight(stepWeight * bendWeight); newMol.AddAtom(atom, positions[winner]); newMol.AddEnergy(Energy(bendEnergy, nonbonded_1_4[winner], inter[winner]));// v1 }
void DCLinkNoDih::BuildOld(TrialMol& oldMol, uint molIndex) {//printf("DCLinkNoDeh old\n"); AlignBasis(oldMol); IncorporateOld(oldMol); double* nonbonded_1_4 = data->nonbonded_1_4;// v1 double* inter = data->inter; uint nLJTrials = data->nLJTrialsNth; XYZArray& positions = data->positions; PRNG& prng = data->prng; positions.Set(0, oldMol.AtomPosition(atom)); for (uint trial = 1, count = nLJTrials; trial < count; ++trial) { double phi = prng.rand(M_PI * 2); positions.Set(trial, oldMol.GetRectCoords(bondLength, theta, phi)); } data->axes.WrapPBC(positions, oldMol.GetBox()); std::fill_n(inter, nLJTrials, 0.0); std::fill_n(nonbonded_1_4, nLJTrials, 0.0);//v1 //data->calc.ParticleInter(inter, positions, atom, molIndex, oldMol.GetBox(), nLJTrials); //data->calc.GetParticleEnergyGPU(oldMol.GetBox(), inter,positions, oldMol.molLength, oldMol.mOff, atom,oldMol.molKindIndex); data->calc.GetParticleEnergy(oldMol.GetBox(), inter,positions, oldMol.molLength, oldMol.mOff, atom,oldMol.molKindIndex,nLJTrials); //printf("DC Linked No dihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\n"); /* for (int trial = 0; trial < data->nLJTrials; ++trial) { printf("serial Trial %d energy=%f\n",trial,inter[trial] ); } printf("\n\n"); data->calc.GetParticleEnergyGPU(oldMol.GetBox(), data->nLJTrials, inter,positions, oldMol.molLength, oldMol.mOff, atom,oldMol.molKindIndex); for (int trial = 0; trial < data->nLJTrials; ++trial) { printf("GPU Trial %d energy=%f\n",trial,inter[trial] ); } printf("===================\n\n");*/ data->calc.ParticleNonbonded_1_4(nonbonded_1_4, oldMol, positions, atom, oldMol.GetBox(), nLJTrials);// v1 double stepWeight = 0; for (uint trial = 0, count = nLJTrials; trial < count; ++trial) { stepWeight += exp(-data->ff.beta * (inter[trial] + nonbonded_1_4[trial]));//v1 } oldMol.MultWeight(stepWeight * bendWeight); oldMol.ConfirmOldAtom(atom); oldMol.AddEnergy(Energy(bendEnergy, nonbonded_1_4[0], inter[0]));//v1 }