Philippe 02/05/2016: moved all LIBTOOLS files in LIBTOOLS directory
[MNH-git_open_source-lfs.git] / LIBTOOLS / tools / diachro / src / mesonh / set_dim.f90
1 !-----------------------------------------------------------------
2 !--------------- special set of characters for SCCS information
3 !--------------- C. Fischer 30/09/94
4 !      @(#) Lib:/mesonh/sources/init/s.set_dim.f90, Version:1.9, Date:98/06/23, Last modified:98/06/04
5 !-----------------------------------------------------------------
6 !     ###################
7       MODULE MODI_SET_DIM
8 !     ###################
9 !
10 INTERFACE
11 !
12 SUBROUTINE SET_DIM(HINIFILE,HLUOUT,KIINF,KISUP,KJINF,KJSUP,         &
13                    KIMAX,KJMAX,KKMAX)
14 CHARACTER (LEN=*), INTENT(IN)  :: HINIFILE ! Name of the initial file 
15 CHARACTER (LEN=*), INTENT(IN)  :: HLUOUT   ! name for output-listing
16                                            !  of nested models
17 INTEGER,         INTENT(INOUT) :: KIINF    !  Lower bound  in x direction of the 
18                                            ! arrays in Initialization or in 
19                                            ! Post-processing subroutines
20 INTEGER,         INTENT(INOUT) :: KISUP    !  Upper bound  in x direction of the 
21                                            ! arraysin Initialization or in 
22                                            ! Post-processing subroutines
23 INTEGER,        INTENT(INOUT)  :: KJINF    !  Lower bound  in y direction of the 
24                                            ! arrays in Initialization or in 
25                                            ! Post-processing subroutines
26 INTEGER,        INTENT(INOUT)  :: KJSUP    !  Upper bound  in y direction of the 
27                                            ! arraysin Initialization or in 
28                                            ! Post-processing subroutines
29 INTEGER,           INTENT(OUT) :: KIMAX    !  Dimension in x direction of the 
30                                            ! arrays  stored in LFIFM file
31 INTEGER,           INTENT(OUT) :: KJMAX    !  Dimension in y direction of the 
32                                            ! arrays  stored in LFIFM file
33 INTEGER,           INTENT(OUT) :: KKMAX    !  Dimension in z direction of the  
34                                            ! arrays stored in LFIFM file
35 END  SUBROUTINE SET_DIM
36 !
37 END INTERFACE
38 !
39 END MODULE MODI_SET_DIM
40 !
41 !
42 !
43 !     ##############################################################
44       SUBROUTINE SET_DIM(HINIFILE,HLUOUT,KIINF,KISUP,KJINF,KJSUP,         &
45                          KIMAX,KJMAX,KKMAX)
46 !     ##############################################################
47 !
48 !!****  *SET_DIM* - routine to set model dimensions
49 !!
50 !!    PURPOSE
51 !!    -------
52 !       The purpose of this routine is to set dimensions of the model
53 !
54 !
55 !!**  METHOD
56 !!    ------
57 !!      The dimensions KIMAX,KJMAX,KKMAX are read in initial file. 
58 !!      Then, the horizontal dimensions of arrays are deduced :
59 !!        - If it is a segment achievement  configuration (CCONF='START' or 
60 !!     'RESTA'), the horizontal dimensions of the arrays are :
61 !!            KIINF=1, KISUP=KIMAX+2*JPHEXT
62 !!            KJINF=1, KJSUP=KJMAX+2*JPHEXT
63 !!        - If it is a postprocessing configuration (CCONF='POSTP'), 
64 !!     an horizontal window is possible ; KIINF, KISUP, 
65 !!     KJINF,KJSUP are the values read in EXSEG file, except when :
66 !!             * KIINF is  greater than KIMAX + 2*JPHEXT . Then it is set
67 !!     equal to KIMAX + 2*JPHEXT
68 !!             * KISUP is  greater than KIMAX + 2*JPHEXT . Then it is set
69 !!     equal to KIMAX + 2*JPHEXT
70 !!             * KJINF is  greater than KJMAX + 2*JPHEXT . Then it is set
71 !!     equal to KJMAX + 2*JPHEXT
72 !!             * KJSUP is  greater than KJMAX + 2*JPHEXT . Then it is set
73 !!     equal to KJMAX + 2*JPHEXT
74 !!             * KIINF or KISUP is less or equal to zero. It means that there
75 !!     is no window in x direction. Then, KIINF is set equal to 1 and  KISUP 
76 !!      is set equal to KIMAX + 2*JPHEXT.
77 !!             * KJINF or KJSUP is less or equal to zero. It means that there
78 !!     is no window in x direction. Then, KJINF is set equal to 1 and  KJSUP 
79 !!      is set equal to KJMAX + 2*JPHEXT.
80 !!
81 !!             
82 !!      
83 !!    EXTERNAL
84 !!    --------   
85 !!      FMREAD      : to read data in LFIFM file 
86 !!
87 !!    IMPLICIT ARGUMENTS
88 !!    ------------------ 
89 !!      Module MODD_PARAMETERS : contains declaration of parameter variables
90 !!
91 !!        JPHEXT : Horizontal external points number
92 !!        JPVEXT : Vertical  external points number
93 !!
94 !!      Module MODD_CONF  : contains declaration of configuration variables
95 !!
96 !!         CCONF      : configuration of models
97 !!                          'START' for start configuration
98 !!                          'RESTA' for restart configuration
99 !!                          'POSTP' for post-processing configuration
100 !!         NVERB      : Level of informations on output-listing
101 !!                          0 for minimum  prints
102 !!                          5 for intermediate level of prints
103 !!                         10 for maximum  prints 
104 !!
105 !!    REFERENCE
106 !!    ---------
107 !!      Book2 of documentation (routine SET_DIM)
108 !!      
109 !!
110 !!    AUTHOR
111 !!    ------
112 !!      V. Ducrocq       * Meteo France *
113 !!
114 !!    MODIFICATIONS
115 !!    -------------
116 !!      Original    14/06/94 
117 !-------------------------------------------------------------------------------
118 !
119 !*       0.    DECLARATIONS
120 !              ------------ 
121 USE MODD_PARAMETERS
122 USE MODD_CONF
123 !
124 USE MODI_FMREAD
125 !
126 IMPLICIT NONE
127 !
128 !*       0.1   declarations of argument
129 !
130 CHARACTER (LEN=*), INTENT(IN)  :: HINIFILE ! Name of the initial file 
131 CHARACTER (LEN=*), INTENT(IN)  :: HLUOUT   ! name for output-listing
132                                            !  of nested models
133 INTEGER,         INTENT(INOUT) :: KIINF    !  Lower bound  in x direction of the 
134                                            ! arrays in Initialization or in 
135                                            ! Post-processing subroutines
136 INTEGER,         INTENT(INOUT) :: KISUP    !  Upper bound  in x direction of the 
137                                            ! arraysin Initialization or in 
138                                            ! Post-processing subroutines
139 INTEGER,        INTENT(INOUT)  :: KJINF    !  Lower bound  in y direction of the 
140                                            ! arrays in Initialization or in 
141                                            ! Post-processing subroutines
142 INTEGER,        INTENT(INOUT)  :: KJSUP    !  Upper bound  in y direction of the 
143                                            ! arraysin Initialization or in 
144                                            ! Post-processing subroutines
145 INTEGER,           INTENT(OUT) :: KIMAX    !  Dimension in x direction of 
146                                            ! the physical part of the  
147                                            ! arrays  stored in LFIFM file
148 INTEGER,           INTENT(OUT) :: KJMAX    !  Dimension in y direction of the 
149                                            !  physical part of the  
150                                            ! arrays  stored in LFIFM file
151 INTEGER,           INTENT(OUT) :: KKMAX    !  Dimension in z direction of the  
152                                            !  physical part of the  
153                                            ! arrays stored in LFIFM file
154 !
155 !*       0.2   declarations of local variables
156 !
157 INTEGER             :: ILENG,IGRID,ILENCH,IRESP  !   File 
158 CHARACTER (LEN=16)  :: YRECFM                    ! management
159 CHARACTER (LEN=100) :: YCOMMENT                  ! variables  
160 INTEGER             :: ILUOUT                    ! Logical unit number for
161                                                  ! output-listing
162 !
163 !-------------------------------------------------------------------------------
164 !
165 !*       1.    READ DIMENSIONS OF ARRAYS IN LFIFM FILE
166 !              ---------------------------------------
167 !
168 YRECFM='IMAX'
169 ILENG=1
170 CALL FMREAD(HINIFILE,YRECFM,HLUOUT,ILENG,KIMAX,IGRID,ILENCH,YCOMMENT,IRESP)
171 !
172 YRECFM='JMAX'
173 ILENG=1
174 CALL FMREAD(HINIFILE,YRECFM,HLUOUT,ILENG,KJMAX,IGRID,ILENCH,YCOMMENT,IRESP)
175 !
176 YRECFM='KMAX'
177 ILENG=1
178 CALL FMREAD(HINIFILE,YRECFM,HLUOUT,ILENG,KKMAX,IGRID,ILENCH,YCOMMENT,IRESP)
179 !
180 !
181 !-------------------------------------------------------------------------------
182 !
183 !*       2.    SET DIMENSIONS FOR ARRAY IN INITIALIZATION OR POST-PROCESSING
184 !              -------------------------------------------------------------
185 !
186 IF (CCONF == 'POSTP') THEN 
187 !              
188   IF ((KIINF <= 0).OR.(KISUP <= 0)) THEN ! this condition corresponds to a 
189     KIINF = 1                            ! post-processing case where the whole 
190     KISUP = KIMAX + 2*JPHEXT             ! simulation domain must be considered
191                                          ! along the x direction
192   ELSE                                                           
193     KIINF = MIN(KIINF,KIMAX+2*JPHEXT)    ! post-processing case with an 
194     KISUP = MIN(KISUP,KIMAX+2*JPHEXT)    ! explicit window
195   END IF 
196 !                                                        
197   IF ((KJINF <= 0 ).OR.(KJSUP <= 0 )) THEN                       
198     KJINF = 1
199     KJSUP = KJMAX + 2* JPHEXT 
200   ELSE                                                           
201     KJINF = MIN(KJINF,KJMAX+2*JPHEXT) 
202     KJSUP = MIN(KJSUP,KJMAX+2*JPHEXT)
203   END IF 
204 !                                                        
205 ELSE 
206 !                                                            
207   KIINF = 1                             ! case corresponding to a simulation
208   KISUP = KIMAX + 2* JPHEXT
209   KJINF = 1
210   KJSUP = KJMAX+ 2* JPHEXT
211 !
212 END IF                                                           
213 !
214 !-------------------------------------------------------------------------------
215 !
216 !*       3.    PRINT DIMENSIONS ON OUTPUT_LISTING
217 !              ----------------------------------
218 !
219 CALL FMLOOK(HLUOUT,HLUOUT,ILUOUT,IRESP)
220 IF(KIINF > KISUP) THEN
221   WRITE(UNIT=ILUOUT,FMT="(' THE PROGRAM STOPS IN THE SET_DIM SUBROUTINE ',/,&
222               & 'BECAUSE THE WINDOW BOUNDS ARE NOT CONSISTENT ',/,          &
223               & 'KIINF =',I5,' KISUP =',I5,' KJINF =',I5,' KJSUP =',I5)")   &
224                  KIINF,KISUP,KJINF,KJSUP 
225   STOP
226 END IF
227
228 IF (NVERB >= 5) THEN
229   WRITE(UNIT=ILUOUT,FMT="(' DIMENSIONS INITIALIZED BY SET_GRID :',/,       &
230               & 'KIMAX =',I5,' KJMAX =',I5,' KKMAX =',I5,/,                 &
231               & 'KIINF =',I5,' KISUP =',I5,' KJINF =',I5,' KJSUP =',I5)")   &
232                  KIMAX,KJMAX,KKMAX,KIINF,KISUP,KJINF,KJSUP
233 END IF
234 !
235 !-------------------------------------------------------------------------------
236 !
237 END SUBROUTINE SET_DIM