File: fft_smallbox_type.f90

package info (click to toggle)
espresso 6.7-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 311,068 kB
  • sloc: f90: 447,429; ansic: 52,566; sh: 40,631; xml: 37,561; tcl: 20,077; lisp: 5,923; makefile: 4,503; python: 4,379; perl: 1,219; cpp: 761; fortran: 618; java: 568; awk: 128
file content (154 lines) | stat: -rw-r--r-- 5,306 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
!
! Copyright (C) Quantum ESPRESSO group
!
! This file is distributed under the terms of the
! GNU General Public License. See the file `License'
! in the root directory of the present distribution,
! or http://www.gnu.org/copyleft/gpl.txt .
!

MODULE fft_smallbox_type

  USE fft_types, ONLY: fft_type_descriptor

  IMPLICIT NONE

  SAVE

  INTEGER :: stdout = 6

  TYPE fft_box_descriptor
    !
    !  Sub (box) grid descriptor
    !
    INTEGER, ALLOCATABLE :: irb(:,:)  ! the offset of the box corner
    INTEGER, ALLOCATABLE :: imin2(:),imin3(:)  ! the starting index of local yz-plane section
    INTEGER, ALLOCATABLE :: imax2(:),imax3(:)  ! the last index of local yz-plane section
    INTEGER, ALLOCATABLE :: np2(:),np3(:)    ! number of local yz-plane section for the box fft
    !
    INTEGER :: nr1    = 0  !
    INTEGER :: nr2    = 0  ! effective FFT dimensions of the 3D grid (global)
    INTEGER :: nr3    = 0  ! 
    INTEGER :: nr1x   = 0  ! FFT grids leading dimensions
    INTEGER :: nr2x   = 0  ! dimensions of the arrays for the 3D grid (global)
    INTEGER :: nr3x   = 0  ! may differ from nr1 ,nr2 ,nr3 in order to boost performances
    INTEGER :: nnr    = 0 
    !
    !  fft parallelization
    !
    INTEGER :: mype     = 0          ! my processor id (starting from 0) in the fft group
    INTEGER :: comm     = 0          ! communicator of the fft gruop 
    INTEGER :: nproc    = 1          ! number of processor in the fft group
    INTEGER :: root     = 0          ! root processor

  END TYPE

CONTAINS

!=----------------------------------------------------------------------------=!

  SUBROUTINE fft_box_allocate( desc, mype, root, nproc, comm, nat )
    TYPE (fft_box_descriptor) :: desc
    INTEGER, INTENT(in) :: nat, nproc, mype, root, comm  ! mype starting from 0
    ALLOCATE( desc%irb( 3, nat ) )
    ALLOCATE( desc%imin2( nat ), desc%imin3( nat ) )
    ALLOCATE( desc%imax2( nat ), desc%imax3( nat ) )
    ALLOCATE( desc%np2( nat ), desc%np3( nat ) )
    desc%irb = 0
    desc%imin2 = 0; desc%imin3 = 0
    desc%imax2 = 0; desc%imax3 = 0
    desc%np2 = 0; desc%np3 = 0
    desc%mype = mype
    desc%nproc = nproc
    desc%comm = comm
    desc%root = root
  END SUBROUTINE fft_box_allocate

  SUBROUTINE fft_box_deallocate( desc )
    TYPE (fft_box_descriptor) :: desc
    IF( ALLOCATED( desc%irb ) ) DEALLOCATE( desc%irb )
    IF( ALLOCATED( desc%imin2 ) ) DEALLOCATE( desc%imin2 )
    IF( ALLOCATED( desc%imin3 ) ) DEALLOCATE( desc%imin3 )
    IF( ALLOCATED( desc%imax2 ) ) DEALLOCATE( desc%imax2 )
    IF( ALLOCATED( desc%imax3 ) ) DEALLOCATE( desc%imax3 )
    IF( ALLOCATED( desc%np2 ) ) DEALLOCATE( desc%np2 )
    IF( ALLOCATED( desc%np3 ) ) DEALLOCATE( desc%np3 )
  END SUBROUTINE fft_box_deallocate

!=----------------------------------------------------------------------------=!
!=----------------------------------------------------------------------------=!

  SUBROUTINE fft_box_set( desc, nat, irb, dfftp )

    IMPLICIT NONE

    TYPE (fft_box_descriptor), INTENT(INOUT) :: desc
    INTEGER, INTENT(in) :: nat
    INTEGER, INTENT(in) :: irb( :, : )
    TYPE (fft_type_descriptor), INTENT(IN) :: dfftp

    INTEGER :: nr1b, nr2b, nr3b, nr1bx, nr2bx, nr3bx
    INTEGER :: isa
    INTEGER :: ir2, ibig2, irb2, imin2, imax2, nr2
    INTEGER :: ir3, ibig3, irb3, imin3, imax3, nr3

    IF( nat > size( desc%irb, 2 ) ) THEN
       WRITE( stdout, fmt="( ///,'NAT, SIZE = ',2I10)" ) nat, size( desc%irb, 2 )
       CALL fftx_error__(" fft_box_set ", " inconsistent dimensions ", 1 )
    ENDIF

    if ( (desc%nr1.eq.0)  .OR. (desc%nr2.eq.0)  .OR. (desc%nr3.eq.0) .OR. &
         (desc%nr1x.eq.0) .OR. (desc%nr2x.eq.0) .OR. (desc%nr3x.eq.0) ) &
         call fftx_error__(" fft_box_set ", "descriptor dimensions must be already initialized", 1)
    nr1b  = desc%nr1  ; nr2b  = desc%nr2  ; nr3b  = desc%nr3
    nr1bx = desc%nr1x ; nr2bx = desc%nr2x ; nr3bx = desc%nr3x

    desc%irb( 1:3, 1:nat ) = irb( 1:3, 1:nat )

    DO isa = 1, nat

       imin3 = nr3b
       imax3 = 1
       irb3  = irb( 3, isa )

       DO ir3 = 1, nr3b
          ibig3 = 1 + mod( irb3 + ir3 - 2, dfftp%nr3 )
          IF( ibig3 < 1 .or. ibig3 > dfftp%nr3 )   &
        &        CALL fftx_error__(' fft_box_set ',' ibig3 wrong ', ibig3 )
          ibig3 = ibig3 - dfftp%my_i0r3p
          IF ( ibig3 > 0 .and. ibig3 <= dfftp%my_nr3p ) THEN
               imin3 = min( imin3, ir3 )
               imax3 = max( imax3, ir3 )
          ENDIF
       ENDDO

       desc%imin3( isa ) = imin3
       desc%imax3( isa ) = imax3
       desc%np3( isa )   = imax3 - imin3 + 1

       imin2 = nr2b
       imax2 = 1
       irb2  = irb( 2, isa )

       DO ir2 = 1, nr2b
          ibig2 = 1 + mod( irb2 + ir2 - 2, dfftp%nr2 )
          IF( ibig2 < 1 .or. ibig2 > dfftp%nr2 )   &
        &        CALL fftx_error__(' fft_box_set ',' ibig2 wrong ', ibig2 )
          ibig2 = ibig2 - dfftp%my_i0r2p
          IF ( ibig2 > 0 .and. ibig2 <= dfftp%my_nr2p ) THEN
               imin2 = min( imin2, ir2 )
               imax2 = max( imax2, ir2 )
          ENDIF
       ENDDO

       desc%imin2( isa ) = imin2
       desc%imax2( isa ) = imax2
       desc%np2( isa )   = imax2 - imin2 + 1

    ENDDO

    desc%nnr  = desc%nr1x * desc%nr2x * desc%nr3x

  END SUBROUTINE fft_box_set

END MODULE fft_smallbox_type