A routine to unpack the supercell tmp_sum vectors to full field arrays
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(fieldmat_type), | intent(inout) | :: | self | |||
complex, | intent(inout), | dimension(-ntgrid:,:,:) | :: | ph | ||
complex, | intent(inout), | dimension(-ntgrid:,:,:) | :: | ap | ||
complex, | intent(inout), | dimension(-ntgrid:,:,:) | :: | bp |
subroutine fm_unpack_to_field(self,ph,ap,bp)
use theta_grid, only: ntgrid
use run_parameters, only: has_phi, has_apar, has_bpar
use mp, only: proc0
implicit none
class(fieldmat_type), intent(inout) :: self
complex,dimension(-ntgrid:,:,:), intent(inout) :: ph,ap,bp
integer :: ik,is,ic,iex,ig,it,bnd,ifl
!We don't need to unpack if we're proc0 as we've done this already
if(.not.proc0)then
!$OMP PARALLEL DO DEFAULT(none) &
!$OMP PRIVATE(ik, is, iex, ifl, ic, it, bnd, ig) &
!$OMP SHARED(self, ph, ap, bp, has_phi, has_apar, has_bpar, ntgrid) &
!$OMP SCHEDULE(static)
do ik=1,self%naky
if(.not.self%kyb(ik)%is_local) cycle
do is=1,self%kyb(ik)%nsupercell
if(.not.self%kyb(ik)%supercells(is)%is_local) cycle
iex=0
ifl=0
if(has_phi)then
ifl=ifl+1
do ic=1,self%kyb(ik)%supercells(is)%ncell
it=self%kyb(ik)%supercells(is)%cells(ic)%it_ind
bnd=0
if(ic/=self%kyb(ik)%supercells(is)%ncell) bnd=1
do ig=-ntgrid,ntgrid-bnd
iex=iex+1
ph(ig,it,ik)=self%kyb(ik)%supercells(is)%tmp_sum(iex)
enddo
enddo
!/Fix boundary points
if(self%kyb(ik)%supercells(is)%ncell>1) then
do ic=1,self%kyb(ik)%supercells(is)%ncell-1
ph(ntgrid,self%kyb(ik)%supercells(is)%cells(ic)%it_ind,ik)=&
ph(-ntgrid,self%kyb(ik)%supercells(is)%cells(ic+1)%it_ind,ik)
enddo
endif
endif
if(has_apar)then
ifl=ifl+1
do ic=1,self%kyb(ik)%supercells(is)%ncell
it=self%kyb(ik)%supercells(is)%cells(ic)%it_ind
bnd=0
if(ic/=self%kyb(ik)%supercells(is)%ncell) bnd=1
do ig=-ntgrid,ntgrid-bnd
iex=iex+1
ap(ig,it,ik)=self%kyb(ik)%supercells(is)%tmp_sum(iex)
enddo
enddo
!/Fix boundary points
if(self%kyb(ik)%supercells(is)%ncell>1) then
do ic=1,self%kyb(ik)%supercells(is)%ncell-1
ap(ntgrid,self%kyb(ik)%supercells(is)%cells(ic)%it_ind,ik)=&
ap(-ntgrid,self%kyb(ik)%supercells(is)%cells(ic+1)%it_ind,ik)
enddo
endif
endif
if(has_bpar)then
ifl=ifl+1
do ic=1,self%kyb(ik)%supercells(is)%ncell
it=self%kyb(ik)%supercells(is)%cells(ic)%it_ind
bnd=0
if(ic/=self%kyb(ik)%supercells(is)%ncell) bnd=1
do ig=-ntgrid,ntgrid-bnd
iex=iex+1
bp(ig,it,ik)=self%kyb(ik)%supercells(is)%tmp_sum(iex)
enddo
enddo
!/Fix boundary points
if(self%kyb(ik)%supercells(is)%ncell>1) then
do ic=1,self%kyb(ik)%supercells(is)%ncell-1
bp(ntgrid,self%kyb(ik)%supercells(is)%cells(ic)%it_ind,ik)=&
bp(-ntgrid,self%kyb(ik)%supercells(is)%cells(ic+1)%it_ind,ik)
enddo
endif
endif
enddo
enddo
!$OMP END PARALLEL DO
endif
end subroutine fm_unpack_to_field