1!
2! Copyright (C) 2010 Quantum ESPRESSO group
3! This file is distributed under the terms of the
4! GNU General Public License. See the file `License'
5! in the root directory of the present distribution,
6! or http://www.gnu.org/copyleft/gpl.txt .
7!
8!=----------------------------------------------------------------------------=!
9   MODULE smallbox_grid_dim
10!=----------------------------------------------------------------------------=!
11
12     !  Dimensions of the 3D real and reciprocal space FFT subgrids
13     !  used for atomic augmentation charge density (USPP)
14     !  Dependencies:
15     !     fft_scalar       good_fft_dimension, good_fft_order
16     !     io_global        stdout, ionode
17     !
18
19     IMPLICIT NONE
20     SAVE
21
22     PRIVATE
23     PUBLIC :: smallbox_grid_init, smallbox_grid_info
24
25   CONTAINS
26
27     SUBROUTINE smallbox_grid_init( dfftp, dfftb )
28       !
29       USE fft_support, only: good_fft_dimension, good_fft_order
30       USE fft_types,  only: fft_type_descriptor
31       USE fft_smallbox_type,  only: fft_box_descriptor
32       !
33       IMPLICIT NONE
34       !
35       TYPE(fft_type_descriptor), INTENT(IN)    :: dfftp
36       TYPE(fft_box_descriptor), INTENT(INOUT) :: dfftb
37       !
38       ! no default values for grid box: if nr*b=0, ignore
39
40       IF( dfftb%nr1 > 0 .AND. dfftb%nr2 > 0 .AND. dfftb%nr3 > 0 ) THEN
41
42          dfftb%nr1 = good_fft_order( dfftb%nr1 )
43          dfftb%nr2 = good_fft_order( dfftb%nr2 )
44          dfftb%nr3 = good_fft_order( dfftb%nr3 )
45          dfftb%nr1x = good_fft_dimension( dfftb%nr1 )
46
47       ELSE
48
49          dfftb%nr1x = dfftb%nr1
50
51       END IF
52
53       dfftb%nr2x = dfftb%nr2
54       dfftb%nr3x = dfftb%nr3
55       dfftb%nnr  = dfftb%nr1x * dfftb%nr2x * dfftb%nr3x
56
57       IF ( dfftb%nr1 > dfftp%nr1 .or. dfftb%nr2 > dfftp%nr2 .or. dfftb%nr3 > dfftp%nr3 ) &
58          CALL errore(' smallbox_grid_init ', ' box grid larger than dense grid?',1)
59       RETURN
60
61     END SUBROUTINE smallbox_grid_init
62
63     SUBROUTINE smallbox_grid_info( dfftb )
64       !
65       USE io_global,  ONLY: stdout, ionode
66       USE fft_smallbox_type,  only: fft_box_descriptor
67       !
68       TYPE(fft_box_descriptor), INTENT(IN) :: dfftb
69       !
70       IF ( ionode ) THEN
71         IF ( dfftb%nr1 > 0 .AND. dfftb%nr2 > 0 .AND. dfftb%nr3 > 0 ) THEN
72           WRITE( stdout,*)
73           WRITE( stdout,*) '  Small Box Real Mesh'
74           WRITE( stdout,*) '  -------------------'
75           WRITE( stdout,1000) dfftb%nr1, dfftb%nr2, dfftb%nr3, dfftb%nr1, dfftb%nr2, dfftb%nr3, 1, 1, 1
76           WRITE( stdout,1010) dfftb%nr1x, dfftb%nr2x, dfftb%nr3x
77           WRITE( stdout,1020) dfftb%nnr
78         END IF
79       END IF
80
811000  FORMAT(3X, &
82         'Global Dimensions   Local  Dimensions   Processor Grid',/,3X, &
83         '.X.   .Y.   .Z.     .X.   .Y.   .Z.     .X.   .Y.   .Z.',/, &
84         3(1X,I5),2X,3(1X,I5),2X,3(1X,I5) )
851010  FORMAT(3X, 'Array leading dimensions ( nr1x, nr2x, nr3x )   = ', 3(1X,I5) )
861020  FORMAT(3X, 'Local number of cell to store the grid ( nrxx ) = ', 1X, I9 )
87
88
89     END SUBROUTINE smallbox_grid_info
90
91!=----------------------------------------------------------------------------=!
92   END MODULE smallbox_grid_dim
93!=----------------------------------------------------------------------------=!
94