New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
dimension.f90 in branches/2013/dev_rev4119_MERCATOR4_CONFMAN/NEMOGCM/TOOLS/SIREN/src – NEMO

source: branches/2013/dev_rev4119_MERCATOR4_CONFMAN/NEMOGCM/TOOLS/SIREN/src/dimension.f90 @ 4213

Last change on this file since 4213 was 4213, checked in by cbricaud, 10 years ago

first draft of the CONFIGURATION MANAGER demonstrator

File size: 46.7 KB
Line 
1!----------------------------------------------------------------------
2! NEMO system team, System and Interface for oceanic RElocable Nesting
3!----------------------------------------------------------------------
4!
5! MODULE: dim
6!
7! DESCRIPTION:
8!> @brief
9!> This module manage dimension and how to change order of those dimension.
10!
11!> @details
12!>    define type TDIM:<br/>
13!>    TYPE(TDIM) :: tl_dim<br/>
14!>
15!>    to initialise a dimension structure:<br/>
16!>    - tl_dim=dim_init( cd_name, [id_len,] [ld_uld,] [cd_sname])
17!>       - cd_name is the dimension name
18!>       - id_len is the dimension size (optional)
19!>       - ld_uld is true if this dimension is the unlimited one (optional)
20!>       - cd_sname is the dimension short name (optional)
21!>
22!>    to print information about dimension structure:<br/>
23!>    CALL dim_print(tl_dim)
24!>
25!>    to get dimension name:<br/>
26!>    - tl_dim\%c_name
27!>
28!>    to get dimension short name:<br/>
29!>    - tl_dim\%c_sname
30!>
31!>    to get dimension length:<br/>
32!>    - tl_dim\%i_len
33!>
34!>    to know if dimension is the unlimited one:<br/>
35!>    - tl_dim\%l_uld
36!>
37!>    to get dimension id (use for variable or file dimension):<br/>
38!>    - tl_dim\%i_id
39!>
40!>    to know if dimension is used (use for variable or file dimension):<br/>
41!>    - tl_dim\%l_use
42!>
43!>    Former function or information concern only one dimension. However
44!>    variables as well as files use usually 4 dimensions.<br/>
45!>    To easily work with variable we want they will be all 4D and ordered as
46!>    follow: ('x','y','z','t').<br/>
47!>    Functions and subroutines below, allow to reorder dimension of
48!>    variable.<br/>
49!>   
50!>    Suppose we defined the table of dimension structure below:<br/>
51!>    TYPE(TDIM), DIMENSION(4) :: tl_dim
52!>    tl_dim(1)=dim_init( 'X', id_len=10)
53!>    tl_dim(2)=dim_init( 'T', id_len=3, ld_uld=.TRUE.)
54!>
55!>    to reorder dimension as we assume variable are defined
56!>    ('x','y','z','t'):<br/>
57!>    CALL dim_reorder(tl(dim(:))
58!>
59!>    This subroutine filled dimension structure with unused dimension,
60!>    then switch from "unordered" dimension to "ordered" dimension
61!>    The dimension structure return will be:
62!>    tl_dim(1) => 'X', i_len=10, l_use=T, l_uld=F
63!>    tl_dim(2) => 'Y', i_len=0,  l_use=F, l_uld=F
64!>    tl_dim(3) => 'Z', i_len=0,  l_use=F, l_uld=F
65!>    tl_dim(4) => 'T', i_len=3,  l_use=T, l_uld=T
66!>
67!>    After using dim_reorder subroutine you could use functions and subroutine
68!>    below.<br/>
69!>
70!>    to reshape table of value in "ordered" dimension:<br/>
71!>    CALL dim_reshape_2xyzt(tl_dim(:), value(:,:,:,:))
72!>       - value must be a 4D table of real(8) value "unordered"
73!>
74!>    to reshape table of value in "unordered" dimension:<br/>
75!>    CALL dim_reshape_xyzt2(tl_dim(:), value(:,:,:,:))
76!>       - value must be a 4D table of real(8) value "ordered"
77!>
78!>    to reorder a 1D table of 4 elements in "ordered" dimension:<br/>
79!>    CALL dim_reorder_2xyzt(tl_dim(:), tab(:))
80!>
81!>       - tab must be a 1D table with 4 elements "unordered".
82!>       It could be composed of character, integer(4), or logical
83!>
84!>    to reorder a 1D table of 4 elements in "unordered" dimension:<br/>
85!>    CALL dim_reorder_2xyzt(tl_dim(:), tab(:))
86!>
87!>       - tab must be a 1D table with 4 elements "ordered".
88!>       It could be composed of character, integer(4), or logical
89!>
90!> @author
91!> J.Paul
92! REVISION HISTORY:
93!> @date Nov, 2013 - Initial Version
94!
95!> @todo
96!> - add description generique de l'objet dim
97!>
98!> @note Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
99!----------------------------------------------------------------------
100MODULE dim
101   USE global                          ! global variable
102   USE kind                            ! F90 kind parameter
103   USE logger                          ! log file manager
104   USE fct                             ! basic useful function
105   IMPLICIT NONE
106   PRIVATE
107   ! NOTE_avoid_public_variables_if_possible
108
109   ! type and variable
110   PUBLIC :: TDIM              !< dimension structure
111   PUBLIC :: ip_maxdim         !< number of dimension to be used
112   PUBLIC :: cp_dimorder       !< dimension order
113
114   ! function and subroutine
115   PUBLIC :: dim_init          !< initialize dimension structure
116   PUBLIC :: dim_clean         !< clean dimension structuree
117   PUBLIC :: dim_print         !< print dimension information
118   PUBLIC :: dim_get_id        !< get dimension id in table of dimension structure
119   PUBLIC :: dim_get_void_id   !< get unused dimension id in table of dimension structure
120   PUBLIC :: dim_order         !< check if dimension are ordered or not
121   PUBLIC :: dim_reorder       !< filled dimension structure to switch from unordered to ordered dimension
122   PUBLIC :: dim_unorder       !< switch dimension table from ordered to unordered dimension
123   PUBLIC :: dim_reshape_2xyzt !< reshape table dimension to ('x','y','z','t')
124   PUBLIC :: dim_reshape_xyzt2 !< reshape table dimension from ('x','y','z','t')
125   PUBLIC :: dim_reorder_2xyzt !< reorder 1D table to ('x','y','z','t')
126   PUBLIC :: dim_reorder_xyzt2 !< reorder 1D table from ('x','y','z','t')
127
128   PRIVATE :: dim__fill_unused      !< filled dimension structure with unused dimension
129   PRIVATE :: dim__reshape_2xyzt_dp !< reshape real(8) 4D table to ('x','y','z','t')
130   PRIVATE :: dim__reshape_xyzt2_dp !< reshape real(8) 4D table from ('x','y','z','t')
131   PRIVATE :: dim__reorder_2xyzt_i4 !< reorder integer(4) 1D table to ('x','y','z','t')
132   PRIVATE :: dim__reorder_xyzt2_i4 !< reorder integer(4) 1D table from ('x','y','z','t')
133   PRIVATE :: dim__reorder_2xyzt_l  !< reorder logical 1D table to ('x','y','z','t')
134   PRIVATE :: dim__reorder_xyzt2_l  !< reorder logical 1D table from ('x','y','z','t')
135   PRIVATE :: dim__reorder_2xyzt_c  !< reorder string 1D table to ('x','y','z','t')
136   PRIVATE :: dim__reorder_xyzt2_c  !< reorder string 1D table from ('x','y','z','t')
137   PRIVATE :: dim__clean_unit       !< clean one dimension structure
138   PRIVATE :: dim__clean_tab        !< clean a table of dimension structure
139   PRIVATE :: dim__print_unit       !< print information on one dimension structure
140   PRIVATE :: dim__print_tab        !< print information on a table of dimension structure
141
142   !> @struct TDIM
143   TYPE TDIM
144      CHARACTER(LEN=lc) :: c_name = ''!< dimension name
145      CHARACTER(LEN=lc) :: c_sname = 'u'     !< dimension short name
146      INTEGER(i4)       :: i_id = 0          !< dimension id
147      INTEGER(i4)       :: i_len = 1         !< dimension length
148      LOGICAL           :: l_uld = .FALSE.   !< dimension unlimited or not
149      LOGICAL           :: l_use = .FALSE.   !< dimension used or not
150      INTEGER(i4)       :: i_2xyzt = 0       !< indices to reshape table to ('x','y','z','t')
151      INTEGER(i4)       :: i_xyzt2 = 0       !< indices to reshape table from ('x','y','z','t')
152   END TYPE
153
154   INTEGER(i4), PARAMETER :: ip_maxdim = 4  !< number of dimension to be used
155
156   !  module variable
157   CHARACTER(LEN=lc), PARAMETER :: cp_dimorder = 'xyzt' !< dimension order to output
158
159   INTERFACE dim_print
160      MODULE PROCEDURE dim__print_unit ! print information on one dimension
161      MODULE PROCEDURE dim__print_tab  ! print information on a table of dimension
162   END INTERFACE dim_print
163
164   INTERFACE dim_clean
165      MODULE PROCEDURE dim__clean_unit ! clean one dimension
166      MODULE PROCEDURE dim__clean_tab  ! clean a table of dimension
167   END INTERFACE dim_clean
168
169   INTERFACE dim_reshape_2xyzt
170      MODULE PROCEDURE dim__reshape_2xyzt_dp   ! reshape real(8) 4D table to ('x','y','z','t')
171   END INTERFACE dim_reshape_2xyzt
172
173   INTERFACE dim_reshape_xyzt2
174      MODULE PROCEDURE dim__reshape_xyzt2_dp   ! reshape real(8) 4D table from ('x','y','z','t')
175   END INTERFACE dim_reshape_xyzt2
176
177   INTERFACE dim_reorder_2xyzt
178      MODULE PROCEDURE dim__reorder_2xyzt_i4   ! reorder integer(4) 1D table to ('x','y','z','t')
179      MODULE PROCEDURE dim__reorder_2xyzt_c    ! reorder string 1D table to ('x','y','z','t')
180      MODULE PROCEDURE dim__reorder_2xyzt_l    ! reorder logical 1D table to ('x','y','z','t')
181   END INTERFACE dim_reorder_2xyzt
182
183   INTERFACE dim_reorder_xyzt2
184      MODULE PROCEDURE dim__reorder_xyzt2_i4   ! reorder integer(4) 1D table from ('x','y','z','t')
185      MODULE PROCEDURE dim__reorder_xyzt2_c    ! reorder string 1D table from ('x','y','z','t')
186      MODULE PROCEDURE dim__reorder_xyzt2_l    ! reorder logical 1D table from ('x','y','z','t') 
187   END INTERFACE dim_reorder_xyzt2
188
189CONTAINS
190   !-------------------------------------------------------------------
191   !> @brief This function returns dimension id, in a table of dimension structure,
192   !> given dimension name, or short name.
193   !> only dimension used are checked.
194   !>
195   !> @author J.Paul
196   !> - Nov, 2013- Initial Version
197   !
198   !> @param[in] td_dim   : dimension structure
199   !> @param[in] cd_name  : dimension name or short name
200   !> @param[in] cd_sname : dimension short name
201   !> @return dimension id
202   !-------------------------------------------------------------------
203   !> @code
204   INTEGER(i4) FUNCTION dim_get_id( td_dim, cd_name, cd_sname )
205      IMPLICIT NONE
206      ! Argument
207      TYPE(TDIM),       DIMENSION(:), INTENT(IN) :: td_dim
208      CHARACTER(LEN=*),               INTENT(IN) :: cd_name
209      CHARACTER(LEN=*),               INTENT(IN), OPTIONAL :: cd_sname
210
211      ! local variable
212      CHARACTER(LEN=lc) :: cl_name
213      CHARACTER(LEN=lc) :: cl_dim_name
214      CHARACTER(LEN=lc) :: cl_sname
215      CHARACTER(LEN=lc) :: cl_dim_sname
216
217      INTEGER(i4) :: il_ndim
218
219      ! loop indices
220      INTEGER(i4) :: ji
221      INTEGER(i4) :: jj
222      !----------------------------------------------------------------
223      ! init
224      dim_get_id=0
225
226      il_ndim=SIZE(td_dim(:))
227
228      ! look for dimension name
229      cl_name=fct_lower(cd_name)
230      ! check if dimension is in table of dimension structure and used
231      jj=0
232      DO ji=1,il_ndim
233         !IF( td_dim(ji)%l_use ) jj=jj+1
234
235         cl_dim_name=fct_lower(td_dim(ji)%c_name)
236         IF( TRIM(cl_dim_name) == TRIM(cl_name) .AND. &
237         &   td_dim(ji)%l_use )THEN
238            dim_get_id=ji !jj
239            CALL logger_debug("GET ID: variable name "//&
240            &  TRIM(ADJUSTL(cd_name))//" already in file " )
241            EXIT
242         ENDIF
243      ENDDO
244
245      ! look for dimension short name
246      IF(  dim_get_id == 0 )THEN
247
248         cl_sname=fct_lower(cd_name)
249         ! check if dimension is in table of dimension structure and used
250         jj=0
251         DO ji=1,il_ndim
252            IF( td_dim(ji)%l_use ) jj=jj+1
253           
254            cl_dim_sname=fct_lower(td_dim(ji)%c_sname)
255            IF( (TRIM(cl_dim_sname) == TRIM(cl_sname) ).AND.&
256            &   td_dim(ji)%l_use )THEN
257               CALL logger_debug("GET ID: variable short name "//&
258               &  TRIM(ADJUSTL(cd_name))//" already in file")
259               dim_get_id=jj
260               EXIT
261            ENDIF
262         ENDDO
263      ENDIF
264
265      ! look for dimension short name
266      IF( PRESENT(cd_sname) )THEN
267         IF(  dim_get_id == 0 )THEN
268
269            cl_sname=fct_lower(cd_sname)
270            ! check if dimension is in table of dimension structure and used
271            jj=0
272            DO ji=1,il_ndim
273               IF( td_dim(ji)%l_use ) jj=jj+1
274               
275               cl_dim_sname=fct_lower(td_dim(ji)%c_sname)
276               IF( (TRIM(cl_dim_sname) == TRIM(cl_sname) ).AND.&
277               &   td_dim(ji)%l_use )THEN
278                  CALL logger_debug("GET ID: variable short name "//&
279                  &  TRIM(ADJUSTL(cd_sname))//" already in file")
280                  dim_get_id=jj
281                  EXIT
282               ENDIF
283            ENDDO
284         ENDIF
285      ENDIF
286
287   END FUNCTION dim_get_id
288   !> @endcode
289   !-------------------------------------------------------------------
290   !> @brief This function returns dimension id, in a table of dimension structure,
291   !> given dimension name, or short name.
292   !> only dimension used are checked.
293   !>
294   !> @author J.Paul
295   !> - Nov, 2013- Initial Version
296   !
297   !> @param[in] td_dim   : dimension structure
298   !> @param[in] cd_name  : dimension name or short name
299   !> @param[in] cd_sname : dimension short name
300   !> @return dimension id
301   !-------------------------------------------------------------------
302   !> @code
303   INTEGER(i4) FUNCTION dim_get_void_id( td_dim, cd_name, cd_sname )
304      IMPLICIT NONE
305      ! Argument
306      TYPE(TDIM),       DIMENSION(:), INTENT(IN) :: td_dim
307      CHARACTER(LEN=*),               INTENT(IN), OPTIONAL :: cd_name
308      CHARACTER(LEN=*),               INTENT(IN), OPTIONAL :: cd_sname
309
310      ! local variable
311      CHARACTER(LEN=lc) :: cl_name
312      CHARACTER(LEN=lc) :: cl_dim_name
313      CHARACTER(LEN=lc) :: cl_sname
314      CHARACTER(LEN=lc) :: cl_dim_sname
315
316      INTEGER(i4) :: il_ndim
317
318      ! loop indices
319      INTEGER(i4) :: ji
320      !----------------------------------------------------------------
321      ! init
322      dim_get_void_id=0
323
324      il_ndim=SIZE(td_dim(:))
325
326      ! look for dimension name
327      cl_name=fct_lower(cd_name)
328      ! check if dimension is in table of dimension structure and used
329      DO ji=1,il_ndim
330
331         cl_dim_name=fct_lower(td_dim(ji)%c_name)
332         IF( TRIM(cl_dim_name) == TRIM(cl_name) .AND. &
333         &   .NOT. td_dim(ji)%l_use )THEN
334            dim_get_void_id=ji
335            EXIT
336         ENDIF
337      ENDDO
338
339      ! look for dimension short name
340      IF(  dim_get_void_id == 0 )THEN
341
342         cl_sname=fct_lower(cd_name)
343         ! check if dimension is in table of dimension structure and used
344         DO ji=1,il_ndim
345           
346            cl_dim_sname=fct_lower(td_dim(ji)%c_sname)
347            IF( (TRIM(cl_dim_sname) == TRIM(cl_sname) ).AND.&
348            &   .NOT. td_dim(ji)%l_use )THEN
349               dim_get_void_id=ji
350               EXIT
351            ENDIF
352         ENDDO
353      ENDIF
354
355      ! look for dimension short name
356      IF( PRESENT(cd_sname) )THEN
357         IF(  dim_get_void_id == 0 )THEN
358
359            cl_sname=fct_lower(cd_sname)
360            ! check if dimension is in table of dimension structure and used
361            DO ji=1,il_ndim
362               
363               cl_dim_sname=fct_lower(td_dim(ji)%c_sname)
364               IF( (TRIM(cl_dim_sname) == TRIM(cl_sname) ).AND.&
365               &   .NOT. td_dim(ji)%l_use )THEN
366                  dim_get_void_id=ji
367                  EXIT
368               ENDIF
369            ENDDO
370         ENDIF
371      ENDIF
372
373      IF( dim_get_void_id == 0 )THEN
374         DO ji=1,il_ndim
375            IF( .NOT. td_dim(ji)%l_use ) dim_get_void_id=ji
376         ENDDO
377      ENDIF
378
379   END FUNCTION dim_get_void_id
380   !> @endcode
381   !-------------------------------------------------------------------
382   !> @brief This routine initialise a dimension structure with given
383   !> arguments (name, length, etc).<br/>
384   !> define dimension is supposed to be used.
385   !>
386   !> @author J.Paul
387   !> - Nov, 2013- Initial Version
388   !
389   !> @param[in] cd_name : dimension name
390   !> @param[in] id_len : dimension length
391   !> @param[in] ld_uld : dimension unlimited
392   !> @param[in] cd_sname : dimension short name
393   !> @return dimension structure
394   !-------------------------------------------------------------------
395   !> @code
396   TYPE(TDIM) FUNCTION dim_init( cd_name, id_len, ld_uld, cd_sname)
397      IMPLICIT NONE
398
399      ! Argument
400      CHARACTER(LEN=*), INTENT(IN)  :: cd_name
401      INTEGER(i4),      INTENT(IN), OPTIONAL :: id_len
402      LOGICAL,          INTENT(IN), OPTIONAL :: ld_uld
403      CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: cd_sname
404
405      ! local variable
406      CHARACTER(LEN=lc) :: cl_name
407      CHARACTER(LEN=lc) :: cl_sname
408      !----------------------------------------------------------------
409
410      ! clean dimension
411      CALL dim_clean(dim_init)
412
413      cl_name=fct_upper(cd_name)
414
415      CALL logger_info( &
416      &  " DIM INIT: dimension name: "//TRIM(cl_name) )
417      dim_init%c_name=TRIM(ADJUSTL(cd_name))
418
419      IF( PRESENT(id_len) )THEN
420         CALL logger_info( &
421         &  " DIM INIT: dimension length: "//fct_str(id_len) )
422         dim_init%i_len=id_len
423      ENDIF
424
425      ! define dimension is supposed to be used
426      dim_init%l_use=.TRUE.
427
428      IF( PRESENT(cd_sname) )THEN
429
430         cl_sname=fct_lower(cd_sname)
431
432         IF( TRIM(cl_sname) == 'x' .OR. &
433         &   TRIM(cl_sname) == 'y' .OR. & 
434         &   TRIM(cl_sname) == 'z' .OR. & 
435         &   TRIM(cl_sname) == 't' )THEN
436            CALL logger_info( &
437            &  " DIM INIT: dimension short name: "//TRIM(cd_sname) )
438            dim_init%c_sname=TRIM(cd_sname)
439         ELSE
440            CALL logger_warn("DIM INIT: invalid short name."//&
441            " choose between ('x','y','z','t')")
442         ENDIF
443      ENDIF
444
445      IF( TRIM(fct_lower(dim_init%c_sname)) == 'u' )THEN
446
447         cl_name=fct_lower(cd_name)
448
449         IF( TRIM(cl_name) == 'x' )THEN
450            dim_init%c_sname='x'
451         ELSEIF( TRIM(cl_name) == 'y' )THEN
452            dim_init%c_sname='y'
453         ELSEIF( TRIM(cl_name)== 'z' .OR. &
454         &   INDEX(cl_name,'depth')/=0 )THEN
455            dim_init%c_sname='z'
456         ELSEIF( TRIM(cl_name)== 't' .OR. &
457         &   INDEX(cl_name,'time')/=0 )THEN
458            dim_init%c_sname='t'
459         ENDIF     
460
461      ENDIF
462
463      IF( PRESENT(ld_uld) )THEN
464         CALL logger_info( &
465         &  " DIM INIT: unlimited dimension: "//fct_str(ld_uld) )
466         dim_init%l_uld=ld_uld
467      ELSE
468         IF( TRIM(fct_lower(dim_init%c_sname)) =='t'  )THEN
469            dim_init%l_uld=.TRUE.
470         ENDIF
471      ENDIF
472     
473   END FUNCTION dim_init
474   !> @endcode
475   !-------------------------------------------------------------------
476   !> @brief This subrtoutine print dimension information
477   !>
478   !> @author J.Paul
479   !> - Nov, 2013- Initial Version
480   !
481   !> @param[in] td_dim : table of dimension structure
482   !-------------------------------------------------------------------
483   !> @code
484   SUBROUTINE dim__print_tab(td_dim)
485      IMPLICIT NONE
486
487      ! Argument     
488      TYPE(TDIM), DIMENSION(:), INTENT(IN) :: td_dim
489
490      ! loop indices
491      INTEGER(i4) :: ji
492      !----------------------------------------------------------------
493
494      DO ji=1,SIZE(td_dim(:))
495         CALL dim_print(td_dim(ji))
496      ENDDO
497
498   END SUBROUTINE dim__print_tab
499   !> @endcode
500   !-------------------------------------------------------------------
501   !> @brief This subrtoutine print dimension information
502   !>
503   !> @author J.Paul
504   !> - Nov, 2013- Initial Version
505   !
506   !> @param[in] td_dim : dimension structure
507   !-------------------------------------------------------------------
508   !> @code
509   SUBROUTINE dim__print_unit(td_dim)
510      IMPLICIT NONE
511
512      ! Argument     
513      TYPE(TDIM), INTENT(IN) :: td_dim
514
515      !----------------------------------------------------------------
516
517      WRITE(*,'((3x,a,a),(/6x,a,a),(a,i1),(a,i4),2(a,a),2(a,i1))')   &
518      &        " dimension : ",TRIM(td_dim%c_name),               &
519      &        " short name : ",TRIM(td_dim%c_sname),        &
520      &        " id : ",td_dim%i_id,                         &
521      &        " len : ",td_dim%i_len,                       &
522      &        " use : ",TRIM(fct_str(td_dim%l_use)),        &
523      &        " uld : ",TRIM(fct_str(td_dim%l_uld)),        &
524      &        " xyzt2 : ",td_dim%i_xyzt2,                   &
525      &        " 2xyzt : ",td_dim%i_2xyzt
526
527   END SUBROUTINE dim__print_unit
528   !> @endcode
529   !-------------------------------------------------------------------
530   !> @brief
531   !> This subroutine check if dimension are ordered or not
532   !
533   !> @author J.Paul
534   !> - 2013- Initial Version
535   !
536   !> @param[in] td_dim : table of dimension structure
537   !> @return dimension are ordered or not
538   !-------------------------------------------------------------------
539   !> @code
540   FUNCTION dim_order(td_dim)
541      IMPLICIT NONE
542      ! Argument     
543      TYPE(TDIM), DIMENSION(:), INTENT(IN) :: td_dim
544
545      ! function
546      LOGICAL :: dim_order
547
548      ! local variable
549      CHARACTER(LEN=lc) :: cl_dimin
550
551      ! loop indices
552      !----------------------------------------------------------------
553      ! init
554      dim_order=.FALSE.
555
556      IF( SIZE(td_dim(:)) /= ip_maxdim )THEN
557         CALL logger_error("DIM ORDER: invalid dimension of table dimension.")
558      ELSE
559
560         cl_dimin=fct_concat(td_dim(:)%c_sname)
561
562         IF( TRIM(cp_dimorder) == TRIM(cl_dimin) )THEN
563            dim_order=.TRUE.
564         ENDIF
565
566      ENDIF
567   END FUNCTION dim_order
568   !> @endcode
569   !-------------------------------------------------------------------
570   !> @brief
571   !> This subroutine switch element of a table (4 elts) of dimension
572   !> structure
573   !> from unordered dimension to ordered dimension ('x','y','z','t')
574   !> Example: (/'z','x','t','y'/) => (/'x','y','z','t'/)
575   !> @warning this subroutine change dimension order
576   !
577   !> @author J.Paul
578   !> - Nov, 2013- Initial Version
579   !
580   !> @param[inout] td_dim : table of dimension structure
581   !> @return dimension structure completed and reordered
582   !>
583   !> @todo
584   !> -check input dimension order and stop if already ordered
585   !> -
586   !-------------------------------------------------------------------
587   !> @code
588   SUBROUTINE dim_reorder(td_dim)
589      IMPLICIT NONE
590      ! Argument     
591      TYPE(TDIM), DIMENSION(:), INTENT(INOUT) :: td_dim
592
593      ! local variable
594      INTEGER(i4)                             :: il_id
595      CHARACTER(LEN=lc)                       :: cl_dimin
596      TYPE(TDIM)       , DIMENSION(ip_maxdim) :: tl_dim
597
598      ! loop indices
599      INTEGER(i4) :: ji
600      INTEGER(i4) :: jj
601      !----------------------------------------------------------------
602
603      IF( SIZE(td_dim(:)) /= ip_maxdim )THEN
604         CALL logger_error("DIM ORDER: invalid dimension of table dimension.")
605      ELSE
606
607         ! copy and rename dimension in local variable
608         tl_dim(:)=td_dim(:)
609         jj=0
610         DO ji=1, ip_maxdim
611
612         CALL logger_debug( "DIM REORDER : jj "//TRIM(fct_str(jj))//&
613         &  " "//TRIM(fct_str(td_dim(ji)%l_use)))
614            IF( td_dim(ji)%l_use )THEN
615               jj=jj+1
616            !IF( td_dim(ji)%l_use .AND. td_dim(ji)%i_id == 0 )THEN
617               ! add id if dimension used and no id
618               CALL logger_debug( "DIM REORDER : add id "//TRIM(fct_str(jj))//&
619               &  " to dimension "//TRIM(td_dim(ji)%c_name) )
620               tl_dim(ji)%i_id=jj
621            ELSE
622               td_dim(ji)%i_id=0
623               td_dim(ji)%i_xyzt2=0
624               td_dim(ji)%c_sname='u'
625               td_dim(ji)%c_name=''
626               td_dim(ji)%l_uld=.FALSE.
627            ENDIF
628
629         ENDDO
630
631         print *,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
632         CALL dim_print(tl_dim(:))
633
634
635         ! fill unused dimension
636         CALL dim__fill_unused(tl_dim(:))
637         cl_dimin=fct_lower(fct_concat(tl_dim(:)%c_sname))
638
639         print *,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
640         CALL dim_print(tl_dim(:))
641         ! compute input id from output id (xyzt)
642         DO ji = 1, ip_maxdim
643             
644            il_id=SCAN(TRIM(cp_dimorder),TRIM(cl_dimin(ji:ji)))
645            IF( il_id /= 0 )THEN
646               tl_dim(ji)%i_xyzt2=il_id
647            ENDIF
648           
649         ENDDO
650
651         ! compute output id (xyzt) from input id
652         DO ji = 1, ip_maxdim
653             
654            il_id=SCAN(TRIM(cl_dimin),TRIM(cp_dimorder(ji:ji)))
655            IF( il_id /= 0 )THEN
656               tl_dim(ji)%i_2xyzt=il_id
657            ENDIF
658           
659         ENDDO
660
661         ! change dimension order to ('x','y','z','t')
662         td_dim(:)%c_name  = dim_reorder_2xyzt(tl_dim(:),tl_dim(:)%c_name)
663         td_dim(:)%c_sname = dim_reorder_2xyzt(tl_dim(:),tl_dim(:)%c_sname)
664         td_dim(:)%i_id    = dim_reorder_2xyzt(tl_dim(:),tl_dim(:)%i_id  )
665         td_dim(:)%i_len   = dim_reorder_2xyzt(tl_dim(:),tl_dim(:)%i_len )
666         td_dim(:)%l_uld   = dim_reorder_2xyzt(tl_dim(:),tl_dim(:)%l_uld )
667         td_dim(:)%l_use   = dim_reorder_2xyzt(tl_dim(:),tl_dim(:)%l_use )
668         td_dim(:)%i_2xyzt = tl_dim(:)%i_2xyzt
669         td_dim(:)%i_xyzt2 = tl_dim(:)%i_xyzt2
670
671      ENDIF
672
673   END SUBROUTINE dim_reorder
674   !> @endcode
675   !-------------------------------------------------------------------
676   !> @brief
677   !> This subroutine switch dimension table from ordered dimension ('x','y','z','t')
678   !> to unordered dimension.<br/>
679   !> Example: (/'x','y','z','t'/) => (/'z','x','t','y'/)<br/>
680   !> This is useful to add dimension in a variable or file
681   !
682   !> @warning this subroutine change dimension order
683   !
684   !> @author J.Paul
685   !> - Nov, 2013- Initial Version
686   !
687   !> @param[inout] td_dim : table of dimension structure
688   !> @return dimension structure unordered
689   !-------------------------------------------------------------------
690   !> @code
691   SUBROUTINE dim_unorder(td_dim)
692      IMPLICIT NONE
693      ! Argument     
694      TYPE(TDIM), DIMENSION(:), INTENT(INOUT) :: td_dim
695
696      ! local variable
697
698      ! loop indices
699      INTEGER(i4) :: ji
700      INTEGER(i4) :: jj
701      !----------------------------------------------------------------
702
703      IF( SIZE(td_dim(:)) /= ip_maxdim )THEN
704         CALL logger_error("DIM ORDER: invalid dimension of table dimension.")
705      ELSE     
706         ! add dummy xyzt2 id to removed dimension
707         jj=1
708         DO ji = 1, ip_maxdim
709            IF( .NOT. td_dim(ji)%l_use .AND. td_dim(ji)%i_xyzt2 == 0 )THEN
710               DO WHILE( ANY( td_dim(:)%i_xyzt2 == jj ))
711                  jj=jj+1
712               ENDDO
713               td_dim(ji)%i_xyzt2=jj
714            ENDIF
715         ENDDO
716
717         ! change dimension order from ('x','y','z','t')
718         td_dim(:)%c_name  = dim_reorder_xyzt2(td_dim,td_dim(:)%c_name)
719         td_dim(:)%c_sname = dim_reorder_xyzt2(td_dim,td_dim(:)%c_sname)
720         td_dim(:)%i_id    = dim_reorder_xyzt2(td_dim,td_dim(:)%i_id  )
721         td_dim(:)%i_len   = dim_reorder_xyzt2(td_dim,td_dim(:)%i_len )
722         td_dim(:)%l_uld   = dim_reorder_xyzt2(td_dim,td_dim(:)%l_uld )
723         td_dim(:)%l_use   = dim_reorder_xyzt2(td_dim,td_dim(:)%l_use )
724
725         ! remove dummy xyzt2 id from unused dimension
726         DO ji = 1, ip_maxdim
727            IF( .NOT. td_dim(ji)%l_use )THEN
728               td_dim(ji)%i_id=0
729               td_dim(ji)%i_xyzt2=0
730               td_dim(ji)%c_sname='u'
731               !td_dim(ji)%c_name='unknown'
732               !td_dim(ji)%c_sname=''
733               td_dim(ji)%c_name=''
734               td_dim(ji)%l_uld=.FALSE.
735            ENDIF
736         ENDDO
737      ENDIF
738
739   END SUBROUTINE dim_unorder
740   !> @endcode   
741   !-------------------------------------------------------------------
742   !> @brief This subroutine filled dimension structure with unused
743   !> dimension in order that all dimensions 'x','y','z' and 't' be
744   !> informed, even if void
745   !
746   !> @author J.Paul
747   !> - Nov, 2013- Initial Version
748   !
749   !> @param[inout] td_dim : table of dimension structure
750   !> @return td_dim with unused dimension
751   !-------------------------------------------------------------------
752   !> @code
753   SUBROUTINE dim__fill_unused(td_dim)
754      IMPLICIT NONE
755      ! Argument     
756      TYPE(TDIM), DIMENSION(:), INTENT(INOUT) :: td_dim
757
758      ! local variable
759      CHARACTER(LEN=lc)               :: cl_dimin
760      INTEGER(i4)      , DIMENSION(1) :: il_ind  ! index
761     
762      ! loop indices
763      INTEGER(i4) :: ji
764      !----------------------------------------------------------------
765
766      IF( SIZE(td_dim(:)) /= ip_maxdim )THEN
767         CALL logger_error("DIM ORDER: invalid dimension of table dimension.")
768      ELSE     
769         ! concatenate dimension used in a character string
770         cl_dimin=fct_lower(fct_concat(td_dim(:)%c_sname))
771         DO ji = 1, ip_maxdim
772
773            ! search missing dimension
774            IF( INDEX(cl_dimin,TRIM(fct_lower(cp_dimorder(ji:ji)))) == 0 )THEN
775               ! search first empty dimension
776               il_ind(:)=MINLOC( td_dim(:)%i_id, td_dim(:)%i_id == 0 )
777
778               ! put missing dimension instead of empty one
779               td_dim(il_ind(1))%c_sname=fct_lower(cp_dimorder(ji:ji))
780               ! update output structure
781               td_dim(il_ind(1))%c_name=fct_lower(cp_dimorder(ji:ji))
782               td_dim(il_ind(1))%i_id=il_ind(1)
783               td_dim(il_ind(1))%i_len=1
784               td_dim(il_ind(1))%l_use=.FALSE.
785
786            ENDIF
787
788         ENDDO
789
790         ! remove id of unused dimension
791         DO ji = 1, ip_maxdim
792            IF( .NOT. td_dim(ji)%l_use ) td_dim(ji)%i_id=0
793         ENDDO
794      ENDIF
795
796   END SUBROUTINE dim__fill_unused
797   !> @endcode   
798   !-------------------------------------------------------------------
799   !> @brief This subroutine reshape real(8) 4D table   
800   !> to an ordered table with dimension (/'x','y','z','t'/).<br/>
801   !> Example: (/'z','x','t','y'/) => (/'x','y','z','t'/)
802   !
803   !> @note you must have run dim_reorder before use this subroutine
804   !
805   !> @warning output table dimension differ from input table dimension
806   !
807   !> @author J.Paul
808   !> - Nov, 2013- Initial Version
809   !
810   !> @param[in] td_dim : table of dimension structure
811   !> @param[in] dd_value : table of value to reshape
812   !> @return table of value reshaped
813   !-------------------------------------------------------------------
814   !> @code
815   FUNCTION dim__reshape_2xyzt_dp(td_dim, dd_value)
816      IMPLICIT NONE
817
818      ! Argument     
819      TYPE(TDIM), DIMENSION(:)      , INTENT(IN) :: td_dim
820      REAL(dp)  , DIMENSION(:,:,:,:), INTENT(IN) :: dd_value
821     
822      ! function
823      REAL(dp), DIMENSION(td_dim(1)%i_len, &
824      &                   td_dim(2)%i_len, &
825      &                   td_dim(3)%i_len, &
826      &                   td_dim(4)%i_len) :: dim__reshape_2xyzt_dp
827
828      ! local variable
829      INTEGER(i4)      , DIMENSION(ip_maxdim) :: il_shape
830      CHARACTER(LEN=lc)                       :: cl_dim
831     
832      ! loop indices
833      INTEGER(i4) :: ji
834      !----------------------------------------------------------------
835
836      IF( SIZE(td_dim(:)) /= ip_maxdim )THEN
837         CALL logger_error("DIM ORDER: invalid dimension of table dimension.")
838      ELSE     
839
840         IF( ANY(td_dim(:)%i_2xyzt==0) .OR. ANY(td_dim(:)%i_xyzt2==0) )THEN
841
842            CALL logger_fatal( &
843            &  "  RESHAPE to XYZT: you should have run dim_reorder &
844            &     before running RESHAPE" )
845
846         ENDIF
847
848         il_shape=SHAPE(dd_value)
849         ! check input dimension
850         IF( ANY(il_shape(:) /= (/ td_dim(td_dim(1)%i_xyzt2)%i_len, &
851                               &   td_dim(td_dim(2)%i_xyzt2)%i_len, &
852                               &   td_dim(td_dim(3)%i_xyzt2)%i_len, &
853                               &   td_dim(td_dim(4)%i_xyzt2)%i_len /)) )THEN
854
855            DO ji=1,ip_maxdim
856               CALL logger_debug(" RESHAPE to XYZT: dim "//&
857               &     TRIM(td_dim(td_dim(ji)%i_xyzt2)%c_name)//" "//&
858               &     TRIM(fct_str(td_dim(td_dim(ji)%i_xyzt2)%i_len))//" vs "//&
859               &     TRIM(fct_str(il_shape(ji))) )
860            ENDDO
861            CALL logger_fatal(" RESHAPE to XYZT: wrong input dimensions " )
862
863         ELSE
864
865            ! write some informations
866            cl_dim="(/"
867            DO ji=1,ip_maxdim-1
868               cl_dim=TRIM(cl_dim)//TRIM(fct_str(il_shape(ji)))//','
869            ENDDO
870            cl_dim=TRIM(cl_dim)//TRIM(fct_str(il_shape(ip_maxdim)))//"/)"
871
872            CALL logger_info(" RESHAPE to XYZT: input dimensions are "//&
873            &  TRIM(cl_dim) )
874
875            cl_dim="(/"
876            DO ji=1,ip_maxdim-1
877               cl_dim=TRIM(cl_dim)//TRIM(fct_str(td_dim(ji)%i_len))//','
878            ENDDO
879            cl_dim=TRIM(cl_dim)//TRIM(fct_str(td_dim(ip_maxdim)%i_len))//"/)"
880
881            CALL logger_info(" RESHAPE to XYZT: ouput dimensions should be "//&
882            &  TRIM(cl_dim) )
883
884               ! reorder dimension to x,y,z,t
885               dim__reshape_2xyzt_dp(:,:,:,:)=RESHAPE(SOURCE=dd_value(:,:,:,:),&
886               &                 SHAPE = (/ td_dim(1)%i_len,   &
887               &                            td_dim(2)%i_len,   &
888               &                            td_dim(3)%i_len,   &
889               &                            td_dim(4)%i_len /),&
890               &                 ORDER = (/ td_dim(1)%i_2xyzt,          &
891               &                            td_dim(2)%i_2xyzt,          &
892               &                            td_dim(3)%i_2xyzt,          &
893               &                            td_dim(4)%i_2xyzt        /))     
894
895         ENDIF
896      ENDIF
897
898   END FUNCTION dim__reshape_2xyzt_dp
899   !> @endcode   
900   !-------------------------------------------------------------------
901   !> @brief This subroutine reshape ordered real(8) 4D table with dimension
902   !> (/'x','y','z','t'/) to a table ordered as file variable.<br/>
903   !> Example: (/'x','y','z','t'/) => (/'z','x','t','y'/)
904   !
905   !> @note you must have run dim_reorder before use this subroutine
906   !
907   !> @warning output table dimension differ from input table dimension
908   !
909   !> @author J.Paul
910   !> - Nov, 2013- Initial Version
911   !
912   !> @param[in] td_dim : table of dimension structure
913   !> @param[in] dd_value : table of value to reshape
914   !> @return table of value reshaped
915   !-------------------------------------------------------------------
916   !> @code
917   FUNCTION dim__reshape_xyzt2_dp(td_dim, dd_value)
918      IMPLICIT NONE
919     
920      ! Argument     
921      TYPE(TDIM), DIMENSION(:)      , INTENT(IN) :: td_dim
922      REAL(dp),   DIMENSION(:,:,:,:), INTENT(IN) :: dd_value
923     
924      ! function
925      REAL(dp), DIMENSION(td_dim(td_dim(1)%i_xyzt2)%i_len, &
926      &                   td_dim(td_dim(2)%i_xyzt2)%i_len, &
927      &                   td_dim(td_dim(3)%i_xyzt2)%i_len, &
928      &                   td_dim(td_dim(4)%i_xyzt2)%i_len) :: dim__reshape_xyzt2_dp
929
930      ! local variable
931      INTEGER(i4),      DIMENSION(ip_maxdim) :: il_shape
932      CHARACTER(LEN=lc)                      :: cl_dim
933     
934      ! loop indices
935      INTEGER(i4) :: ji
936      !----------------------------------------------------------------
937
938      IF( SIZE(td_dim(:)) /= ip_maxdim )THEN
939         CALL logger_error("DIM ORDER: invalid dimension of table dimension.")
940      ELSE
941
942         IF( ANY(td_dim(:)%i_xyzt2==0) .OR. ANY(td_dim(:)%i_2xyzt==0) )THEN
943
944            CALL logger_fatal( &
945            &  "  RESHAPE from XYZT: you should have run dim_reorder &
946            &     before running RESHAPE" )
947
948         ENDIF       
949
950         ! check input dimension
951         il_shape=SHAPE(dd_value)
952         IF( ANY(il_shape(:)/=td_dim(:)%i_len))THEN
953
954            DO ji=1,ip_maxdim
955               CALL logger_debug(" RESHAPE from XYZT: dim "//&
956               &              TRIM(td_dim(ji)%c_name)//" "//&
957               &              TRIM(fct_str(td_dim(ji)%i_len))//" vs "//&
958               &              TRIM(fct_str(il_shape(ji))) )
959            ENDDO
960            CALL logger_fatal( "RESHAPE from XYZT: wrong input dimensions ")
961
962         ELSE     
963
964            ! write some informations
965            cl_dim="(/"
966            DO ji=1,ip_maxdim-1
967               cl_dim=TRIM(cl_dim)//TRIM(fct_str(il_shape(ji)))//','
968            ENDDO
969            cl_dim=TRIM(cl_dim)//TRIM(fct_str(il_shape(ip_maxdim)))//"/)"
970
971            CALL logger_info(" RESHAPE from XYZT: input dimensions are "//&
972            &  TRIM(cl_dim) )
973
974            cl_dim="(/"
975            DO ji=1,ip_maxdim-1
976               cl_dim=TRIM(cl_dim)//&
977               &      TRIM(fct_str(td_dim(td_dim(ji)%i_xyzt2)%i_len))//','
978            ENDDO
979            cl_dim=TRIM(cl_dim)//&
980            &      TRIM(fct_str(td_dim(td_dim(ip_maxdim)%i_xyzt2)%i_len))//"/)"
981
982            CALL logger_info(" RESHAPE from XYZT: ouput dimensions should be "//&
983            &  TRIM(cl_dim) )
984
985            ! reshape table
986            dim__reshape_xyzt2_dp(:,:,:,:)=RESHAPE(SOURCE=dd_value,  &
987            &           SHAPE = (/ td_dim(td_dim(1)%i_xyzt2)%i_len,   &
988            &                      td_dim(td_dim(2)%i_xyzt2)%i_len,   &
989            &                      td_dim(td_dim(3)%i_xyzt2)%i_len,   &
990            &                      td_dim(td_dim(4)%i_xyzt2)%i_len /),&
991            &           ORDER = (/        td_dim(1)%i_xyzt2,          &
992            &                             td_dim(2)%i_xyzt2,          &
993            &                             td_dim(3)%i_xyzt2,          &
994            &                             td_dim(4)%i_xyzt2        /))
995
996
997         ENDIF     
998      ENDIF     
999
1000   END FUNCTION dim__reshape_xyzt2_dp
1001   !> @endcode   
1002   !-------------------------------------------------------------------
1003   !> @brief  This subroutine reordered integer(4) 1D table to be suitable
1004   !> with dimension ordered as (/'x','y','z','t'/)
1005   !> @note you must have run dim_reorder before use this subroutine
1006   !
1007   !> @author J.Paul
1008   !> - Nov, 2013- Initial Version
1009   !
1010   !> @param[in] td_dim : table of dimension structure
1011   !> @param[in] id_tab : table of value to reshape
1012   !> @return table of value reshaped
1013   !-------------------------------------------------------------------
1014   !> @code
1015   FUNCTION dim__reorder_2xyzt_i4(td_dim, id_tab)
1016      IMPLICIT NONE
1017
1018      ! Argument     
1019      TYPE(TDIM) , DIMENSION(:), INTENT(IN) :: td_dim
1020      INTEGER(i4), DIMENSION(:), INTENT(IN) :: id_tab
1021     
1022      ! function
1023      INTEGER(i4), DIMENSION(ip_maxdim) :: dim__reorder_2xyzt_i4
1024
1025      ! loop indices
1026      INTEGER(i4) :: ji
1027      !----------------------------------------------------------------
1028
1029      IF( SIZE(td_dim(:)) /= ip_maxdim .OR. &
1030      &   SIZE(id_tab(:)) /= ip_maxdim )THEN
1031         CALL logger_error("DIM ORDER: invalid dimension of table dimension"//&
1032         &              " or of table of value.")
1033      ELSE     
1034         IF( ANY(td_dim(:)%i_2xyzt==0) )THEN
1035
1036            CALL logger_error( &
1037            &  "  REORDER to XYZT: you should have run dim_reorder &
1038            &     before running REORDER" )
1039
1040         ENDIF       
1041
1042         DO ji=1,ip_maxdim
1043            dim__reorder_2xyzt_i4(ji)=id_tab(td_dim(ji)%i_2xyzt)
1044         ENDDO
1045      ENDIF
1046
1047   END FUNCTION dim__reorder_2xyzt_i4
1048   !> @endcode   
1049   !-------------------------------------------------------------------
1050   !> @brief This subroutine reordered integer(4) 1D table to be suitable with
1051   !> dimension read in the file.
1052   !> @note you must have run dim_reorder before use this subroutine
1053   !
1054   !> @author J.Paul
1055   !> - Nov, 2013- Initial Version
1056   !
1057   !> @param[in] td_dim : table of dimension structure
1058   !> @param[in] id_tab : table of value to reshape
1059   !> @return table of value reshaped
1060   !-------------------------------------------------------------------
1061   !> @code
1062   FUNCTION dim__reorder_xyzt2_i4(td_dim, id_tab)
1063      IMPLICIT NONE
1064
1065      ! Argument     
1066      TYPE(TDIM) , DIMENSION(:), INTENT(IN) :: td_dim
1067      INTEGER(i4), DIMENSION(:), INTENT(IN) :: id_tab
1068     
1069      ! function
1070      INTEGER(i4), DIMENSION(ip_maxdim) :: dim__reorder_xyzt2_i4
1071     
1072      ! loop indices
1073      INTEGER(i4) :: ji
1074      !----------------------------------------------------------------
1075
1076      IF( SIZE(td_dim(:)) /= ip_maxdim .OR. &
1077      &   SIZE(id_tab(:)) /= ip_maxdim )THEN
1078         CALL logger_error("DIM ORDER: invalid dimension of table dimension"//&
1079         &              " or of table of value.")
1080      ELSE     
1081         IF( ANY(td_dim(:)%i_xyzt2==0) )THEN
1082
1083            CALL logger_error( &
1084            &  "  REORDER from XYZT: you should have run dim_reorder &
1085            &     before running REORDER" )
1086
1087         ENDIF       
1088
1089         DO ji=1,ip_maxdim
1090            dim__reorder_xyzt2_i4(ji)=id_tab(td_dim(ji)%i_xyzt2)
1091         ENDDO
1092      ENDIF
1093
1094   END FUNCTION dim__reorder_xyzt2_i4
1095   !> @endcode   
1096   !-------------------------------------------------------------------
1097   !> @brief  This subroutine reordered logical 1D table to be suitable
1098   !> with dimension ordered as (/'x','y','z','t'/)
1099   !> @note you must have run dim_reorder before use this subroutine
1100   !
1101   !> @author J.Paul
1102   !> - Nov, 2013- Initial Version
1103   !
1104   !> @param[in] td_dim : table of dimension structure
1105   !> @param[in] ld_tab : table of value to reordered
1106   !> @return table of value reordered
1107   !-------------------------------------------------------------------
1108   !> @code
1109   FUNCTION dim__reorder_2xyzt_l(td_dim, ld_tab)
1110      IMPLICIT NONE
1111      ! Argument     
1112      TYPE(TDIM) , DIMENSION(:), INTENT(IN) :: td_dim
1113      LOGICAL    , DIMENSION(:), INTENT(IN) :: ld_tab
1114     
1115      ! function
1116      LOGICAL, DIMENSION(ip_maxdim) :: dim__reorder_2xyzt_l
1117
1118      ! loop indices
1119      INTEGER(i4) :: ji
1120      !----------------------------------------------------------------
1121
1122      IF( SIZE(td_dim(:)) /= ip_maxdim .OR. &
1123      &   SIZE(ld_tab(:)) /= ip_maxdim )THEN
1124         CALL logger_error("DIM ORDER: invalid dimension of table dimension"//&
1125         &              " or of table of value.")
1126      ELSE     
1127         IF( ANY(td_dim(:)%i_2xyzt==0) )THEN
1128
1129            CALL logger_error( &
1130            &  "  REORDER to XYZT: you should have run dim_reorder &
1131            &     before running REORDER" )
1132
1133         ENDIF       
1134
1135         DO ji=1,ip_maxdim
1136            dim__reorder_2xyzt_l(ji)=ld_tab(td_dim(ji)%i_2xyzt)
1137         ENDDO
1138      ENDIF
1139
1140   END FUNCTION dim__reorder_2xyzt_l
1141   !> @endcode   
1142   !-------------------------------------------------------------------
1143   !> @brief This subroutine reordered logical 1D table to be suitable with
1144   !> dimension read in the file.
1145   !> @note you must have run dim_reorder before use this subroutine
1146   !
1147   !> @author J.Paul
1148   !> - Nov, 2013- Initial Version
1149   !
1150   !> @param[in] td_dim : table of dimension structure
1151   !> @param[in] ld_tab : table of value to reordered
1152   !> @return table of value reordered
1153   !-------------------------------------------------------------------
1154   !> @code
1155   FUNCTION dim__reorder_xyzt2_l(td_dim, ld_tab)
1156      IMPLICIT NONE
1157
1158      ! Argument     
1159      TYPE(TDIM) , DIMENSION(:), INTENT(IN) :: td_dim
1160      LOGICAL    , DIMENSION(:), INTENT(IN) :: ld_tab
1161     
1162      ! function
1163      LOGICAL, DIMENSION(ip_maxdim) :: dim__reorder_xyzt2_l
1164     
1165      ! loop indices
1166      INTEGER(i4) :: ji
1167      !----------------------------------------------------------------
1168
1169      IF( SIZE(td_dim(:)) /= ip_maxdim .OR. &
1170      &   SIZE(ld_tab(:)) /= ip_maxdim )THEN
1171         CALL logger_error("DIM ORDER: invalid dimension of table dimension"//&
1172         &              " or of table of value.")
1173      ELSE
1174         IF( ANY(td_dim(:)%i_xyzt2==0) )THEN
1175
1176            CALL logger_error( &
1177            &  "  REORDER from XYZT: you should have run dim_reorder &
1178            &     before running REORDER" )
1179
1180         ENDIF       
1181
1182         DO ji=1,ip_maxdim
1183            dim__reorder_xyzt2_l(ji)=ld_tab(td_dim(ji)%i_xyzt2)
1184         ENDDO
1185      ENDIF
1186
1187   END FUNCTION dim__reorder_xyzt2_l
1188   !> @endcode
1189   !-------------------------------------------------------------------
1190   !> @brief  This subroutine reordered string 1D table to be suitable
1191   !> with dimension ordered as (/'x','y','z','t'/)
1192   !> @note you must have run dim_reorder before use this subroutine
1193   !
1194   !> @author J.Paul
1195   !> - Nov, 2013- Initial Version
1196   !
1197   !> @param[in] td_dim : table of dimension structure
1198   !> @param[in] cd_tab : table of value to reordered
1199   !> @return table of value reordered
1200   !-------------------------------------------------------------------
1201   !> @code
1202   FUNCTION dim__reorder_2xyzt_c(td_dim, cd_tab)
1203      IMPLICIT NONE
1204      ! Argument     
1205      TYPE(TDIM),       DIMENSION(:), INTENT(IN) :: td_dim
1206      CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: cd_tab
1207     
1208      ! function
1209      CHARACTER(LEN=lc), DIMENSION(ip_maxdim) :: dim__reorder_2xyzt_c
1210
1211      ! loop indices
1212      INTEGER(i4) :: ji
1213      !----------------------------------------------------------------
1214
1215      IF( SIZE(td_dim(:)) /= ip_maxdim .OR. &
1216      &   SIZE(cd_tab(:)) /= ip_maxdim )THEN
1217         CALL logger_error("DIM ORDER: invalid dimension of table dimension"//&
1218         &              " or of table of value.")
1219      ELSE     
1220         IF( ANY(td_dim(:)%i_2xyzt==0) )THEN
1221
1222            CALL logger_error( &
1223            &  "  REORDER to XYZT: you should have run dim_reorder"//&
1224            &  " before running REORDER" )
1225
1226         ENDIF       
1227
1228         DO ji=1,ip_maxdim
1229            dim__reorder_2xyzt_c(ji)=TRIM(cd_tab(td_dim(ji)%i_2xyzt))
1230         ENDDO
1231      ENDIF
1232
1233   END FUNCTION dim__reorder_2xyzt_c
1234   !> @endcode   
1235   !-------------------------------------------------------------------
1236   !> @brief This subroutine reordered string 1D table to be suitable with
1237   !> dimension read in the file.
1238   !> @note you must have run dim_reorder before use this subroutine
1239   !
1240   !> @author J.Paul
1241   !> - Nov, 2013- Initial Version
1242   !
1243   !> @param[in] td_dim : table of dimension structure
1244   !> @param[in] cd_tab : table of value to reordered
1245   !> @return table of value reordered
1246   !-------------------------------------------------------------------
1247   !> @code
1248   FUNCTION dim__reorder_xyzt2_c(td_dim, cd_tab)
1249      IMPLICIT NONE
1250
1251      ! Argument     
1252      TYPE(TDIM),       DIMENSION(:), INTENT(IN) :: td_dim
1253      CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: cd_tab
1254     
1255      ! function
1256      CHARACTER(LEN=lc), DIMENSION(ip_maxdim) :: dim__reorder_xyzt2_c
1257     
1258      ! loop indices
1259      INTEGER(i4) :: ji
1260      !----------------------------------------------------------------
1261
1262      IF( SIZE(td_dim(:)) /= ip_maxdim .OR. &
1263      &   SIZE(cd_tab(:)) /= ip_maxdim )THEN
1264         CALL logger_error("DIM ORDER: invalid dimension of table dimension"//&
1265         &              " or of table of value.")
1266      ELSE
1267         IF( ANY(td_dim(:)%i_xyzt2==0) )THEN
1268            CALL logger_error( &
1269            &  "  REORDER from XYZT: you should have run dim_reorder &
1270            &     before running REORDER" )
1271
1272         ENDIF       
1273
1274         DO ji=1,ip_maxdim
1275            dim__reorder_xyzt2_c(ji)=TRIM(cd_tab(td_dim(ji)%i_xyzt2))
1276         ENDDO
1277      ENDIF
1278
1279   END FUNCTION dim__reorder_xyzt2_c
1280   !> @endcode   
1281   !-------------------------------------------------------------------
1282   !> @brief This subroutine clean dimension structure
1283   !
1284   !> @author J.Paul
1285   !> - Nov, 2013- Initial Version
1286   !
1287   !> @param[in] td_dim : dimension strucutre
1288   !-------------------------------------------------------------------
1289   !> @code
1290   SUBROUTINE dim__clean_unit( td_dim )
1291      IMPLICIT NONE
1292      ! Argument
1293      TYPE(TDIM), INTENT(INOUT) :: td_dim
1294
1295      ! local variable
1296      TYPE(TDIM) :: tl_dim ! empty dimension strucutre
1297      !----------------------------------------------------------------
1298
1299      CALL logger_info( &
1300      &  " CLEAN: reset dimension "//TRIM(td_dim%c_name) )
1301
1302      ! replace by empty structure
1303      td_dim=tl_dim
1304
1305   END SUBROUTINE dim__clean_unit
1306   !> @endcode
1307   !-------------------------------------------------------------------
1308   !> @brief This subroutine clean table of dimension structure
1309   !
1310   !> @author J.Paul
1311   !> - Nov, 2013- Initial Version
1312   !
1313   !> @param[in] td_dim : table of dimension strucutre
1314   !-------------------------------------------------------------------
1315   !> @code
1316   SUBROUTINE dim__clean_tab( td_dim )
1317      IMPLICIT NONE
1318      ! Argument
1319      TYPE(TDIM), DIMENSION(:), INTENT(INOUT) :: td_dim
1320
1321      ! loop indices
1322      INTEGER(i4) :: ji
1323      !----------------------------------------------------------------
1324
1325      DO ji=1,SIZE(td_dim(:))
1326         CALL dim_clean(td_dim(ji))
1327      ENDDO
1328
1329   END SUBROUTINE dim__clean_tab
1330   !> @endcode
1331END MODULE dim
1332
Note: See TracBrowser for help on using the repository browser.