private void AddForce(ApproximateAminoAcidForces aminoAcidForces, Vector3D forceDirection, double forceMagnitude) { var force = forceMagnitude * forceDirection.To(Unit.Newton); aminoAcidForces.NitrogenForce += force; aminoAcidForces.CarbonAlphaForce += force; aminoAcidForces.CarbonForce += force; }
private void ApplyForce(ApproximatedAminoAcid aminoAcid, ApproximateAminoAcidForces resultingForces, UnitValue timeStepSize, UnitValue reservoirTemperature) { var scaling = 1e0; var nitrogenForce = scaling * resultingForces.NitrogenForce; var nitrogenMass = PeriodicTable.GetSingleAtomMass(ElementName.Nitrogen); var nitrogenAcceleration = nitrogenForce / nitrogenMass; var nitrogenVelocityChange = nitrogenAcceleration * timeStepSize; aminoAcid.NitrogenVelocity += nitrogenVelocityChange; aminoAcid.NitrogenVelocity = InteractWithReservoir(aminoAcid.NitrogenVelocity, nitrogenMass, reservoirTemperature); aminoAcid.NitrogenPosition += aminoAcid.NitrogenVelocity * timeStepSize; if (simulationSettings.ResetAtomVelocityAfterEachTimestep) { aminoAcid.NitrogenVelocity = new UnitVector3D(Unit.MetersPerSecond, 0, 0, 0); } var carbonAlphaForce = scaling * resultingForces.CarbonAlphaForce; var carbonAlphaMass = PeriodicTable.GetSingleAtomMass(ElementName.Carbon) + AminoAcidSideChainMassLookup.SideChainMasses[aminoAcid.Name]; var carbonAlphaAcceleration = carbonAlphaForce / carbonAlphaMass; var carbonAlphaVelocityChange = carbonAlphaAcceleration * timeStepSize; aminoAcid.CarbonAlphaVelocity += carbonAlphaVelocityChange; aminoAcid.CarbonAlphaVelocity = InteractWithReservoir(aminoAcid.CarbonAlphaVelocity, carbonAlphaMass, reservoirTemperature); aminoAcid.CarbonAlphaPosition += aminoAcid.CarbonAlphaVelocity * timeStepSize; if (simulationSettings.ResetAtomVelocityAfterEachTimestep) { aminoAcid.CarbonAlphaVelocity = new UnitVector3D(Unit.MetersPerSecond, 0, 0, 0); } var carbonForce = scaling * resultingForces.CarbonForce; var carbonMass = PeriodicTable.GetSingleAtomMass(ElementName.Carbon); var carbonAcceleration = carbonForce / carbonMass; var carbonVelocityChange = carbonAcceleration * timeStepSize; aminoAcid.CarbonVelocity += carbonVelocityChange; aminoAcid.CarbonVelocity = InteractWithReservoir(aminoAcid.CarbonVelocity, carbonMass, reservoirTemperature); aminoAcid.CarbonPosition += aminoAcid.CarbonVelocity * timeStepSize; if (simulationSettings.ResetAtomVelocityAfterEachTimestep) { aminoAcid.CarbonVelocity = new UnitVector3D(Unit.MetersPerSecond, 0, 0, 0); } }
private void RunSimulation(CancellationToken cancellationToken) { var simulationTime = simulationSettings.SimulationTime; var dT = simulationSettings.TimeStep; for (CurrentTime = 0.To(Unit.Second); CurrentTime < simulationTime; CurrentTime += dT) { cancellationToken.ThrowIfCancellationRequested(); var compactnessForces = simulationSettings.UseCompactingForce ? compactnessForceCalculator.Calculate(CompactnessMeasurer.Measure(Peptide)) : new Dictionary <ApproximatedAminoAcid, ApproximateAminoAcidForces>(); var ramachandranForces = simulationSettings.UseRamachandranForce ? ramachandranForceCalculator.Calculate(Peptide) : new Dictionary <ApproximatedAminoAcid, ApproximateAminoAcidForces>(); var bondForces = bondForceCalculator.Calculate(Peptide); foreach (var aminoAcid in Peptide.AminoAcids) { var resultingForce = new ApproximateAminoAcidForces(); if (compactnessForces.ContainsKey(aminoAcid)) { var compactnessForce = compactnessForces[aminoAcid]; resultingForce += compactnessForce; } if (ramachandranForces.ContainsKey(aminoAcid)) { var ramachandranForce = ramachandranForces[aminoAcid]; resultingForce += ramachandranForce; } if (bondForces.ContainsKey(aminoAcid)) { var bondForce = bondForces[aminoAcid]; resultingForce += bondForce; } ApplyForce(aminoAcid, resultingForce, dT, simulationSettings.ReservoirTemperature); } OnSimulationTimestepComplete(new SimulationTimestepCompleteEventArgs(CurrentTime, Peptide)); } SimulationCompleted?.Invoke(this, EventArgs.Empty); IsSimulating = false; }