diff --git a/source/KKRnano/source/bfield/bfield.f90 b/source/KKRnano/source/bfield/bfield.f90
index c4430a0e4e2d79426cd1580834b10413e2e8180c..3dc12d5b51550b0ca2e18d70679c11bbddf91440 100644
--- a/source/KKRnano/source/bfield/bfield.f90
+++ b/source/KKRnano/source/bfield/bfield.f90
@@ -29,13 +29,11 @@ module mod_bfield
   !> Summary: A type storing information on magnetic fields for a single atom
   !-------------------------------------------------------------------------------
   type :: bfield_data
-    double precision, dimension(3) :: bfield !! external magnetic field in cartesian coordinates
-    double precision               :: bfield_strength !! absolute value of the external magnetic field
+    double precision, dimension(3) :: bfield_ext    !! external magnetic field in cartesian coordinates
     double precision, dimension(3) :: bfield_constr !! constraining field in cartesian coordinates
-    double precision               :: theta !! polar angle of the magnetic field
-    double precision               :: phi   !! azimuthal angle of the magnetic field
+    double precision, dimension(3) :: mag_torque    !! Magnetic torque
+
     double precision, dimension(:,:,:), allocatable :: thetallmat !! shapefun in the ll' expansion
-    double precision, dimension(3) :: mag_torque !! Magnetic torque 
   end type
 
 contains
@@ -173,11 +171,14 @@ contains
     integer        :: iatom, iostat
     character(256) :: linebuffer
     logical        :: file_exists
+    double precision, dimension(:), allocatable :: phi, theta, strength
 
     number_of_atoms = size(bfields)
 
     inquire(file='bfield.dat', exist=file_exists)
-   
+
+    allocate(phi(number_of_atoms), theta(number_of_atoms), strength(number_of_atoms))
+
     if (file_exists) then
       open(unit=57493215, file='bfield.dat', iostat=iostat)
       
@@ -190,7 +191,7 @@ contains
           stop
         end if
         if (linebuffer(1:1) == '#') cycle ! input line commented out
-        read(linebuffer, *, iostat=iostat) bfields(iatom)%theta, bfields(iatom)%phi, bfields(iatom)%bfield_strength
+        read(linebuffer, *, iostat=iostat) theta(iatom), phi(iatom), strength(iatom)
         if (iostat /= 0) then
           write(*,*) "Error parsing a line in bfield.dat"
           stop
@@ -200,25 +201,25 @@ contains
       close(57493215)
     else
       ! No 'bfield.dat' given, use default 0
-      do iatom = 1, number_of_atoms
-        bfields(iatom)%theta = 0.
-        bfields(iatom)%phi = 0.
-        bfields(iatom)%bfield_strength = 0.
-      end do
+      theta(:)    = 0.
+      phi(:)      = 0.
+      strength(:) = 0.
     end if
 
+    theta(:) = theta(:) / 360.0d0 * 8.d0 * datan(1.d0)
+    phi(:)   = phi(:)   / 360.0d0 * 8.d0 * datan(1.d0)
+    do iatom = 1, number_of_atoms
+      bfields(iatom)%bfield_ext(1) = strength(iatom) * sin(theta(iatom)) * cos(phi(iatom))
+      bfields(iatom)%bfield_ext(2) = strength(iatom) * sin(theta(iatom)) * sin(phi(iatom))
+      bfields(iatom)%bfield_ext(3) = strength(iatom) * cos(theta(iatom))
+    end do
+
     write(*,*) '  ###############################################'
     write(*,*) '  external non-collinear magnetic fields'
     write(*,*) '  ###############################################'
     write(*,*) '  iatom      theta       phi         bfield (in Ry)'
     do iatom = 1, number_of_atoms
-      bfields(iatom)%theta           = bfields(iatom)%theta / 360.0d0 * 8.d0 * datan(1.d0)
-      bfields(iatom)%phi             = bfields(iatom)%phi   / 360.0d0 * 8.d0 * datan(1.d0)
-      bfields(iatom)%bfield_strength = bfields(iatom)%bfield_strength ! / 235051.787 ! conversion from Tesla to Ry
-      bfields(iatom)%bfield(1)       = bfields(iatom)%bfield_strength*cos(bfields(iatom)%phi)*sin(bfields(iatom)%theta)
-      bfields(iatom)%bfield(2)       = bfields(iatom)%bfield_strength*sin(bfields(iatom)%phi)*sin(bfields(iatom)%theta)
-      bfields(iatom)%bfield(3)       = bfields(iatom)%bfield_strength*cos(bfields(iatom)%theta)
-      write(*,'(2X,I4,3(E16.8))') iatom, bfields(iatom)%theta, bfields(iatom)%phi, bfields(iatom)%bfield_strength
+      write(*,'(2X,I4,3(E16.8))') iatom, theta(iatom), phi(iatom), strength(iatom)
    end do
   end subroutine read_bfield
 
@@ -261,7 +262,7 @@ contains
     lmmax = size(bfield%thetallmat, 1) ! size(vnspll, 1) is 2*lmmax
     irmd = size(vnspll, 3)
 
-    combined_bfields(:) = bfield%bfield(:) ! start with external, is zero if unused
+    combined_bfields(:) = bfield%bfield_ext(:) ! start with external, is zero if unused
     if (lbfield_constr) then
       ! Add constraint field
       combined_bfields(:) = combined_bfields(:) + bfield%bfield_constr(:)