LCOV - code coverage report
Current view: top level - src/78_effpot - m_lattice_lwf_mover.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 53 0
Test Date: 2026-09-19 15:24:51 Functions: 0.0 % 4 0

            Line data    Source code
       1              : !!****m* ABINIT/m_lattice_lwf_mover
       2              : !! NAME
       3              : !! m_lattice_lwf_mover
       4              : !!
       5              : !! FUNCTION
       6              : !! This module contains the mover for coupled lattice lwf dynamics
       7              : !!
       8              : !!
       9              : !! COPYRIGHT
      10              : !! Copyright (C) 2001-2026 ABINIT group (hexu)
      11              : !! This file is distributed under the terms of the
      12              : !! GNU General Public License, see ~abinit/COPYING
      13              : !! or http://www.gnu.org/copyleft/gpl.txt .
      14              : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
      15              : !!
      16              : !! SOURCE
      17              : 
      18              : #if defined HAVE_CONFIG_H
      19              : #include "config.h"
      20              : #endif
      21              : #include "abi_common.h"
      22              : 
      23              : module  m_lattice_lwf_mover
      24              : 
      25              :   use defs_basis
      26              :   use m_errors
      27              :   use m_abicore
      28              :   use m_xmpi
      29              :   use m_io_tools, only : get_unit, open_file, close_unit
      30              :   use m_mpi_scheduler, only: mpi_scheduler_t, init_mpi_info
      31              : 
      32              : 
      33              :   use m_abstract_potential, only: abstract_potential_t
      34              :   use m_abstract_mover, only: abstract_mover_t
      35              :   use m_lattice_mover, only: lattice_mover_t
      36              :   use m_lwf_mover, only: lwf_mover_t
      37              :   use m_hashtable_strval, only: hash_table_t
      38              : 
      39              :   implicit none
      40              : 
      41              :   private
      42              : 
      43              : !!***
      44              : 
      45              :   type, public, extends(abstract_mover_t) :: lattice_lwf_mover_t
      46              :     class(lattice_mover_t), pointer :: lattice_mover => null()
      47              :     class(lwf_mover_t),    pointer :: lwf_mover => null()
      48              :   CONTAINS
      49              :     procedure :: initialize
      50              :     procedure :: finalize
      51              :     procedure :: run_time
      52              : 
      53              :  end type lattice_lwf_mover_t
      54              : 
      55              : contains
      56            0 :   subroutine initialize(self, lattice_mover, lwf_mover)
      57              :     class(lattice_lwf_mover_t),intent(inout) :: self
      58              :     class(lattice_mover_t), target:: lattice_mover
      59              :     class(lwf_mover_t), target:: lwf_mover
      60            0 :     self%lattice_mover=>lattice_mover
      61            0 :     self%lwf_mover=>lwf_mover
      62            0 :     self%dt=self%lattice_mover%dt
      63            0 :     self%thermal_time=self%lattice_mover%thermal_time
      64            0 :   end subroutine initialize
      65              : 
      66            0 :   subroutine finalize(self)
      67              :     class(lattice_lwf_mover_t),intent(inout) :: self
      68            0 :     nullify(self%lattice_mover)
      69            0 :     nullify(self%lwf_mover)
      70            0 :   end subroutine finalize
      71              : 
      72            0 :   subroutine run_time(self, effpot, displacement, strain, spin, lwf, energy_table)
      73              :     class(lattice_lwf_mover_t),intent(inout) :: self
      74              :     ! array of effective potentials so that there can be multiple of them.
      75              :     class(abstract_potential_t), intent(inout) :: effpot
      76              :     real(dp), optional, intent(inout) :: displacement(:,:), strain(:,:), spin(:,:), lwf(:)
      77              :     type(hash_table_t), optional, intent(inout) :: energy_table
      78              :     integer :: i, nstep
      79              :     character(len=90) :: msg
      80            0 :     if(present(displacement) .or. present(strain)) then
      81            0 :        ABI_ERROR("displacement and strain should not be input for lattice mover")
      82              :     end if
      83            0 :     ABI_UNUSED_A(effpot)
      84            0 :     ABI_UNUSED_A(spin)
      85            0 :     ABI_UNUSED_A(lwf)
      86            0 :     ABI_UNUSED_A(energy_table)
      87              : 
      88              : 
      89            0 :     msg=repeat("=", 90)
      90            0 :     call wrtout(std_out,msg,'COLL')
      91            0 :     call wrtout(ab_out, msg, 'COLL')
      92            0 :     write(msg, '(A22)') "Lattice dynamic steps:"
      93            0 :     call wrtout(std_out,msg,'COLL')
      94            0 :     call wrtout(ab_out, msg, 'COLL')
      95            0 :     msg=repeat("=", 90)
      96            0 :     call wrtout(std_out,msg,'COLL')
      97            0 :     call wrtout(ab_out, msg, 'COLL')
      98              : 
      99              :     write(msg, "(A13, 4X, A15, 4X, A15, 4X, A15, 4X, A15)") &
     100            0 :             &  "Iteration", "temperature(K)", "Ekin(Ha/uc)", &
     101            0 :             & "Epot(Ha/uc)", "ETOT(Ha/uc)"
     102            0 :     call wrtout(std_out,msg,'COLL')
     103            0 :     call wrtout(ab_out, msg, 'COLL')
     104              : 
     105            0 :     nstep=floor(self%lattice_mover%thermal_time/self%lattice_mover%dt)
     106            0 :     do i =1, nstep
     107              :        call self%lattice_mover%run_one_step(effpot=effpot, displacement=self%lattice_mover%displacement, &
     108            0 :             & strain=strain, spin=spin, lwf=self%lwf_mover%lwf, energy_table=energy_table)
     109              :        !call self%lwf_mover%run_one_step(effpot=effpot, displacement=self%lattice_mover%displacement, strain=strain, spin=spin, &
     110              :        !     & lwf=lwf, energy_table=energy_table)
     111            0 :        call self%lwf_mover%hist%set_hist(lwf=self%lwf_mover%lwf, energy=self%lattice_mover%energy )
     112              :     end do
     113              : 
     114            0 :     nstep=floor(self%lattice_mover%total_time/self%lattice_mover%dt)
     115            0 :     do i =1, nstep
     116              :        call self%lattice_mover%run_one_step(effpot=effpot, displacement=self%lattice_mover%displacement, &
     117            0 :                                 & lwf=self%lwf_mover%lwf, energy_table=energy_table)
     118            0 :        call self%lwf_mover%hist%set_hist(lwf=self%lwf_mover%lwf, energy=self%lattice_mover%energy )
     119              : 
     120            0 :        if(modulo(i, self%lattice_mover%params%nctime)==0) then
     121            0 :           write(msg, "(I13, 4X, F15.5, 4X, ES15.5, 4X, ES15.5, 4X, ES15.5)")  i, self%lattice_mover%T_ob*Ha_K, &
     122            0 :                & self%lattice_mover%Ek/self%lattice_mover%supercell%ncell, &
     123            0 :                & self%lattice_mover%energy/self%lattice_mover%supercell%ncell, &
     124            0 :                & (self%lattice_mover%Ek+self%lattice_mover%energy)/self%lattice_mover%supercell%ncell
     125            0 :           call wrtout(std_out,msg,'COLL')
     126            0 :           call wrtout(ab_out, msg, 'COLL')
     127              : 
     128            0 :           self%lattice_mover%current_xcart(:, :) = self%lattice_mover%supercell%lattice%xcart(:,:)+self%lattice_mover%displacement
     129              :           call self%lattice_mover%ncfile%write_one_step(self%lattice_mover%current_xcart, &
     130            0 :                & self%lattice_mover%current_vcart, self%lattice_mover%energy, self%lattice_mover%Ek)
     131              : 
     132            0 :           call self%lwf_mover%ncfile%write_one_step(self%lwf_mover%hist)
     133              : 
     134              :        end if
     135              :     end do
     136              : 
     137            0 :     msg=repeat("=", 90)
     138            0 :     call wrtout(std_out,msg,'COLL')
     139            0 :     call wrtout(ab_out, msg, 'COLL')
     140            0 :   end subroutine run_time
     141              : 
     142            0 : end module m_lattice_lwf_mover
        

Generated by: LCOV version 2.3-1