diff --git a/source/KKRnano/source/ProcessKKRresults_mod.F90 b/source/KKRnano/source/ProcessKKRresults_mod.F90 index 10188e0af8362a6700dd259ed7e3dfc3a5bac136..4af5e74c8a03d53c02b530def122581896c520ee 100644 --- a/source/KKRnano/source/ProcessKKRresults_mod.F90 +++ b/source/KKRnano/source/ProcessKKRresults_mod.F90 @@ -183,7 +183,7 @@ module ProcessKKRresults_mod arrays%ZAT, emesh%EZ,& ! emesh%WEZ,& params%LDAU, dims%iemxd, & - dims%korbit) + dims%korbit, params%noncobfield) call outTime(mp%isMasterRank, 'results ........................', getTime(program_timer), iter) @@ -1049,9 +1049,10 @@ module ProcessKKRresults_mod !> size of records used in the file resp. the number of records used !> per atom. subroutine calculateResults1FileShapes(reclen, recnum, kte, korbit, & - iemxd, lmaxd, npol) + noncobfield, iemxd, lmaxd, npol) integer, intent(out) :: reclen, recnum integer, intent(in) :: kte, korbit + logical, intent(in) :: noncobfield integer, intent(in) :: iemxd, lmaxd, npol ! To use the file for different information depending on what is calculated @@ -1086,6 +1087,11 @@ module ProcessKKRresults_mod recnum = recnum + 1 reclen = max(reclen, 4*8 + 1*1 + 3*8) end if + if (noncobfield) then + ! The constraint bfields (double(3)) + recnum = recnum + 1 + reclen = max(reclen, 3*8) + end if end subroutine @@ -1113,7 +1119,7 @@ module ProcessKKRresults_mod r1fu = 71 call calculateResults1FileShapes(reclen, recnum, params%kte, dims%korbit, & - dims%iemxd, dims%lmaxd, emesh%npol) + params%noncobfield, dims%iemxd, dims%lmaxd, emesh%npol) if (recnum <= 0) return ! if nothing is written anyway, end here @@ -1156,6 +1162,10 @@ module ProcessKKRresults_mod irec = irec + 1 endif end do + if (params%noncobfield) then + write(unit=r1fu, rec=irec) calc%bfields(ila)%bfield_constr + irec = irec + 1 + end if close(r1fu) @@ -1558,7 +1568,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) + korbit, noncobfield) use Constants_mod, only: pi integer, intent(in) :: iemxd integer, intent(in) :: ielast, itscf, lmax, natoms, npol, nspin @@ -1571,6 +1581,7 @@ module ProcessKKRresults_mod double precision, intent(in) :: zat(natoms) integer, intent(in) :: ititle(20,*) integer, intent(in) :: korbit ! NOCO + logical, intent(in) :: noncobfield ! logical, external :: TEST #define TEST(STRING) .false. @@ -1600,6 +1611,7 @@ module ProcessKKRresults_mod double precision max_delta_angle !NOCO double precision delta_angle !NOCO integer :: max_delta_atom !NOCO + double precision, dimension(3) :: constr_field integer :: reclen, recnum, irec, ie, lrecres2 integer :: lcoremax, i1, ispin, lpot character(len=*), parameter :: & @@ -1624,7 +1636,7 @@ module ProcessKKRresults_mod ! Calculate size of data written per atom call calculateResults1FileShapes(reclen, recnum, compute_total_energy, & - korbit, iemxd, lmax, npol) + korbit, noncobfield, iemxd, lmax, npol) if (recnum > 0) then !TODO I think there are some things that should be written anyway, @@ -1673,10 +1685,14 @@ module ProcessKKRresults_mod end do end if - ! Third loop: Nonco stuff + ! Third loop: Nonco and constraint bfields stuff 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 + open(15, file='bconstr_out.dat', form='formatted') + write(15, '(A)') '# bconstr_x [Ry], bconstr_x [Ry], bconstr_x [Ry]' + end if do i1 = 1, natoms irec = 1 + (i1 - 1) * recnum @@ -1693,6 +1709,12 @@ module ProcessKKRresults_mod read(71, rec=irec) phi_noco, theta_noco, phi_noco_old, theta_noco_old, & angle_fix_mode, moment_x, moment_y, moment_z + irec = irec + 1 + + if (noncobfield) then + read(71, rec=irec) constr_field + irec = irec + 1 + end if delta_angle = acos(sin(theta_noco)*sin(theta_noco_old)*cos(phi_noco-phi_noco_old)+ & cos(theta_noco)*cos(theta_noco_old)) @@ -1716,6 +1738,11 @@ module ProcessKKRresults_mod theta_noco/(2.0D0*PI)*360.0D0, & phi_noco/(2.0D0*PI)*360.0D0, & angle_fix_mode + + if (noncobfield) then + write(15,*) constr_field(:) + end if + sum_moment_x = sum_moment_x + moment_x sum_moment_y = sum_moment_y + moment_y sum_moment_z = sum_moment_z + moment_z @@ -1723,6 +1750,9 @@ module ProcessKKRresults_mod close(13) close(14) + if (noncobfield) then + close(15) + end if end if if (compute_total_energy >= 0) then