LCOV - code coverage report
Current view: top level - src/66_nonlocal - m_nonlop_ylm.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 74.2 % 617 458
Test Date: 2026-09-20 18:56:22 Functions: 25.0 % 4 1

            Line data    Source code
       1              : !!****m* ABINIT/m_nonlop_ylm
       2              : !! NAME
       3              : !!  m_nonlop_ylm
       4              : !!
       5              : !! FUNCTION
       6              : !!
       7              : !! COPYRIGHT
       8              : !!  Copyright (C) 1998-2026 ABINIT group (MT)
       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_nonlop_ylm
      22              : 
      23              :  use defs_basis
      24              :  use m_xmpi
      25              :  use m_abicore
      26              :  use m_errors
      27              : 
      28              :  use defs_abitypes,      only : MPI_type
      29              :  use m_geometry,         only : strconv
      30              :  use m_kg,               only : ph1d3d, mkkpg
      31              :  use m_pawcprj,          only : pawcprj_type
      32              :  use m_opernla_ylm,      only : opernla_ylm,opernla_counter
      33              :  use m_opernla_ylm_mv,   only : opernla_ylm_mv,opernla_mv_counter,opernla_mv_dgemv_counter
      34              :  use m_opernlb_ylm,      only : opernlb_ylm,opernlb_counter
      35              :  use m_opernlb_ylm_mv,   only : opernlb_ylm_mv,opernlb_mv_counter,opernlb_mv_dgemv_counter
      36              :  use m_opernlc_ylm,      only : opernlc_ylm
      37              :  use m_opernld_ylm,      only : opernld_ylm
      38              :  use m_kg,               only : mkkpgcart
      39              : ! use m_time,             only : timab
      40              : 
      41              :  implicit none
      42              : 
      43              :  private
      44              : !!***
      45              : 
      46              :  public :: nonlop_ylm
      47              :  public :: nonlop_ylm_init_counters
      48              :  public :: nonlop_ylm_stop_counters
      49              :  public :: nonlop_ylm_output_counters
      50              : !!***
      51              : 
      52              : contains
      53              : !!***
      54              : 
      55              : !!****f* ABINIT/nonlop_ylm
      56              : !! NAME
      57              : !! nonlop_ylm
      58              : !!
      59              : !! FUNCTION
      60              : !! * Compute application of a nonlocal operator Vnl in order to get:
      61              : !!    - contracted elements (energy, forces, stresses, ...), if signs=1
      62              : !!    - a function in reciprocal space (|out> = Vnl|in>), if signs=2
      63              : !!   Operator Vnl, as the following general form:
      64              : !!    $Vnl=sum_{R,lmn,l''m''n''} {|P_{Rlmn}> Enl^{R}_{lmn,l''m''n''} <P_{Rl''m''n''}|}$
      65              : !!   Operator Vnl is -- in the typical case -- the nonlocal potential.
      66              : !!   - With norm-conserving pseudopots, $Enl^{R}_{lmn,l''m''n''}$ is the
      67              : !!     Kleinmann-Bylander energy $Ekb^{R}_{ln}$.
      68              : !!   - In a PAW calculation, $Enl^{R}_{lmn,l''m''n''}$ are the nonlocal
      69              : !!     coefficients to connect projectors $D_{ij}$.
      70              : !!   - The |P_{Rlmn}> are the projector functions.
      71              : !! * Optionnaly, in case of PAW calculation, compute:
      72              : !!   - Application of the overlap matrix in reciprocal space
      73              : !!     (<in|S|in> or (I+S)|in>).
      74              : !!   - Application of (Vnl-lambda.S) in reciprocal space
      75              : !!     (<in|Vnl-lambda.S|in> and derivatives or (Vnl-lambda.S)|in>).
      76              : !! * This routine uses spherical harmonics Ylm to express Vnl.
      77              : !!
      78              : !! INPUTS
      79              : !!  atindx1(natom)=index table for atoms, inverse of atindx
      80              : !!  choice: chooses possible output:
      81              : !!    choice=0 => do nothing (only compute WF projected with NL projectors)
      82              : !!          =1 => non-local energy contribution
      83              : !!          =2 => 1st derivative(s) with respect to atomic position(s)
      84              : !!          =3 => 1st derivative(s) with respect to strain(s)
      85              : !!          =22=> mixed 2nd derivative(s) with respect to atomic pos. and q vector (at q=0)
      86              : !!          =25=> mixed 3rd derivative(s) with respect to atomic pos. and two q vectors (at q=0)
      87              : !!          =23=> 1st derivative(s) with respect to atomic pos. and
      88              : !!                1st derivative(s) with respect to atomic pos. and strains
      89              : !!          =4 => 2nd derivative(s) with respect to 2 atomic pos.
      90              : !!          =24=> 1st derivative(s) with respect to atm. pos. and
      91              : !!          =33=> mixed 2nd derivative(s) with respect to strain and q vector (at q=0)
      92              : !!                2nd derivative(s) with respect to 2 atomic pos.
      93              : !!          =5 => 1st derivative(s) with respect to k wavevector, typically
      94              : !!                sum_ij [ |p_i> D_ij <dp_j/dk| + |dp_i/dk> D_ij < p_j| ]
      95              : !!          =6 => 2nd derivative(s) with respect to 2 strains and
      96              : !!                mixed 2nd derivative(s) with respect to strains & atomic pos.
      97              : !!          =51 =>right 1st derivative(s) with respect to k wavevector, typically
      98              : !!                sum_ij [ |p_i> D_ij <dp_j/dk| ]
      99              : !!          =52 =>left 1st derivative(s) with respect to k wavevector, typically
     100              : !!                sum_ij [ |dp_i/dk> D_ij < p_j| ]
     101              : !!          =53 =>twist 1st derivative(s) with respect to k, typically
     102              : !!                sum_ij [ |dp_i/dk_(idir+1)> D_ij <dp_j//dk_(idir+2)|
     103              : !!          =54=> mixed 2nd derivative(s) with respect to atomic pos. and left k wavevector
     104              : !!          =55=> mixed 2nd derivative(s) with respect to strain and right k wavevector
     105              : !!          =7 => apply operator $\sum_i [ |p_i> <p_i| ],
     106              : !!                same as overlap operator with s_ij=identity (paw_opt==3 only)
     107              : !!          =8 => 2nd derivatives with respect to 2 k wavevectors
     108              : !!          =81=> partial 2nd derivatives with respect to 2 k wavevectors,
     109              : !!                full derivative with respect to k1, right derivative with respect to k2,
     110              : !!                (derivative with respect to k of choice 51), typically
     111              : !!                sum_ij [ |dp_i/dk1> D_ij <dp_j/dk2| + |p_i> D_ij < d2p_j/dk1dk2| ]
     112              : !!    Only choices 1,2,3,23,4,5,6 are compatible with useylm=0.
     113              : !!    Only choices 1,2,22,25,3,5,33,51,52,53,7,8,81 are compatible with signs=2
     114              : !!  cpopt=flag defining the status of cprjin%cp(:)=<Proj_i|Cnk> scalars (see below, side effects)
     115              : !!  dimenl1,dimenl2=dimensions of enl (see enl)
     116              : !!  dimekbq=1 if enl factors do not contain a exp(-iqR) phase, 2 is they do
     117              : !!  dimffnlin=second dimension of ffnlin (1+number of derivatives)
     118              : !!  dimffnlout=second dimension of ffnlout (1+number of derivatives)
     119              : !!  enl(cplex_enl*dimenl1,dimenl2,nspinortot**2,dimekbq)=
     120              : !!  ->Norm conserving : ==== when paw_opt=0 ====
     121              : !!                      (Real) Kleinman-Bylander energies (hartree)
     122              : !!                      dimenl1=lmnmax  -  dimenl2=ntypat
     123              : !!                      dimekbq is 2 if Enl contains a exp(-iqR) phase, 1 otherwise
     124              : !!  ->PAW :             ==== when paw_opt=1, 2 or 4 ====
     125              : !!                      (Real or complex, hermitian) Dij coefs to connect projectors
     126              : !!                      dimenl1=cplex_enl*lmnmax*(lmnmax+1)/2  -  dimenl2=natom
     127              : !!                      These are complex numbers if cplex_enl=2
     128              : !!                        enl(:,:,1) contains Dij^up-up
     129              : !!                        enl(:,:,2) contains Dij^dn-dn
     130              : !!                        enl(:,:,3) contains Dij^up-dn (only if nspinor=2)
     131              : !!                        enl(:,:,4) contains Dij^dn-up (only if nspinor=2)
     132              : !!                      dimekbq is 2 if Dij contains a exp(-iqR) phase, 1 otherwise
     133              : !!  ffnlin(npwin,dimffnlin,lmnmax,ntypat)=nonlocal form factors to be used
     134              : !!          for the application of the nonlocal operator to the |in> vector
     135              : !!  ffnlout(npwout,dimffnlout,lmnmax,ntypat)=nonlocal form factors to be used
     136              : !!          for the application of the nonlocal operator to the |out> vector
     137              : !!  -----------------------------------------------------------
     138              : !!  gprimd(3,3)=dimensional reciprocal space primitive translations
     139              : !!  idir=direction of the - atom to be moved in the case (choice=2,signs=2) or (choice=22,signs=2)
     140              : !!                        - k point direction in the case (choice=5,signs=2S)
     141              : !!                          for choice 53, twisted derivative involves idir+1 and idir+2 (mod 3)
     142              : !!                        - strain component (1:6) in the case (choice=3,signs=2) or (choice=6,signs=1)
     143              : !!                        - strain component (1:9) in the case (choice=33,signs=2)
     144              : !!                        - (1:9) components to specify the atom to be moved and the second q-gradient
     145              : !!                          direction in the case (choice=25,signs=2)
     146              : !!  indlmn(6,i,ntypat)= array giving l,m,n,lm,ln,s for i=lmn
     147              : !!  istwf_k=option parameter that describes the storage of wfs
     148              : !!  kgin(3,npwin)=integer coords of planewaves in basis sphere, for the |in> vector
     149              : !!  kgout(3,npwout)=integer coords of planewaves in basis sphere, for the |out> vector
     150              : !!  kpgin(npw,npkgin)= (k+G) components and related data, for the |in> vector
     151              : !!  kpgout(npw,nkpgout)=(k+G) components and related data, for the |out> vector
     152              : !!  kptin(3)=k point in terms of recip. translations, for the |in> vector
     153              : !!  kptout(3)=k point in terms of recip. translations, for the |out> vector
     154              : !!  lambda=factor to be used when computing (Vln-lambda.S) - only for paw_opt=2
     155              : !!         Typically lambda is the eigenvalue (or its guess)
     156              : !!  lmnmax=max. number of (l,m,n) components over all types of atoms
     157              : !!  matblk=dimension of the arrays ph3din and ph3dout
     158              : !!  mgfft=maximum size of 1D FFTs
     159              : !!  mpi_enreg=information about MPI parallelization
     160              : !!  natom=number of atoms in cell
     161              : !!  nattyp(ntypat)=number of atoms of each type
     162              : !!  ngfft(18)=contain all needed information about 3D FFT, see ~abinit/doc/variables/vargs.htm#ngfft
     163              : !!  nkpgin,nkpgout=second sizes of arrays kpgin/kpgout
     164              : !!  nloalg(3)=governs the choice of the algorithm for nonlocal operator
     165              : !!  nnlout=dimension of enlout (when signs=1 and choice>0):
     166              : !!         ==== if paw_opt=0, 1 or 2 ====
     167              : !!         choice   nnlout     |  choice   nnlout
     168              : !!              1   1          |      51   6 (complex)
     169              : !!              2   3*natom    |      52   6 (complex)
     170              : !!              3   6          |      53   6 (complex)
     171              : !!              4   6*natom    |      54   9*natom
     172              : !!             23   6+3*natom  |      55   36 (complex)
     173              : !!             24   9*natom    |       6   36+18*natom
     174              : !!              5   3          |       8   6
     175              : !!                             |      81   18 (complex)
     176              : !!         ==== if paw_opt=3 ====
     177              : !!         choice   nnlout
     178              : !!              1   1
     179              : !!              2   3*natom
     180              : !!              5   3
     181              : !!             51   3
     182              : !!             52   3
     183              : !!             54   9*natom
     184              : !!             55   36
     185              : !!              7   1
     186              : !!              8   6
     187              : !!             81   9
     188              : !!         ==== if paw_opt=4 ====
     189              : !!         not available
     190              : !!  npwin=number of planewaves for given k point, for the |in> vector
     191              : !!  npwout=number of planewaves for given k point, for the |out> vector
     192              : !!  nspinor=number of spinorial components of the wavefunctions (on current proc)
     193              : !!  nspinortot=total number of spinorial components of the wavefunctions
     194              : !!  ntypat=number of types of atoms in cell
     195              : !!  paw_opt= define the nonlocal operator concerned with:
     196              : !!           paw_opt=0 : Norm-conserving Vnl (use of Kleinman-Bylander ener.)
     197              : !!           paw_opt=1 : PAW nonlocal part of H (use of Dij coeffs)
     198              : !!           paw_opt=2 : PAW: (Vnl-lambda.Sij) (Sij=overlap matrix)
     199              : !!           paw_opt=3 : PAW overlap matrix (Sij)
     200              : !!           paw_opt=4 : both PAW nonlocal part of H (Dij) and overlap matrix (Sij)
     201              : !!  phkxredin(2,natom)=phase factors exp(2 pi kptin.xred)
     202              : !!  phkxredout(2,natom)=phase factors exp(2 pi kptout.xred)
     203              : !!  ph1d(2,3*(2*mgfft+1)*natom)=1D structure factors phase information
     204              : !!  ph3din(2,npwin,matblk)=3D structure factors, for each atom and plane wave (in)
     205              : !!  ph3dout(2,npwout,matblk)=3-dim structure factors, for each atom and plane wave (out)
     206              : !!  [qdir]= optional,direction of the q-gradient (only for choice=22 choice=25 and choice=33)
     207              : !!  signs= if 1, get contracted elements (energy, forces, stress, ...)
     208              : !!         if 2, applies the non-local operator to a function in reciprocal space
     209              : !!  sij(dimenl1,ntypat*(paw_opt/3))=overlap matrix components (only if paw_opt=2, 3 or 4)
     210              : !!  ucvol=unit cell volume (bohr^3)
     211              : !!  vectin(2,npwin*nspinor)=input cmplx wavefunction coefficients <G|in>
     212              : !!  [cprjin_left(natom,nspinor)]=The projected input wave function <p_nlm|in_left>
     213              : !!    for the left wavefunction. Data are assumed to be in memory, they are NOT recalculated here.
     214              : !!
     215              : !! OUTPUT
     216              : !! ==== if (signs==1) ====
     217              : !! --If (paw_opt==0, 1 or 2)
     218              : !!    enlout(nnlout)= contribution to the non-local part of the following properties:
     219              : !!      if choice=1 : enlout(1)             -> the energy
     220              : !!      if choice=2 : enlout(3*natom)       -> 1st deriv. of energy wrt atm. pos (forces)
     221              : !!      if choice=3 : enlout(6)             -> 1st deriv. of energy wrt strain (stresses)
     222              : !!      if choice=4 : enlout(6*natom)       -> 2nd deriv. of energy wrt 2 atm. pos (dyn. mat.)
     223              : !!      if choice=23: enlout(6+3*natom)     -> 1st deriv. of energy wrt atm. pos (forces) and
     224              : !!                                             1st deriv. of energy wrt strain (stresses)
     225              : !!      if choice=24: enlout(9*natom)       -> 1st deriv. of energy wrt atm. pos (forces) and
     226              : !!                                             2nd deriv. of energy wrt 2 atm. pos (dyn. mat.)
     227              : !!      if choice=5 : enlout(3)             -> 1st deriv. of energy wrt k
     228              : !!      if choice=51: enlout(3)             -> 1st deriv. (right) of energy wrt k
     229              : !!      if choice=52: enlout(3)             -> 1st deriv. (left) of energy wrt k
     230              : !!      if choice=53: enlout(3)             -> 1st deriv. (twist) of energy wrt k
     231              : !!      if choice=54: enlout(18*natom)      -> 2nd deriv. of energy wrt atm. pos and right k (Born eff. charge)
     232              : !!      if choice=55: enlout(36)            -> 2nd deriv. of energy wrt strain and right k (piezoelastic tensor)
     233              : !!      if choice=6 : enlout(36+18*natom)   -> 2nd deriv. of energy wrt 2 strains (elast. tensor) and
     234              : !!                                             2nd deriv. of energy wrt to atm. pos and strain (internal strain)
     235              : !!      if choice=8 : enlout(6)             -> 2nd deriv. of energy wrt 2 k
     236              : !!      if choice=81: enlout(9)             -> 2nd deriv.of E: full derivative w.r.t. k1, right derivative w.r.t k2
     237              : !! --If (paw_opt==3)
     238              : !!      if choice=1 : enlout(1)             -> contribution to <c|S|c> (note: not including <c|c>)
     239              : !!      if choice=2 : enlout(3*natom)       -> contribution to <c|dS/d_atm.pos|c>
     240              : !!      if choice=51: enlout(3)             -> contribution to <c|d(right)S/d_k|c>
     241              : !!      if choice=52: enlout(3)             -> contribution to <c|d(left)S/d_k|c>
     242              : !!      if choice=54: enlout(18*natom)      -> 2nd deriv. of energy wrt atm. pos and right k (Born eff. charge)
     243              : !!      if choice=55: enlout(36)            -> 2nd deriv. of energy wrt strain and right k (piezoelastic tensor)
     244              : !!      if choice=7 : enlout(1)             -> contribution to <c|sum_i[p_i><p_i]|c>
     245              : !!      if choice=8 : enlout(6)             -> contribution to <c|d2S/d_k1d_k2|c>
     246              : !!      if choice=81: enlout(9)             -> contribution to <c|dS/d_k1[d(right)d_k2]|c>
     247              : !! --If (paw_opt==4)
     248              : !!      not available
     249              : !! ==== if (signs==2) ====
     250              : !! --if (paw_opt=0)
     251              : !!    vectout(2,npwout*my_nspinor*ndat)=result of the aplication of the concerned operator
     252              : !!                or one of its derivatives to the input vect.
     253              : !!      if (choice=22) <G|d2V_nonlocal/d(atm. pos)dq|vect_in> (at q=0)
     254              : !!      if (choice=25) <G|d3V_nonlocal/d(atm. pos)dqdq|vect_in> (at q=0)
     255              : !!      if (choice=33) <G|d2V_nonlocal/d(strain)dq|vect_in> (at q=0)
     256              : !! --if (paw_opt=0, 1 or 4)
     257              : !!    vectout(2,npwout*my_nspinor*ndat)=result of the aplication of the concerned operator
     258              : !!                or one of its derivatives to the input vect.:
     259              : !!      if (choice=1)  <G|V_nonlocal|vect_in>
     260              : !!      if (choice=2)  <G|dV_nonlocal/d(atm. pos)|vect_in>
     261              : !!      if (choice=3)  <G|dV_nonlocal/d(strain)|vect_in>
     262              : !!      if (choice=5)  <G|dV_nonlocal/d(k)|vect_in>
     263              : !!      if (choice=51) <G|d(right)V_nonlocal/d(k)|vect_in>
     264              : !!      if (choice=52) <G|d(left)V_nonlocal/d(k)|vect_in>
     265              : !!      if (choice=53) <G|d(twist)V_nonlocal/d(k)|vect_in>
     266              : !!      if (choice=8)  <G|d2V_nonlocal/d(k)d(k)|vect_in>
     267              : !!      if (choice=81) <G|d[d(right)V_nonlocal/d(k)]/d(k)|vect_in>
     268              : !! --if (paw_opt=2)
     269              : !!    vectout(2,npwout*my_nspinor*ndat)=final vector in reciprocal space:
     270              : !!      if (choice=1)  <G|V_nonlocal-lambda.(I+S)|vect_in>
     271              : !!      if (choice=2)  <G|d[V_nonlocal-lambda.(I+S)]/d(atm. pos)|vect_in>
     272              : !!      if (choice=3)  <G|d[V_nonlocal-lambda.(I+S)]/d(strain)|vect_in>
     273              : !!      if (choice=5)  <G|d[V_nonlocal-lambda.(I+S)]/d(k)|vect_in>
     274              : !!      if (choice=51) <G|d(right)[V_nonlocal-lambda.(I+S)]/d(k)|vect_in>
     275              : !!      if (choice=52) <G|d(left)[V_nonlocal-lambda.(I+S)]/d(k)|vect_in>
     276              : !!      if (choice=53) <G|d(twist)[V_nonlocal-lambda.(I+S)]/d(k)|vect_in>
     277              : !!      if (choice=8)  <G|d2[V_nonlocal-lambda.(I+S)]/d(k)d(k)|vect_in>
     278              : !!      if (choice=81) <G|d[d(right[V_nonlocal-lambda.(I+S)]/d(k)]/d(k)|vect_in>
     279              : !! --if (paw_opt=3 or 4)
     280              : !!    svectout(2,npwout*my_nspinor*ndat)=result of the aplication of Sij (overlap matrix)
     281              : !!                  or one of its derivatives to the input vect.:
     282              : !!      if (choice=1)  <G|I+S|vect_in>
     283              : !!      if (choice=2)  <G|dS/d(atm. pos)|vect_in>
     284              : !!      if (choice=3)  <G|dS/d(strain)|vect_in>
     285              : !!      if (choice=5)  <G|dS/d(k)|vect_in>
     286              : !!      if (choice=51) <G|d(right)S/d(k)|vect_in>
     287              : !!      if (choice=52) <G|d(left)S/d(k)|vect_in>
     288              : !!      if (choice=53) <G|d(twist)S/d(k)|vect_in>
     289              : !!      if (choice=3)  <G|d[V_nonlocal-lambda.(I+S)]/d(strain)|vect_in>
     290              : !!      if (choice=7)  <G|sum_i[p_i><p_i]|vect_in>
     291              : !!      if (choice=8)  <G|d2S/d(k)d(k)|vect_in>
     292              : !!      if (choice=81) <G|d[d(right)S/d(k)]/d(k)|vect_in>
     293              : !!
     294              : !! SIDE EFFECTS
     295              : !!  cprjin(natom,nspinor) <type(pawcprj_type)>=projected input wave function |in> on non-local projectors
     296              : !!                                            =<p_lmn|in> and derivatives
     297              : !!                    Treatment depends on cpopt parameter:
     298              : !!                     if cpopt=-1, <p_lmn|in> (and derivatives)
     299              : !!                                  are computed here (and not saved)
     300              : !!                     if cpopt= 0, <p_lmn|in> are computed here and saved
     301              : !!                                  derivatives are eventually computed but not saved
     302              : !!                     if cpopt= 1, <p_lmn|in> and first derivatives are computed here and saved
     303              : !!                                  other derivatives are eventually computed but not saved
     304              : !!                     if cpopt= 2  <p_lmn|in> are already in memory;
     305              : !!                                  first (and 2nd) derivatives are computed here and not saved
     306              : !!                     if cpopt= 3  <p_lmn|in> are already in memory;
     307              : !!                                  first derivatives are computed here and saved
     308              : !!                                  other derivatives are eventually computed but not saved
     309              : !!                     if cpopt= 4  <p_lmn|in> and first derivatives are already in memory;
     310              : !!                                  other derivatives are not computed (except when choice=8 or 81)
     311              : !!                                  This option is not compatible with choice=4,24 or 6
     312              : !!                     Warning: for cpopt= 1 or 3, derivatives wrt strains do not contain
     313              : !!                              the contribution due to the volume change;
     314              : !!                              i.e. <dp_lmn/dEps|in> are incomplete.
     315              : !!
     316              : !! NOTES
     317              : !! This application of the nonlocal operator is programmed using a direct
     318              : !! implementation of spherical harmonics (Ylm). Abinit used historically
     319              : !! Legendre polynomials for the application of nonlocal operator; but the
     320              : !! implementation of PAW algorithm enforced the use of Ylm.
     321              : !!
     322              : !! In the case signs=1, the array vectout is not used, nor modified
     323              : !! so that the same array as vectin can be used as a dummy argument;
     324              : !! the same is true for the pairs npwin-npwout, ffnlin-ffnlout,
     325              : !! kgin-kgout, ph3din-ph3dout, phkredin-phkxredout).
     326              : !!
     327              : !! Notes about choice==33:
     328              : !!  **Since the 2nd derivative w.r.t q-vector is calculated along cartesian
     329              : !!    directions, the 1/twopi**2 factor (that in the rest of the code is applied
     330              : !!    in the reduced to cartesian derivative conversion process) is here
     331              : !!    explicictly included in the formulas.
     332              : !!
     333              : !!  **Notice that idir=1-9, in contrast to the strain perturbation (idir=1-6),
     334              : !!    because this term is not symmetric w.r.t permutations of the two strain
     335              : !!    indices.(Also applies for choice=25)
     336              : !!
     337              : !!  **A -i factor has been factorized out in all the contributions of the second
     338              : !!    q-gradient of the metric Hamiltonian and in the first and second q-gradients
     339              : !!    of the atomic displacement Hamiltonian. This is lately included in the
     340              : !!    matrix element calculation.
     341              : !!
     342              : !! TODO
     343              : !! * Complete implementation of spin-orbit
     344              : !!
     345              : !! SOURCE
     346              : 
     347    100125612 :  subroutine nonlop_ylm(atindx1,choice,cpopt,cprjin,dimenl1,dimenl2,dimekbq,dimffnlin,dimffnlout,&
     348     25031403 : &                      enl,enlout,ffnlin,ffnlout,gprimd,idir,indlmn,istwf_k,&
     349     25031403 : &                      kgin,kgout,kpgin,kpgout,kptin,kptout,lambda,lmnmax,matblk,mgfft,&
     350     25031403 : &                      mpi_enreg,natom,nattyp,ngfft,nkpgin,nkpgout,nloalg,nnlout,&
     351     25031403 : &                      npwin,npwout,nspinor,nspinortot,ntypat,paw_opt,phkxredin,phkxredout,ph1d,&
     352     50062806 : &                      ph3din,ph3dout,signs,sij,svectout,ucvol,vectin,vectout,cprjin_left,&
     353     25031403 : &                      enlout_im,ndat_left,qdir)
     354              : 
     355              : !Arguments ------------------------------------
     356              : !scalars
     357              :  integer,intent(in) :: choice,cpopt,dimenl1,dimenl2,dimekbq,dimffnlin,dimffnlout,idir
     358              :  integer,intent(in) :: istwf_k,lmnmax,matblk,mgfft,natom,nkpgin,nkpgout,nnlout
     359              :  integer,intent(in) :: npwin,npwout,nspinor,nspinortot,ntypat,paw_opt,signs
     360              :  integer,intent(in),optional :: qdir,ndat_left
     361              :  real(dp),intent(in) :: lambda,ucvol
     362              :  type(MPI_type),intent(in) :: mpi_enreg
     363              : !arrays
     364              :  integer,intent(in) :: atindx1(natom),kgin(3,npwin)
     365              :  integer,intent(in),target :: indlmn(6,lmnmax,ntypat)
     366              :  integer,intent(in) :: kgout(3,npwout),nattyp(ntypat),ngfft(18),nloalg(3)
     367              :  real(dp),intent(in) :: enl(dimenl1,dimenl2,nspinortot**2,dimekbq)
     368              :  real(dp),intent(in),target :: ffnlin(npwin,dimffnlin,lmnmax,ntypat)
     369              :  real(dp),intent(in),target :: ffnlout(npwout,dimffnlout,lmnmax,ntypat)
     370              :  real(dp),intent(in) :: gprimd(3,3)
     371              :  real(dp),intent(in),target :: kpgin(npwin,nkpgin),kpgout(npwout,nkpgout)
     372              :  real(dp),intent(in) :: kptin(3),kptout(3),ph1d(2,3*(2*mgfft+1)*natom)
     373              :  real(dp),intent(in) :: phkxredin(2,natom),phkxredout(2,natom)
     374              :  real(dp),intent(in) :: sij(dimenl1,ntypat*((paw_opt+1)/3))
     375              :  real(dp),intent(inout) :: ph3din(2,npwin,matblk),ph3dout(2,npwout,matblk)
     376              :  real(dp),intent(inout) :: vectin(:,:)
     377              :  real(dp),intent(out) :: enlout(:)
     378              :  real(dp),intent(out),optional :: enlout_im(:)
     379              :  real(dp),intent(out) :: svectout(:,:)
     380              :  real(dp),intent(inout) :: vectout (:,:)
     381              :  type(pawcprj_type),intent(inout) :: cprjin(:,:)
     382              :  type(pawcprj_type),optional,intent(in) :: cprjin_left(:,:)
     383              : 
     384              : !Local variables-------------------------------
     385              : !scalars
     386              :  integer :: choice_a,choice_b,cplex,cplex_enl,cplex_fac,ia,ia1,ia2,ia3,ia4,ia5
     387              :  integer :: iatm,ic,idir1,idir2,ii,ierr,ilmn,ishift,ispinor,itypat,jc,mincat,mu,mua,mub,mu0
     388              :  integer :: n1,n2,n3,nd2gxdt,ndat_left_,ndgxdt,ndgxdt_stored,nd2gxdtfac,ndgxdtfac
     389              :  integer :: nincat,nkpgin_,nkpgout_,nlmn,nu,nua1,nua2,nub1,nub2,optder
     390              :  real(dp) :: enlk!, tsec(2)
     391              :  logical :: check,testnl,no_opernla_mv,no_opernlb_mv
     392              :  character(len=500) :: message
     393              : !arrays
     394              :  integer,parameter :: alpha(6)=(/1,2,3,3,3,2/),beta(6)=(/1,2,3,2,1,1/)
     395              :  integer,parameter :: gamma(3,3)=reshape((/1,6,5,6,2,4,5,4,3/),(/3,3/))
     396     25031403 :  integer,allocatable :: cplex_dgxdt(:),cplex_d2gxdt(:)
     397     25031403 :  integer,ABI_CONTIGUOUS pointer :: indlmn_typ(:,:)
     398     25031403 :  real(dp),allocatable :: d2gxdt(:,:,:,:,:),d2gxdtfac(:,:,:,:,:),d2gxdtfac_sij(:,:,:,:,:)
     399     25031403 :  real(dp),allocatable :: dgxdt(:,:,:,:,:),dgxdtfac(:,:,:,:,:),dgxdtfac_sij(:,:,:,:,:)
     400     25031403 :  real(dp),allocatable :: ddkk(:),fnlk(:),gmet(:,:)
     401     25031403 :  real(dp),allocatable :: gx(:,:,:,:),gxfac(:,:,:,:),gxfac_sij(:,:,:,:),gx_left(:,:,:,:)
     402     25031403 :  real(dp),allocatable :: sij_typ(:),strnlk(:)
     403     25031403 :  real(dp),allocatable :: work1(:),work2(:),work3(:,:),work4(:,:),work5(:,:,:),work6(:,:,:),work7(:,:,:)
     404     25031403 :  real(dp),ABI_CONTIGUOUS pointer :: ffnlin_typ(:,:,:),ffnlout_typ(:,:,:),kpgin_(:,:),kpgout_(:,:)
     405              : 
     406              : ! **********************************************************************
     407              : 
     408              :  DBG_ENTER("COLL")
     409              : 
     410              : ! call timab(1100,1,tsec)
     411              : 
     412              : !Check consistency of arguments
     413              : !==============================================================
     414              : 
     415              : !signs=1, almost all choices
     416     25031403 :  if (signs==1) then
     417      1391215 :    if(paw_opt<3) then
     418              :      check=(choice==0 .or.choice==1 .or.choice==2 .or.choice==3 .or.choice==4 .or.&
     419              : &     choice==23.or.choice==24.or.choice==5 .or.choice==51.or.choice==52.or.&
     420              : &     choice==53.or.choice==54.or.choice==55.or.&
     421      1148223 : &     choice==6 .or.choice==8 .or.choice==81)
     422       242992 :    else if (paw_opt==3) then
     423              :      check=(choice== 0.or.choice== 1.or.choice== 2.or.choice==3.or.choice==5.or.&
     424              : &     choice==23.or.choice==51.or.choice==52.or.choice==53.or.choice==54.or.choice==55.or.&
     425       242992 : &     choice== 8.or.choice==81)
     426              :    else
     427              :      check = .false.
     428              :    end if
     429            0 :    ABI_CHECK(check,'BUG: choice not compatible (for signs=1)')
     430              :  end if
     431              : 
     432              : !signs=2, less choices
     433     25031403 :  if (signs==2) then
     434              :    check=(choice==0.or.choice==1.or.choice==2.or.choice==22.or.choice==25.or.choice==3 .or.&
     435              : &   choice==5.or.choice==33.or.choice==51.or.choice==52.or.choice==53.or.choice==54.or.&
     436     23640188 : &   choice==7.or.choice==8.or.choice==81)
     437            0 :    ABI_CHECK(check,'BUG: choice not compatible (for signs=2)')
     438              :  end if
     439              : !1<=idir<=6 is required when choice=3 and signs=2
     440     25031403 :  if (choice==3.and.signs==2) then
     441       261762 :    check=(idir>=1.and.idir<=6)
     442       261762 :    ABI_CHECK(check,'BUG: choice=3 and signs=2 requires 1<=idir<=6')
     443              : !1<=idir<=9 is required when choice= 25 or 33 and signs=2
     444     24769641 :  else if ((choice==25.or.choice==33).and.signs==2) then
     445       622080 :    check=(idir>=1.and.idir<=9)
     446       622080 :    ABI_CHECK(check,'BUG: choice= 25 or 33 and signs=2 requires 1<=idir<=9')
     447              : !1<=idir<=9 is required when choice==8/81 and signs=2
     448     24147561 :  else if ((choice==8.or.choice==81.or.choice==54).and.signs==2) then
     449        72807 :    check=(idir>=1.and.idir<=9)
     450        72807 :    ABI_CHECK(check,'BUG: choice=8/81 and signs=2 requires 1<=idir<=9')
     451              :  else
     452              : !  signs=2 requires 1<=idir<=3 when choice>1
     453     24074754 :    check=(signs/=2.or.choice<=1.or.choice==7.or.(idir>=1.and.idir<=3))
     454            0 :    ABI_CHECK(check,'BUG: signs=2 requires 1<=idir<=3')
     455              :  end if
     456              : !1<=qdir<=3 is required when choice==22 or choice==25 or choice==33 and signs=2
     457     25031403 :  if ((choice==22.or.choice==25.or.choice==33).and.signs==2) then
     458      1002208 :    check=(qdir>=1.and.qdir<=3)
     459      1002208 :    ABI_CHECK(check,'BUG: choice=22,25 or 33 and signs=2 requires 1<=qdir<=3')
     460              :  end if
     461              : 
     462              : !check allowed values for cpopt
     463     25031403 :  check=(cpopt>=-1.and.cpopt<=4)
     464     25031403 :  ABI_CHECK(check,'bad value for cpopt')
     465     25031403 :  check=(cpopt/=4.or.(choice/=4.and.choice/=24.and.choice/=6))
     466            0 :  ABI_CHECK(check,'BUG: cpopt=4 not allowed for 2nd derivatives')
     467     25031403 :  check=(cpopt/=2.or.(choice/=8.and.choice/=81))
     468            0 :  ABI_CHECK(check,'BUG: cpopt=2 not allowed for choice=8,81, use cpopt=4 instead')
     469              : !check conditions for optional arguments
     470     25031403 :  check=((.not.present(cprjin_left)).or.(signs==1.and.choice==1))
     471            0 :  ABI_CHECK(check,'BUG: when cprjin_left is present, must have choice=1,signs=1')
     472              : !protect special case choice==7
     473     25031403 :  check=(choice/=7.or.paw_opt==3)
     474            0 :  ABI_CHECK(check,'BUG: when choice=7, paw_opt must be 3')
     475              : !
     476              : 
     477              : !Test: size of blocks of atoms
     478     63565768 :  mincat=min(NLO_MINCAT,maxval(nattyp))
     479     25031403 :  if (nloalg(2)<=0.and.mincat>matblk) then
     480              :    write(message, '(a,a,a,i4,a,i4,a)' ) &
     481            0 : &   'With nloc_mem<=0, mincat must be less than matblk.',ch10,&
     482            0 : &   'Their value is ',mincat,' and ',matblk,'.'
     483            0 :    ABI_BUG(message)
     484              :  end if
     485     25031403 :  ndat_left_=1
     486     25031403 :  if (present(ndat_left)) then
     487       220960 :    ndat_left_=ndat_left
     488              :  end if
     489     25031403 :  if (nloalg(1)<2.or.nloalg(1)>10) then
     490            0 :    ABI_ERROR('nloalg(1) should be between 2 and 10.')
     491              :  end if
     492              :  ! Determine which implementation to use : matrix-vector (mv), matrix-vector with dgmev (mv-dgemv), or native
     493              :  !nloalg(1)|  opernla |  opernlb
     494              :  !------------------------------
     495              :  !    2    | mv-dgemv | mv-dgemv
     496              :  !    3    |    mv    |    mv
     497              :  !  4(def) |  native  |  native
     498              :  !    5    | mv-dgemv |    mv
     499              :  !    6    |    mv    | mv-dgemv
     500              :  !    7    | mv-dgemv |  native
     501              :  !    8    |  native  |    mv
     502              :  !    9    |    mv    |  native
     503              :  !   10    |  native  | mv-dgemv
     504     25031403 :  no_opernla_mv = nloalg(1)==4.or.nloalg(1)==8.or.nloalg(1)==10 ! have to be consistent with getcprj
     505     25031403 :  no_opernlb_mv = nloalg(1)==4.or.nloalg(1)==7.or.nloalg(1)==9
     506              : 
     507              : !Define dimensions of projected scalars
     508              : !==============================================================
     509              : 
     510              : !Define some useful variables
     511     25031403 :  n1=ngfft(1);n2=ngfft(2);n3=ngfft(3)
     512     25031403 :  choice_a=merge(choice,1,choice/=7);choice_b=choice_a
     513     25031403 :  if (cpopt>=2) choice_a=-choice_a
     514     25031403 :  cplex=2;if (istwf_k>1) cplex=1 !Take into account TR-symmetry
     515     25031403 :  cplex_enl=1;if (paw_opt>0) cplex_enl=2*dimenl1/(lmnmax*(lmnmax+1))
     516     25031403 :  cplex_fac=max(cplex,dimekbq)
     517     25031403 :  if ((nspinortot==2.or.cplex_enl==2).and.paw_opt>0.and.choice/=7) cplex_fac=2
     518              : 
     519              : !Define dimensions of projected scalars
     520     25031403 :  ndgxdt=0;ndgxdtfac=0;nd2gxdt=0;nd2gxdtfac=0
     521     25031403 :  if (choice==2) then
     522      1732024 :    if (signs==1) ndgxdt=3
     523      1732024 :    if (signs==2) ndgxdt=1
     524      1732024 :    if (signs==2) ndgxdtfac=1
     525              :  end if
     526     25031403 :  if (choice==22) then
     527       380128 :    if (signs==2) ndgxdt=1
     528       380128 :    if (signs==2) ndgxdtfac=1
     529              :  end if
     530     25031403 :  if (choice==25) then
     531       248832 :    if (signs==2) ndgxdt=1
     532       248832 :    if (signs==2) ndgxdtfac=1
     533              :  end if
     534     25031403 :  if (choice==3) then
     535       285701 :    if (signs==1) ndgxdt=6
     536       285701 :    if (signs==2) ndgxdt=1
     537       285701 :    if (signs==2) ndgxdtfac=1
     538              :  end if
     539     25031403 :  if (choice==23) then
     540        43350 :    if (signs==1) ndgxdt=9
     541              :  end if
     542     25031403 :  if (choice==4) then
     543        23856 :    if(signs==1) ndgxdt=3
     544        23856 :    if(signs==1) ndgxdtfac=3
     545        23856 :    if(signs==1) nd2gxdt=6
     546              :  end if
     547     25031403 :  if (choice==24) then
     548            0 :    if(signs==1) ndgxdt=3
     549            0 :    if(signs==1) ndgxdtfac=3
     550            0 :    if(signs==1) nd2gxdt=6
     551              :  end if
     552     25031403 :  if (choice==33) then
     553       373248 :    if(signs==2) ndgxdt=2
     554       373248 :    if(signs==2) ndgxdtfac=2
     555       373248 :    if(signs==2) nd2gxdt=3
     556       373248 :    if(signs==2) nd2gxdtfac=3
     557              :  end if
     558     25031403 :  if (choice==5) then
     559       851957 :    if(signs==1) ndgxdt=3
     560       851957 :    if(signs==2) ndgxdt=1
     561       851957 :    if(signs==2) ndgxdtfac=1
     562              :  end if
     563     25031403 :  if (choice==51) then
     564       106864 :    if(signs==1) ndgxdt=3
     565       106864 :    if(signs==2) ndgxdt=1
     566       106864 :    if(signs==2) ndgxdtfac=1
     567              :  end if
     568     25031403 :  if (choice==52) then
     569            0 :    if(signs==1) ndgxdt=3
     570            0 :    if(signs==2) ndgxdt=1
     571            0 :    if(signs==2) ndgxdtfac=1
     572              :  end if
     573     25031403 :  if (choice==53) then
     574            0 :    if(signs==1) ndgxdt=3
     575            0 :    if(signs==1) ndgxdtfac=3
     576            0 :    if(signs==2) ndgxdt=1
     577            0 :    if(signs==2) ndgxdtfac=1
     578              :  end if
     579     25031403 :  if (choice==54) then
     580        34432 :    if(signs==1) ndgxdt=6
     581        34432 :    if(signs==1) ndgxdtfac=6
     582        34432 :    if(signs==1) nd2gxdt=9
     583        34432 :    if(signs==2) ndgxdt=1
     584        34432 :    if(signs==2) nd2gxdt=1
     585        34432 :    if(signs==2) ndgxdtfac=1
     586        34432 :    if(signs==2) nd2gxdtfac=1
     587              :  end if
     588     25031403 :  if (choice==55) then
     589         2576 :    if(signs==1) ndgxdt=9
     590         2576 :    if(signs==1) ndgxdtfac=9
     591         2576 :    if(signs==1) nd2gxdt=18
     592              :  end if
     593     25031403 :  if (choice==6) then
     594         2400 :    if(signs==1) ndgxdt=9
     595         2400 :    if(signs==1) ndgxdtfac=9
     596         2400 :    if(signs==1) nd2gxdt=54
     597              :  end if
     598     25031403 :  if (choice==8) then
     599        47271 :    if(signs==1) ndgxdt=3
     600        47271 :    if(signs==1) ndgxdtfac=3
     601        47271 :    if(signs==1) nd2gxdt=6
     602        47271 :    if(signs==2) ndgxdt=2
     603        47271 :    if(signs==2) ndgxdtfac=2
     604        47271 :    if(signs==2) nd2gxdt=1
     605        47271 :    if(signs==2) nd2gxdtfac=1
     606              :  end if
     607     25031403 :  if (choice==81) then
     608         3456 :    if(signs==1) ndgxdt=3
     609         3456 :    if(signs==1) ndgxdtfac=3
     610         3456 :    if(signs==1) nd2gxdt=6
     611         3456 :    if(signs==2) ndgxdt=1
     612         3456 :    if(signs==2) ndgxdtfac=1
     613         3456 :    if(signs==2) nd2gxdt=1
     614         3456 :    if(signs==2) nd2gxdtfac=1
     615              :  end if
     616     25031403 :  ABI_CHECK(ndgxdtfac<=ndgxdt,"BUG: ndgxdtfac>ndgxdt!")
     617     25031403 :  optder=0;if (ndgxdtfac>0) optder=1
     618     25031403 :  if (nd2gxdtfac>0) optder=2
     619              : 
     620              : !Consistency tests
     621     25031403 :  if (cpopt==4) then
     622      2109586 :    if (ndgxdt>0.and.cprjin(1,1)%ncpgr<=0) then
     623            0 :      message='cprjin%ncpgr=0 not allowed with cpopt=4 and these (choice,signs) !'
     624            0 :      ABI_BUG(message)
     625              :    end if
     626              :  end if
     627     25031403 :  if (cpopt==1.or.cpopt==3) then
     628        96596 :    if (cprjin(1,1)%ncpgr<ndgxdt) then
     629            0 :      message='should have cprjin%ncpgr>=ndgxdt with cpopt=1 or 3 !'
     630            0 :      ABI_BUG(message)
     631              :    end if
     632              :  end if
     633              : 
     634              : 
     635              : !Additional steps before calculation
     636              : !==============================================================
     637              : 
     638              : !Initialize output arrays
     639     25031403 :  if (signs==1) then
     640      4173645 :    ABI_MALLOC(fnlk,(3*natom))
     641      1391215 :    ABI_MALLOC(ddkk,(6))
     642      1391215 :    ABI_MALLOC(strnlk,(6))
     643     31570749 :    enlk=zero;fnlk=zero;ddkk=zero;strnlk=zero
     644      7588040 :    enlout(:)=zero
     645      1391215 :    if (present(enlout_im)) then
     646      2217120 :      enlout_im(:)=zero
     647              :    end if
     648              :  end if
     649     25031403 :  if (signs==2) then
     650  12654508015 :    if (paw_opt==0.or.paw_opt==1.or.paw_opt==4) vectout(:,:)=zero
     651     23640188 :    if (paw_opt==2.and.choice==1) vectout(:,:)=-lambda*vectin(:,:)
     652     23663970 :    if (paw_opt==2.and.choice> 1) vectout(:,:)=zero
     653     23640188 :    if (paw_opt==3.or.paw_opt==4) then
     654   7808045175 :      if (choice==1) svectout(:,:)=vectin(:,:)
     655   1259774897 :      if (choice> 1) svectout(:,:)=zero
     656              :    end if
     657              :  end if
     658              : 
     659              : !Eventually re-compute (k+G) vectors (and related data)
     660     25031403 :  nkpgin_=0
     661     25031403 :  if (choice==2.or.choice==22.or.choice==25.or.choice==33.or.choice==54) nkpgin_=3
     662     25031403 :  if (signs==1) then
     663      1391215 :    if (choice==4.or.choice==24) nkpgin_=9
     664      1391215 :    if (choice==3.or.choice==23.or.choice==6) nkpgin_=3
     665      1391215 :    if (choice==55) nkpgin_=3
     666              :  end if
     667     25031403 :  if (nkpgin<nkpgin_) then
     668      7565828 :    ABI_MALLOC(kpgin_,(npwin,nkpgin_))
     669              : 
     670              :    !For the metric derivatives we need kpg in Cartesian coordinates
     671      1891457 :    if (choice==33) then
     672       373248 :      call mkkpgcart(gprimd,kgin,kpgin_,kptin,nkpgin_,npwin)
     673              :    else
     674      1518209 :      call mkkpg(kgin,kpgin_,kptin,nkpgin_,npwin)
     675              :    end if
     676              : 
     677              :  else
     678     23139946 :    nkpgin_ = nkpgin
     679     23139946 :    kpgin_  => kpgin
     680              :  end if
     681              : 
     682     25031403 :  nkpgout_=0
     683      3054365 :  if ((choice==2.or.choice==22.or.choice==25.or.choice==3.or.choice==33.or.choice==54).and.signs==2) nkpgout_=3
     684     25031403 :  if (nkpgout<nkpgout_) then
     685      7875440 :    ABI_MALLOC(kpgout_,(npwout,nkpgout_))
     686              : 
     687              :    !For the metric derivatives we need kpg in Cartesian coordinates
     688      1968860 :    if (choice==33) then
     689       373248 :      call mkkpgcart(gprimd,kgout,kpgout_,kptout,nkpgout_,npwout)
     690              :    else
     691      1595612 :      call mkkpg(kgout,kpgout_,kptout,nkpgout_,npwout)
     692              :    end if
     693              : 
     694              :  else
     695     23062543 :    nkpgout_ = nkpgout
     696     23062543 :    kpgout_ => kpgout
     697              :  end if
     698              : 
     699              : !Big loop on atom types
     700              : !==============================================================
     701              : 
     702     25031403 :  ia1=1;iatm=0
     703     63565768 :  do itypat=1,ntypat
     704              : 
     705              : !  Get atom loop indices for different types:
     706     38534365 :    ia2=ia1+nattyp(itypat)-1;ia5=1
     707              : 
     708              : !  Select quantities specific to the current type of atom
     709    479185541 :    nlmn=count(indlmn(3,:,itypat)>0)
     710              : 
     711              : !  Test on local part
     712     38534365 :    testnl=(paw_opt/=0)
     713     48122562 :    if (paw_opt==0) testnl=any(abs(enl(:,:,:,:))>tol10)
     714              : 
     715              : !  Some non-local part is to be applied for that type of atom
     716     38534365 :    if (testnl) then
     717              : 
     718              : !    Store some quantities depending only of the atom type
     719     38533021 :      ffnlin_typ => ffnlin(:,:,:,itypat)
     720     38533021 :      indlmn_typ => indlmn(:,:,itypat)
     721     38533021 :      if (signs==2) then
     722     36551897 :        ffnlout_typ => ffnlout(:,:,:,itypat)
     723              :      end if
     724     38533021 :      if (paw_opt>=2) then
     725     63901632 :        ABI_MALLOC(sij_typ,(nlmn*(nlmn+1)/2))
     726     21300544 :        if (cplex_enl==1) then
     727   1449784887 :          do ilmn=1,nlmn*(nlmn+1)/2
     728   1449784887 :            sij_typ(ilmn)=sij(ilmn,itypat)
     729              :          end do
     730              :        else
     731    272198975 :          do ilmn=1,nlmn*(nlmn+1)/2
     732    272198975 :            sij_typ(ilmn)=sij(2*ilmn-1,itypat)
     733              :          end do
     734              :        end if
     735              :      else
     736     17232477 :        ABI_MALLOC(sij_typ,(0))
     737              :      end if
     738              : 
     739              : !    Loop over atoms of the same type
     740              : !    ==============================================================
     741              : 
     742              : !    Cut the sum on different atoms in blocks, to allow memory saving.
     743              : !    Inner summations on atoms will be done from ia3 to ia4.
     744              : !    Note: the maximum range from ia3 to ia4 is mincat (max. increment of atoms).
     745              : 
     746     38533021 :      do ia3=ia1,ia2,mincat
     747     38665329 :        ia4=min(ia2,ia3+mincat-1)
     748              : !      Give the increment of number of atoms in this subset.
     749     38665329 :        nincat=ia4-ia3+1
     750              : 
     751              : !      Prepare the phase factors if they were not already computed
     752     38665329 :        if (nloalg(2)<=0) then
     753       362256 :          call ph1d3d(ia3,ia4,kgin,matblk,natom,npwin,n1,n2,n3,phkxredin,ph1d,ph3din)
     754              :        end if
     755              : 
     756              : !      Allocate memory for projected scalars
     757    231991974 :        ABI_MALLOC(gx,(cplex,nlmn,nincat,nspinor))
     758    231991974 :        ABI_MALLOC(gxfac,(cplex_fac,nlmn,nincat,nspinor))
     759    270657303 :        ABI_MALLOC(dgxdt,(cplex,ndgxdt,nlmn,nincat,nspinor))
     760    270657303 :        ABI_MALLOC(d2gxdt,(cplex,nd2gxdt,nlmn,nincat,nspinor))
     761    270657303 :        ABI_MALLOC(d2gxdtfac,(cplex_fac,nd2gxdtfac,nlmn,nincat,nspinor))
     762    270657303 :        ABI_MALLOC(dgxdtfac,(cplex_fac,ndgxdtfac,nlmn,nincat,nspinor))
     763   3700940626 :        gx(:,:,:,:)=zero;gxfac(:,:,:,:)=zero
     764    431082564 :        if (ndgxdt>0) dgxdt(:,:,:,:,:)=zero
     765    293715385 :        if (ndgxdtfac>0) dgxdtfac(:,:,:,:,:)=zero
     766    135059542 :        if (nd2gxdt>0) d2gxdt(:,:,:,:,:)=zero
     767    109990590 :        if (nd2gxdtfac>0) d2gxdtfac(:,:,:,:,:)=zero
     768     38665329 :        if (paw_opt>=3) then
     769     98885585 :          ABI_MALLOC(gxfac_sij,(cplex,nlmn,nincat,nspinor))
     770    138439819 :          ABI_MALLOC(dgxdtfac_sij,(cplex,ndgxdtfac,nlmn,nincat,nspinor))
     771    138439819 :          ABI_MALLOC(d2gxdtfac_sij,(cplex,nd2gxdtfac,nlmn,nincat,nspinor))
     772   1059638301 :          gxfac_sij(:,:,:,:)=zero
     773     98844665 :          if (ndgxdtfac>0) dgxdtfac_sij(:,:,:,:,:)=zero
     774     20984371 :          if (nd2gxdtfac>0) d2gxdtfac_sij(:,:,:,:,:) = zero
     775              :        else
     776     18888212 :          ABI_MALLOC(gxfac_sij,(0,0,0,0))
     777     18888212 :          ABI_MALLOC(dgxdtfac_sij,(0,0,0,0,0))
     778     18888212 :          ABI_MALLOC(d2gxdtfac_sij,(0,0,0,0,0))
     779              :        end if
     780              : 
     781              : !      When istwf_k > 1, gx derivatives can be real or pure imaginary
     782              : !      cplex_dgxdt(i)  = 1 if dgxdt(1,i,:,:)  is real, 2 if it is pure imaginary
     783              : !      cplex_d2gxdt(i) = 1 if d2gxdt(1,i,:,:) is real, 2 if it is pure imaginary
     784    115995987 :        ABI_MALLOC(cplex_dgxdt,(ndgxdt))
     785    115995987 :        ABI_MALLOC(cplex_d2gxdt,(nd2gxdt))
     786     86399653 :        cplex_dgxdt(:) = 1 ; cplex_d2gxdt(:) = 1
     787     38665329 :        if(ndgxdt > 0) then
     788              :          if (choice==5.or.choice==51.or.choice==52.or.choice==53.or. &
     789      8204673 : &         choice==8.or.choice==81) cplex_dgxdt(:) = 2
     790      5090672 :          if (choice==54.and.signs==1) cplex_dgxdt(4:6) = 2
     791      5046256 :          if (choice==54.and.signs==2) cplex_dgxdt(:)   = 2
     792      5020784 :          if (choice==55.and.signs==1) cplex_dgxdt(7:9) = 2
     793              :        end if
     794     38665329 :        if(nd2gxdt > 0) then
     795       829469 :          if (choice==54) cplex_d2gxdt(:) = 2
     796       655037 :          if (choice==55.and.signs==1) cplex_d2gxdt(1:18)= 2
     797              :        end if
     798              : 
     799              : !      Compute projection of current wave function |c> on each
     800              : !      non-local projector: <p_lmn|c>
     801              : !      ==============================================================
     802              : 
     803              : !      Retrieve eventually <p_lmn|c> coeffs (and derivatives)
     804     38665329 :        if (cpopt>=2) then
     805     21009363 :          do ispinor=1,nspinor
     806     33533552 :            do ia=1,nincat
     807    337414353 :              gx(1:cplex,1:nlmn,ia,ispinor)=cprjin(iatm+ia,ispinor)%cp(1:cplex,1:nlmn)
     808              :            end do
     809              :          end do
     810              :        end if
     811     38665329 :        if (cpopt==4.and.ndgxdt>0) then
     812      1298212 :          ndgxdt_stored = cprjin(1,1)%ncpgr
     813      1298212 :          ishift=0
     814      1298212 :          if (((choice==2).or.(choice==3)).and.(ndgxdt_stored>ndgxdt).and.(signs==2)) ishift=idir-ndgxdt
     815      1298212 :          if ((choice==2).and.(ndgxdt_stored==9).and.(signs==2)) ishift=ishift+6
     816      1298212 :          if (choice==2.and.(ndgxdt_stored>ndgxdt).and.(signs==1)) ishift=ndgxdt_stored-ndgxdt
     817      1298212 :          if(cplex == 2) then
     818      2614856 :            do ispinor=1,nspinor
     819      4115208 :              do ia=1,nincat
     820      2816996 :                if (ndgxdt_stored==ndgxdt.or.(ndgxdt_stored>ndgxdt.and.((choice==2).or.(choice==3)))) then
     821     51054164 :                  dgxdt(1:2,1:ndgxdt,1:nlmn,ia,ispinor)=cprjin(iatm+ia,ispinor)%dcp(1:2,1+ishift:ndgxdt+ishift,1:nlmn)
     822        92268 :                else if (signs==2.and.ndgxdt_stored==3) then
     823        92268 :                  if (choice==5.or.choice==51.or.choice==52) then ! ndgxdt=1
     824      2258700 :                    dgxdt(1:2,1,1:nlmn,ia,ispinor)=cprjin(iatm+ia,ispinor)%dcp(1:2,idir,1:nlmn)
     825              :                  else if (choice==53) then ! ndgxdt=1
     826            0 :                    idir1 = mod(idir+1,3)+1
     827            0 :                    dgxdt(1:2,1,1:nlmn,ia,ispinor)=cprjin(iatm+ia,ispinor)%dcp(1:2,idir1,1:nlmn)
     828              :                  else if (choice==8) then ! ndgxdt=2
     829          768 :                    idir1=(idir-1)/3+1; idir2=mod((idir-1),3)+1
     830        19200 :                    dgxdt(1:2,1,1:nlmn,ia,ispinor)=cprjin(iatm+ia,ispinor)%dcp(1:2,idir1,1:nlmn)
     831        19200 :                    dgxdt(1:2,2,1:nlmn,ia,ispinor)=cprjin(iatm+ia,ispinor)%dcp(1:2,idir2,1:nlmn)
     832              :                  else if (choice==81) then ! ndgxdt=1
     833         1152 :                    idir1=(idir-1)/3+1; idir2=mod((idir-1),3)+1
     834        28800 :                    dgxdt(1:2,1,1:nlmn,ia,ispinor)=cprjin(iatm+ia,ispinor)%dcp(1:2,idir2,1:nlmn)
     835              :                  end if
     836              :                end if
     837              :              end do
     838              :            end do
     839              :          else ! cplex != 2
     840            0 :            do ispinor=1,nspinor
     841            0 :              do ia=1,nincat
     842            0 :                do ilmn=1,nlmn
     843            0 :                  if (ndgxdt_stored==ndgxdt.or.(ndgxdt_stored>ndgxdt.and.((choice==2).or.(choice==3)))) then
     844            0 :                    do ii=1,ndgxdt
     845            0 :                      ic = cplex_dgxdt(ii)
     846            0 :                      dgxdt(1,ii,ilmn,ia,ispinor)=cprjin(iatm+ia,ispinor)%dcp(ic,ii+ishift,ilmn)
     847              :                    end do
     848            0 :                  else if (signs==2.and.ndgxdt_stored==3) then
     849            0 :                    if (choice==5.or.choice==51.or.choice==52) then ! ndgxdt=1
     850            0 :                      dgxdt(1,1,ilmn,ia,ispinor)=cprjin(iatm+ia,ispinor)%dcp(cplex_dgxdt(1),idir,ilmn)
     851              :                    else if (choice==53) then ! ndgxdt=1
     852            0 :                      idir1 = mod(idir+1,3)+1
     853            0 :                      dgxdt(1,1,1:nlmn,ia,ispinor)=cprjin(iatm+ia,ispinor)%dcp(cplex_dgxdt(1),idir1,1:nlmn)
     854              :                    else if (choice==8) then ! ndgxdt=2
     855            0 :                      idir1=(idir-1)/3+1; idir2=mod((idir-1),3)+1
     856            0 :                      dgxdt(1,1,ilmn,ia,ispinor)=cprjin(iatm+ia,ispinor)%dcp(cplex_dgxdt(1),idir1,ilmn)
     857            0 :                      dgxdt(1,2,ilmn,ia,ispinor)=cprjin(iatm+ia,ispinor)%dcp(cplex_dgxdt(2),idir2,ilmn)
     858              :                    else if (choice==81) then ! ndgxdt=1
     859            0 :                      idir1=(idir-1)/3+1; idir2=mod((idir-1),3)+1
     860            0 :                      dgxdt(1,1,ilmn,ia,ispinor)=cprjin(iatm+ia,ispinor)%dcp(cplex_dgxdt(1),idir2,ilmn)
     861              :                    end if
     862              :                  end if
     863              :                end do
     864              :              end do
     865              :            end do
     866              :          end if ! cplex == 2
     867              :        end if ! cpopt==4 and ndgxdt>0
     868              : 
     869              :        ! Computation or <p_lmn|c> (and derivatives) for this block of atoms if :
     870              :        !    <p_lmn|c> are not in memory : cpopt<=1
     871              :        ! OR <p_lmn|c> are in memory, but we need derivatives : cpopt<=3 and abs(choice_a)>1
     872              :        ! OR <p_lmn|c> and first derivatives are in memory, but we need second derivatives : choice=8 or 81
     873     38665329 :        if (cpopt<=1.or.(cpopt<=3.and.abs(choice_a)>1).or.choice==8.or.choice==81) then
     874              : !       if ((cpopt<4.and.choice_a/=-1).or.choice==8.or.choice==81) then
     875     28289817 :          if (abs(choice_a)>1.or.no_opernla_mv) then
     876              : !           call timab(1101,1,tsec)
     877              :            call opernla_ylm(choice_a,cplex,cplex_dgxdt,cplex_d2gxdt,dimffnlin,d2gxdt,dgxdt,ffnlin_typ,gx,&
     878              : &           ia3,idir,indlmn_typ,istwf_k,kpgin_,matblk,mpi_enreg,nd2gxdt,ndgxdt,nincat,nkpgin_,nlmn,&
     879     28289817 : &           nloalg,npwin,nspinor,ph3din,signs,ucvol,vectin,qdir=qdir)
     880              : !           call timab(1101,2,tsec)
     881              :          else
     882              : !           call timab(1102,1,tsec)
     883              :            call opernla_ylm_mv(choice_a,cplex,dimffnlin,ffnlin_typ,gx,&
     884              : &           ia3,indlmn_typ,istwf_k,matblk,mpi_enreg,nincat,nlmn,&
     885            0 : &           nloalg,npwin,nspinor,ph3din,ucvol,vectin)
     886              : !           call timab(1102,2,tsec)
     887              :          end if
     888              :        end if
     889              : 
     890              : !      Transfer result to output variable cprj (if requested)
     891              : !      cprj(:)%cp receive the <p_i|Psi> factors (p_i: non-local projector)
     892              : !      Be careful: cprj(:)%dcp does not exactly contain the derivative of cprj(:)%cp.
     893              : !                  - Volume contributions (in case of strain derivative) are not included,
     894              : !                  - Global coordinate transformation are not applied,
     895              : !                  cprj(:)%dcp is meant to be a restart argument of the present nonlop routine.
     896     38665329 :        if (cpopt==0.or.cpopt==1) then
     897     17722762 :          do ispinor=1,nspinor
     898     30581128 :            do ia=1,nincat
     899     12858366 :              cprjin(iatm+ia,ispinor)%nlmn=nlmn
     900    372665204 :              cprjin(iatm+ia,ispinor)%cp(1:cplex,1:nlmn)=gx(1:cplex,1:nlmn,ia,ispinor)
     901     29144615 :              if (cplex==1) cprjin(iatm+ia,ispinor)%cp(2,1:nlmn)=zero
     902              :            end do
     903              :          end do
     904              :        end if
     905     38665329 :        if ((cpopt==1.or.cpopt==3).and.ndgxdt>0) then
     906       172928 :          ishift=0
     907       172928 :          if ((choice==2).and.(cprjin(1,1)%ncpgr>ndgxdt)) ishift=cprjin(1,1)%ncpgr-ndgxdt
     908       172928 :          if(cplex==2)then
     909       345856 :            do ispinor=1,nspinor
     910       538576 :              do ia=1,nincat
     911     15350496 :                cprjin(iatm+ia,ispinor)%dcp(1:2,1+ishift:ndgxdt+ishift,1:nlmn)=dgxdt(1:2,1:ndgxdt,1:nlmn,ia,ispinor)
     912              : !               cprjin(iatm+ia,ispinor)%dcp(1:2,1:ndgxdt,1:nlmn)=dgxdt(1:2,1:ndgxdt,1:nlmn,ia,ispinor)
     913              :              end do
     914              :            end do
     915              :          else
     916            0 :            do ispinor=1,nspinor
     917            0 :              do ia=1,nincat
     918            0 :                do ilmn=1,nlmn
     919            0 :                  do ii=1,ndgxdt
     920            0 :                    ic = cplex_dgxdt(ii) ; jc = 3 - ic
     921            0 :                    cprjin(iatm+ia,ispinor)%dcp(ic,ii+ishift,ilmn)=dgxdt(1,ii,ilmn,ia,ispinor)
     922            0 :                    cprjin(iatm+ia,ispinor)%dcp(jc,ii+ishift,ilmn)=zero
     923              : !                   cprjin(iatm+ia,ispinor)%dcp(ic,ii,ilmn)=dgxdt(1,ii,ilmn,ia,ispinor)
     924              : !                   cprjin(iatm+ia,ispinor)%dcp(jc,ii,ilmn)=zero
     925              :                  end do
     926              :                end do
     927              :              end do
     928              :            end do
     929              :          end if
     930              :        end if
     931              : 
     932              : !      If choice==0, that's all for these atoms !
     933     38665329 :        if (choice>0) then
     934     36071915 :          if(choice/=7) then
     935              : !           call timab(1105,1,tsec)
     936              : !          Contraction from <p_i|c> to Sum_j[Dij.<p_j|c>] (and derivatives)
     937              :            call opernlc_ylm(atindx1,cplex,cplex_dgxdt,cplex_d2gxdt,cplex_enl,cplex_fac,dgxdt,dgxdtfac,dgxdtfac_sij,&
     938              : &           d2gxdt,d2gxdtfac,d2gxdtfac_sij,dimenl1,dimenl2,dimekbq,enl,gx,gxfac,gxfac_sij,&
     939              : &           iatm,indlmn_typ,itypat,lambda,mpi_enreg,natom,ndgxdt,ndgxdtfac,nd2gxdt,nd2gxdtfac,&
     940     34745067 : &           nincat,nlmn,nspinor,nspinortot,optder,paw_opt,sij_typ)
     941              : !           call timab(1105,2,tsec)
     942              :          else
     943     70435680 :             gxfac_sij=gx
     944              :          end if
     945              : 
     946              : !        Operate with the non-local potential on the projected scalars,
     947              : !        in order to get contributions to energy/forces/stress/dyn.mat
     948              : !        ==============================================================
     949     36071915 :          if (signs==1) then
     950       738502 :            if (.not.present(cprjin_left)) then
     951              : !             call timab(1106,1,tsec)
     952              :              call opernld_ylm(choice_b,cplex,cplex_fac,ddkk,dgxdt,dgxdtfac,dgxdtfac_sij,d2gxdt,&
     953              : &             enlk,enlout,fnlk,gx,gxfac,gxfac_sij,ia3,natom,ndat_left_,nd2gxdt,ndgxdt,ndgxdtfac,&
     954       517542 : &             nincat,nlmn,nnlout,nspinor,paw_opt,strnlk)
     955              : !             call timab(1106,2,tsec)
     956              :            else
     957      1325760 :              ABI_MALLOC(gx_left,(cplex,nlmn,nincat,nspinor*ndat_left_))
     958              : !            Retrieve <p_lmn|c> coeffs
     959      2217120 :              do ispinor=1,nspinor*ndat_left_
     960      6773920 :                do ia=1,nincat
     961    149784960 :                  gx_left(1:cplex,1:nlmn,ia,ispinor)=cprjin_left(iatm+ia,ispinor)%cp(1:cplex,1:nlmn)
     962              :                end do
     963              :              end do
     964              : !            TODO
     965              : !            if (cpopt==4.and.ndgxdt>0) then
     966              : !            do ispinor=1,nspinor
     967              : !            do ia=1,nincat
     968              : !            dgxdt_left(1:cplex,1:ndgxdt,1:nlmn,ia,ispinor)=cprjin_left(iatm+ia,ispinor)%dcp(1:cplex,1:ndgxdt,1:nlmn)
     969              : !            end do
     970              : !            end do
     971              : !            end if
     972       220960 :              if (present(enlout_im)) then
     973              : !               call timab(1108,1,tsec)
     974              :                call opernld_ylm(choice_b,cplex,cplex_fac,ddkk,dgxdt,dgxdtfac,dgxdtfac_sij,d2gxdt,&
     975              : &               enlk,enlout,fnlk,gx_left,gxfac,gxfac_sij,ia3,natom,ndat_left_,nd2gxdt,ndgxdt,ndgxdtfac,&
     976       220960 : &               nincat,nlmn,nnlout,nspinor,paw_opt,strnlk,enlout_im=enlout_im)
     977              : !               call timab(1108,2,tsec)
     978              :              else
     979              : !               call timab(1107,1,tsec)
     980              :                call opernld_ylm(choice_b,cplex,cplex_fac,ddkk,dgxdt,dgxdtfac,dgxdtfac_sij,d2gxdt,&
     981              : &               enlk,enlout,fnlk,gx_left,gxfac,gxfac_sij,ia3,natom,ndat_left_,nd2gxdt,ndgxdt,ndgxdtfac,&
     982            0 : &               nincat,nlmn,nnlout,nspinor,paw_opt,strnlk)
     983              : !               call timab(1107,2,tsec)
     984              :              end if
     985       220960 :              ABI_FREE(gx_left)
     986              :            end if
     987              :          end if ! signs == 1
     988              : 
     989              : !        Operate with the non-local potential on the projected scalars,
     990              : !        in order to get matrix element
     991              : !        ==============================================================
     992     36071915 :          if (signs==2) then
     993              : !          Prepare the phase factors if they were not already computed
     994     35333413 :            if(nloalg(2)<=0) then
     995       362256 :              call ph1d3d(ia3,ia4,kgout,matblk,natom,npwout,n1,n2,n3,phkxredout,ph1d,ph3dout)
     996              :            end if
     997     35333413 :            if (abs(choice_b)>1.or.no_opernlb_mv) then
     998              : !             call timab(1103,1,tsec)
     999              :              call opernlb_ylm(choice_b,cplex,cplex_dgxdt,cplex_d2gxdt,cplex_fac,&
    1000              : &             d2gxdtfac,d2gxdtfac_sij,dgxdtfac,dgxdtfac_sij,dimffnlout,ffnlout_typ,gxfac,gxfac_sij,ia3,&
    1001              : &             idir,indlmn_typ,kpgout_,matblk,ndgxdtfac,nd2gxdtfac,nincat,nkpgout_,nlmn,&
    1002     35333413 : &             nloalg,npwout,nspinor,paw_opt,ph3dout,svectout,ucvol,vectout,qdir=qdir)
    1003              : !             call timab(1103,2,tsec)
    1004              :            else
    1005              : !             call timab(1104,1,tsec)
    1006              :              call opernlb_ylm_mv(choice_b,cplex,cplex_fac,&
    1007              : &             dimffnlout,ffnlout_typ,gxfac,gxfac_sij,ia3,indlmn_typ,matblk,nincat,nlmn,&
    1008            0 : &             nloalg,npwout,nspinor,paw_opt,ph3dout,svectout,ucvol,vectout)
    1009              : !             call timab(1104,2,tsec)
    1010              :            end if
    1011              :          end if ! signs == 2
    1012              : 
    1013              :        end if ! choice>=0
    1014              : 
    1015              : !      Deallocate temporary projected scalars
    1016     38665329 :        ABI_FREE(gx)
    1017     38665329 :        ABI_FREE(gxfac)
    1018     38665329 :        ABI_FREE(dgxdt)
    1019     38665329 :        ABI_FREE(dgxdtfac)
    1020     38665329 :        ABI_FREE(d2gxdt)
    1021     38665329 :        ABI_FREE(d2gxdtfac)
    1022     38665329 :        ABI_FREE(dgxdtfac_sij)
    1023     38665329 :        ABI_FREE(d2gxdtfac_sij)
    1024     38665329 :        ABI_FREE(gxfac_sij)
    1025     38665329 :        ABI_FREE(cplex_dgxdt)
    1026     38665329 :        ABI_FREE(cplex_d2gxdt)
    1027              : 
    1028              : !      End sum on atom subset loop
    1029     38803442 :        iatm=iatm+nincat;ia5=ia5+nincat
    1030              :      end do
    1031              :      !if (paw_opt>=2)  then
    1032     38533021 :      ABI_FREE(sij_typ)
    1033              :      !end if
    1034              : 
    1035              : !    End condition of existence of a non-local part
    1036              :    else
    1037         1344 :      if (cpopt==0.or.cpopt==1) then
    1038            0 :        do ispinor=1,nspinor
    1039            0 :          do ia=1,nattyp(itypat)
    1040            0 :            cprjin(iatm+ia,ispinor)%cp(:,1:nlmn)=zero
    1041              :          end do
    1042              :        end do
    1043              :      end if
    1044         1344 :      if ((cpopt==1.or.cpopt==3).and.ndgxdt>0) then
    1045            0 :        ishift=0
    1046            0 :        if ((choice==2).and.(cprjin(1,1)%ncpgr>ndgxdt)) ishift=cprjin(1,1)%ncpgr-ndgxdt
    1047            0 :        do ispinor=1,nspinor
    1048            0 :          do ia=1,nattyp(itypat)
    1049            0 :            cprjin(iatm+ia,ispinor)%dcp(:,1+ishift:ndgxdt+ishift,1:nlmn)=zero
    1050              : !           cprjin(iatm+ia,ispinor)%dcp(:,1:ndgxdt,1:nlmn)=zero
    1051              :          end do
    1052              :        end do
    1053              :      end if
    1054         1344 :      iatm=iatm+nattyp(itypat)
    1055              :    end if
    1056              : 
    1057              : !  End atom type loop
    1058     63565768 :    ia1=ia2+1
    1059              :  end do
    1060              : 
    1061              : 
    1062              : !Reduction in case of parallelism
    1063              : !==============================================================
    1064              : 
    1065     25031403 :  if (signs==1.and.mpi_enreg%paral_spinor==1) then
    1066         9272 :    if (nnlout/=0) then
    1067         1304 :      call xmpi_sum(enlout,mpi_enreg%comm_spinor,ierr)
    1068              :    end if
    1069         9272 :    if (choice==3.or.choice==6.or.choice==23) then
    1070         1304 :      call xmpi_sum(enlk,mpi_enreg%comm_spinor,ierr)
    1071              :    end if
    1072         9272 :    if (choice==6) then
    1073            0 :      call xmpi_sum(fnlk,mpi_enreg%comm_spinor,ierr)
    1074            0 :      call xmpi_sum(strnlk,mpi_enreg%comm_spinor,ierr)
    1075              :    end if
    1076         9272 :    if (choice==55) then
    1077            0 :      call xmpi_sum(ddkk,mpi_enreg%comm_spinor,ierr)
    1078              :    end if
    1079              :  end if
    1080              : 
    1081              : !Coordinate transformations
    1082              : !==============================================================
    1083              : 
    1084              : !Need sometimes gmet
    1085     25031403 :  if ((signs==1.and.paw_opt<=3).and. &
    1086              : & (choice==5 .or.choice==51.or.choice==52.or.choice==53.or.&
    1087              : & choice==54.or.choice==55)) then
    1088        15120 :    ABI_MALLOC(gmet,(3,3))
    1089     25817643 :    gmet = MATMUL(TRANSPOSE(gprimd),gprimd)
    1090              :  end if
    1091              : 
    1092              : !1st derivative wrt to strain (stress tensor):
    1093              : ! - convert from reduced to cartesian coordinates
    1094              : ! - substract volume contribution
    1095     25031403 :  if ((choice==3.or.choice==23).and.signs==1.and.paw_opt<=3) then
    1096        67289 :    mu0=0 ! Shift to be applied in enlout array
    1097        67289 :    ABI_MALLOC(work1,(6))
    1098       471023 :    work1(1:6)=enlout(mu0+1:mu0+6)
    1099        67289 :    call strconv(work1,gprimd,work1)
    1100       269156 :    enlout(mu0+1:mu0+3)=(work1(1:3)-enlk)
    1101       269156 :    enlout(mu0+4:mu0+6)= work1(4:6)
    1102        67289 :    ABI_FREE(work1)
    1103              :  end if
    1104              : 
    1105              : !1st derivative wrt to k wave vector (ddk):
    1106              : ! - convert from cartesian to reduced coordinates
    1107     25031403 :  if ((choice==5.or.choice==53).and.signs==1.and.paw_opt<=3) then
    1108         1152 :    mu0=0 ! Shift to be applied in enlout array
    1109         1152 :    ABI_MALLOC(work1,(3))
    1110         4608 :    work1(:)=enlout(mu0+1:mu0+3)
    1111         4608 :    enlout(mu0+1:mu0+3)=gmet(:,1)*work1(1)+gmet(:,2)*work1(2)+gmet(:,3)*work1(3)
    1112         1152 :    ABI_FREE(work1)
    1113              :  end if
    1114     25031403 :  if ((choice==51.or.choice==52).and.signs==1.and.paw_opt<=3) then
    1115            0 :    mu0=0 ! Shift to be applied in enlout array
    1116            0 :    ABI_MALLOC(work1,(3))
    1117            0 :    do mu=1,2 ! Loop for Re,Im
    1118            0 :      work1(1:3)=(/enlout(mu0+1),enlout(mu0+3),enlout(mu0+5)/)
    1119            0 :      enlout(mu0+1)=gmet(1,1)*work1(1)+gmet(1,2)*work1(2)+gmet(1,3)*work1(3)
    1120            0 :      enlout(mu0+3)=gmet(2,1)*work1(1)+gmet(2,2)*work1(2)+gmet(2,3)*work1(3)
    1121            0 :      enlout(mu0+5)=gmet(3,1)*work1(1)+gmet(3,2)*work1(2)+gmet(3,3)*work1(3)
    1122            0 :      mu0=mu0+1
    1123              :    end do
    1124            0 :    ABI_FREE(work1)
    1125              :  end if
    1126              : 
    1127              : !2nd derivative wrt to k wave vector and atomic position (effective charges):
    1128              : ! - convert from cartesian to reduced coordinates
    1129     25031403 :  if (choice==54.and.signs==1.and.paw_opt<=3) then
    1130        11392 :    mu0=0 ! Shift to be applied in enlout array
    1131        11392 :    ABI_MALLOC(work1,(3))
    1132        11392 :    ABI_MALLOC(work2,(3))
    1133        81664 :    do mu=1,3*natom
    1134              : !    First, real part
    1135        70272 :      work1(1)=enlout(mu0+1);work1(2)=enlout(mu0+3);work1(3)=enlout(mu0+5)
    1136       281088 :      work2(:)=gmet(:,1)*work1(1)+gmet(:,2)*work1(2)+gmet(:,3)*work1(3)
    1137        70272 :      enlout(mu0+1)=work2(1);enlout(mu0+3)=work2(2);enlout(mu0+5)=work2(3)
    1138              : !    Then imaginary part
    1139        70272 :      work1(1)=enlout(mu0+2);work1(2)=enlout(mu0+4);work1(3)=enlout(mu0+6)
    1140       281088 :      work2(:)=gmet(:,1)*work1(1)+gmet(:,2)*work1(2)+gmet(:,3)*work1(3)
    1141        70272 :      enlout(mu0+2)=work2(1);enlout(mu0+4)=work2(2);enlout(mu0+6)=work2(3)
    1142        81664 :      mu0=mu0+6
    1143              :    end do
    1144        11392 :    ABI_FREE(work1)
    1145        11392 :    ABI_FREE(work2)
    1146              :  end if
    1147              : 
    1148              : !2nd derivative wrt to k wave vector and strain (piezoelectric tensor):
    1149              : ! - convert from cartesian to reduced coordinates (k point)
    1150              : ! - convert from reduced to cartesian coordinates (strain)
    1151              : ! - substract volume contribution
    1152              : ! - symetrize strain components
    1153     25031403 :  if (choice==55.and.signs==1.and.paw_opt<=3) then
    1154         2576 :    ABI_MALLOC(work3,(2,3))
    1155         2576 :    ABI_MALLOC(work4,(2,3))
    1156         2576 :    ABI_MALLOC(work5,(2,3,6))
    1157         2576 :    ABI_MALLOC(work7,(2,3,6))
    1158         2576 :    ABI_MALLOC(work6,(2,3,3))
    1159        10304 :    do ic=1,3 ! gamma
    1160       471408 :      work5=zero
    1161        30912 :      do jc=1,3 ! nu
    1162       100464 :        do ii=1,3 ! lambda
    1163        69552 :          mu=(gamma(jc,ii)-1)*3+1
    1164              :          work5(1,jc,ii)=gmet(ic,1)*enlout(2*mu-1)+gmet(ic,2)*enlout(2*mu+1) &
    1165        69552 : &         +gmet(ic,3)*enlout(2*mu+3)
    1166              :          work5(2,jc,ii)=gmet(ic,1)*enlout(2*mu  )+gmet(ic,2)*enlout(2*mu+2) &
    1167        92736 : &         +gmet(ic,3)*enlout(2*mu+4)
    1168              :        end do
    1169              :      end do
    1170       239568 :      work6=zero
    1171        30912 :      do jc=1,3 ! nu
    1172       100464 :        do ii=1,3 ! beta
    1173              :          work6(1:cplex,ii,jc)=gprimd(ii,1)*work5(1:cplex,jc,1)+gprimd(ii,2)*work5(1:cplex,jc,2) &
    1174       231840 : &         +gprimd(ii,3)*work5(1:cplex,jc,3)
    1175              :        end do
    1176              :      end do
    1177        33488 :      do jc=1,3 ! alpha
    1178       100464 :        do ii=1,3 ! beta
    1179        69552 :          mu=gamma(jc,ii)
    1180              :          work7(1:cplex,ic,mu)=gprimd(jc,1)*work6(1:cplex,ii,1)+gprimd(jc,2)*work6(1:cplex,ii,2) &
    1181       231840 : &         +gprimd(jc,3)*work6(1:cplex,ii,3)
    1182              :        end do
    1183              :      end do
    1184              :    end do ! gamma
    1185              : 
    1186        10304 :    do ii=1,3 ! alpha
    1187              :      work3(1,ii)=gprimd(ii,1)*ddkk(2*1-1)+gprimd(ii,2)*ddkk(2*2-1) &
    1188         7728 : &     +gprimd(ii,3)*ddkk(2*3-1)
    1189              :      work3(2,ii)=gprimd(ii,1)*ddkk(2*1  )+gprimd(ii,2)*ddkk(2*2  ) &
    1190        10304 : &     +gprimd(ii,3)*ddkk(2*3  )
    1191              :    end do
    1192        10304 :    do ii=1,3 ! gamma
    1193              :      work4(1,ii)=gmet(ii,1)*ddkk(2*1-1)+gmet(ii,2)*ddkk(2*2-1) &
    1194         7728 : &     +gmet(ii,3)*ddkk(2*3-1)
    1195              :      work4(2,ii)=gmet(ii,1)*ddkk(2*1  )+gmet(ii,2)*ddkk(2*2  ) &
    1196        10304 : &     +gmet(ii,3)*ddkk(2*3  )
    1197              :    end do
    1198              : 
    1199        18032 :    do mu=1,6
    1200        15456 :      ii=alpha(mu) ! alpha
    1201        15456 :      ic=beta(mu) ! beta
    1202        64400 :      do jc=1,3 ! gamma
    1203              :        work7(1:cplex,jc,mu)=work7(1:cplex,jc,mu)-half &
    1204       139104 : &       *(gprimd(ic,jc)*work3(1:cplex,ii)+gprimd(ii,jc)*work3(1:cplex,ic))
    1205       108192 :        if (ii==ic) work7(1:cplex,jc,mu)=work7(1:cplex,jc,mu)-work4(1:cplex,jc)
    1206              :      end do
    1207              :    end do
    1208        18032 :    do mu=1,6 ! alpha,beta
    1209        64400 :      do nu=1,3 ! gamma
    1210        46368 :        mu0=3*(mu-1)+nu
    1211        46368 :        enlout(2*mu0-1)=work7(1,nu,mu)
    1212        61824 :        enlout(2*mu0  )=work7(2,nu,mu)
    1213              :      end do
    1214              :    end do
    1215         2576 :    ABI_FREE(gmet)
    1216         2576 :    ABI_FREE(work3)
    1217         2576 :    ABI_FREE(work4)
    1218         2576 :    ABI_FREE(work5)
    1219         2576 :    ABI_FREE(work6)
    1220         2576 :    ABI_FREE(work7)
    1221              :  end if
    1222              : 
    1223              : !2nd derivative wrt to 2 k wave vectors (effective mass):
    1224              : ! - convert from cartesian to reduced coordinates
    1225     25031403 :  if ((choice==8.or.choice==81).and.signs==1.and.paw_opt<=3) then
    1226          960 :    mu0=0 ! Shift to be applied in enlout array
    1227          960 :    ABI_MALLOC(work3,(3,3))
    1228          960 :    ABI_MALLOC(work4,(3,3))
    1229          960 :    mua=1;if (choice==81) mua=2
    1230         2496 :    do ii=1,mua ! Loop Re,Im
    1231         1536 :      if (choice==8) then ! enlout is real in Voigt notation
    1232          384 :        work3(1,1)=enlout(mu0+1) ; work3(1,2)=enlout(mu0+6) ; work3(1,3)=enlout(mu0+5)
    1233          384 :        work3(2,1)=enlout(mu0+6) ; work3(2,2)=enlout(mu0+2) ; work3(2,3)=enlout(mu0+4)
    1234          384 :        work3(3,1)=enlout(mu0+5) ; work3(3,2)=enlout(mu0+4) ; work3(3,3)=enlout(mu0+3)
    1235              :      else                ! enlout is complex in matrix notation
    1236         1152 :        work3(1,1)=enlout(mu0+1 ) ; work3(1,2)=enlout(mu0+3 ) ; work3(1,3)=enlout(mu0+5 )
    1237         1152 :        work3(2,1)=enlout(mu0+7 ) ; work3(2,2)=enlout(mu0+9 ) ; work3(2,3)=enlout(mu0+11)
    1238         1152 :        work3(3,1)=enlout(mu0+13) ; work3(3,2)=enlout(mu0+15) ; work3(3,3)=enlout(mu0+17)
    1239              :      end if
    1240         6144 :      do mu=1,3
    1241        19968 :        work4(:,mu)=gprimd(:,1)*work3(mu,1)+gprimd(:,2)*work3(mu,2)+gprimd(:,3)*work3(mu,3)
    1242              :      end do
    1243         6144 :      do mu=1,3
    1244        19968 :        work3(:,mu)=gprimd(:,1)*work4(mu,1)+gprimd(:,2)*work4(mu,2)+gprimd(:,3)*work4(mu,3)
    1245              :      end do
    1246         6144 :      do mu=1,3
    1247        19968 :        work4(:,mu)=gprimd(1,:)*work3(mu,1)+gprimd(2,:)*work3(mu,2)+gprimd(3,:)*work3(mu,3)
    1248              :      end do
    1249         6144 :      do mu=1,3
    1250        19968 :        work3(:,mu)=gprimd(1,:)*work4(mu,1)+gprimd(2,:)*work4(mu,2)+gprimd(3,:)*work4(mu,3)
    1251              :      end do
    1252         1536 :      if (choice==8) then ! enlout is real in Voigt notation
    1253          384 :        enlout(mu0+1) = work3(1,1) ; enlout(mu0+2) = work3(2,2) ; enlout(mu0+3) = work3(3,3)
    1254          384 :        enlout(mu0+4) = work3(3,2) ; enlout(mu0+5) = work3(1,3) ; enlout(mu0+6) = work3(2,1)
    1255              :      else                ! enlout is complex in matrix notation
    1256         1152 :        enlout(mu0+1 )=work3(1,1) ; enlout(mu0+3 )=work3(1,2) ; enlout(mu0+5 )=work3(1,3)
    1257         1152 :        enlout(mu0+7 )=work3(2,1) ; enlout(mu0+9 )=work3(2,2) ; enlout(mu0+11)=work3(2,3)
    1258         1152 :        enlout(mu0+13)=work3(3,1) ; enlout(mu0+15)=work3(3,2) ; enlout(mu0+17)=work3(3,3)
    1259              :      end if
    1260         2496 :      mu0=mu0+1
    1261              :    end do
    1262          960 :    ABI_FREE(work3)
    1263          960 :    ABI_FREE(work4)
    1264              :  end if
    1265              : 
    1266              : !2nd derivative wrt to 2 strains (elastic tensor):
    1267              : ! - convert from reduced to cartesian coordinates
    1268              : ! - substract volume contribution
    1269     25031403 :  if (choice==6.and.signs==1.and.paw_opt<=3) then
    1270         2400 :    mu0=0 ! Shift to be applied in enlout array
    1271         2400 :    ABI_MALLOC(work1,(6))
    1272         2400 :    ABI_MALLOC(work2,(6))
    1273         9600 :    ABI_MALLOC(work3,(6+3*natom,6))
    1274         7200 :    work3(:,:)=reshape(enlout(mu0+1:mu0+6*(6+3*natom)),(/6+3*natom,6/))
    1275        16800 :    do mu=1,6
    1276        16800 :      call strconv(work3(1:6,mu),gprimd,work3(1:6,mu))
    1277              :    end do
    1278        32928 :    do mu=1,6+3*natom
    1279       213696 :      work1(1:6)=work3(mu,1:6)
    1280        30528 :      call strconv(work1,gprimd,work2)
    1281       216096 :      work3(mu,1:6)=work2(1:6)
    1282              :    end do
    1283         4800 :    enlout(mu0+1:mu0+6*(6+3*natom))=reshape(work3(:,:),(/6*(6+3*natom)/))
    1284         2400 :    ABI_FREE(work1)
    1285         2400 :    ABI_FREE(work2)
    1286         2400 :    ABI_FREE(work3)
    1287         2400 :    call strconv(strnlk,gprimd,strnlk)
    1288        16800 :    do mub=1,6
    1289        14400 :      nub1=alpha(mub);nub2=beta(mub)
    1290       100800 :      do mua=1,6
    1291        86400 :        mu=mu0+mua+(3*natom+6)*(mub-1)
    1292        86400 :        nua1=alpha(mua);nua2=beta(mua)
    1293        86400 :        if (mua<=3.and.mub<=3) enlout(mu)=enlout(mu)+enlk
    1294        86400 :        if (mua<=3) enlout(mu)=enlout(mu)-strnlk(mub)
    1295        86400 :        if (mub<=3) enlout(mu)=enlout(mu)-strnlk(mua)
    1296        86400 :        if (nub1==nua2) enlout(mu)=enlout(mu)-0.25d0*strnlk(gamma(nua1,nub2))
    1297        86400 :        if (nub2==nua2) enlout(mu)=enlout(mu)-0.25d0*strnlk(gamma(nua1,nub1))
    1298        86400 :        if (nub1==nua1) enlout(mu)=enlout(mu)-0.25d0*strnlk(gamma(nua2,nub2))
    1299       100800 :        if (nub2==nua1) enlout(mu)=enlout(mu)-0.25d0*strnlk(gamma(nua2,nub1))
    1300              :      end do
    1301        16800 :      if (mub<=3) then
    1302        23328 :        do nua1=1,natom
    1303        16128 :          nua2=3*(nua1-1);mu=mu0+nua2+6+(3*natom+6)*(mub-1)
    1304        71712 :          enlout(mu+1:mu+3)=enlout(mu+1:mu+3)-fnlk(nua2+1:nua2+3)
    1305              :        end do
    1306              :      end if
    1307              :    end do
    1308              :  end if
    1309              : 
    1310     25031403 :  if (allocated(gmet)) then
    1311        12544 :    ABI_FREE(gmet)
    1312              :  end if
    1313              : 
    1314              : !Final deallocations
    1315              : !==============================================================
    1316              : 
    1317     25031403 :  if (signs==1)  then
    1318      1391215 :    ABI_FREE(fnlk)
    1319      1391215 :    ABI_FREE(ddkk)
    1320      1391215 :    ABI_FREE(strnlk)
    1321              :  end if
    1322              : 
    1323     25031403 :  if (nkpgin<nkpgin_) then
    1324      1891457 :    ABI_FREE(kpgin_)
    1325              :  end if
    1326     25031403 :  if (nkpgout<nkpgout_) then
    1327      1968860 :    ABI_FREE(kpgout_)
    1328              :  end if
    1329              : 
    1330              : ! call timab(1100,2,tsec)
    1331              : 
    1332              :  DBG_EXIT("COLL")
    1333              : 
    1334     50062806 : end subroutine nonlop_ylm
    1335              : !!***
    1336              : 
    1337              : !!****f* ABINIT/nonlop_ylm_init_counters
    1338              : !! NAME
    1339              : !! nonlop_ylm_init_counters
    1340              : !!
    1341              : !! FUNCTION
    1342              : !!
    1343              : !! SOURCE
    1344              : 
    1345            0 : subroutine nonlop_ylm_init_counters()
    1346              : 
    1347            0 :    opernla_counter = 0
    1348            0 :    opernlb_counter = 0
    1349            0 :    opernla_mv_counter = 0
    1350            0 :    opernlb_mv_counter = 0
    1351            0 :    opernla_mv_dgemv_counter = 0
    1352            0 :    opernlb_mv_dgemv_counter = 0
    1353              : 
    1354            0 : end subroutine nonlop_ylm_init_counters
    1355              : !!***
    1356              : 
    1357              : !!****f* ABINIT/nonlop_ylm_stop_counters
    1358              : !! NAME
    1359              : !! nonlop_ylm_stop_counters
    1360              : !!
    1361              : !! FUNCTION
    1362              : !!
    1363              : !! SOURCE
    1364              : 
    1365            0 : subroutine nonlop_ylm_stop_counters()
    1366              : 
    1367            0 :    opernla_counter = -1
    1368            0 :    opernlb_counter = -1
    1369            0 :    opernla_mv_counter = -1
    1370            0 :    opernlb_mv_counter = -1
    1371            0 :    opernla_mv_dgemv_counter = -1
    1372            0 :    opernlb_mv_dgemv_counter = -1
    1373              : 
    1374            0 : end subroutine nonlop_ylm_stop_counters
    1375              : !!***
    1376              : 
    1377              : !!****f* ABINIT/nonlop_ylm_output_counters
    1378              : !! NAME
    1379              : !! nonlop_ylm_output_counters
    1380              : !!
    1381              : !! FUNCTION
    1382              : !!
    1383              : !! SOURCE
    1384              : 
    1385            0 : subroutine nonlop_ylm_output_counters(natom,nbandtot,ntypat,typat,mpi_enreg)
    1386              : 
    1387              : !Arguments ------------------------------------
    1388              : !scalars
    1389              :  integer,intent(in) :: natom,nbandtot,ntypat
    1390              :  integer,intent(in) :: typat(:)
    1391              :  type(MPI_type),intent(in) :: mpi_enreg
    1392              : !arrays
    1393              : 
    1394              : !Local variables-------------------------------
    1395              : !scalars
    1396              :  character(len=500) :: msg
    1397              :  integer :: cnt,ia1,ia2,ia3,ia4,ia5,iatm,ierr,itypat,mincat,nincat,opernl_calls
    1398              : !arrays
    1399            0 :  integer :: nattyp(ntypat)
    1400              : 
    1401            0 :  do itypat=1,ntypat
    1402            0 :    nattyp(itypat)=0
    1403            0 :    do iatm=1,natom
    1404            0 :      if(typat(iatm)==itypat)then
    1405              : !       atindx(iatom)=indx
    1406              : !       atindx1(indx)=iatom
    1407              : !       indx=indx+1
    1408            0 :        nattyp(itypat)=nattyp(itypat)+1
    1409              :      end if
    1410              :    end do
    1411              :  end do
    1412            0 :  call wrtout([std_out,ab_out],'','COLL')
    1413            0 :  write(msg,'(a)')                ' --- NONLOP YLM COUNTERS -----------------------------------------------------'
    1414            0 :  call wrtout([std_out,ab_out],msg,'COLL')
    1415            0 :  mincat=min(NLO_MINCAT,maxval(nattyp))
    1416            0 :  ia1=1;iatm=0;opernl_calls=0
    1417            0 :  do itypat=1,ntypat
    1418              : !  Get atom loop indices for different types:
    1419            0 :    ia2=ia1+nattyp(itypat)-1;ia5=1
    1420            0 :    do ia3=ia1,ia2,mincat
    1421            0 :      ia4=min(ia2,ia3+mincat-1)
    1422              : !    Give the increment of number of atoms in this subset.
    1423            0 :      nincat=ia4-ia3+1
    1424            0 :      opernl_calls=opernl_calls+1
    1425              : !    End sum on atom subset loop
    1426            0 :      iatm=iatm+nincat;ia5=ia5+nincat
    1427              :    end do
    1428              : !  End atom type loop
    1429            0 :    ia1=ia2+1
    1430              :  end do
    1431            0 :  if (iatm/=natom) then
    1432            0 :    ABI_ERROR('iatm should be equal to natom!')
    1433              :  end if
    1434            0 :  write(msg,'(a,i6)')             ' Number of Calls in nonlop_ylm : NC = ',opernl_calls
    1435            0 :  call wrtout([std_out,ab_out],msg,'COLL')
    1436            0 :  write(msg,'(a,i6)')             ' total Number of Bands         : NB = ',nbandtot
    1437            0 :  call wrtout([std_out,ab_out],msg,'COLL')
    1438            0 :  write(msg,'(a)')                '                      | total count (TC) |            TC/NC |         TC/NC/NB'
    1439            0 :  call wrtout([std_out,ab_out],msg,'COLL')
    1440            0 :  write(msg,'(a)')                ' -----------------------------------------------------------------------------'
    1441            0 :  call wrtout([std_out,ab_out],msg,'COLL')
    1442            0 :  call xmpi_sum(opernla_counter,mpi_enreg%comm_kpt,ierr)
    1443            0 :  call xmpi_sum(opernlb_counter,mpi_enreg%comm_kpt,ierr)
    1444            0 :  call xmpi_sum(opernla_mv_counter,mpi_enreg%comm_kpt,ierr)
    1445            0 :  call xmpi_sum(opernlb_mv_counter,mpi_enreg%comm_kpt,ierr)
    1446            0 :  call xmpi_sum(opernla_mv_dgemv_counter,mpi_enreg%comm_kpt,ierr)
    1447            0 :  call xmpi_sum(opernlb_mv_dgemv_counter,mpi_enreg%comm_kpt,ierr)
    1448            0 :  cnt=opernla_counter
    1449            0 :  if (cnt>0) then
    1450            0 :    write(msg,'(2(a,i16),a,f16.1)') ' opernla_ylm          | ',&
    1451            0 :      & cnt,' | ',cnt/opernl_calls,' | ',dble(cnt)/opernl_calls/nbandtot
    1452            0 :    call wrtout([std_out,ab_out],msg,'COLL')
    1453              :  end if
    1454            0 :  cnt=opernla_mv_counter
    1455            0 :  if (cnt>0) then
    1456            0 :    write(msg,'(2(a,i16),a,f16.1)') ' opernla_ylm_mv       | ',&
    1457            0 :      & cnt,' | ',cnt/opernl_calls,' | ',dble(cnt)/opernl_calls/nbandtot
    1458            0 :    call wrtout([std_out,ab_out],msg,'COLL')
    1459              :  end if
    1460            0 :  cnt=opernla_mv_dgemv_counter
    1461            0 :  if (cnt>0) then
    1462            0 :    write(msg,'(2(a,i16),a,f16.1)') ' opernla_ylm_mv(dgemv)| ',&
    1463            0 :      & cnt,' | ',cnt/opernl_calls,' | ',dble(cnt)/opernl_calls/nbandtot
    1464            0 :    call wrtout([std_out,ab_out],msg,'COLL')
    1465              :  end if
    1466            0 :  cnt=opernlb_counter
    1467            0 :  if (cnt>0) then
    1468            0 :    write(msg,'(2(a,i16),a,f16.1)') ' opernlb_ylm          | ',&
    1469            0 :      & cnt,' | ',cnt/opernl_calls,' | ',dble(cnt)/opernl_calls/nbandtot
    1470            0 :    call wrtout([std_out,ab_out],msg,'COLL')
    1471              :  end if
    1472            0 :  cnt=opernlb_mv_counter
    1473            0 :  if (cnt>0) then
    1474            0 :    write(msg,'(2(a,i16),a,f16.1)') ' opernlb_ylm_mv       | ',&
    1475            0 :      & cnt,' | ',cnt/opernl_calls,' | ',dble(cnt)/opernl_calls/nbandtot
    1476            0 :    call wrtout([std_out,ab_out],msg,'COLL')
    1477              :  end if
    1478            0 :  cnt=opernlb_mv_dgemv_counter
    1479            0 :  if (cnt>0) then
    1480            0 :    write(msg,'(2(a,i16),a,f16.1)') ' opernlb_ylm_mv(dgemv)| ',&
    1481            0 :      & cnt,' | ',cnt/opernl_calls,' | ',dble(cnt)/opernl_calls/nbandtot
    1482            0 :    call wrtout([std_out,ab_out],msg,'COLL')
    1483              :  end if
    1484            0 :  write(msg,'(a)')                ' -----------------------------------------------------------------------------'
    1485            0 :  call wrtout([std_out,ab_out],msg,'COLL')
    1486              : 
    1487            0 : end subroutine nonlop_ylm_output_counters
    1488              : !!***
    1489              : 
    1490              : end module m_nonlop_ylm
    1491              : !!***
        

Generated by: LCOV version 2.3-1