subroutine UseTheForce() ! This routine takes the old translation coefficients and Lambdas and moves them by a timestep in the direction ! of the calculated force. integer :: m, w, z, i, j, Symm, SymMin real(dp) :: NewCoeff, NewLambda DistCs = 0.0_dp do w = MinOccVirt, MaxOccVirt if (w == 1) then SymMin = 1 MinMZ = 1 if (tSeparateOccVirt) then MaxMZ = NoOcc else MaxMZ = NoOrbs end if else SymMin = 9 MinMZ = NoOcc + 1 MaxMZ = NoOrbs end if do m = MinMZ, MaxMZ if (tStoreSpinOrbs) then SymM = int(G1(SymLabelList2_rot(m))%sym%S) else SymM = int(G1(SymLabelList2_rot(m) * 2)%sym%S) end if ! Symmetry requirement that z must be from the same irrep as m. do z = SymLabelCounts2_rot(1, SymM + SymMin), & (SymLabelCounts2_rot(1, SymM + SymMin) + & SymLabelCounts2_rot(2, SymM + SymMin) - 1) ! Only coeffs with sym of m and z the same have non-zero coeffs. NewCoeff = 0.0_dp NewCoeff = CoeffT1(z, m) - (TimeStep * DerivCoeff(z, m)) DistCs = DistCs + abs(TimeStep * DerivCoeff(z, m)) CoeffT1(z, m) = NewCoeff end do end do end do DistCs = DistCs / (real(NoOrbs**2, dp)) if (tLagrange) then DistLs = 0.0_dp LambdaMag = 0.0_dp do i = 1, NoOrbs do j = 1, NoOrbs NewLambda = 0.0_dp NewLambda = Lambdas(i, j) - (TimeStep * DerivLambda(i, j)) ! Timestep must be specified in the input file. DistLs = DistLs + abs(TimeStep * DerivLambda(i, j)) Lambdas(i, j) = NewLambda LambdaMag = LambdaMag + abs(NewLambda) end do end do DistLs = DistLs / (real(NoOrbs**2, dp)) LambdaMag = LambdaMag / (real(NoOrbs**2, dp)) end if end subroutine UseTheForce