LCOV - code coverage report
Current view: top level - src/78_effpot - m_spin_ncfile.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 94.1 % 152 143
Test Date: 2026-11-10 12:08:57 Functions: 88.9 % 9 8
Branches: 65.1 % 212 138

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_spin_ncfile
       2                 :             : !! NAME
       3                 :             : !! m_spin_ncfile
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !! This module contains the wrapper for writting spin hist netcdf file.
       7                 :             : !! Unlike the m_spin_potential, inside netcdf, there should be not only the
       8                 :             : !! data of magnetic atoms, but also the whole lattice (which do not move).
       9                 :             : !!
      10                 :             : !! Datatypes:
      11                 :             : !!  spin_ncfile_t
      12                 :             : !!
      13                 :             : !! Subroutines:
      14                 :             : !!  * spin_ncfile_t_init
      15                 :             : !!  * spin_ncfile_t_write_parameters (write parameters)
      16                 :             : !!  * spin_ncfile_t_def_sd (define spin dynamics related dimensions and ids)
      17                 :             : !!  * spin_ncfile_t_write_primitive_cell (write primitive cell information)
      18                 :             : !!  * spin_ncfile_t_write_supercell (write supercell information)
      19                 :             : !!  * spin_ncfile_t_write_one_step (write one step of spin dynamics)
      20                 :             : !!  * spin_ncfile_t_close (close and save netcdf file)
      21                 :             : !!
      22                 :             : !! TODO hexu: should consider carefully what to write.
      23                 :             : !!
      24                 :             : !! COPYRIGHT
      25                 :             : !! Copyright (C) 2001-2026 ABINIT group (hexu)
      26                 :             : !! This file is distributed under the terms of the
      27                 :             : !! GNU General Public License, see ~abinit/COPYING
      28                 :             : !! or http://www.gnu.org/copyleft/gpl.txt .
      29                 :             : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
      30                 :             : !!
      31                 :             : !! SOURCE
      32                 :             : 
      33                 :             : #if defined HAVE_CONFIG_H
      34                 :             : #include "config.h"
      35                 :             : #endif
      36                 :             : 
      37                 :             : 
      38                 :             : #include "abi_common.h"
      39                 :             : 
      40                 :             : module m_spin_ncfile
      41                 :             :   use defs_basis
      42                 :             :   use m_abicore
      43                 :             :   use m_errors
      44                 :             :   use m_xmpi
      45                 :             :   use m_nctk
      46                 :             :   use m_spin_hist , only: spin_hist_t
      47                 :             :   use m_spin_primitive_potential, only: spin_primitive_potential_t
      48                 :             :   use m_spin_potential , only: spin_potential_t
      49                 :             :   use m_multibinit_dataset, only: multibinit_dtset_type
      50                 :             :   !use m_multibinit_supercell, only: mb_supercell_t
      51                 :             :   use m_multibinit_cell, only: mbcell_t, mbsupercell_t
      52                 :             :   use m_spin_observables, only : spin_observable_t
      53                 :             :   use netcdf
      54                 :             : 
      55                 :             :   implicit none
      56                 :             : 
      57                 :             :   !!***
      58                 :             : 
      59                 :             :   type spin_ncfile_t
      60                 :             :      logical :: isopen=.False.  ! if the file is open
      61                 :             :      ! dimensions
      62                 :             :      integer :: three, nspin, natoms, ntime, ntypat, nsublatt
      63                 :             :      ! three: 3
      64                 :             :      ! nspin: number of spin
      65                 :             :      ! natoms: number of atoms in a structure >=nspin
      66                 :             :      ! ntime: number of time step
      67                 :             :      ! ntypat: number of
      68                 :             :      ! nsublatt: number of spin sublattice
      69                 :             : 
      70                 :             :      ! file id
      71                 :             :      integer :: ncerr, ncid
      72                 :             :      ! variable id
      73                 :             :      integer :: xred_id,  typat_id, znucl_id,  label_id, spin_index_id
      74                 :             :      integer ::  acell_id, rprimd_id
      75                 :             :      ! variable ids for spin dynamics
      76                 :             :      integer :: entropy_id, etotal_id, S_id, snorm_id, dsdt_id
      77                 :             :      integer :: heff_id, time_id, itime_id
      78                 :             :      ! entropy
      79                 :             :      ! etotal: total energy
      80                 :             :      ! S: spin
      81                 :             :      ! snorm: magnetic moment. (norm of S)
      82                 :             :      ! dsdt: dS/dt
      83                 :             :      ! heff: effective magnetic field from derivative of E
      84                 :             :      ! time:  time
      85                 :             :      ! iteme: index of time step
      86                 :             :      integer :: Mst_sub_id, Mst_sub_norm_id, Mst_norm_total_id, Snorm_total_id
      87                 :             :      ! Mst_sub: magnetic moment of every sub lattice, \sum_(i in I) Si, where I is a sublattice
      88                 :             :      ! Mst_sub_norm: norm of magnetic momemt of every sub lattice |\sum_(i in I) Si|
      89                 :             :      ! Mst_norm_total: sum of the norm of magnetic moment of every sublattice \sum_I |\sum_(i in I) Si|
      90                 :             :      ! Snorm_total: \sum_i |Si|
      91                 :             : 
      92                 :             :      ! thermo obs
      93                 :             :      integer :: chi_id, binderU4_id, Cv_id
      94                 :             :      !chi: susceptibility
      95                 :             :      ! binder U4:
      96                 :             :      ! Cv: Specific heat
      97                 :             : 
      98                 :             :      ! variable ids for spin/lattice coupling
      99                 :             :      ! TODO: How to do this?
     100                 :             :      integer :: ihist_g_id
     101                 :             : 
     102                 :             :      integer :: itime
     103                 :             :      ! itime: time index
     104                 :             : 
     105                 :             :      integer :: write_traj=0
     106                 :             :      !whether to write the trajectory (S(t))
     107                 :             : 
     108                 :             :      character(len=fnlen) :: filename
     109                 :             :      ! netcdf filename
     110                 :             :    contains
     111                 :             :      ! initialize
     112                 :             :      procedure :: initialize
     113                 :             :      ! define variables for trajectory
     114                 :             :      procedure :: def_spindynamics_var
     115                 :             :      ! define variables for observables
     116                 :             :      procedure :: def_observable_var
     117                 :             :      ! write one step of hist
     118                 :             :      procedure :: write_one_step
     119                 :             :      ! write the primitive cell information
     120                 :             :      procedure :: write_primitive_cell
     121                 :             :      ! write supercell information
     122                 :             :      procedure :: write_supercell
     123                 :             :      ! write parameters related to simulation
     124                 :             :      procedure :: write_parameters
     125                 :             :      ! close netcdf file
     126                 :             :      procedure :: close
     127                 :             :   end type spin_ncfile_t
     128                 :             : 
     129                 :             : contains
     130                 :             : 
     131                 :             :   !-----------------------------------------------------------------------
     132                 :             :   !> @brief initialize
     133                 :             :   !>   open netcdf file
     134                 :             :   !> @param [in] filename: the netcdf filename
     135                 :             :   !> @param [in] write_traj: whether to write full trajectory
     136                 :             :   !-----------------------------------------------------------------------
     137                 :             : 
     138                 :           2 :   subroutine initialize(self, filename, write_traj)
     139                 :             : 
     140                 :             :     class(spin_ncfile_t), intent(inout):: self
     141                 :             :     character(len=*),intent(in) :: filename
     142                 :             :     integer, intent(in) :: write_traj
     143                 :             :     integer :: ncerr
     144                 :           2 :     self%itime=0
     145                 :           2 :     self%write_traj=write_traj
     146                 :           2 :     self%filename=trim(filename)
     147                 :           2 :     self%isopen=.False.
     148                 :             : 
     149                 :           2 :     write(std_out,*) "Write iteration in spin history file "//trim(self%filename)//"."
     150                 :             :     !  Create netCDF file
     151                 :           2 :     ncerr = nf90_create(path=trim(filename), cmode=NF90_CLOBBER, ncid=self%ncid)
     152         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when creating netcdf history file")
     153                 :           2 :     self%isopen=.True.
     154                 :           2 :     ncerr =nf90_enddef(self%ncid)
     155         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when ending def mode in spin netcdf history file")
     156         [ +  - ]:           2 :   end subroutine initialize
     157                 :             : 
     158                 :             : 
     159                 :             :   !-----------------------------------------------------------------------
     160                 :             :   !> @brief define variables for spin dynamics trajectory (and energy)
     161                 :             :   !> @param [in] hist: the spin hist object (not histfile!)
     162                 :             :   !-----------------------------------------------------------------------
     163                 :           2 :   subroutine def_spindynamics_var(self, hist)
     164                 :             :     class(spin_ncfile_t), intent(inout) :: self
     165                 :             :     type(spin_hist_t),intent(in) :: hist
     166                 :             :     integer :: ncerr
     167                 :             : 
     168                 :           2 :     ncerr = nf90_redef(self%ncid)
     169         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when starting defining trajectory variables in spin history file.")
     170                 :             :     ! define dimensions
     171                 :           2 :     ncerr=nf90_def_dim(self%ncid, "three", 3, self%three)
     172         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when defining dimension three in spin history file.")
     173                 :           2 :     ncerr=nf90_def_dim(self%ncid, "nspin", hist%nspin, self%nspin )
     174         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when defining dimension nspin in spin history file.")
     175                 :           2 :     ncerr=nf90_def_dim(self%ncid, "ntime", nf90_unlimited, self%ntime)
     176         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when defining dimension ntime in spin history file.")
     177                 :             :     !call ab_define_var(ncid,dim1,typat_id,NF90_DOUBLE,&
     178                 :             :     !     &  "typat","types of atoms","dimensionless" )
     179                 :             : 
     180         [ +  - ]:           2 :     if(self%write_traj==1) then
     181                 :             :        call ab_define_var(self%ncid, (/ self%three, self%nspin, self%ntime /), &
     182         [ +  + ]:           8 :             &         self%S_id, NF90_DOUBLE, "S", "Spin orientations", "dimensionless")
     183                 :             : 
     184                 :             :        call ab_define_var(self%ncid, (/ self%nspin, self%ntime /), &
     185         [ +  + ]:           6 :             &         self%snorm_id, NF90_DOUBLE, "snorm", "Spin norm2", "Mu_B")
     186                 :             :        call ab_define_var(self%ncid, (/ self%three, self%nspin, self%ntime /), &
     187         [ +  + ]:           8 :             &         self%dsdt_id, NF90_DOUBLE, "dsdt", "Spin orientations derivative to time", "1/s")
     188                 :             : 
     189                 :             :        call ab_define_var(self%ncid, (/ self%three, self%nspin, self%ntime /), &
     190         [ +  + ]:           8 :             &         self%Heff_id, NF90_DOUBLE, "Heff", "Effective spin torque", "Tesla")
     191                 :             :     endif
     192                 :             : 
     193                 :             :     call ab_define_var(self%ncid, (/ self%ntime /), &
     194         [ +  + ]:           4 :          &         self%time_id, NF90_DOUBLE, "time", "time", "s")
     195                 :             :     call ab_define_var(self%ncid, (/ self%ntime /), &
     196         [ +  + ]:           4 :          &         self%etotal_id, NF90_DOUBLE, "etotal", "TOTAL energy", "Joule")
     197                 :             :     call ab_define_var(self%ncid, (/ self%ntime /), &
     198         [ +  + ]:           4 :          &         self%entropy_id, NF90_DOUBLE, "entropy", "Entropy", "Joule/K")
     199                 :             : 
     200                 :             :     call ab_define_var(self%ncid, (/ self%ntime /), &
     201         [ +  + ]:           4 :          &         self%itime_id, NF90_INT, "itime", "index of time in spin timeline", "1")
     202                 :             : 
     203                 :           2 :     ncerr=nf90_enddef(self%ncid)
     204         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when finishing defining variables in spin history file.")
     205                 :             : 
     206                 :           2 :   end subroutine def_spindynamics_var
     207                 :             : 
     208                 :             : 
     209                 :             :   !-----------------------------------------------------------------------
     210                 :             :   !> @brief define varibles of observables
     211                 :             :   !> @param [in] ob: the spin observalble object
     212                 :             :   !-----------------------------------------------------------------------
     213                 :           2 :   subroutine def_observable_var(self, ob)
     214                 :             :     class(spin_ncfile_t), intent(inout) :: self
     215                 :             :     type(spin_observable_t), intent(in) :: ob
     216                 :             :     integer ncerr
     217                 :             : 
     218                 :           2 :     ncerr = nf90_redef(self%ncid)
     219         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when defining observable variables in spin history file.")
     220                 :           2 :     ncerr = nf90_def_dim(self%ncid, "nsublatt", ob%nsublatt, self%nsublatt)
     221         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when defining dimension nsublatt in spin history file.")
     222                 :             :     call ab_define_var(self%ncid, (/self%three, self%nsublatt, self%ntime/),&
     223         [ +  + ]:           8 :            & self%Mst_sub_id, NF90_DOUBLE, "Mst_sub", "Sublattice staggered M", "Bohr magneton")
     224                 :             :     call ab_define_var(self%ncid, (/ self%nsublatt, self%ntime/), &
     225                 :             :           &  self%Mst_sub_norm_id, NF90_DOUBLE, "Mst_sub_norm", &
     226         [ +  + ]:           6 :           &  "Norm of sublattice staggered M", "Bohr magneton")
     227                 :             :     call ab_define_var(self%ncid, (/self%ntime/), self%Mst_norm_total_id, &
     228         [ +  + ]:           4 :            & NF90_DOUBLE, "Mst_norm_total", "total Norm of sublattice M", "Bohr magneton")
     229                 :             :     call ab_define_var(self%ncid, (/self%ntime/), self%Snorm_total_id, &
     230         [ +  + ]:           4 :            & NF90_DOUBLE, "Snorm_sub", "Snorm of sublattice", "Bohr magneton")
     231                 :             : 
     232         [ +  - ]:           2 :     if(ob%calc_thermo_obs)then
     233                 :             :        call ab_define_var(self%ncid, (/self%ntime/), self%binderU4_id, &
     234         [ +  + ]:           4 :                & NF90_DOUBLE, "BinderU4", "Binder U4", "1")
     235                 :             :        call ab_define_var(self%ncid, (/self%ntime/), self%Cv_id, &
     236         [ +  + ]:           4 :                & NF90_DOUBLE, "Cv", "Specific heat", "Joule/K")
     237                 :             :        call ab_define_var(self%ncid, (/self%ntime/), self%chi_id, &
     238         [ +  + ]:           4 :                &NF90_DOUBLE, "chi", "magnetic susceptibility", "1")
     239                 :             :     endif
     240                 :             : 
     241                 :             :     if(ob%calc_traj_obs)then
     242                 :             :      !TODO define traj obs here
     243                 :             :   endif
     244                 :             :   if(ob%calc_correlation_obs)then
     245                 :             :      !TODO define correlation obs here
     246                 :             :   endif
     247                 :             : 
     248                 :           2 :   ncerr=nf90_enddef(self%ncid)
     249         [ -  + ]:           2 :   NCF_CHECK_MSG(ncerr, "Error when finishing defining observable variables in spin history file.")
     250                 :           2 : end subroutine def_observable_var
     251                 :             : 
     252                 :             : !-----------------------------------------------------------------------
     253                 :             : !> @brief write to netcdf after one step is done in a mover
     254                 :             : !> @param [in] hist: the spin hist object
     255                 :             : !> @param [in] ob : the spin observables
     256                 :             : !-----------------------------------------------------------------------
     257                 :         202 :   subroutine write_one_step(self, hist, ob)
     258                 :             : 
     259                 :             :     class(spin_ncfile_t), intent(inout) :: self
     260                 :             :     type(spin_hist_t), intent(in) :: hist
     261                 :             :     type(spin_observable_t), optional, intent(in) :: ob
     262                 :             :     integer :: ncerr, itime
     263                 :         202 :     itime=self%itime+1
     264                 :             : 
     265                 :             :     !write(std_out, *) "writing spin dynamics step into spin hist netcdf file: itime: ", itime
     266         [ +  - ]:         202 :     if(self%write_traj ==1) then
     267                 :             :        ncerr=nf90_put_var(self%ncid, self%S_id, hist%S(:,:,hist%ihist_prev), &
     268   [ +  +  +  + ]:        1414 :             &      start=[1, 1, itime], count=[3, hist%nspin, 1])
     269         [ -  + ]:         202 :        NCF_CHECK_MSG(ncerr, "Error when writting Spin orientations in spin history file.")
     270                 :             :        ncerr=nf90_put_var(self%ncid, self%dsdt_id, &
     271                 :             :             &      hist%dsdt(:,:,hist%ihist_prev), start=[1, 1, itime], &
     272   [ +  +  +  + ]:        1414 :             &      count=[3, hist%nspin, 1])
     273         [ -  + ]:         202 :        NCF_CHECK_MSG(ncerr, "Error when writting dSdt in spin history file.")
     274                 :             :        ncerr=nf90_put_var(self%ncid, self%heff_id, &
     275   [ +  +  +  + ]:        1414 :             &      hist%heff(:,:,hist%ihist_prev), start=[1, 1, itime], count=[3, hist%nspin, 1])
     276         [ -  + ]:         202 :        NCF_CHECK_MSG(ncerr, "Error when writting Heff in spin history file.")
     277                 :             :        ncerr=nf90_put_var(self%ncid, self%snorm_id, &
     278   [ +  -  +  +  :       44642 :             &      hist%snorm(:,hist%ihist_prev)/mu_B, start=[1, itime], count=[hist%nspin, 1])
             +  +  +  + ]
     279         [ -  + ]:         202 :        NCF_CHECK_MSG(ncerr, "Error when writting Snorm in spin history file.")
     280                 :             :     end if
     281                 :             :     !ncerr=nf90_put_var(self%ncid, self%ihist_g_id, [hist%ihist_latt(hist%ihist_prev)], start=[itime], count=[1])
     282                 :             :     ncerr=nf90_put_var(self%ncid, self%itime_id, &
     283   [ +  +  +  + ]:         606 :          &       [hist%itime(hist%ihist_prev)], start=[itime], count=[1])
     284         [ -  + ]:         202 :     NCF_CHECK_MSG(ncerr, "Error when writting itime in spin history file.")
     285                 :             :     ncerr=nf90_put_var(self%ncid, self%time_id, &
     286   [ +  +  +  + ]:         606 :          & [hist%time(hist%ihist_prev)], start=[itime], count=[1])
     287         [ -  + ]:         202 :     NCF_CHECK_MSG(ncerr, "Error when writting time in spin history file.")
     288                 :             :     ncerr=nf90_put_var(self%ncid, self%etotal_id,  &
     289   [ +  +  +  + ]:         606 :          & [hist%etot(hist%ihist_prev)], start=[itime], count=[1])
     290         [ -  + ]:         202 :     NCF_CHECK_MSG(ncerr, "Error when writting etotal in spin history file.")
     291                 :         202 :     self%itime=itime
     292                 :             : 
     293         [ -  + ]:         202 :     if(present(ob)) then
     294                 :             :        ncerr=nf90_put_var(self%ncid, self%Mst_sub_id, ob%Mst_sub, &
     295   [ #  #  #  # ]:           0 :             &      start=[1, 1, itime], count=[3, ob%nsublatt, 1])
     296         [ #  # ]:           0 :        NCF_CHECK_MSG(ncerr, "Error when writting Mst_sub in spin history file.")
     297                 :             :        ncerr=nf90_put_var(self%ncid, self%Mst_sub_norm_id, ob%Mst_sub_norm, &
     298   [ #  #  #  # ]:           0 :             &      start=[ 1, itime], count=[ob%nsublatt, 1])
     299                 :             : 
     300         [ #  # ]:           0 :        NCF_CHECK_MSG(ncerr, "Error when writting Mst_sub_norm in spin history file.")
     301                 :             :        ncerr=nf90_put_var(self%ncid, self%Mst_norm_total_id, [ob%Mst_norm_total], &
     302   [ #  #  #  # ]:           0 :             &      start=[itime], count=[1])
     303         [ #  # ]:           0 :        NCF_CHECK_MSG(ncerr, "Error when writting Mst_norm_total in spin history file.")
     304                 :             :        ncerr=nf90_put_var(self%ncid, self%Snorm_total_id, [ob%Snorm_total/mu_B], &
     305   [ #  #  #  # ]:           0 :             &      start=[itime], count=[1])
     306         [ #  # ]:           0 :        NCF_CHECK_MSG(ncerr, "Error when writting Snorm_total in spin history file.")
     307                 :             :        if(ob%calc_traj_obs)then
     308                 :             :        endif
     309                 :             :        if(ob%calc_thermo_obs)then
     310                 :             :        endif
     311                 :             :        if(ob%calc_correlation_obs)then
     312                 :             :        endif
     313                 :             :     end if
     314                 :             : 
     315                 :         202 :   end subroutine write_one_step
     316                 :             : 
     317                 :             :   !-----------------------------------------------------------------------
     318                 :             :   !> @brief write information about the primitive cell
     319                 :             :   !> Currently disabled.
     320                 :             :   !> @param [in] prim: the primitive cell
     321                 :             :   !-----------------------------------------------------------------------
     322                 :           2 :   subroutine write_primitive_cell(self, prim)
     323                 :             : 
     324                 :             :     class(spin_ncfile_t), intent(inout) :: self
     325                 :             :     type(mbcell_t) :: prim
     326                 :             : 
     327                 :             :     !integer :: natom
     328                 :             :     integer :: nspin
     329                 :             :     integer :: ms_id, rprimd_id, spin_xcart_id, gyro_ratio_id, &
     330                 :             :          & gilbert_damping_id, ref_spin_orientation_id, &
     331                 :             :          & ref_spin_qpoint_id, ref_spin_rotate_axis_id
     332                 :             :     integer :: ncerr
     333                 :             : 
     334                 :             : 
     335                 :           2 :      ncerr=nf90_redef(self%ncid)
     336         [ -  + ]:           2 :      NCF_CHECK_MSG(ncerr, "Error when starting defining primitive cell variables in spin history file.")
     337                 :             : 
     338                 :             :      ! lattice is not yet forced to be saved in prim
     339                 :             :      !ncerr=nf90_def_dim(self%ncid, "prim_natoms", prim%lattice%natom, natom )
     340                 :             :      !NCF_CHECK_MSG(ncerr, "Error when defining dimension prim_natoms in spin history file.")
     341                 :           2 :      ncerr=nf90_def_dim(self%ncid, "prim_nspins", prim%spin%nspin, nspin)
     342         [ -  + ]:           2 :      NCF_CHECK_MSG(ncerr, "Error when defining dimension prim_nspins in spin history file.")
     343                 :             : 
     344                 :             :      call ab_define_var(self%ncid, [self%three, self%three], rprimd_id, &
     345         [ +  + ]:           6 :           & NF90_DOUBLE, "prim_rprimd","PRIMitive cell Real space PRIMitive translations, Dimensional", "bohr")
     346                 :             :      call ab_define_var(self%ncid, [nspin], ms_id, &
     347         [ +  + ]:           4 :           & NF90_DOUBLE, "prim_ms","PRIMitive cell Magnetic moment Scalar", "muB")
     348                 :             :      call ab_define_var(self%ncid, [self%three, nspin], spin_xcart_id, &
     349         [ +  + ]:           6 :           & NF90_DOUBLE, "prim_spin_xcart","PRIMitive cell X Cartesian coordinates", "bohr")
     350                 :             :      call ab_define_var(self%ncid, [self%three, nspin], ref_spin_orientation_id, &
     351         [ +  + ]:           6 :           & NF90_DOUBLE, "prim_ref_spin_orientation","PRIMitive cell REFerence SPIN ORIENTATION", "unitless")
     352                 :             :      call ab_define_var(self%ncid, [self%three], ref_spin_qpoint_id, &
     353         [ +  + ]:           4 :           & NF90_DOUBLE, "prim_ref_spin_qpoint","PRIMitive cell REFerence SPIN QPOINT", "unitless")
     354                 :             :      call ab_define_var(self%ncid, [self%three], ref_spin_rotate_axis_id, &
     355         [ +  + ]:           4 :           & NF90_DOUBLE, "prim_ref_spin_rotate_axis","PRIMitive cell REFerence SPIN ROTATE AXIS", "unitless")
     356                 :             : 
     357                 :             :      call ab_define_var(self%ncid, [nspin], gilbert_damping_id, &
     358         [ +  + ]:           4 :           & NF90_DOUBLE, "prim_gilbert_damping","PRIMitive cell GILBERT DAMPING", "a.u.")
     359                 :             : 
     360                 :             :      call ab_define_var(self%ncid, [nspin], gyro_ratio_id, &
     361         [ +  + ]:           4 :           & NF90_DOUBLE, "prim_gyro_ratio","PRIMitive cell GYROmagnetic RATIO", "a.u.")
     362                 :             : 
     363                 :           2 :      ncerr=nf90_enddef(self%ncid)
     364                 :             : 
     365         [ -  + ]:           2 :      NCF_CHECK_MSG(ncerr, "Error when ending defining primitive cell variables in spin history file.")
     366                 :           2 :      ncerr = nf90_put_var(self%ncid, rprimd_id, prim%spin%rprimd)
     367         [ -  + ]:           2 :      NCF_CHECK_MSG(ncerr, "Error when writting rprimd in spin history file.")
     368                 :           2 :      ncerr = nf90_put_var(self%ncid, ms_id, prim%spin%ms)
     369         [ -  + ]:           2 :      NCF_CHECK_MSG(ncerr, "Error when writting ms in spin history file.")
     370                 :           2 :      ncerr = nf90_put_var(self%ncid, spin_xcart_id, prim%spin%spin_positions)
     371         [ -  + ]:           2 :      NCF_CHECK_MSG(ncerr, "Error when writting xcart in spin history file.")
     372                 :           2 :      ncerr = nf90_put_var(self%ncid, ref_spin_orientation_id, prim%spin%Sref)
     373         [ -  + ]:           2 :      NCF_CHECK_MSG(ncerr, "Error when writting ref_spin_orientation in spin history file.")
     374                 :           2 :      ncerr = nf90_put_var(self%ncid, ref_spin_qpoint_id, prim%spin%ref_qpoint)
     375         [ -  + ]:           2 :      NCF_CHECK_MSG(ncerr, "Error when writting ref_spin_qpoint in spin history file.")
     376                 :           2 :      ncerr = nf90_put_var(self%ncid, ref_spin_rotate_axis_id, prim%spin%ref_rotate_axis)
     377         [ -  + ]:           2 :      NCF_CHECK_MSG(ncerr, "Error when writting ref_spin_rotate_axis in spin history file.")
     378                 :           2 :      ncerr = nf90_put_var(self%ncid, gilbert_damping_id, prim%spin%gilbert_damping)
     379         [ -  + ]:           2 :      NCF_CHECK_MSG(ncerr, "Error when writting gilbert_damping in spin history file.")
     380                 :           2 :      ncerr = nf90_put_var(self%ncid, gyro_ratio_id, prim%spin%gyro_ratio)
     381         [ -  + ]:           2 :      NCF_CHECK_MSG(ncerr, "Error when writting gyro_ratio in spin history file.")
     382                 :             : 
     383                 :           2 :   end subroutine write_primitive_cell
     384                 :             : 
     385                 :             :   !-----------------------------------------------------------------------
     386                 :             :   !> @brief write information of supercell
     387                 :             :   !>     - cartesian coordinates of each spin in supercell
     388                 :             :   !>     - R vector in supercell (as R in S_j e^iqR_j)
     389                 :             :   !>     - the index of spin in primitive cell (as j in S_j e&iqR_j).
     390                 :             :   !> @param [in] supercell: The supercell object
     391                 :             :   !-----------------------------------------------------------------------
     392                 :           2 :   subroutine write_supercell(self, supercell)
     393                 :             : 
     394                 :             :     class(spin_ncfile_t), intent(inout) :: self
     395                 :             :     type(mbsupercell_t), intent(in) :: supercell
     396                 :             :     integer ::  pos_id, ispin_prim_id, rvec_id, ncerr
     397                 :             :     !integer :: rprimd_id, iatomsid
     398                 :             :     ! sc_matric
     399                 :             : 
     400                 :           2 :     ncerr=nf90_redef(self%ncid)
     401         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when starting to redefine supercell variables in spin history file.")
     402                 :             :     !call ab_define_var(self%ncid, (/self%three, self%three /), rprimd_id,&
     403                 :             :     !      & NF90_DOUBLE, "rprimd", "primitive cell vectors in real space with&
     404                 :             :     !      & units", "bohr")
     405                 :             :     call ab_define_var(self%ncid, (/self%three, self%nspin/), pos_id, &
     406         [ +  + ]:           6 :          & NF90_DOUBLE, "xcart_spin","position of spin in cartesian coordinates", "bohr")
     407                 :             :     call ab_define_var(self%ncid, (/self%three, self%nspin/), rvec_id, &
     408         [ +  + ]:           6 :           & NF90_INT, "Rvec", "R vector for spin in supercell", "dimensionless")
     409                 :             :     call ab_define_var(self%ncid, (/self%nspin/), ispin_prim_id,&
     410         [ +  + ]:           4 :           & NF90_INT, "ispin_prim", "index of spin in primitive cell", "dimensionless")
     411                 :             : 
     412                 :           2 :     ncerr=nf90_enddef(self%ncid)
     413         [ -  + ]:           2 :     NCF_CHECK(ncerr)
     414                 :             : 
     415                 :             :     !ncerr=nf90_put_var(self%ncid, rprimd_id, scell%cell)
     416                 :           2 :     ncerr=nf90_put_var(self%ncid, pos_id, supercell%spin%spin_positions)
     417         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when writting xcart_spin in spin history file.")
     418                 :           2 :     ncerr=nf90_put_var(self%ncid, ispin_prim_id, supercell%spin%ispin_prim)
     419         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when writting ispin_prim in spin history file.")
     420                 :           2 :     ncerr=nf90_put_var(self%ncid, rvec_id, supercell%spin%rvec)
     421         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when writting Rvec in spin history file.")
     422                 :             :     ! ncerr=nf90_put_var(self%ncid, iatoms_id, scell%iatoms)
     423                 :           2 :   end subroutine write_supercell
     424                 :             : 
     425                 :             :   !-----------------------------------------------------------------------
     426                 :             :   !> @brief write parameters into hist file
     427                 :             :   !> @param [in] params: parameters from input
     428                 :             :   !-----------------------------------------------------------------------
     429                 :           2 :   subroutine write_parameters(self, params)
     430                 :             :     class(spin_ncfile_t), intent(inout) :: self
     431                 :             :     type(multibinit_dtset_type) :: params
     432                 :             : 
     433                 :             :     integer :: qpoint_id, temperature_id, dt_id, mfield_id, ncell_id
     434                 :             :     integer :: dim0(0)
     435                 :             :     integer :: ncerr
     436                 :           2 :     ncerr=nf90_redef(self%ncid)
     437         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when starting to redefining parameters in spin history file.")
     438                 :             :     ! dims
     439                 :             :     ! vars
     440                 :             :     call ab_define_var(self%ncid, (/self%three/), qpoint_id, NF90_DOUBLE,&
     441         [ +  + ]:           4 :          & "spin_projection_qpoint", "spin QPOINT", "dimensionless")
     442                 :             :     ! TODO should change ncell to 3*3 matrix
     443                 :             :     call ab_define_var(self%ncid, (/self%three/), ncell_id, NF90_INT, "ncell",&
     444         [ +  + ]:           4 :          & "supercell matrix (only diagonal)", "dimensionless")
     445                 :             :     call ab_define_var(self%ncid, dim0, temperature_id, NF90_DOUBLE,&
     446                 :           2 :          & "spin_temperature", "Spin temperature", "Kelvin")
     447                 :             :     call ab_define_var(self%ncid, dim0, dt_id, NF90_DOUBLE, "spin_dt", "Spin&
     448                 :           2 :          & time step", "second")
     449                 :             :     call ab_define_var(self%ncid, (/self%three/), mfield_id, NF90_DOUBLE,&
     450         [ +  + ]:           4 :          & "spin_mag_field", "magnetic field for spin dynamics", "Tesla")
     451                 :             :     !ncerr=nf90_def_var(self%ncid, "ncell", NF90_INT, [self%three], ncell_id)
     452                 :             :     !ncerr=nf90_def_var(self%ncid, "spin_temperature", NF90_DOUBLE,
     453                 :             :     !temperature_id)
     454                 :             :     !ncerr=nf90_def_var(self%ncid, "spin_dt", NF90_DOUBLE,  dt_id)
     455                 :             :     !ncerr=nf90_def_var(self%ncid, "spin_mag_field", NF90_DOUBLE, [self%three],
     456                 :             :     !mfield_id)
     457                 :             : 
     458                 :           2 :     ncerr=nf90_enddef(self%ncid)
     459         [ -  + ]:           2 :     NCF_CHECK(ncerr)
     460                 :             :     ! put vars
     461                 :           2 :     ncerr=nf90_put_var(self%ncid, qpoint_id, params%spin_projection_qpoint)
     462         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when writting spin_projection_qpoint in spin history file.")
     463                 :           2 :     ncerr=nf90_put_var(self%ncid, ncell_id, params%ncell)
     464         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when writting ncell in spin history file.")
     465                 :           2 :     ncerr=nf90_put_var(self%ncid, temperature_id, params%spin_temperature*Ha_K)
     466         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when writting spin_temperature in spin history file.")
     467                 :           2 :     ncerr=nf90_put_var(self%ncid, dt_id, params%spin_dt*Time_Sec)
     468         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when writting spin_dt in spin history file.")
     469         [ +  + ]:           8 :     ncerr=nf90_put_var(self%ncid, mfield_id, params%spin_mag_field/Bfield_Tesla)
     470         [ -  + ]:           2 :     NCF_CHECK_MSG(ncerr, "Error when writting spin_mag_field in spin history file.")
     471                 :           2 :   end subroutine write_parameters
     472                 :             : 
     473                 :             :   !-----------------------------------------------------------------------
     474                 :             :   !> @brief close hist file
     475                 :             :   !-----------------------------------------------------------------------
     476                 :           2 :   subroutine close(self)
     477                 :             : 
     478                 :             :     class(spin_ncfile_t), intent(inout) :: self
     479                 :             :     integer :: ncerr
     480         [ +  - ]:           2 :     if (self%isopen) then
     481                 :           2 :        write(std_out, *) "Closing spin history file "//trim(self%filename)//"."
     482                 :           2 :        ncerr=nf90_close(self%ncid)
     483   [ -  +  -  - ]:           2 :        NCF_CHECK_MSG(ncerr, "close netcdf spin history file"//trim(self%filename)//".")
     484                 :             :     end if
     485                 :           2 :   end subroutine close
     486                 :             : 
     487                 :           0 : end module m_spin_ncfile
        

Generated by: LCOV version 2.3-1