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-09-19 17:42:43 Functions: 44.4 % 9 4

            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