LCOV - code coverage report
Current view: top level - src/78_effpot - m_primitive_potential_list.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 72.9 % 70 51
Test Date: 2026-11-08 00:10:28 Functions: 44.4 % 9 4
Branches: 39.7 % 68 27

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_primitive_potential_list
       2                 :             : !! NAME
       3                 :             : !! m_primitive_potential_list
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !! This module define the primitive potential list type, which is a list of primitive potentials
       7                 :             : !!
       8                 :             : !! Datatypes:
       9                 :             : !!  primitive_potential_list_t
      10                 :             : !!
      11                 :             : !! Subroutines:
      12                 :             : !!
      13                 :             : !!  * fill_supercell: use translation symmetry to fill the supercell.
      14                 :             : !!  * load_from_file: load potential from file.
      15                 :             : !!  * save_to_file: save to file.
      16                 :             : !!
      17                 :             : !! COPYRIGHT
      18                 :             : !! Copyright (C) 2001-2026 ABINIT group (hexu)
      19                 :             : !! This file is distributed under the terms of the
      20                 :             : !! GNU General Public License, see ~abinit/COPYING
      21                 :             : !! or http://www.gnu.org/copyleft/gpl.txt .
      22                 :             : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
      23                 :             : !!
      24                 :             : !! SOURCE
      25                 :             : 
      26                 :             : 
      27                 :             : #if defined HAVE_CONFIG_H
      28                 :             : #include "config.h"
      29                 :             : #endif
      30                 :             : #include "abi_common.h"
      31                 :             : 
      32                 :             : module m_primitive_potential_list
      33                 :             :   use defs_basis
      34                 :             :   use m_abicore
      35                 :             :   use m_errors
      36                 :             :   use m_xmpi
      37                 :             : 
      38                 :             :   use m_mpi_scheduler, only: init_mpi_info
      39                 :             :   use m_multibinit_dataset , only: multibinit_dtset_type
      40                 :             :   !use m_multibinit_cell, only: mbcell_t
      41                 :             :   use m_supercell_maker, only: supercell_maker_t
      42                 :             :   use m_abstract_potential, only: abstract_potential_t
      43                 :             :   use m_potential_list, only: potential_list_t
      44                 :             :   use m_primitive_potential, only: primitive_potential_t
      45                 :             :   use m_multibinit_cell, only: mbsupercell_t
      46                 :             :   implicit none
      47                 :             :   private
      48                 :             : !!***
      49                 :             : 
      50                 :             :   !-------------------------------------------------------------------!
      51                 :             :   ! primitve_potential_pointer_t
      52                 :             :   !-------------------------------------------------------------------!
      53                 :             :   type, public:: primitive_potential_pointer_t ! pointer to effpot
      54                 :             :      class(primitive_potential_t), pointer :: obj=>null()
      55                 :             :   end type primitive_potential_pointer_t
      56                 :             : 
      57                 :             : 
      58                 :             :   !-------------------------------------------------------------------!
      59                 :             :   ! primitive_potential_list_t
      60                 :             :   ! abstract type for primitive potential list
      61                 :             :   !-------------------------------------------------------------------!
      62                 :             :   type, public, extends(primitive_potential_t):: primitive_potential_list_t
      63                 :             :      type(primitive_potential_pointer_t), allocatable :: data(:) ! list of pointer type
      64                 :             :      integer :: size=0   ! number of components.
      65                 :             :      integer :: capacity=0  ! number of slots allocated for saving the pointers.
      66                 :             :    contains
      67                 :             :      procedure :: initialize
      68                 :             :      procedure :: append
      69                 :             :      procedure :: load_from_files
      70                 :             :      procedure :: fill_supercell
      71                 :             :      procedure :: fill_supercell_list
      72                 :             :      procedure:: finalize
      73                 :             :   end type primitive_potential_list_t
      74                 :             : contains
      75                 :             : 
      76                 :             :   !-------------------------------------------------------------------!
      77                 :             :   ! fill supercell:
      78                 :             :   !-------------------------------------------------------------------!
      79                 :           0 :   subroutine fill_supercell(self, scmaker, params, scpot, supercell)
      80                 :             :     class(primitive_potential_list_t), intent(inout) :: self
      81                 :             :     type(supercell_maker_t),           intent(inout) :: scmaker
      82                 :             :     type(multibinit_dtset_type),       intent(inout) :: params
      83                 :             :     class(abstract_potential_t), pointer, intent(inout) :: scpot
      84                 :             :     type(mbsupercell_t), target :: supercell
      85                 :             :     ! Note that sc_pot is a pointer
      86                 :             :     ! use a pointer to the specific potential which will be filled
      87                 :             :     ! e.g. type(spin_potential_t), pointer :: tmp
      88                 :             :     type(abstract_potential_t), pointer :: tmp
      89         [ #  # ]:           0 :     ABI_MALLOC_TYPE_SCALAR(abstract_potential_t, tmp)
      90                 :             :     !call tmp%initialize(....)
      91                 :             :     ! set tmp
      92                 :           0 :     ABI_UNUSED_A(self)
      93                 :           0 :     ABI_UNUSED_A(scmaker)
      94                 :           0 :     ABI_UNUSED_A(params)
      95                 :           0 :     ABI_UNUSED_A(scpot)
      96                 :           0 :     ABI_UNUSED_A(supercell)
      97                 :           0 :     nullify(tmp)
      98                 :           0 :   end subroutine fill_supercell
      99                 :             : 
     100                 :             :   !-------------------------------------------------------------------!
     101                 :             :   ! load primitive potential from file
     102                 :             :   !-------------------------------------------------------------------!
     103                 :           0 :   subroutine load_from_files(self, params,  fnames)
     104                 :             :     class(primitive_potential_list_t), intent(inout) :: self
     105                 :             :     type(multibinit_dtset_type), intent(in) :: params
     106                 :             :     character(len=fnlen), intent(in) :: fnames(:)
     107                 :           0 :     ABI_UNUSED_A(self)
     108                 :           0 :     ABI_UNUSED_A(params)
     109                 :           0 :     ABI_UNUSED_A(fnames)
     110                 :             : 
     111                 :             : 
     112                 :           0 :   end subroutine load_from_files
     113                 :             : 
     114                 :             :   !-------------------------------------------------------------------!
     115                 :             :   ! save primitive potential to file
     116                 :             :   !-------------------------------------------------------------------!
     117                 :             :   subroutine save_to_file(self, fname)
     118                 :             :     class(primitive_potential_list_t), intent(inout) :: self
     119                 :             :     character(len=fnlen), intent(in) :: fname
     120                 :             :     ABI_UNUSED_A(self)
     121                 :             :     ABI_UNUSED_A(fname)
     122                 :             : 
     123                 :             :   end subroutine save_to_file
     124                 :             : 
     125                 :             : 
     126                 :             :   !-------------------------------------------------------------------!
     127                 :             :   ! Initialize
     128                 :             :   !-------------------------------------------------------------------!
     129                 :           6 :   subroutine initialize(self)
     130                 :             :     class(primitive_potential_list_t), intent(inout):: self
     131                 :           6 :     self%label="ListPotential"
     132                 :           6 :     self%size=0
     133                 :           6 :     self%capacity=0
     134                 :           6 :   end subroutine initialize
     135                 :             : 
     136                 :             :   !----------------------------------------------------------------------
     137                 :             :   !> @brief finalize, all the pots in the list will also be finalized.
     138                 :             :   !> and the pointers will be nullified.
     139                 :             :   !----------------------------------------------------------------------
     140                 :          12 :   subroutine finalize(self)
     141                 :             :     class(primitive_potential_list_t), intent(inout):: self
     142                 :             :     integer :: i
     143                 :             : 
     144                 :             :     integer :: master, my_rank, comm, nproc, ierr
     145                 :             :     logical :: iam_master
     146                 :           6 :     call init_mpi_info(master, iam_master, my_rank, comm, nproc)
     147                 :             : 
     148                 :           6 :     call xmpi_bcast(self%size, master, comm, ierr)
     149         [ +  + ]:          16 :     do i=1, self%size
     150                 :          10 :        call self%data(i)%obj%finalize()
     151         [ +  - ]:          10 :        if(associated(self%data(i)%obj)) then
     152         [ +  - ]:          20 :            ABI_FREE(self%data(i)%obj)
     153                 :             :        endif
     154                 :          16 :        nullify(self%data(i)%obj)
     155                 :             :     end do
     156         [ +  - ]:           6 :     if(allocated(self%data)) then
     157                 :           6 :        ABI_FREE(self%data)
     158                 :             :     end if
     159                 :           6 :     nullify(self%primcell)
     160                 :           6 :     self%size=0
     161                 :           6 :     self%capacity=0
     162                 :           6 :     self%has_displacement=.False.
     163                 :           6 :     self%has_strain=.False.
     164                 :           6 :     self%has_spin=.False.
     165                 :           6 :     self%has_lwf=.False.
     166                 :           6 :   end subroutine finalize
     167                 :             : 
     168                 :             :   !----------------------------------------------------------------------
     169                 :             :   !> @brief append a potential to the list
     170                 :             :   !>    The meta data will be updated accordingly.
     171                 :             :   !> @param[in]  input
     172                 :             :   !> @param[out] output
     173                 :             :   !----------------------------------------------------------------------
     174                 :          10 :   subroutine append(self, pot)
     175                 :             :     class(primitive_potential_list_t), intent(inout):: self
     176                 :             :     class(primitive_potential_t), target, intent(inout) :: pot
     177                 :          10 :     type(primitive_potential_pointer_t), allocatable :: temp(:)
     178                 :             :     integer :: master, my_rank, comm, nproc, ierr
     179                 :             :     logical :: iam_master
     180                 :          10 :     call init_mpi_info(master, iam_master, my_rank, comm, nproc)
     181                 :             : 
     182                 :          10 :     self%size=self%size + 1
     183         [ +  + ]:          10 :     if(self%size==1) then
     184                 :           6 :        self%capacity=8
     185   [ -  +  -  +  :          54 :        ABI_MALLOC(self%data, (self%capacity))
                   +  + ]
     186         [ -  + ]:           4 :     else if ( self%size>self%capacity ) then
     187                 :           0 :        self%capacity = self%size + self%size / 4 + 8
     188   [ #  #  #  #  :           0 :        ABI_MALLOC(temp, (self%capacity))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     189         [ #  # ]:           0 :        temp(1:self%size-1) = self%data(:)
     190         [ #  # ]:           0 :        ABI_MOVE_ALLOC(temp, self%data) !temp gets deallocated
     191                 :             :     end if
     192                 :             : 
     193                 :          10 :     call xmpi_barrier(comm)
     194                 :          10 :     self%data(self%size)%obj=>pot
     195   [ +  +  +  + ]:          10 :     self%has_spin= (self%has_spin .or. pot%has_spin)
     196   [ +  +  +  + ]:          10 :     self%has_displacement= (self%has_displacement .or. pot%has_displacement)
     197   [ +  -  -  + ]:          10 :     self%has_strain= (self%has_strain.or. pot%has_strain)
     198   [ +  -  +  + ]:          10 :     self%has_lwf= (self%has_lwf.or. pot%has_lwf)
     199                 :          10 :     call xmpi_bcast(self%size, master, comm, ierr)
     200                 :          10 :     call xmpi_bcast(self%capacity, master, comm, ierr)
     201                 :          10 :     call xmpi_bcast(self%has_spin, master, comm, ierr)
     202                 :          10 :     call xmpi_bcast(self%has_displacement, master, comm, ierr)
     203                 :          10 :     call xmpi_bcast(self%has_strain, master, comm, ierr)
     204                 :          10 :     call xmpi_bcast(self%has_lwf, master, comm, ierr)
     205                 :             : 
     206                 :          10 :   end subroutine append
     207                 :             : 
     208                 :             : 
     209                 :             :   !----------------------------------------------------------------------
     210                 :             :   !> @brief build supercell potential for every component in the list
     211                 :             :   !> Here sc_pot is an pointer.
     212                 :             :   !> @param[in]  sc_maker: the helper class for uilder supercell
     213                 :             :   !> @param[out] sc_pots: the potential list of supercell pots.
     214                 :             :   !----------------------------------------------------------------------
     215                 :             :   subroutine fill_supercell_ptr(self, sc_maker, params, sc_pot, supercell)
     216                 :             :     class(primitive_potential_list_t), intent(inout) :: self
     217                 :             :     type(supercell_maker_t),           intent(inout) :: sc_maker
     218                 :             :     type(multibinit_dtset_type),       intent(inout) :: params
     219                 :             :     class(abstract_potential_t), pointer, intent(inout) :: sc_pot
     220                 :             :     type(mbsupercell_t), target :: supercell
     221                 :             : 
     222                 :             :     ! Note that sc_pot is a pointer
     223                 :             :     ! use a pointer to the specific potential which will be filled
     224                 :             :     type(potential_list_t), pointer :: tmp
     225                 :             :     ABI_MALLOC_SCALAR(tmp)
     226                 :             :     call self%fill_supercell_list( sc_maker, params, tmp, supercell)
     227                 :             :     sc_pot=>tmp
     228                 :             :     nullify(tmp)
     229                 :             :   end subroutine fill_supercell_ptr
     230                 :             : 
     231                 :             :   !----------------------------------------------------------------------
     232                 :             :   !> @brief build supercell potential for every component in the list
     233                 :             :   !>
     234                 :             :   !> @param[in]  sc_maker: the helper class for uilder supercell
     235                 :             :   !> @param[out] sc_pots: the potential list of supercell pots.
     236                 :             :   !----------------------------------------------------------------------
     237                 :           6 :   subroutine fill_supercell_list(self, sc_maker, params, sc_pots, supercell)
     238                 :             :     class(primitive_potential_list_t), intent(inout) :: self
     239                 :             :     type(supercell_maker_t),           intent(inout) :: sc_maker
     240                 :             :     type(multibinit_dtset_type),       intent(inout) :: params
     241                 :             :     type(potential_list_t),            intent(inout) :: sc_pots
     242                 :             :     type(mbsupercell_t), target :: supercell
     243                 :             : 
     244                 :             :     ! Note that sc_pot is a pointer
     245                 :             :     ! use a pointer to the specific potential which will be filled
     246                 :             :     class(abstract_potential_t), pointer :: tmp
     247                 :             :     integer :: i
     248                 :           6 :     tmp=>null()
     249         [ +  + ]:          16 :     do i =1, self%size
     250                 :          10 :       call self%data(i)%obj%fill_supercell(sc_maker, params, tmp, supercell)
     251                 :          16 :       call sc_pots%append(tmp)
     252                 :             :     end do
     253                 :             : 
     254                 :           6 :     ABI_UNUSED_A(params)
     255                 :             : 
     256                 :           6 :   end subroutine fill_supercell_list
     257                 :             : 
     258   [ #  #  #  #  :           0 : end module m_primitive_potential_list
          #  #  #  #  #  
                #  #  # ]
     259                 :             : 
        

Generated by: LCOV version 2.3-1