LCOV - code coverage report
Current view: top level - src/45_geomoptim - m_pred_srkna14.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 86.2 % 87 75
Test Date: 2026-09-19 15:24:51 Functions: 100.0 % 1 1

            Line data    Source code
       1              : !!****m* ABINIT/m_pred_srkhna14
       2              : !! NAME
       3              : !!  m_pred_srkna14
       4              : !!
       5              : !! FUNCTION
       6              : !!
       7              : !! COPYRIGHT
       8              : !!  Copyright (C) 1998-2026 ABINIT group (DCA, XG, GMR, JCC, SE)
       9              : !!  This file is distributed under the terms of the
      10              : !!  GNU General Public License, see ~abinit/COPYING
      11              : !!  or http://www.gnu.org/copyleft/gpl.txt .
      12              : !!
      13              : !! SOURCE
      14              : 
      15              : #if defined HAVE_CONFIG_H
      16              : #include "config.h"
      17              : #endif
      18              : 
      19              : #include "abi_common.h"
      20              : 
      21              : module m_pred_srkhna14
      22              : 
      23              :  use defs_basis
      24              :  use m_abicore
      25              :  use m_abimover
      26              :  use m_abihist
      27              : 
      28              :  use m_geometry,    only : xcart2xred, xred2xcart, metric
      29              : 
      30              :  implicit none
      31              : 
      32              :  private
      33              : !!***
      34              : 
      35              :  public :: pred_srkna14
      36              : !!***
      37              : 
      38              : contains
      39              : !!***
      40              : 
      41              : !!****f* ABINIT/pred_srkna14
      42              : !! NAME
      43              : !! pred_srkna14
      44              : !!
      45              : !! FUNCTION
      46              : !! Ionmov predictors (14) Srkna14 molecular dynamics
      47              : !!
      48              : !! IONMOV 14:
      49              : !! Simple molecular dynamics with a symplectic algorithm proposed
      50              : !! by S.Blanes and P.C.Moans, called SRKNa14 in Practical symplectic partitioned
      51              : !! Runge--Kutta and Runge--Kutta--Nystrom methods, Journal of Computational
      52              : !! and Applied Mathematics archive, volume 142,  issue 2  (May 2002), pages 313 - 330 [[cite:Blanes2002]].
      53              : !! of the kind first published by H. Yoshida, Construction of higher order symplectic
      54              : !! integrators, Physics Letters A, volume 150, number 5 to 7, pages 262 - 268 [[cite:Yoshida1990]]
      55              : !! This algorithm requires at least 14 evaluation of the forces (actually 15 are done
      56              : !! within Abinit) per time step. At this cost it usually gives much better
      57              : !! energy conservation than the verlet algorithm (ionmov 6) for a 30 times bigger
      58              : !! value of <a href="varrlx.html#dtion">dtion</a>. Notice that the potential
      59              : !! energy of the initial atomic configuration is never evaluated using this
      60              : !! algorithm.
      61              : !!
      62              : !! INPUTS
      63              : !! ab_mover <type(abimover)> : Datatype with all the information needed by the preditor
      64              : !! itime  : Index of the present iteration
      65              : !! ntime  : Maximal number of iterations
      66              : !! icycle : Index of the present cycle
      67              : !! zDEBUG : if true print some debugging information
      68              : !!
      69              : !! SIDE EFFECTS
      70              : !! hist <type(abihist)> : History of positions,forces acell, rprimd, stresses
      71              : !!
      72              : !! SOURCE
      73              : 
      74           16 : subroutine pred_srkna14(ab_mover,hist,icycle,zDEBUG,iexit,skipcycle)
      75              : 
      76              : !Arguments ------------------------------------
      77              : !scalars
      78              :  type(abimover),intent(in)       :: ab_mover
      79              :  type(abihist),intent(inout) :: hist
      80              :  integer,intent(in)    :: icycle
      81              :  integer,intent(in)    :: iexit
      82              :  logical,intent(in)    :: zDEBUG
      83              :  logical,intent(out)   :: skipcycle
      84              : 
      85              : !Local variables-------------------------------
      86              : !scalars
      87              :  integer  :: ihist_prev,ii,jj,kk
      88              :  real(dp) :: ucvol,ucvol_next
      89              :  real(dp),parameter :: v2tol=tol8
      90              :  real(dp) :: etotal
      91              :  logical  :: jump_end_of_cycle=.FALSE.
      92              : ! character(len=5000) :: message
      93              : !arrays
      94              :  real(dp),save :: aa(15),bb(15)
      95              :  real(dp) :: acell(3),acell_next(3)
      96              :  real(dp) :: rprimd(3,3),rprimd_next(3,3)
      97              :  real(dp) :: gprimd(3,3),gmet(3,3),rmet(3,3)
      98           32 :  real(dp) :: fcart(3,ab_mover%natom),fcart_m(3,ab_mover%natom)
      99           32 :  real(dp) :: xcart(3,ab_mover%natom)
     100           32 :  real(dp) :: xred(3,ab_mover%natom)
     101            1 :  real(dp) :: vel(3,ab_mover%natom)
     102              :  real(dp) :: strten(6)
     103              : 
     104              : !***************************************************************************
     105              : !Beginning of executable session
     106              : !***************************************************************************
     107              : 
     108           16 :  if(iexit/=0)then
     109              :    return
     110              :  end if
     111              : 
     112           15 :  jump_end_of_cycle=.FALSE.
     113          255 :  fcart_m(:,:)=zero
     114              : 
     115              : !write(std_out,*) 'srkna14 03',jump_end_of_cycle
     116              : !##########################################################
     117              : !### 03. Obtain the present values from the history
     118              : 
     119           15 :  call hist2var(acell,hist,ab_mover%natom,rprimd,xred,zDEBUG)
     120           15 :  call metric(gmet,gprimd,-1,rmet,rprimd,ucvol)
     121              : 
     122           15 :  call xred2xcart(ab_mover%natom,rprimd,xcart,xred)
     123              : 
     124          255 :  fcart(:,:)=hist%fcart(:,:,hist%ihist)
     125          105 :  strten(:) =hist%strten(:,hist%ihist)
     126          255 :  vel(:,:)  =hist%vel(:,:,hist%ihist)
     127           15 :  etotal    =hist%etot(hist%ihist)
     128              : 
     129           15 :  if(zDEBUG)then
     130            0 :    write (std_out,*) 'fcart:'
     131            0 :    do kk=1,ab_mover%natom
     132            0 :      write (std_out,*) fcart(:,kk)
     133              :    end do
     134            0 :    write (std_out,*) 'vel:'
     135            0 :    do kk=1,ab_mover%natom
     136            0 :      write (std_out,*) vel(:,kk)
     137              :    end do
     138            0 :    write (std_out,*) 'strten:'
     139            0 :    write (std_out,*) strten(1:3),ch10,strten(4:6)
     140            0 :    write (std_out,*) 'etotal:'
     141            0 :    write (std_out,*) etotal
     142              :  end if
     143              : 
     144           15 :  write(std_out,*) 'RMET'
     145           60 :  do ii=1,3
     146           60 :    write(std_out,*) rmet(ii,:)
     147              :  end do
     148              : 
     149              : !write(std_out,*) 'srkna14 04',jump_end_of_cycle
     150              : !##########################################################
     151              : !### 04. Compute the next values (Only for the first cycle)
     152              : 
     153           15 :  if (icycle==1) then
     154              : 
     155            1 :    if(zDEBUG) then
     156            0 :      write(std_out,*) 'Entering only for first cycle'
     157              :    end if
     158              : 
     159            1 :    aa(1) =  0.0378593198406116_dp;
     160            1 :    aa(2) =  0.102635633102435_dp;
     161            1 :    aa(3) = -0.0258678882665587_dp;
     162            1 :    aa(4) =  0.314241403071447_dp;
     163            1 :    aa(5) = -0.130144459517415_dp;
     164            1 :    aa(6) =  0.106417700369543_dp;
     165            1 :    aa(7) = -0.00879424312851058_dp;
     166              :    aa(8) =  1._dp -&
     167            1 : &   2._dp*(aa(1)+aa(2)+aa(3)+aa(4)+aa(5)+aa(6)+aa(7));
     168            1 :    aa(9) =  aa(7);
     169            1 :    aa(10)=  aa(6);
     170            1 :    aa(11)=  aa(5);
     171            1 :    aa(12)=  aa(4);
     172            1 :    aa(13)=  aa(3);
     173            1 :    aa(14)=  aa(2);
     174            1 :    aa(15)=  aa(1);
     175              : 
     176            1 :    bb(1) =  0.0_dp
     177            1 :    bb(2) =  0.09171915262446165_dp;
     178            1 :    bb(3) =  0.183983170005006_dp;
     179            1 :    bb(4) = -0.05653436583288827_dp;
     180            1 :    bb(5) =  0.004914688774712854_dp;
     181            1 :    bb(6) =  0.143761127168358_dp;
     182            1 :    bb(7) =  0.328567693746804_dp;
     183            1 :    bb(8) =  0.5_dp - (bb(1)+bb(2)+bb(3)+bb(4)+bb(5)+bb(6)+bb(7));
     184            1 :    bb(9) =  0.5_dp - (bb(1)+bb(2)+bb(3)+bb(4)+bb(5)+bb(6)+bb(7));
     185            1 :    bb(10)=  bb(7);
     186            1 :    bb(11)=  bb(6);
     187            1 :    bb(12)=  bb(5);
     188            1 :    bb(13)=  bb(4);
     189            1 :    bb(14)=  bb(3);
     190            1 :    bb(15)=  bb(2);
     191              : 
     192              :    acell_next(:)=acell(:)
     193            1 :    ucvol_next=ucvol
     194              :    rprimd_next(:,:)=rprimd(:,:)
     195              : 
     196              : !  step 1 of 15
     197              : 
     198              : !  Convert input xred (reduced coordinates) to xcart (cartesian)
     199            1 :    call xred2xcart(ab_mover%natom,rprimd,xcart,xred)
     200              : 
     201           17 :    vel(:,:) = vel(:,:) + bb(1) * ab_mover%dtion * fcart_m(:,:)
     202              : 
     203            4 :    do ii=1,3
     204           16 :      do jj=1,ab_mover%natom
     205           12 :        write(std_out,*) xcart(ii,jj), ab_mover%dtion, aa(1), vel(ii,jj)
     206           12 :        xcart(ii,jj) = xcart(ii,jj) + ab_mover%dtion * aa(1) * vel(ii,jj)
     207           15 :        write(std_out,*) xcart(ii,jj)
     208              :      end do
     209              :    end do
     210              : 
     211              : !  xcart(:,:) = xcart(:,:) + ab_mover%dtion * aa(1) * vel(:,:);
     212              : 
     213              : !  Convert back to xred (reduced coordinates)
     214            1 :    call xcart2xred(ab_mover%natom,rprimd,xcart,xred)
     215              : 
     216              :  end if ! if (icycle==1)
     217              : 
     218              : !write(std_out,*) 'srkna14 05',jump_end_of_cycle
     219              : !##########################################################
     220              : !### 05. Compute the next values (Only for extra cycles)
     221              : 
     222           15 :  if (icycle>1) then
     223              : 
     224           70 :    do ii=1,ab_mover%natom
     225          238 :      do jj=1,3
     226          224 :        fcart_m(jj,ii) = fcart(jj,ii)/ab_mover%amass(ii)
     227              :      end do
     228              :    end do
     229              : 
     230           14 :    if (icycle<16)then
     231              : 
     232              : !    Update of velocities and positions
     233          238 :      vel(:,:) = vel(:,:) + bb(icycle) * ab_mover%dtion * fcart_m(:,:)
     234              :      xcart(:,:) = xcart(:,:) +&
     235          238 : &     aa(icycle) * ab_mover%dtion * vel(:,:)
     236              : !    Convert xcart_next to xred_next (reduced coordinates)
     237              : !    for scfcv
     238              :      call xcart2xred(ab_mover%natom, rprimd, xcart,&
     239           14 : &     xred)
     240              : 
     241              :    end if ! (ii<16)
     242              : 
     243              :  end if ! if (icycle>1)
     244              : 
     245              : !write(std_out,*) 'srkna14 06',jump_end_of_cycle
     246              : !##########################################################
     247              : !### 06. Compute the next values (Only for the last cycle)
     248              : 
     249           15 :  if(jump_end_of_cycle)then
     250            0 :    skipcycle=.TRUE.
     251              :  else
     252           15 :    skipcycle=.FALSE.
     253              :  end if
     254              : 
     255              : !write(std_out,*) 'srkna14 07',jump_end_of_cycle
     256              : !##########################################################
     257              : !### 07. Update the history with the prediction
     258              : 
     259              : !Increase indexes
     260           15 :  hist%ihist = abihist_findIndex(hist,+1)
     261              : 
     262              : !Fill the history with the variables
     263              : !xred, acell, rprimd, vel
     264           15 :  call var2hist(acell,hist,ab_mover%natom,rprimd,xred,zDEBUG)
     265          255 :  hist%vel(:,:,hist%ihist)=vel(:,:)
     266           15 :  ihist_prev = abihist_findIndex(hist,-1)
     267           15 :  hist%time(hist%ihist)=hist%time(ihist_prev)+ab_mover%dtion
     268              : 
     269              : end subroutine pred_srkna14
     270              : !!***
     271              : 
     272              : end module m_pred_srkhna14
     273              : !!***
        

Generated by: LCOV version 2.3-1