LCOV - code coverage report
Current view: top level - src/78_effpot - m_scup_dataset.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 46.3 % 259 120
Test Date: 2026-09-21 19:39:32 Functions: 37.5 % 8 3

            Line data    Source code
       1              : !!****m* ABINIT/m_scup_dataset
       2              : !! NAME
       3              : !!  m_scup_dataset
       4              : !!
       5              : !! FUNCTION
       6              : !!  module with the type of the input variables for scale_up
       7              : !!  when initialized this is a subtype of multibinit_dtset_type
       8              : !!
       9              : !! COPYRIGHT
      10              : !!  Copyright (C) 2014-2026 ABINIT group (AM)
      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_scup_dataset
      24              : 
      25              :  use defs_basis
      26              :  use m_abicore
      27              :  use m_errors
      28              :  use m_bz_mesh
      29              : 
      30              :  use m_parser, only : intagm
      31              :  use m_matrix, only : matr3inv
      32              : 
      33              :  implicit none
      34              : 
      35              :  private
      36              : 
      37              :  public :: scup_dtset_type
      38              :  public :: scup_dtset_init
      39              :  public :: scup_dtset_free
      40              :  public :: outvars_scup
      41              :  public :: invars10scup
      42              :  public :: scup_kpath_new
      43              :  public :: scup_kpath_print
      44              : !!***
      45              : 
      46              : !!****t* m_scup_dataset/scup_dtset_type
      47              : !! NAME
      48              : !! scup_dtset_type
      49              : !!
      50              : !! FUNCTION
      51              : !! The scup_dtset_type structured datatype
      52              : !! gathers all input variables and options for the SCALE UP part
      53              : !! that is linked with multibinit
      54              : !!
      55              : !! SOURCE
      56              : 
      57              :  type scup_dtset_type
      58              : 
      59              : !Integer
      60              :  integer :: scup_nspeck
      61              :  integer :: scup_ndivsm
      62              :  integer :: scup_printniter
      63              :  integer :: scup_startpulay
      64              :  integer :: scup_maxscfstep
      65              : !Logicals
      66              :  logical :: scup_elec_model
      67              :  logical :: scup_initorbocc
      68              :  logical :: scup_ismagnetic
      69              :  logical :: scup_istddft
      70              :  logical :: scup_printbands
      71              :  logical :: scup_printeigv
      72              :  logical :: scup_printeltic
      73              :  logical :: scup_printgeom
      74              :  logical :: scup_printorbocc
      75              :  logical(1) :: scup_freezden
      76              : !Real
      77              :  real*8   :: scup_tcharge
      78              :  real*8   :: scup_scfmixing
      79              :  real*8   :: scup_scfthresh
      80              :  real*8   :: scup_smearing
      81              : !Integer Array
      82              :  integer :: scup_ksamp(3)
      83              : 
      84              : !Real Array
      85              :  real(dp),allocatable :: scup_speck(:,:)
      86              : 
      87              : !Kpath Type
      88              :  type(kpath_t) :: scup_kpath
      89              : 
      90              :  end type scup_dtset_type
      91              : !!***
      92              : CONTAINS
      93              : 
      94              : !!****f* m_scup_dataset/scup_dtset_init
      95              : !!
      96              : !! NAME
      97              : !! scup_dtset_init
      98              : !!
      99              : !! FUNCTION
     100              : !! Init the scup_dtset type
     101              : !!
     102              : !! INPUTS
     103              : !!
     104              : !!
     105              : !! OUTPUT
     106              : !! scup_dtset <type(scup_dtset_type)> = datatype with all the input variables
     107              : !!
     108              : !! NOTES
     109              : !! Should be executed by one processor only.
     110              : !!
     111              : !! SOURCE
     112              : 
     113           73 : subroutine scup_dtset_init(scup_dtset)
     114              : 
     115              : 
     116              : !Arguments -------------------------------
     117              :  class(scup_dtset_type),intent(inout) :: scup_dtset
     118              : !-----------------------------------------
     119              : 
     120           73 : scup_dtset%scup_ndivsm      =  0
     121           73 : scup_dtset%scup_nspeck      =  0
     122           73 : scup_dtset%scup_elec_model  = .FALSE.
     123          292 : scup_dtset%scup_ksamp       =  (/ 1, 1, 1 /)
     124           73 : scup_dtset%scup_tcharge     =  0
     125           73 : scup_dtset%scup_initorbocc  = .FALSE.
     126           73 : scup_dtset%scup_ismagnetic  = .FALSE.
     127           73 : scup_dtset%scup_istddft     = .FALSE.
     128           73 : scup_dtset%scup_printbands  = .FALSE.
     129           73 : scup_dtset%scup_printeigv   = .FALSE.
     130           73 : scup_dtset%scup_printeltic  = .FALSE.
     131           73 : scup_dtset%scup_printgeom   = .FALSE.
     132           73 : scup_dtset%scup_printniter  =  0
     133           73 : scup_dtset%scup_printorbocc = .FALSE.
     134           73 : scup_dtset%scup_freezden    = .FALSE.
     135           73 : scup_dtset%scup_scfmixing   =  0.3
     136           73 : scup_dtset%scup_scfthresh   =  tol6
     137           73 : scup_dtset%scup_smearing    =  0.00091873313 ! Room Temperature in Hartree
     138           73 : scup_dtset%scup_startpulay  =  3
     139           73 : scup_dtset%scup_maxscfstep  =  100
     140              : 
     141           73 : end subroutine  scup_dtset_init
     142              : !!***
     143              : 
     144              : !!****f* m_scup_dataset/scup_dtset_free
     145              : !!
     146              : !! NAME
     147              : !!  scup_dtset_free
     148              : !!
     149              : !! FUNCTION
     150              : !!  deallocate remaining arrays in the scup_dtset datastructure
     151              : !!
     152              : !! INPUTS
     153              : !!  scup_dtset <type(scup_dtset_type)> = scup_dataset structure
     154              : !!
     155              : !! OUTPUTS
     156              : !!  scup_dtset <type(scup_dtset_type)> = scup_dataset structure
     157              : !!
     158              : !! SOURCE
     159              : 
     160           73 : subroutine scup_dtset_free(scup_dtset)
     161              : 
     162              : !Arguments ------------------------------------
     163              :  class(scup_dtset_type), intent(inout) :: scup_dtset
     164              : 
     165              : ! *************************************************************************
     166              : 
     167           73 :  ABI_SFREE(scup_dtset%scup_speck)
     168              : 
     169           73 : call scup_dtset%scup_kpath%free
     170              : 
     171              : 
     172           73 : end subroutine scup_dtset_free
     173              : !!***
     174              : 
     175              : !!****f* m_scup_dataset/outvars_scup
     176              : !!
     177              : !! NAME
     178              : !! outvars_scup
     179              : !!
     180              : !! FUNCTION
     181              : !! Takes as an input the input dtset for scup and echoes it to
     182              : !! the output
     183              : !!
     184              : !! INPUTS
     185              : !! multibinit_dtset <type(multibinit_dtset_type)> datatype with all the input variables
     186              : !! nunit=unit number for input or output
     187              : !!
     188              : !! OUTPUT
     189              : !!  (only writing)
     190              : !!
     191              : !! NOTES
     192              : !! Should be executed by one processor only.
     193              : !!
     194              : !! SOURCE
     195              : 
     196            0 : subroutine outvars_scup(scup_dtset,nunit)
     197              : 
     198              : !Arguments -------------------------------
     199              : !scalars
     200              :  integer,intent(in) :: nunit
     201              :  class(scup_dtset_type),intent(in) :: scup_dtset
     202              : 
     203              : !Local variables -------------------------
     204              : !Set routine version number here:
     205              : !scalars
     206              : !integers for printing
     207              :  integer :: int_inorb=0,int_mgn=0,int_tddft=0,int_pband=0
     208              :  integer :: int_peigv=0,int_peltic=0,int_pgeom=0,int_porbocc=0
     209              :  integer :: int_freezden=0
     210              : !Character for defining format string
     211              : !*********************************************************************
     212              : 
     213              :    !Check if logicals are true, if yes set integers to one for printing
     214            0 :    if(scup_dtset%scup_initorbocc)   int_inorb    =1
     215            0 :    if(scup_dtset%scup_ismagnetic)   int_mgn      =1
     216            0 :    if(scup_dtset%scup_istddft)      int_tddft    =1
     217            0 :    if(scup_dtset%scup_printbands)   int_pband    =1
     218            0 :    if(scup_dtset%scup_printeigv)    int_peigv    =1
     219            0 :    if(scup_dtset%scup_printeltic)   int_peltic   =1
     220            0 :    if(scup_dtset%scup_printgeom)    int_pgeom    =1
     221            0 :    if(scup_dtset%scup_printorbocc)  int_porbocc  =1
     222            0 :    if(scup_dtset%scup_freezden)     int_freezden =1
     223              : 
     224              :    !Print
     225            0 :    write(nunit,'(a)')'Variables for SCALE-UP electronic model :'
     226            0 :    write(nunit,'(1x,a16,3I3)')    '      scup_ksamp',scup_dtset%scup_ksamp
     227            0 :    write(nunit,'(1x,a16,F7.3)')   '    scup_tcharge',scup_dtset%scup_tcharge
     228            0 :    write(nunit,'(1x,a16,I3)')     ' scup_initorbocc',int_inorb
     229            0 :    write(nunit,'(1x,a16,I3)')     ' scup_ismagnetic',int_mgn
     230            0 :    write(nunit,'(1x,a16,I3)')     '    scup_istddft',int_tddft
     231            0 :    write(nunit,'(1x,a16,I3)')     ' scup_printbands',int_pband
     232            0 :    write(nunit,'(1x,a16,I3)')     '  scup_printeigv',int_peigv
     233            0 :    write(nunit,'(1x,a16,I3)')     ' scup_printeltic',int_peltic
     234            0 :    write(nunit,'(1x,a16,I3)')     '  scup_printgeom',int_pgeom
     235            0 :    write(nunit,'(1x,a16,I3)')     ' scup_printniter',scup_dtset%scup_printniter
     236            0 :    write(nunit,'(1x,a16,I3)')     'scup_printorbocc',int_porbocc
     237            0 :    write(nunit,'(1x,a16,I3)')     '   scup_freezden',int_freezden
     238            0 :    write(nunit,'(1x,a16,I3)')     '     scup_nspeck',scup_dtset%scup_nspeck
     239            0 :    write(nunit,'(1x,a16,I3)')     '     scup_ndivsm',scup_dtset%scup_ndivsm
     240            0 :    write(nunit,'(1x,a16,F7.3)')   '  scup_scfmixing',scup_dtset%scup_scfmixing
     241            0 :    write(nunit,'(1x,a16,ES10.2)') '  scup_scfthresh',scup_dtset%scup_scfthresh
     242            0 :    write(nunit,'(1x,a16,ES10.2)') '   scup_smearing',scup_dtset%scup_smearing
     243            0 :    write(nunit,'(1x,a16,I3)')     ' scup_startpulay',scup_dtset%scup_startpulay
     244            0 :    write(nunit,'(1x,a16,I3)')     ' scup_maxscfstep',scup_dtset%scup_maxscfstep
     245              : 
     246              : 
     247            0 : end subroutine outvars_scup
     248              : !!***
     249              : 
     250              : !!****f* m_scup_dataset/invars10scup
     251              : !!
     252              : !! NAME
     253              : !! invars10scup
     254              : !!
     255              : !! FUNCTION
     256              : !! Open input file for the multibinit code, then reads or echoes the input information
     257              : !! for SCALE UP part that is linked with multibinit.
     258              : !!
     259              : !! INPUTS
     260              : !! lenstr=actual length of string
     261              : !! natom=number of atoms, needed for atifc
     262              : !! string*(*)=string of characters containing all input variables and data
     263              : !!
     264              : !! OUTPUT
     265              : !! scup_dtset <type(scup_dtset_type)> = datatype with all the input variables
     266              : !!
     267              : !! NOTES
     268              : !! Should be executed by one processor only.
     269              : !!
     270              : !! SOURCE
     271              : 
     272           73 : subroutine invars10scup(scup_dtset,lenstr,string)
     273              : 
     274              : !Arguments -------------------------------
     275              : !scalars
     276              :  integer,intent(in) :: lenstr
     277              :  character(len=*),intent(in) :: string
     278              :  class(scup_dtset_type),intent(inout) :: scup_dtset
     279              : 
     280              : !Local variables -------------------------
     281              : !Dummy arguments for subroutine 'intagm' to parse input file
     282              : !Set routine version number here:
     283              : !scalars
     284              :  integer :: ii,jdtset,marr,tread
     285              :  character(len=500) :: message
     286              : !arrays
     287           73 :  integer,allocatable :: intarr(:)
     288           73 :  real(dp),allocatable :: dprarr(:)
     289              :  !tmp integer to transfer to logicals
     290              :  integer :: tmp_int
     291              : 
     292              : !*********************************************************************
     293              : 
     294           73 :  marr=30
     295           73 :  ABI_MALLOC(intarr,(marr))
     296           73 :  ABI_MALLOC(dprarr,(marr))
     297              : 
     298           73 :  jdtset=1
     299              : 
     300              : !=====================================================================
     301              : ! Initialize Dataset with default values
     302              : !=====================================================================
     303              : 
     304           73 : call scup_dtset_init(scup_dtset)
     305           73 : tmp_int=0
     306              : 
     307              : !=====================================================================
     308              : !start reading in dimensions and non-dependent variables
     309              : !=====================================================================
     310              : 
     311              : !A
     312              : !B
     313              : !C
     314              : !D
     315              : !E
     316           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_elec_model',tread,'INT')
     317           73 :  if(tread==1) tmp_int=intarr(1)
     318           73 :  if(tmp_int<0 .or. tmp_int>1 )then
     319              :    write(message, '(a,I3,a,a,a,a,a)' )&
     320            0 : &   'scup_elec_model is',tmp_int,', but the only allowed values',ch10,&
     321            0 : &   'are 0 and 1.',ch10,&
     322            0 : &   'Action: correct scup_elec_model in your input file.'
     323            0 :    ABI_ERROR(message)
     324              :  end if
     325           73 :  if(tmp_int == 1) scup_dtset%scup_elec_model = .TRUE.
     326           73 :  tmp_int = 0
     327              : 
     328              : !F
     329           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_freezden',tread,'INT')
     330           73 :  if(tread==1) tmp_int=intarr(1)
     331           73 :  if(tmp_int<0 .or. tmp_int>1 )then
     332              :    write(message, '(a,I3,a,a,a,a,a)' )&
     333            0 : &   'scup_freezden is',tmp_int,', but the only allowed values',ch10,&
     334            0 : &   'are 0 and 1.',ch10,&
     335            0 : &   'Action: correct scup_freezden in your input file.'
     336            0 :    ABI_ERROR(message)
     337              :  end if
     338           73 :  if(tmp_int == 1) scup_dtset%scup_freezden = .TRUE.
     339           73 :  tmp_int = 0
     340              : 
     341              :  !G
     342              : !H
     343              : !I
     344           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_initorbocc',tread,'INT')
     345           73 :  if(tread==1) tmp_int=intarr(1)
     346           73 :  if(tmp_int<0 .or. tmp_int>1 )then
     347              :    write(message, '(a,I3,a,a,a,a,a)' )&
     348            0 : &   'scup_initorbocc is',tmp_int,', but the only allowed values',ch10,&
     349            0 : &   'are 0 and 1.',ch10,&
     350            0 : &   'Action: correct scup_initorbocc in your input file.'
     351            0 :    ABI_ERROR(message)
     352              :  end if
     353           73 :  if(tmp_int == 1) scup_dtset%scup_initorbocc = .TRUE.
     354           73 :  tmp_int = 0
     355              : 
     356           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_ismagnetic',tread,'INT')
     357           73 :  if(tread==1) tmp_int=intarr(1)
     358           73 :  if(tmp_int<0 .or. tmp_int>1 )then
     359              :    write(message, '(a,I3,a,a,a,a,a)' )&
     360            0 : &   'scup_ismagnetic is',tmp_int,', but the only allowed values',ch10,&
     361            0 : &   'are 0 and 1.',ch10,&
     362            0 : &   'Action: correct scup_ismagnetic in your input file.'
     363            0 :    ABI_ERROR(message)
     364              :  end if
     365           73 :  if(tmp_int == 1) scup_dtset%scup_ismagnetic = .TRUE.
     366           73 :  tmp_int = 0
     367              : 
     368           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_istddft',tread,'INT')
     369           73 :  if(tread==1) tmp_int=intarr(1)
     370           73 :  if(tmp_int<0 .or. tmp_int>1 )then
     371              :    write(message, '(a,I3,a,a,a,a,a)' )&
     372            0 : &   'scup_istddft is',tmp_int,', but the only allowed values',ch10,&
     373            0 : &   'are 0 and 1.',ch10,&
     374            0 : &   'Action: correct scup_istddft in your input file.'
     375            0 :    ABI_ERROR(message)
     376              :  end if
     377           73 :  if(tmp_int == 1) scup_dtset%scup_istddft = .TRUE.
     378           73 :  tmp_int = 0
     379              : 
     380              : 
     381              : !J
     382              : !K
     383           73 :  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'scup_ksamp',tread,'INT')
     384           73 :  if(tread==1) scup_dtset%scup_ksamp(1:3)=intarr(1:3)
     385          292 :  do ii=1,3
     386          292 :    if(scup_dtset%scup_ksamp(ii)<1)then
     387              :      write(message, '(a,i0,a,i0,a,a,a,i0,a)' )&
     388            0 : &     'scup_ksamp(',ii,') is',scup_dtset%scup_ksamp(ii),', which is lower than 1 .',ch10,&
     389            0 : &     'Action: correct scup_ksamp(',ii,') in your input file.'
     390            0 :      ABI_ERROR(message)
     391              :    end if
     392              :  end do
     393              : 
     394              : !L
     395              : !M
     396           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_maxscfstep',tread,'INT')
     397           73 :  if(tread==1) scup_dtset%scup_maxscfstep=intarr(1)
     398           73 :  if(scup_dtset%scup_maxscfstep<=0)then
     399              :    write(message, '(a,I3,a,a,a,a,a)' )&
     400            0 : &   'scup_maxscfstep is',scup_dtset%scup_maxscfstep,', but the only allowed values',ch10,&
     401            0 : &   'greater than 0',ch10,&
     402            0 : &   'Action: correct scup_maxscfstep in your input file.'
     403            0 :    ABI_ERROR(message)
     404              :  end if
     405              : 
     406              : !N
     407              : 
     408           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_ndivsm',tread,'INT')
     409           73 :  if(tread==1) scup_dtset%scup_ndivsm=intarr(1)
     410           73 :  if(scup_dtset%scup_ndivsm<0 )then
     411              :    write(message, '(a,I3,a,a,a,a,a)' )&
     412            0 :    'scup_ndivsm is',scup_dtset%scup_ndivsm,', but the only allowed values',ch10,&
     413            0 :    'are positive.',ch10,&
     414            0 :    'Action: correct scup_ndivsm in your input file.'
     415            0 :    ABI_ERROR(message)
     416              :  end if
     417              : 
     418              : 
     419           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_nspeck',tread,'INT')
     420           73 :  if(tread==1) scup_dtset%scup_nspeck=intarr(1)
     421           73 :  if(scup_dtset%scup_nspeck<0 )then
     422              :    write(message, '(a,I3,a,a,a,a,a)' )&
     423            0 :    'scup_nspeck is',scup_dtset%scup_nspeck,', but the only allowed values',ch10,&
     424            0 :    'are positive.',ch10,&
     425            0 :    'Action: correct scup_nspeck in your input file.'
     426            0 :    ABI_ERROR(message)
     427              :  end if
     428              : 
     429              : !O
     430              : !P
     431           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_printbands',tread,'INT')
     432           73 :  if(tread==1) tmp_int=intarr(1)
     433           73 :  if(tmp_int<0 .or. tmp_int>1 )then
     434              :    write(message, '(a,I3,a,a,a,a,a)' )&
     435            0 : &   'scup_printbands is',tmp_int,', but the only allowed values',ch10,&
     436            0 : &   'are 0 and 1.',ch10,&
     437            0 : &   'Action: correct scup_printbands in your input file.'
     438            0 :    ABI_ERROR(message)
     439              :  end if
     440           73 :  if(tmp_int == 1) scup_dtset%scup_printbands = .TRUE.
     441           73 :  tmp_int = 0
     442              : 
     443           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_printeigv',tread,'INT')
     444           73 :  if(tread==1) tmp_int=intarr(1)
     445           73 :  if(tmp_int<0 .or. tmp_int>1 )then
     446              :    write(message, '(a,I3,a,a,a,a,a)' )&
     447            0 : &   'scup_printeigv is',tmp_int,', but the only allowed values',ch10,&
     448            0 : &   'are 0 and 1.',ch10,&
     449            0 : &   'Action: correct scup_printeigv in your input file.'
     450            0 :    ABI_ERROR(message)
     451              :  end if
     452           73 :  if(tmp_int == 1) scup_dtset%scup_printeigv = .TRUE.
     453           73 :  tmp_int = 0
     454              : 
     455           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_printeltic',tread,'INT')
     456           73 :  if(tread==1) tmp_int=intarr(1)
     457           73 :  if(tmp_int<0 .or. tmp_int>1 )then
     458              :    write(message, '(a,I3,a,a,a,a,a)' )&
     459            0 : &   'scup_printeltic is',tmp_int,', but the only allowed values',ch10,&
     460            0 : &   'are 0 and 1.',ch10,&
     461            0 : &   'Action: correct scup_printeltic in your input file.'
     462            0 :    ABI_ERROR(message)
     463              :  end if
     464           73 :  if(tmp_int == 1) scup_dtset%scup_printeltic = .TRUE.
     465           73 :  tmp_int = 0
     466              : 
     467           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_printgeom',tread,'INT')
     468           73 :  if(tread==1) tmp_int=intarr(1)
     469           73 :  if(tmp_int<0 .or. tmp_int>1 )then
     470              :    write(message, '(a,I3,a,a,a,a,a)' )&
     471            0 :    'scup_printgeom is',tmp_int,', but the only allowed values',ch10,&
     472            0 :    'are 0 and 1.',ch10,&
     473            0 :    'Action: correct scup_printgeom in your input file.'
     474            0 :    ABI_ERROR(message)
     475              :  end if
     476           73 :  if(tmp_int == 1) scup_dtset%scup_printgeom = .TRUE.
     477           73 :  tmp_int = 0
     478              : 
     479           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_printniter',tread,'INT')
     480           73 :  if(tread==1) scup_dtset%scup_printniter=intarr(1)
     481           73 :  if(scup_dtset%scup_printniter<0 )then
     482              :    write(message, '(a,I3,a,a,a,a,a)' )&
     483            0 :    'scup_printniter is',scup_dtset%scup_printniter,', but the only allowed values',ch10,&
     484            0 :    'are positive',ch10,&
     485            0 :    'Action: correct scup_printniter in your input file.'
     486            0 :    ABI_ERROR(message)
     487              :  end if
     488              : 
     489           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_printorbocc',tread,'INT')
     490           73 :  if(tread==1) tmp_int=intarr(1)
     491           73 :  if(tmp_int<0 .or. tmp_int>1 )then
     492              :    write(message, '(a,I3,a,a,a,a,a)' )&
     493            0 :    'scup_printorbocc is',tmp_int,', but the only allowed values',ch10,&
     494            0 :    'are 0 and 1.',ch10,&
     495            0 :    'Action: correct scup_printorbocc in your input file.'
     496            0 :    ABI_ERROR(message)
     497              :  end if
     498           73 :  if(tmp_int == 1) scup_dtset%scup_printorbocc = .TRUE.
     499           73 :  tmp_int = 0
     500              : 
     501              : !Q
     502              : !R
     503              : !S
     504              : 
     505           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_startpulay',tread,'INT')
     506           73 :  if(tread==1) scup_dtset%scup_startpulay=intarr(1)
     507           73 :  if(scup_dtset%scup_startpulay<3)then
     508              :    write(message, '(a,I3,a,a,a,a,a)' )&
     509            0 : &   'scup_startpulay is',scup_dtset%scup_startpulay,', but the only allowed values',ch10,&
     510            0 : &   'are greater than 3',ch10,&
     511            0 : &   'Action: correct scup_startpulay in your input file.'
     512            0 :    ABI_ERROR(message)
     513              :  end if
     514              : 
     515           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_scfmixing',tread,'DPR')
     516           73 :  if(tread==1) scup_dtset%scup_scfmixing=dprarr(1)
     517           73 :  if(scup_dtset%scup_scfmixing<0)then
     518              :    write(message, '(a,f10.2,a,a,a,a,a)' )&
     519            0 : &   'scup_scfmixing is',scup_dtset%scup_scfmixing,', but the only allowed value',ch10,&
     520            0 : &   'is superior to 0.',ch10,&
     521            0 : &   'Action: correct scup_scfmixing in your input file.'
     522            0 :    ABI_ERROR(message)
     523              :  end if
     524              : 
     525           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_scfthresh',tread,'DPR')
     526           73 :  if(tread==1) scup_dtset%scup_scfthresh=dprarr(1)
     527           73 :  if(scup_dtset%scup_scfthresh <= 0)then
     528              :    write(message, '(a,f10.2,a,a,a,a,a)' )&
     529            0 : &   'scup_scfthresh is',scup_dtset%scup_scfthresh,', but the only allowed value',ch10,&
     530            0 : &   'is superior to 0.',ch10,&
     531            0 : &   'Action: correct scup_scfthresh in your input file.'
     532            0 :    ABI_ERROR(message)
     533              :  end if
     534              : 
     535           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_smearing',tread,'DPR')
     536           73 :  if(tread==1) scup_dtset%scup_smearing=dprarr(1)
     537           73 :  if(scup_dtset%scup_smearing < 0)then
     538              :    write(message, '(a,f10.2,a,a,a,a,a)' )&
     539            0 : &   'scup_smearing is',scup_dtset%scup_smearing,', but the only allowed value',ch10,&
     540            0 : &   'is superior to or equal to 0.',ch10,&
     541            0 : &   'Action: correct scup_smearing in your input file.'
     542            0 :    ABI_ERROR(message)
     543              :  end if
     544              : 
     545              : !T
     546           73 :  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'scup_tcharge',tread,'DPR')
     547           73 :  if(tread==1) scup_dtset%scup_tcharge=dprarr(1)
     548           73 :  if(scup_dtset%scup_tcharge<0)then
     549              :    write(message, '(a,f10.2,a,a,a,a,a)' )&
     550            0 : &   'scup_tcharge is',scup_dtset%scup_tcharge,', but the only allowed value',ch10,&
     551            0 : &   'is superior to 0.',ch10,&
     552            0 : &   'Action: correct scup_tcharge in your input file.'
     553            0 :    ABI_ERROR(message)
     554              :  end if
     555              : 
     556              : 
     557              : !U
     558              : !V
     559              : !W
     560              : !X
     561              : !Y
     562              : !Z
     563              : 
     564              : !=====================================================================
     565              : !start reading dimension dependent variables
     566              : !=====================================================================
     567              : 
     568              : 
     569              : !A
     570              : !B
     571              : !C
     572              : !D
     573              : !E
     574              : !F
     575              : !G
     576              : !H
     577              : !I
     578              : !J
     579              : !K
     580              : !L
     581              : !M
     582              : !N
     583              : !O
     584              : !P
     585              : !Q
     586              : !R
     587              : !S
     588              :    !Allocate
     589           73 :    if(scup_dtset%scup_printbands)then
     590            0 :      ABI_MALLOC(scup_dtset%scup_speck,(3,scup_dtset%scup_nspeck))
     591              : 
     592            0 :    call intagm(dprarr,intarr,jdtset,marr,3*scup_dtset%scup_nspeck,string(1:lenstr),'scup_speck',tread,'DPR')
     593            0 :      if(tread==1)then
     594            0 :        scup_dtset%scup_speck(:,:)=reshape( dprarr(1:3*scup_dtset%scup_nspeck), [3,scup_dtset%scup_nspeck])
     595              :      else
     596              :        write(message,'(5a)') &
     597            0 : &       'When scup_printbands is asked, scup_speck must be initialized ',ch10,&
     598            0 : &       'in the input file, which is not the case.',ch10,&
     599            0 : &       'Action: initialize scup_speck in your input file, or change printbands.'
     600            0 :        ABI_ERROR(message)
     601              :      end if
     602              :    end if
     603              : 
     604              : 
     605              : !T
     606              : !U
     607              : !V
     608              : !W
     609              : !X
     610              : !Y
     611              : !Z
     612              : 
     613              : !=======================================================================
     614              : !Finished reading in variables - deallocate
     615              : !=======================================================================
     616              : 
     617           73 :  ABI_FREE(dprarr)
     618           73 :  ABI_FREE(intarr)
     619              : 
     620           73 : end subroutine invars10scup
     621              : !!***
     622              : 
     623              : !!****f* m_scup_dataset/scup_kpath_new
     624              : !!
     625              : !! NAME
     626              : !! scup_kpath_init
     627              : !!
     628              : !! FUNCTION
     629              : !! Initialize the kpath and all other variables SCALE UP needs to plot electronic bands
     630              : !! along kpath
     631              : !!
     632              : !! INPUTS
     633              : !! speck = array with special k-points along the path
     634              : !! gprimd = reciprocal lattice vectors of cell
     635              : !! ndivsm = number of divisions for smallest segment
     636              : !!
     637              : !! OUTPUT
     638              : !! scup_kpath <type(kpath_t)> = kpath_t with all information about kpath
     639              : !!
     640              : !! NOTES
     641              : !! Should be executed by one processor only.
     642              : !!
     643              : !!  m_bz_mesh/kpath_new
     644              : !!
     645              : !! SOURCE
     646              : 
     647            0 : subroutine scup_kpath_new(speck,rprimd,ndivsm,scup_kpath)
     648              : 
     649              : !Arguments -------------------------------
     650              : !scalars
     651              :  integer,intent(in) :: ndivsm
     652              : 
     653              : !arrays
     654              :  real(dp),intent(in) :: speck(:,:),rprimd(3,3)
     655              :  type(kpath_t), intent(out) :: scup_kpath
     656              : 
     657              : !Local variables -------------------------
     658              : !Dummy arguments for subroutine 'intagm' to parse input file
     659              : !Set routine version number here:
     660              : !scalars
     661              :  integer :: nspeck
     662              : !arrays
     663            0 :  integer,allocatable :: ndivs_tmp(:)
     664              :  real(dp) :: gprimd(3,3)
     665              : 
     666              : !*********************************************************************
     667              : 
     668              : !Get gprimd
     669            0 : call matr3inv(rprimd,gprimd)
     670              : 
     671              : !Create Kpath
     672            0 : call scup_kpath%init(speck,gprimd,ndivsm)
     673              : 
     674              : !Change size of scup_kpath%ndivs(:) variable
     675              : !from nspeck-1 to nspeck and put 1 to first entry
     676            0 : nspeck = size(speck,2)
     677            0 : ABI_MALLOC(ndivs_tmp,(nspeck))
     678              : 
     679              : !First entry is always 1
     680            0 :  ndivs_tmp(1) = 1
     681              : !Copy point/per segments
     682            0 :  ndivs_tmp(2:) = scup_kpath%ndivs(:)
     683              : 
     684              : !Delete original segments
     685            0 : ABI_FREE(scup_kpath%ndivs)
     686              : !Put new path
     687            0 : ABI_MALLOC(scup_kpath%ndivs,(nspeck))
     688            0 : scup_kpath%ndivs = ndivs_tmp
     689              : !Free temporary array
     690            0 : ABI_FREE(ndivs_tmp)
     691              : 
     692            0 : end subroutine scup_kpath_new
     693              : !!***
     694              : 
     695              : !!****f* m_scup_dataset/scup_kpath_print
     696              : !!
     697              : !! NAME
     698              : !! scup_kpath_print
     699              : !!
     700              : !! FUNCTION
     701              : !! Print info of kpath provide to SCALE UP
     702              : !!
     703              : !! INPUTS
     704              : !! scup_kpath<type(kpath_t) = kpath_t with all information about kpath
     705              : !!
     706              : !! OUTPUT
     707              : !! Only Printing
     708              : !!
     709              : !! NOTES
     710              : !! Should be executed by one processor only.
     711              : !!
     712              : !! SOURCE
     713              : 
     714            0 : subroutine scup_kpath_print(scup_kpath)
     715              : 
     716              : !Arguments ------------------------------------
     717              :  class(kpath_t), intent(in) :: scup_kpath
     718              : !Local variables-------------------------------
     719              :  integer :: unt
     720              : ! *************************************************************************
     721              : 
     722            0 :  unt = std_out
     723              : 
     724            0 :  write(unt,'(a)') ch10
     725            0 :  write(unt,'(4a)') ' scup_printbands = 1. Printing of electronic bands active',ch10,&
     726            0 :                    ' Kpath information below:',ch10
     727              : 
     728            0 :  call scup_kpath%print([std_out])
     729              : 
     730            0 : end subroutine scup_kpath_print
     731              : !!***
     732              : 
     733            0 : end module m_scup_dataset
     734              : !!***
        

Generated by: LCOV version 2.3-1