21 #include "./base/base_uses.f90"
26 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'negf_subgroup_types'
27 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .true.
36 TYPE negf_subgroup_env_type
41 INTEGER :: ngroups = -1
44 INTEGER :: mepos_global = -1
46 TYPE(mp_comm_type) :: mpi_comm_global = mp_comm_type()
49 INTEGER,
DIMENSION(:),
ALLOCATABLE :: group_distribution
51 TYPE(cp_blacs_env_type),
POINTER :: blacs_env => null()
53 TYPE(mp_para_env_type),
POINTER :: para_env => null()
54 END TYPE negf_subgroup_env_type
68 SUBROUTINE negf_sub_env_create(sub_env, negf_control, blacs_env_global, blacs_grid_layout, blacs_repeatable)
69 TYPE(negf_subgroup_env_type),
INTENT(out) :: sub_env
70 TYPE(negf_control_type),
POINTER :: negf_control
71 TYPE(cp_blacs_env_type),
POINTER :: blacs_env_global
72 INTEGER,
INTENT(in) :: blacs_grid_layout
73 LOGICAL,
INTENT(in) :: blacs_repeatable
75 CHARACTER(LEN=*),
PARAMETER :: routinen =
'negf_sub_env_create'
79 TYPE(mp_para_env_type),
POINTER :: para_env_global
81 CALL timeset(routinen, handle)
83 CALL blacs_env_global%get(para_env=para_env_global)
84 sub_env%mepos_global = para_env_global%mepos
85 sub_env%mpi_comm_global = para_env_global
90 is_split = negf_control%nprocs > 0 .AND. negf_control%nprocs*2 <= para_env_global%num_pe
93 ALLOCATE (sub_env%group_distribution(0:para_env_global%num_pe - 1))
95 ALLOCATE (sub_env%para_env)
96 CALL sub_env%para_env%from_split(comm=para_env_global, ngroups=sub_env%ngroups, &
97 group_distribution=sub_env%group_distribution, subgroup_min_size=negf_control%nprocs)
100 NULLIFY (sub_env%blacs_env)
104 CALL cp_blacs_env_create(sub_env%blacs_env, sub_env%para_env, blacs_grid_layout, blacs_repeatable)
106 sub_env%para_env => para_env_global
109 ALLOCATE (sub_env%group_distribution(0:para_env_global%num_pe - 1))
110 sub_env%group_distribution(:) = 0
112 sub_env%blacs_env => blacs_env_global
113 CALL sub_env%blacs_env%retain()
115 sub_env%para_env => para_env_global
116 CALL sub_env%para_env%retain()
119 CALL timestop(handle)
129 TYPE(negf_subgroup_env_type),
INTENT(inout) :: sub_env
131 CHARACTER(LEN=*),
PARAMETER :: routinen =
'negf_sub_env_release'
135 CALL timeset(routinen, handle)
140 IF (
ALLOCATED(sub_env%group_distribution)) &
141 DEALLOCATE (sub_env%group_distribution)
145 CALL timestop(handle)
methods related to the blacs parallel environment
subroutine, public cp_blacs_env_release(blacs_env)
releases the given blacs_env
subroutine, public cp_blacs_env_create(blacs_env, para_env, blacs_grid_layout, blacs_repeatable, row_major, grid_2d)
allocates and initializes a type that represent a blacs context
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
Input control types for NEGF based quantum transport calculations.
Environment for NEGF based quantum transport calculations.
subroutine, public negf_sub_env_release(sub_env)
Release a parallel (sub)group environment.
subroutine, public negf_sub_env_create(sub_env, negf_control, blacs_env_global, blacs_grid_layout, blacs_repeatable)
Split MPI communicator to create a set of parallel (sub)groups.