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-09-20 15:27:41 Functions: 88.9 % 9 8

            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