LCOV - code coverage report
Current view: top level - src/45_geomoptim - m_pred_langevin_pimd.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 66 66
Test Date: 2026-09-21 19:39:32 Functions: 100.0 % 1 1

            Line data    Source code
       1              : !!****m* ABINIT/m_pred_langevin_pimd
       2              : !! NAME
       3              : !!  m_pred_langevin_pimd
       4              : !!
       5              : !! FUNCTION
       6              : !! This module provides an interface to call PIMD Langevin dynamics algorithm,
       7              : !! for conventional NVT molecular dynamics.
       8              : !!
       9              : !! COPYRIGHT
      10              : !!  Copyright (C) 2024-2026 ABINIT group (A. Blanchet)
      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              : !!
      15              : !! SOURCE
      16              : 
      17              : #if defined HAVE_CONFIG_H
      18              : #include "config.h"
      19              : #endif
      20              : 
      21              : #include "abi_common.h"
      22              : 
      23              : module m_pred_langevin_pimd
      24              : 
      25              :   use defs_basis
      26              :   use m_abicore
      27              :   use m_abimover
      28              :   use m_abihist
      29              :   use m_pimd
      30              :   use m_pimd_langevin, only : pimd_langevin_nvt,pimd_langevin_npt
      31              :   use m_geometry,      only : metric
      32              : 
      33              :   implicit none
      34              :   public :: pred_langevin_pimd
      35              : 
      36              : contains
      37              : 
      38              :   !!***
      39              :   !!****f* ABINIT/pred_langevin_pimd
      40              :   !! NAME
      41              :   !! pred_langevin_pimd
      42              :   !!
      43              :   !! FUNCTION
      44              :   !! Ionmov predictors (16) Langevin dynamics algorithm using PIMD predictor
      45              :   !!
      46              :   !! IONMOV 16:
      47              :   !! Uses a Langevin dynamics algorithm :
      48              :   !! see Quigley,Probert, JCP 120, 11432 (2004) [[cite:Quigley2004]], part III
      49              :   !!
      50              :   !! INPUTS
      51              :   !! ab_mover <type(abimover)> : Datatype with all the information needed by the preditor
      52              :   !! itime  : Index of the present iteration
      53              :   !! zDEBUG : if true print some debugging information
      54              :   !! pimd_param=datastructure that contains all the parameters necessary to Path-Integral MD
      55              :   !!
      56              :   !! OUTPUT
      57              :   !!
      58              :   !! SIDE EFFECTS
      59              :   !! hist <type(abihist)> : History of positions,forces acell, rprimd, stresses
      60              :   !!
      61              :   !! SOURCE
      62              : 
      63           10 :   subroutine pred_langevin_pimd(ab_mover,hist,itime,zDEBUG,pimd_param)
      64              : 
      65              :     ! Arguments -------------------------------
      66              :     ! Scalars
      67              :     type(abimover),intent(in)   :: ab_mover
      68              :     type(abihist),intent(inout) :: hist
      69              :     type(pimd_type),intent(in)  :: pimd_param
      70              :     integer,intent(in)          :: itime
      71              :     logical,intent(in)          :: zDEBUG
      72              : 
      73              :     ! Local variables -------------------------
      74              :     ! Scalars
      75              :     integer  :: ihist_prev
      76              :     real(dp) :: ucvol
      77              :     real(dp) :: etotal
      78              :     ! Arrays
      79              :     real(dp) :: acell(3),rprimd(3,3),rprimd_next(3,3),rprimd_prev(3,3),gprimd(3,3)
      80           20 :     real(dp) :: gmet(3,3),rmet(3,3),strten(6),fcart(3,ab_mover%natom)
      81           20 :     real(dp) :: xred(3,ab_mover%natom),vel(3,ab_mover%natom),vel_cell(3,3),vel_cell_next(3,3)
      82           20 :     real(dp) :: pimd_etotal(1),pimd_stressin(3,3,1),pimd_xred(3,ab_mover%natom,1)
      83           20 :     real(dp) :: pimd_xred_next(3,ab_mover%natom,1),pimd_xred_prev(3,ab_mover%natom,1)
      84           20 :     real(dp) :: pimd_forces(3,ab_mover%natom,1),pimd_vel(3,ab_mover%natom,1)
      85           20 :     real(dp) :: pimd_vel_next(3,ab_mover%natom,1)
      86              : 
      87              :     ! *********************************************************************
      88              :     ! Initialize arrays
      89           10 :     ihist_prev=0
      90           10 :     ucvol=zero
      91           10 :     etotal=zero
      92           10 :     acell=zero
      93           10 :     rprimd=zero
      94           10 :     rprimd_next=zero
      95           10 :     rprimd_prev=zero
      96           10 :     gprimd=zero
      97           10 :     gmet=zero
      98           10 :     rmet=zero
      99           10 :     strten=zero
     100          250 :     fcart=zero
     101          250 :     xred=zero
     102          250 :     vel=zero
     103           10 :     vel_cell=zero
     104           10 :     vel_cell_next=zero
     105           10 :     pimd_etotal=zero
     106           10 :     pimd_stressin=zero
     107          260 :     pimd_xred=zero
     108          260 :     pimd_xred_next=zero
     109          260 :     pimd_xred_prev=zero
     110          260 :     pimd_forces=zero
     111          260 :     pimd_vel=zero
     112          260 :     pimd_vel_next=zero
     113              :     ! Get last positions
     114           10 :     call hist2var(acell,hist,ab_mover%natom,rprimd,xred,zDEBUG)
     115          250 :     fcart(:,:)=hist%fcart(:,:,hist%ihist)
     116           70 :     strten(:) =hist%strten(:,hist%ihist)
     117          250 :     vel(:,:)  =hist%vel(:,:,hist%ihist)
     118          130 :     vel_cell  =hist%vel_cell(:,:,hist%ihist)
     119           10 :     etotal    =hist%etot(hist%ihist)
     120           10 :     call metric(gmet,gprimd,-1,rmet,rprimd,ucvol)
     121              : 
     122              :     ! Set PIMD corresponding variables
     123           10 :     pimd_etotal(1)=etotal
     124           10 :     pimd_stressin(1,1,1)=strten(1)
     125           10 :     pimd_stressin(2,2,1)=strten(2)
     126           10 :     pimd_stressin(3,3,1)=strten(3)
     127           10 :     pimd_stressin(3,2,1)=strten(4)
     128           10 :     pimd_stressin(3,1,1)=strten(5)
     129           10 :     pimd_stressin(2,1,1)=strten(6)
     130          250 :     pimd_xred(:,:,1)=xred(:,:)
     131              :     ! Get quantities from previous step
     132           10 :     if(itime==1) then
     133           50 :       pimd_xred_prev(:,:,1)=xred(:,:)
     134            2 :       rprimd_prev(:,:)=rprimd(:,:)
     135              :     else
     136            8 :       ihist_prev = abihist_findIndex(hist,-1)
     137          200 :       pimd_xred_prev(:,:,1)=hist%xred(:,:,ihist_prev)
     138          104 :       rprimd_prev(:,:)=hist%rprimd(:,:,ihist_prev)
     139              :     endif
     140          250 :     pimd_forces(:,:,1)=fcart(:,:)
     141          250 :     pimd_vel(:,:,1)=vel(:,:)
     142              : 
     143              :     ! Compute next values
     144           10 :     if(pimd_param%optcell==0) then
     145              :       call pimd_langevin_nvt(pimd_etotal,pimd_forces,itime,ab_mover%natom,pimd_param,&
     146            5 :       & 0,rprimd,pimd_stressin,1,pimd_vel,pimd_vel_next,ucvol,pimd_xred,pimd_xred_next,pimd_xred_prev)
     147            5 :       rprimd_next=rprimd ! We do not change primitive vectors
     148            5 :       vel_cell=zero      ! Cell velocities are set to zero
     149            5 :     elseif(pimd_param%optcell==2) then
     150              :       call pimd_langevin_npt(pimd_etotal,pimd_forces,itime,ab_mover%natom,pimd_param,&
     151              :       & 0,rprimd,rprimd_next,rprimd_prev,pimd_stressin,1,pimd_vel,pimd_vel_next,vel_cell,&
     152              :       & vel_cell_next,ucvol,&
     153            5 :       & pimd_xred,pimd_xred_next,pimd_xred_prev)
     154              :     endif
     155              : 
     156              :     ! Update hist
     157           10 :     hist%ihist = abihist_findIndex(hist,+1)
     158           10 :     call var2hist(acell,hist,ab_mover%natom,rprimd_next,pimd_xred_next(:,:,1),zDEBUG)
     159          250 :     hist%vel(:,:,hist%ihist)=pimd_vel(:,:,1)
     160          130 :     hist%vel_cell(:,:,hist%ihist)=vel_cell(:,:)
     161           10 :     hist%time(hist%ihist)=real(itime,kind=dp)*ab_mover%dtion
     162              : 
     163           10 :   end subroutine pred_langevin_pimd
     164              :   !!***
     165              : 
     166              : end module m_pred_langevin_pimd
     167              : !!***
        

Generated by: LCOV version 2.3-1