Line data Source code
1 : !--------------------------------------------------------------------------------
2 : ! Copyright (c) 2017 Peter Grünberg Institut, Forschungszentrum Jülich, Germany
3 : ! This file is part of FLEUR and available as free software under the conditions
4 : ! of the MIT license as expressed in the LICENSE file in more detail.
5 : !--------------------------------------------------------------------------------
6 :
7 : MODULE m_mpi_bc_potden
8 : #ifdef CPP_MPI
9 : use mpi
10 : #endif
11 : CONTAINS
12 0 : SUBROUTINE mpi_bc_potden(fmpi,stars,sphhar,atoms,input,vacuum ,noco,potden,nococonv)
13 :
14 : USE m_types
15 : USE m_constants
16 : IMPLICIT NONE
17 :
18 : TYPE(t_mpi),INTENT(IN) :: fmpi
19 : TYPE(t_input),INTENT(IN) :: input
20 : TYPE(t_vacuum),INTENT(IN) :: vacuum
21 : TYPE(t_stars),INTENT(IN) :: stars
22 : TYPE(t_sphhar),INTENT(IN) :: sphhar
23 : TYPE(t_atoms),INTENT(IN) :: atoms
24 : TYPE(t_noco),INTENT(IN) :: noco
25 :
26 : TYPE(t_potden),INTENT(INOUT) :: potden
27 : TYPE(t_nococonv),INTENT(INOUT),optional :: nococonv
28 :
29 : INTEGER :: n, ierr
30 : LOGICAL :: l_nocoAlloc, l_denMatAlloc, l_vaczAlloc, l_pw_wAlloc
31 :
32 : #ifdef CPP_MPI
33 :
34 0 : CALL MPI_BCAST(potden%iter,1,MPI_INTEGER,0,fmpi%mpi_comm,ierr)
35 0 : CALL MPI_BCAST(potden%potdenType,1,MPI_INTEGER,0,fmpi%mpi_comm,ierr)
36 :
37 0 : l_nocoAlloc = .FALSE.
38 0 : l_denMatAlloc = .FALSE.
39 0 : l_vaczAlloc = .FALSE.
40 0 : l_pw_wAlloc = .FALSE.
41 0 : IF(fmpi%irank.EQ.0) THEN
42 0 : IF (ALLOCATED(potden%mmpMat)) l_denMatAlloc = .TRUE.
43 0 : IF (ALLOCATED(potden%vac)) l_vaczAlloc = .TRUE.
44 0 : IF (ALLOCATED(potden%pw_w)) l_pw_wAlloc = .TRUE.
45 : END IF
46 0 : CALL MPI_BCAST(l_nocoAlloc,1,MPI_LOGICAL,0,fmpi%mpi_comm,ierr)
47 0 : CALL MPI_BCAST(l_denMatAlloc,1,MPI_LOGICAL,0,fmpi%mpi_comm,ierr)
48 0 : CALL MPI_BCAST(l_vaczAlloc,1,MPI_LOGICAL,0,fmpi%mpi_comm,ierr)
49 0 : CALL MPI_BCAST(l_pw_wAlloc,1,MPI_LOGICAL,0,fmpi%mpi_comm,ierr)
50 0 : IF((fmpi%irank.NE.0).AND.l_denMatAlloc) THEN
51 0 : IF(.NOT.ALLOCATED(potden%mmpMat)) THEN
52 0 : ALLOCATE(potDen%mmpMat(-lmaxU_const:lmaxU_const,-lmaxU_const:lmaxU_const,&
53 0 : MAX(1,atoms%n_u+atoms%n_hia),MERGE(3,input%jspins,any(noco%l_unrestrictMT).OR.noco%l_mperp)))
54 : END IF
55 : END IF
56 :
57 0 : n = stars%ng3 * SIZE(potden%pw,2)
58 0 : CALL MPI_BCAST(potden%pw,n,MPI_DOUBLE_COMPLEX,0,fmpi%mpi_comm,ierr)
59 :
60 0 : n = size(potden%mt)
61 0 : CALL MPI_BCAST(potden%mt,n,MPI_DOUBLE_PRECISION,0,fmpi%mpi_comm,ierr)
62 :
63 0 : IF (l_pw_wAlloc) THEN
64 0 : n = stars%ng3 * SIZE(potden%pw_w,2)
65 0 : CALL MPI_BCAST(potden%pw_w,n,MPI_DOUBLE_COMPLEX,0,fmpi%mpi_comm,ierr)
66 : END IF
67 :
68 0 : IF (l_vaczAlloc) THEN
69 0 : n = vacuum%nmzd * stars%ng2 * 2 * SIZE(potden%vac,4)
70 0 : CALL MPI_BCAST(potden%vac,n,MPI_DOUBLE_COMPLEX,0,fmpi%mpi_comm,ierr)
71 : END IF
72 :
73 0 : IF (l_denMatAlloc) THEN
74 0 : n = SIZE(potden%mmpMat,1) * SIZE(potden%mmpMat,2) * SIZE(potden%mmpMat,3) * SIZE(potden%mmpMat,4)
75 0 : CALL MPI_BCAST(potden%mmpMat,n,MPI_DOUBLE_COMPLEX,0,fmpi%mpi_comm,ierr)
76 : END IF
77 :
78 0 : IF (present(nococonv)) THEN
79 0 : CALL MPI_BCAST(nococonv%alph, size(nococonv%alph), MPI_DOUBLE_PRECISION, 0, fmpi%mpi_comm, ierr)
80 0 : CALL MPI_BCAST(nococonv%beta, size(nococonv%beta), MPI_DOUBLE_PRECISION, 0, fmpi%mpi_comm, ierr)
81 0 : CALL MPI_BCAST(nococonv%alphprev, size(nococonv%alph), MPI_DOUBLE_PRECISION, 0, fmpi%mpi_comm, ierr)
82 0 : CALL MPI_BCAST(nococonv%betaprev, size(nococonv%beta), MPI_DOUBLE_PRECISION, 0, fmpi%mpi_comm, ierr)
83 : ENDIF
84 : #endif
85 :
86 0 : END SUBROUTINE mpi_bc_potden
87 : END MODULE m_mpi_bc_potden
|