diff --git a/source/KKRnano/source/ProcessKKRresults_mod.F90 b/source/KKRnano/source/ProcessKKRresults_mod.F90 index fad7dd1093fa94131be1199e6a715d699d291f63..bbcca67479cee345cc5a37611628a8102323fccb 100644 --- a/source/KKRnano/source/ProcessKKRresults_mod.F90 +++ b/source/KKRnano/source/ProcessKKRresults_mod.F90 @@ -187,7 +187,7 @@ module ProcessKKRresults_mod arrays%ZAT, emesh%EZ,& ! emesh%WEZ,& params%LDAU, dims%iemxd, & - dims%korbit, params%noncobfield) + dims%korbit, params%noncobfield, params%bfield_verbosity) call outTime(mp%isMasterRank, 'results ........................', getTime(program_timer), iter) @@ -1131,9 +1131,9 @@ module ProcessKKRresults_mod reclen = max(reclen, 4*8 + 1*1 + 3*8) end if if (noncobfield) then - ! The constraint bfields (double(3)) + ! The constraint bfields (double(3)) and torques (double(3)) recnum = recnum + 1 - reclen = max(reclen, 3*8) + reclen = max(reclen, (3+3)*8) end if end subroutine @@ -1205,7 +1205,8 @@ module ProcessKKRresults_mod irec = irec + 1 endif if (params%noncobfield) then - write(unit=r1fu, rec=irec) calc%bfields(ila)%bfield_constr + write(unit=r1fu, rec=irec) calc%bfields(ila)%bfield_constr, & + calc%bfields(ila)%mag_torque irec = irec + 1 end if end do @@ -1611,7 +1612,7 @@ module ProcessKKRresults_mod subroutine results(lrecres2, ielast, itscf, lmax, natoms, npol, nspin, kpre, compute_total_energy, lpot, e1, e2, tk, efermi, alat, ititle, chrgnt, zat, ez, & ! wez, & ldau, iemxd, & - korbit, noncobfield) + korbit, noncobfield, bfield_verbosity) use Constants_mod, only: pi integer, intent(in) :: iemxd integer, intent(in) :: ielast, itscf, lmax, natoms, npol, nspin @@ -1625,6 +1626,7 @@ module ProcessKKRresults_mod integer, intent(in) :: ititle(20,*) integer, intent(in) :: korbit ! NOCO logical, intent(in) :: noncobfield + integer, intent(in) :: bfield_verbosity ! logical, external :: TEST #define TEST(STRING) .false. @@ -1655,6 +1657,9 @@ module ProcessKKRresults_mod double precision delta_angle !NOCO integer :: max_delta_atom !NOCO double precision, dimension(3) :: constr_field + double precision, dimension(3) :: torque ! torque of the current atom + double precision :: max_torque_sqrd ! squared magnitude of largest torque so far + integer :: max_torque_atom ! atom with largest torque so far integer :: reclen, recnum, irec, ie, lrecres2 integer :: lcoremax, i1, ispin, lpot character(len=*), parameter :: & @@ -1666,6 +1671,8 @@ module ProcessKKRresults_mod F87="(' Angle between old and new moment (deg) = ',f12.6)", & F88="(' Change of angle theta (deg) = ',f12.6)", & F89="(' Change of angle phi (deg) = ',f12.6)", & + F81="(' Largest torque for atom = ',i5.1)", & + F82="(' Largest torque magnitude [Ry] = ',E12.6)", & F94="(4X,'nuclear charge ',F10.6,9X,'core charge = ',F10.6)" integer :: npotd @@ -1676,6 +1683,8 @@ module ProcessKKRresults_mod max_delta_phi = 0.d0 !NOCO max_delta_angle = 0.d0 !NOCO max_delta_atom = 1 !NOCO + max_torque_sqrd = 0. + max_torque_atom = 0 ! Calculate size of data written per atom call calculateResults1FileShapes(reclen, recnum, compute_total_energy, & @@ -1732,9 +1741,11 @@ module ProcessKKRresults_mod if (korbit > 0) then open(13,file='nonco_angle_out.dat',form='formatted') open(14,file='nonco_moment_out.txt',form='formatted') - if (noncobfield) then + if (noncobfield .and. bfield_verbosity >= 1) then open(15, file='bconstr_out.dat', form='formatted') - write(15, '(A)') '# bconstr_x [Ry], bconstr_x [Ry], bconstr_x [Ry]' + write(15, '(A)') '# bconstr_x [Ry], bconstr_y [Ry], bconstr_z [Ry]' + open(16, file='torque_out.dat', form='formatted') + write(16, '(A)') '# torque_x [Ry], torque_y [Ry], torque_z [Ry]' end if do i1 = 1, natoms @@ -1755,7 +1766,7 @@ module ProcessKKRresults_mod irec = irec + 1 if (noncobfield) then - read(71, rec=irec) constr_field + read(71, rec=irec) constr_field, torque irec = irec + 1 end if @@ -1782,8 +1793,14 @@ module ProcessKKRresults_mod phi_noco/(2.0D0*PI)*360.0D0, & angle_fix_mode - if (noncobfield) then + if (noncobfield .and. bfield_verbosity >= 1) then write(15,*) constr_field(:) + write(16,*) torque(:) + + if (dot_product(torque(:), torque(:)) > max_torque_sqrd) then + max_torque_sqrd = dot_product(torque(:), torque(:)) + max_torque_atom = i1 + end if end if sum_moment_x = sum_moment_x + moment_x @@ -1793,8 +1810,9 @@ module ProcessKKRresults_mod close(13) close(14) - if (noncobfield) then + if (noncobfield .and. bfield_verbosity >= 1) then close(15) + close(16) end if end if @@ -1824,6 +1842,10 @@ module ProcessKKRresults_mod write(6, fmt=F88) 180.0/PI*max_delta_theta ! Corresponding theta angle change, NOCO write(6, fmt=F89) 180.0/PI*max_delta_phi ! Corresponding phi angle change, NOCO end if + if (noncobfield .and. bfield_verbosity >= 2) then + write(6, fmt=F81) max_torque_atom + write(6, fmt=F82) sqrt(max_torque_sqrd) + end if write(6, '(79(1h+))') end if