Changeset 6225 for branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/TOOLS/SIREN/src/dimension.f90
- Timestamp:
- 2016-01-08T10:35:19+01:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/TOOLS/SIREN/src/dimension.f90
r4213 r6225 8 8 !> @brief 9 9 !> This module manage dimension and how to change order of those dimension. 10 ! 10 !> 11 11 !> @details 12 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]) 13 !> @code 14 !> TYPE(TDIM) :: tl_dim 15 !> @endcode 16 !> 17 !> to initialize a dimension structure:<br/> 18 !> @code 19 !> tl_dim=dim_init( cd_name, [id_len,] [ld_uld,] [cd_sname]) 20 !> @endcode 17 21 !> - 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) 22 !> - id_len is the dimension size [optional] 23 !> - ld_uld is true if this dimension is the unlimited one [optional] 24 !> - cd_sname is the dimension short name ('x','y','z','t') [optional] 25 !> 26 !> to clean dimension structure:<br/> 27 !> @code 28 !> CALL dim_clean(tl_dim) 29 !> @endcode 30 !> - tl_dim : dimension strucutre or array of dimension structure 21 31 !> 22 32 !> to print information about dimension structure:<br/> 33 !> @code 23 34 !> CALL dim_print(tl_dim) 35 !> @endcode 36 !> 37 !> to copy dimension structure in another one (using different memory cell):<br/> 38 !> @code 39 !> tl_dim2=dim_copy(tl_dim1) 40 !> @endcode 24 41 !> 25 42 !> to get dimension name:<br/> … … 35 52 !> - tl_dim\%l_uld 36 53 !> 37 !> to get dimension id ( usefor variable or file dimension):<br/>54 !> to get dimension id (for variable or file dimension):<br/> 38 55 !> - tl_dim\%i_id 39 56 !> 40 !> to know if dimension is used ( usefor variable or file dimension):<br/>57 !> to know if dimension is used (for variable or file dimension):<br/> 41 58 !> - tl_dim\%l_use 42 59 !> … … 44 61 !> variables as well as files use usually 4 dimensions.<br/> 45 62 !> To easily work with variable we want they will be all 4D and ordered as 46 !> follow : ('x','y','z','t').<br/>63 !> following: ('x','y','z','t').<br/> 47 64 !> Functions and subroutines below, allow to reorder dimension of 48 65 !> variable.<br/> 49 66 !> 50 !> Suppose we defined the table of dimension structure below:<br/> 51 !> TYPE(TDIM), DIMENSION(4) :: tl_dim 67 !> Suppose we defined the array of dimension structure below:<br/> 68 !> @code 69 !> TYPE(TDIM), DIMENSION(4) :: tl_dim 52 70 !> tl_dim(1)=dim_init( 'X', id_len=10) 53 71 !> 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(:)) 72 !> @endcode 73 !> 74 !> to reorder dimension (default order: ('x','y','z','t')):<br/> 75 !> @code 76 !> CALL dim_reorder(tl_dim(:)) 77 !> @endcode 58 78 !> 59 79 !> This subroutine filled dimension structure with unused dimension, 60 !> then switch from " unordered" dimension to "ordered" dimension61 !> 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=F64 !> tl_dim(3) => 'Z', i_len= 0, l_use=F, l_uld=F65 !> tl_dim(4) => 'T', i_len=3, l_use=T, l_uld=T 66 !> 67 !> After using dim_reorder subroutineyou could use functions and subroutine80 !> then switch from "disordered" dimension to "ordered" dimension.<br/> 81 !> The dimension structure return will be:<br/> 82 !> tl_dim(1) => 'X', i_len=10, l_use=T, l_uld=F<br/> 83 !> tl_dim(2) => 'Y', i_len=1, l_use=F, l_uld=F<br/> 84 !> tl_dim(3) => 'Z', i_len=1, l_use=F, l_uld=F<br/> 85 !> tl_dim(4) => 'T', i_len=3, l_use=T, l_uld=T<br/> 86 !> 87 !> After using subroutine dim_reorder you could use functions and subroutine 68 88 !> below.<br/> 69 89 !> 70 !> to reshape table of value in "ordered" dimension:<br/> 90 !> to use another dimension order.<br/> 91 !> @code 92 !> CALL dim_reorder(tl(dim(:), cl_neworder) 93 !> @endcode 94 !> - cl_neworder : character(len=4) (example: 'yxzt') 95 !> 96 !> to switch dimension array from ordered dimension to disordered 97 !> dimension:<br/> 98 !> @code 99 !> CALL dim_disorder(tl_dim(:)) 100 !> @endcode 101 !> 102 !> to fill unused dimension of an array of dimension structure.<br/> 103 !> @code 104 !> tl_dimout(:)=dim_fill_unused(tl_dimin(:)) 105 !> @endcode 106 !> - tl_dimout(:) : 1D array (4elts) of dimension strcuture 107 !> - tl_dimin(:) : 1D array (<=4elts) of dimension structure 108 !> 109 !> to reshape array of value in "ordered" dimension:<br/> 110 !> @code 71 111 !> 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/> 112 !> @endcode 113 !> - value must be a 4D array of real(8) value "disordered" 114 !> 115 !> to reshape array of value in "disordered" dimension:<br/> 116 !> @code 75 117 !> 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/> 118 !> @endcode 119 !> - value must be a 4D array of real(8) value "ordered" 120 !> 121 !> to reorder a 1D array of 4 elements in "ordered" dimension:<br/> 122 !> @code 79 123 !> CALL dim_reorder_2xyzt(tl_dim(:), tab(:)) 80 !> 81 !> - tab must be a 1D table with 4 elements "unordered".124 !> @endcode 125 !> - tab must be a 1D array with 4 elements "disordered". 82 126 !> It could be composed of character, integer(4), or logical 83 127 !> 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". 128 !> to reorder a 1D array of 4 elements in "disordered" dimension:<br/> 129 !> @code 130 !> CALL dim_reorder_xyzt2(tl_dim(:), tab(:)) 131 !> @endcode 132 !> - tab must be a 1D array with 4 elements "ordered". 88 133 !> It could be composed of character, integer(4), or logical 89 134 !> 90 !> @author 91 !> J.Paul 135 !> to get dimension index from a array of dimension structure, 136 !> given dimension name or short name :<br/> 137 !> @code 138 !> index=dim_get_index( tl_dim(:), [cl_name, cl_sname] ) 139 !> @endcode 140 !> - tl_dim(:) : array of dimension structure 141 !> - cl_name : dimension name [optional] 142 !> - cl_sname: dimension short name [optional] 143 !> 144 !> to get dimension id used in an array of dimension structure, 145 !> given dimension name or short name :<br/> 146 !> @code 147 !> id=dim_get_id( tl_dim(:), [cl_name, cl_sname] ) 148 !> @endcode 149 !> - tl_dim(:) : array of dimension structure 150 !> - cl_name : dimension name [optional] 151 !> - cl_sname: dimension short name [optional] 152 !> 153 !> @author J.Paul 92 154 ! REVISION HISTORY: 93 !> @date Nov, 2013 - Initial Version 94 ! 95 !> @todo 96 !> - add description generique de l'objet dim 155 !> @date November, 2013 - Initial Version 97 156 !> 98 157 !> @note Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 104 163 USE fct ! basic useful function 105 164 IMPLICIT NONE 106 PRIVATE107 165 ! NOTE_avoid_public_variables_if_possible 108 166 109 167 ! type and variable 110 168 PUBLIC :: TDIM !< dimension structure 111 PUBLIC :: ip_maxdim !< number of dimension to be used112 PUBLIC :: cp_dimorder !< dimension order113 169 114 170 ! function and subroutine … … 116 172 PUBLIC :: dim_clean !< clean dimension structuree 117 173 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 174 PUBLIC :: dim_copy !< copy dimension structure 175 PUBLIC :: dim_reorder !< filled dimension structure to switch from disordered to ordered dimension 176 PUBLIC :: dim_disorder !< switch dimension array from ordered to disordered dimension 177 PUBLIC :: dim_fill_unused !< filled dimension structure with unused dimension 178 PUBLIC :: dim_reshape_2xyzt !< reshape array dimension to ('x','y','z','t') 179 PUBLIC :: dim_reshape_xyzt2 !< reshape array dimension from ('x','y','z','t') 180 PUBLIC :: dim_reorder_2xyzt !< reorder 1D array to ('x','y','z','t') 181 PUBLIC :: dim_reorder_xyzt2 !< reorder 1D array from ('x','y','z','t') 182 PUBLIC :: dim_get_index !< get dimension index in array of dimension structure 183 PUBLIC :: dim_get_id !< get dimension id in array of dimension structure 184 185 PRIVATE :: dim__reshape_2xyzt_dp ! reshape real(8) 4D array to ('x','y','z','t') 186 PRIVATE :: dim__reshape_xyzt2_dp ! reshape real(8) 4D array from ('x','y','z','t') 187 PRIVATE :: dim__reorder_2xyzt_i4 ! reorder integer(4) 1D array to ('x','y','z','t') 188 PRIVATE :: dim__reorder_xyzt2_i4 ! reorder integer(4) 1D array from ('x','y','z','t') 189 PRIVATE :: dim__reorder_2xyzt_l ! reorder logical 1D array to ('x','y','z','t') 190 PRIVATE :: dim__reorder_xyzt2_l ! reorder logical 1D array from ('x','y','z','t') 191 PRIVATE :: dim__reorder_2xyzt_c ! reorder string 1D array to ('x','y','z','t') 192 PRIVATE :: dim__reorder_xyzt2_c ! reorder string 1D array from ('x','y','z','t') 193 PRIVATE :: dim__clean_unit ! clean one dimension structure 194 PRIVATE :: dim__clean_arr ! clean a array of dimension structure 195 PRIVATE :: dim__print_unit ! print information on one dimension structure 196 PRIVATE :: dim__print_arr ! print information on a array of dimension structure 197 PRIVATE :: dim__copy_unit ! copy dimension structure 198 PRIVATE :: dim__copy_arr ! copy array of dimension structure 199 200 TYPE TDIM !< dimension structure 201 CHARACTER(LEN=lc) :: c_name = '' !< dimension name 145 202 CHARACTER(LEN=lc) :: c_sname = 'u' !< dimension short name 146 INTEGER(i4) :: i_id = 0!< dimension id203 INTEGER(i4) :: i_id = 0 !< dimension id 147 204 INTEGER(i4) :: i_len = 1 !< dimension length 148 205 LOGICAL :: l_uld = .FALSE. !< dimension unlimited or not 149 206 LOGICAL :: l_use = .FALSE. !< dimension used or not 150 INTEGER(i4) :: i_2xyzt = 0 !< indices to reshape tableto ('x','y','z','t')151 INTEGER(i4) :: i_xyzt2 = 0 !< indices to reshape tablefrom ('x','y','z','t')207 INTEGER(i4) :: i_2xyzt = 0 !< indices to reshape array to ('x','y','z','t') 208 INTEGER(i4) :: i_xyzt2 = 0 !< indices to reshape array from ('x','y','z','t') 152 209 END TYPE 153 154 INTEGER(i4), PARAMETER :: ip_maxdim = 4 !< number of dimension to be used155 156 ! module variable157 CHARACTER(LEN=lc), PARAMETER :: cp_dimorder = 'xyzt' !< dimension order to output158 210 159 211 INTERFACE dim_print 160 212 MODULE PROCEDURE dim__print_unit ! print information on one dimension 161 MODULE PROCEDURE dim__print_ tab ! print information on a tableof dimension213 MODULE PROCEDURE dim__print_arr ! print information on a array of dimension 162 214 END INTERFACE dim_print 163 215 164 216 INTERFACE dim_clean 165 217 MODULE PROCEDURE dim__clean_unit ! clean one dimension 166 MODULE PROCEDURE dim__clean_ tab ! clean a tableof dimension218 MODULE PROCEDURE dim__clean_arr ! clean a array of dimension 167 219 END INTERFACE dim_clean 168 220 221 INTERFACE dim_copy 222 MODULE PROCEDURE dim__copy_unit ! copy dimension structure 223 MODULE PROCEDURE dim__copy_arr ! copy array of dimension structure 224 END INTERFACE 225 169 226 INTERFACE dim_reshape_2xyzt 170 MODULE PROCEDURE dim__reshape_2xyzt_dp ! reshape real(8) 4D tableto ('x','y','z','t')227 MODULE PROCEDURE dim__reshape_2xyzt_dp ! reshape real(8) 4D array to ('x','y','z','t') 171 228 END INTERFACE dim_reshape_2xyzt 172 229 173 230 INTERFACE dim_reshape_xyzt2 174 MODULE PROCEDURE dim__reshape_xyzt2_dp ! reshape real(8) 4D tablefrom ('x','y','z','t')231 MODULE PROCEDURE dim__reshape_xyzt2_dp ! reshape real(8) 4D array from ('x','y','z','t') 175 232 END INTERFACE dim_reshape_xyzt2 176 233 177 234 INTERFACE dim_reorder_2xyzt 178 MODULE PROCEDURE dim__reorder_2xyzt_i4 ! reorder integer(4) 1D tableto ('x','y','z','t')179 MODULE PROCEDURE dim__reorder_2xyzt_c ! reorder string 1D tableto ('x','y','z','t')180 MODULE PROCEDURE dim__reorder_2xyzt_l ! reorder logical 1D tableto ('x','y','z','t')235 MODULE PROCEDURE dim__reorder_2xyzt_i4 ! reorder integer(4) 1D array to ('x','y','z','t') 236 MODULE PROCEDURE dim__reorder_2xyzt_c ! reorder string 1D array to ('x','y','z','t') 237 MODULE PROCEDURE dim__reorder_2xyzt_l ! reorder logical 1D array to ('x','y','z','t') 181 238 END INTERFACE dim_reorder_2xyzt 182 239 183 240 INTERFACE dim_reorder_xyzt2 184 MODULE PROCEDURE dim__reorder_xyzt2_i4 ! reorder integer(4) 1D tablefrom ('x','y','z','t')185 MODULE PROCEDURE dim__reorder_xyzt2_c ! reorder string 1D tablefrom ('x','y','z','t')186 MODULE PROCEDURE dim__reorder_xyzt2_l ! reorder logical 1D tablefrom ('x','y','z','t')241 MODULE PROCEDURE dim__reorder_xyzt2_i4 ! reorder integer(4) 1D array from ('x','y','z','t') 242 MODULE PROCEDURE dim__reorder_xyzt2_c ! reorder string 1D array from ('x','y','z','t') 243 MODULE PROCEDURE dim__reorder_xyzt2_l ! reorder logical 1D array from ('x','y','z','t') 187 244 END INTERFACE dim_reorder_xyzt2 188 245 189 246 CONTAINS 190 247 !------------------------------------------------------------------- 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 ) 248 !> @brief 249 !> This subroutine copy a array of dimension structure in another one 250 !> @details 251 !> see dim__copy_unit 252 !> 253 !> @warning do not use on the output of a function who create or read an 254 !> structure (ex: tl_dim=dim_copy(dim_init()) is forbidden). 255 !> This will create memory leaks. 256 !> @warning to avoid infinite loop, do not use any function inside 257 !> this subroutine 258 !> 259 !> @author J.Paul 260 !> @date November, 2014 - Initial Version 261 ! 262 !> @param[in] td_dim array of dimension structure 263 !> @return copy of input array of dimension structure 264 !------------------------------------------------------------------- 265 FUNCTION dim__copy_arr( td_dim ) 205 266 IMPLICIT NONE 206 267 ! Argument 207 TYPE(TDIM), DIMENSION(:), INTENT(IN) :: td_dim 268 TYPE(TDIM), DIMENSION(:), INTENT(IN) :: td_dim 269 ! function 270 TYPE(TDIM), DIMENSION(SIZE(td_dim(:))) :: dim__copy_arr 271 272 ! local variable 273 ! loop indices 274 INTEGER(i4) :: ji 275 !---------------------------------------------------------------- 276 277 DO ji=1,SIZE(td_dim(:)) 278 dim__copy_arr(ji)=dim_copy(td_dim(ji)) 279 ENDDO 280 281 END FUNCTION dim__copy_arr 282 !------------------------------------------------------------------- 283 !> @brief 284 !> This subroutine copy an dimension structure in another one 285 !> @details 286 !> dummy function to get the same use for all structure 287 !> 288 !> @warning do not use on the output of a function who create or read an 289 !> structure (ex: tl_dim=dim_copy(dim_init()) is forbidden). 290 !> This will create memory leaks. 291 !> @warning to avoid infinite loop, do not use any function inside 292 !> this subroutine 293 !> 294 !> @author J.Paul 295 !> @date November, 2014 - Initial Version 296 !> 297 !> @param[in] td_dim dimension structure 298 !> @return copy of input dimension structure 299 !------------------------------------------------------------------- 300 FUNCTION dim__copy_unit( td_dim ) 301 IMPLICIT NONE 302 ! Argument 303 TYPE(TDIM), INTENT(IN) :: td_dim 304 ! function 305 TYPE(TDIM) :: dim__copy_unit 306 307 ! local variable 308 !---------------------------------------------------------------- 309 310 dim__copy_unit=td_dim 311 312 END FUNCTION dim__copy_unit 313 !------------------------------------------------------------------- 314 !> @brief This function returns dimension index, 315 !> given dimension name or short name. 316 !> 317 !> @details 318 !> the function check dimension name, in the array of dimension structure. 319 !> dimension could be used or not. 320 !> 321 !> @author J.Paul 322 !> @date November, 2013 - Initial Version 323 !> @date September, 2014 324 !> - do not check if dimension used 325 !> 326 !> @param[in] td_dim array of dimension structure 327 !> @param[in] cd_name dimension name 328 !> @param[in] cd_sname dimension short name 329 !> @return dimension index 330 !------------------------------------------------------------------- 331 INTEGER(i4) FUNCTION dim_get_index( td_dim, cd_name, cd_sname ) 332 IMPLICIT NONE 333 ! Argument 334 TYPE(TDIM) , DIMENSION(:), INTENT(IN) :: td_dim 208 335 CHARACTER(LEN=*), INTENT(IN) :: cd_name 209 336 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: cd_sname … … 222 349 !---------------------------------------------------------------- 223 350 ! init 224 dim_get_i d=0351 dim_get_index=0 225 352 226 353 il_ndim=SIZE(td_dim(:)) … … 228 355 ! look for dimension name 229 356 cl_name=fct_lower(cd_name) 230 ! check if dimension is in table of dimension structure and used357 ! check if dimension is in array of dimension structure 231 358 jj=0 232 359 DO ji=1,il_ndim 233 !IF( td_dim(ji)%l_use ) jj=jj+1234 235 360 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 361 IF( TRIM(cl_dim_name) == TRIM(cl_name) )THEN 362 dim_get_index=ji 363 EXIT 242 364 ENDIF 243 365 ENDDO 244 366 245 367 ! look for dimension short name 246 IF( dim_get_i d== 0 )THEN368 IF( dim_get_index == 0 )THEN 247 369 248 370 cl_sname=fct_lower(cd_name) 249 ! check if dimension is in table of dimension structure and used371 ! check if dimension is in array of dimension structure 250 372 jj=0 251 373 DO ji=1,il_ndim 252 IF( td_dim(ji)%l_use ) jj=jj+1253 254 374 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 "//& 375 IF( (TRIM(cl_dim_sname) == TRIM(cl_sname) ) )THEN 376 CALL logger_debug("DIM GET INDEX: variable short name "//& 258 377 & TRIM(ADJUSTL(cd_name))//" already in file") 259 dim_get_i d=jj378 dim_get_index=ji 260 379 EXIT 261 380 ENDIF 262 381 ENDDO 382 263 383 ENDIF 264 384 265 385 ! look for dimension short name 266 386 IF( PRESENT(cd_sname) )THEN 267 IF( dim_get_i d== 0 )THEN387 IF( dim_get_index == 0 )THEN 268 388 269 389 cl_sname=fct_lower(cd_sname) 270 ! check if dimension is in table of dimension structure and used390 ! check if dimension is in array of dimension structure 271 391 jj=0 272 392 DO ji=1,il_ndim 273 IF( td_dim(ji)%l_use ) jj=jj+1274 275 393 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 "//& 394 IF( (TRIM(cl_dim_sname) == TRIM(cl_sname) ) )THEN 395 CALL logger_debug("DIM GET INDEX: variable short name "//& 279 396 & TRIM(ADJUSTL(cd_sname))//" already in file") 280 dim_get_i d=jj397 dim_get_index=ji 281 398 EXIT 282 399 ENDIF 283 400 ENDDO 401 284 402 ENDIF 285 403 ENDIF 286 404 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 405 END FUNCTION dim_get_index 406 !------------------------------------------------------------------- 407 !> @brief This function returns dimension id, in a array of dimension structure, 408 !> given dimension name, or short name. 409 !> @note only dimension used are checked. 410 !> 411 !> @author J.Paul 412 !> @date November, 2013 - Initial Version 413 ! 414 !> @param[in] td_dim dimension structure 415 !> @param[in] cd_name dimension name or short name 416 !> @param[in] cd_sname dimension short name 300 417 !> @return dimension id 301 418 !------------------------------------------------------------------- 302 !> @code 303 INTEGER(i4) FUNCTION dim_get_void_id( td_dim, cd_name, cd_sname ) 419 INTEGER(i4) FUNCTION dim_get_id( td_dim, cd_name, cd_sname ) 304 420 IMPLICIT NONE 305 421 ! Argument 306 422 TYPE(TDIM), DIMENSION(:), INTENT(IN) :: td_dim 307 CHARACTER(LEN=*), INTENT(IN) , OPTIONAL:: cd_name423 CHARACTER(LEN=*), INTENT(IN) :: cd_name 308 424 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: cd_sname 309 425 … … 318 434 ! loop indices 319 435 INTEGER(i4) :: ji 436 INTEGER(i4) :: jj 320 437 !---------------------------------------------------------------- 321 438 ! init 322 dim_get_ void_id=0439 dim_get_id=0 323 440 324 441 il_ndim=SIZE(td_dim(:)) … … 326 443 ! look for dimension name 327 444 cl_name=fct_lower(cd_name) 328 ! check if dimension is in table of dimension structure and used 445 ! check if dimension is in array of dimension structure and used 446 jj=0 329 447 DO ji=1,il_ndim 330 331 448 cl_dim_name=fct_lower(td_dim(ji)%c_name) 332 449 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 450 & td_dim(ji)%l_use )THEN 451 IF( td_dim(ji)%i_id /= 0 )THEN 452 dim_get_id=td_dim(ji)%i_id 453 EXIT 454 ENDIF 336 455 ENDIF 337 456 ENDDO 338 457 339 458 ! look for dimension short name 340 IF( dim_get_ void_id == 0 )THEN459 IF( dim_get_id == 0 )THEN 341 460 342 461 cl_sname=fct_lower(cd_name) 343 ! check if dimension is in table of dimension structure and used 462 ! check if dimension is in array of dimension structure and used 463 jj=0 344 464 DO ji=1,il_ndim 345 346 465 cl_dim_sname=fct_lower(td_dim(ji)%c_sname) 347 466 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 467 & td_dim(ji)%l_use )THEN 468 IF( td_dim(ji)%i_id /= 0 )THEN 469 dim_get_id=td_dim(ji)%i_id 470 EXIT 471 ENDIF 351 472 ENDIF 352 473 ENDDO 474 353 475 ENDIF 354 476 355 477 ! look for dimension short name 356 478 IF( PRESENT(cd_sname) )THEN 357 IF( dim_get_ void_id == 0 )THEN479 IF( dim_get_id == 0 )THEN 358 480 359 481 cl_sname=fct_lower(cd_sname) 360 ! check if dimension is in table of dimension structure and used 482 ! check if dimension is in array of dimension structure and used 483 jj=0 361 484 DO ji=1,il_ndim 362 363 485 cl_dim_sname=fct_lower(td_dim(ji)%c_sname) 364 486 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 487 & td_dim(ji)%l_use )THEN 488 IF( td_dim(ji)%i_id /= 0 )THEN 489 dim_get_id=td_dim(ji)%i_id 490 EXIT 491 ENDIF 368 492 ENDIF 369 493 ENDDO 494 370 495 ENDIF 371 496 ENDIF 372 497 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 498 END FUNCTION dim_get_id 499 !------------------------------------------------------------------- 500 !> @brief This function initialize a dimension structure with given 501 !> name.<br/> 502 !> @details 503 !> Optionally length could be inform, as well as short name and if dimension 504 !> is unlimited or not.<br/> 505 !> By default, define dimension is supposed to be used. 506 !> Optionally you could force a defined dimension to be unused. 507 !> 508 !> @author J.Paul 509 !> @date November, 2013 - Initial Version 510 !> @date February, 2015 511 !> - add optional argument to define dimension unused 512 !> @date July, 2015 513 !> - Bug fix: inform order to disorder table instead of disorder to order 514 !> table 515 ! 516 !> @param[in] cd_name dimension name 517 !> @param[in] id_len dimension length 518 !> @param[in] ld_uld dimension unlimited 519 !> @param[in] cd_sname dimension short name 520 !> @param[in] ld_uld dimension use or not 393 521 !> @return dimension structure 394 522 !------------------------------------------------------------------- 395 !> @code 396 TYPE(TDIM) FUNCTION dim_init( cd_name, id_len, ld_uld, cd_sname) 523 TYPE(TDIM) FUNCTION dim_init( cd_name, id_len, ld_uld, cd_sname, ld_use) 397 524 IMPLICIT NONE 398 525 … … 402 529 LOGICAL, INTENT(IN), OPTIONAL :: ld_uld 403 530 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: cd_sname 531 LOGICAL, INTENT(IN), OPTIONAL :: ld_use 404 532 405 533 ! local variable … … 413 541 cl_name=fct_upper(cd_name) 414 542 415 CALL logger_ info( &543 CALL logger_debug( & 416 544 & " DIM INIT: dimension name: "//TRIM(cl_name) ) 417 545 dim_init%c_name=TRIM(ADJUSTL(cd_name)) 418 546 419 547 IF( PRESENT(id_len) )THEN 420 CALL logger_ info( &548 CALL logger_debug( & 421 549 & " DIM INIT: dimension length: "//fct_str(id_len) ) 422 550 dim_init%i_len=id_len … … 424 552 425 553 ! define dimension is supposed to be used 426 dim_init%l_use=.TRUE. 554 IF( PRESENT(ld_use) )THEN 555 dim_init%l_use=ld_use 556 ELSE 557 dim_init%l_use=.TRUE. 558 ENDIF 427 559 428 560 IF( PRESENT(cd_sname) )THEN … … 434 566 & TRIM(cl_sname) == 'z' .OR. & 435 567 & TRIM(cl_sname) == 't' )THEN 436 CALL logger_ info( &568 CALL logger_debug( & 437 569 & " DIM INIT: dimension short name: "//TRIM(cd_sname) ) 438 570 dim_init%c_sname=TRIM(cd_sname) … … 452 584 dim_init%c_sname='y' 453 585 ELSEIF( TRIM(cl_name)== 'z' .OR. & 454 & INDEX(cl_name,'depth')/=0 )THEN586 & INDEX(cl_name,'depth')/=0 )THEN 455 587 dim_init%c_sname='z' 456 588 ELSEIF( TRIM(cl_name)== 't' .OR. & 457 & INDEX(cl_name,'time')/=0 )THEN589 & INDEX(cl_name,'time')/=0 )THEN 458 590 dim_init%c_sname='t' 459 591 ENDIF … … 462 594 463 595 IF( PRESENT(ld_uld) )THEN 464 CALL logger_ info( &596 CALL logger_debug( & 465 597 & " DIM INIT: unlimited dimension: "//fct_str(ld_uld) ) 466 598 dim_init%l_uld=ld_uld … … 471 603 ENDIF 472 604 605 ! get dimension order indices 606 dim_init%i_xyzt2=SCAN(TRIM(cp_dimorder),TRIM(dim_init%c_sname)) 607 473 608 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) 609 !------------------------------------------------------------------- 610 !> @brief This subroutine print informations of an array of dimension. 611 !> 612 !> @author J.Paul 613 !> @date November, 2013 - Initial Version 614 ! 615 !> @param[in] td_dim array of dimension structure 616 !------------------------------------------------------------------- 617 SUBROUTINE dim__print_arr(td_dim) 485 618 IMPLICIT NONE 486 619 … … 496 629 ENDDO 497 630 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 631 END SUBROUTINE dim__print_arr 632 !------------------------------------------------------------------- 633 !> @brief This subrtoutine print dimension information. 634 !> 635 !> @author J.Paul 636 !> @date November, 2013 - Initial Version 637 ! 638 !> @param[in] td_dim dimension structure 639 !------------------------------------------------------------------- 509 640 SUBROUTINE dim__print_unit(td_dim) 510 641 IMPLICIT NONE … … 512 643 ! Argument 513 644 TYPE(TDIM), INTENT(IN) :: td_dim 514 515 645 !---------------------------------------------------------------- 516 646 … … 526 656 527 657 END SUBROUTINE dim__print_unit 528 !> @endcode 658 !------------------------------------------------------------------- 659 !> @brief This function fill unused dimension of an array of dimension 660 !> and return a 4 elts array of dimension structure. 661 !> @details 662 !> output dimensions 'x','y','z' and 't' are all informed. 663 !> 664 !> @note without input array of dimension, return 665 !> a 4 elts array of dimension structure all unused 666 !> (case variable 0d) 667 !> 668 !> @author J.Paul 669 !> @date November, 2013 - Initial Version 670 !> @date July, 2015 671 !> - Bug fix: use order to disorder table (see dim_init) 672 !> 673 !> @param[in] td_dim array of dimension structure 674 !> @return 4elts array of dimension structure 675 !------------------------------------------------------------------- 676 FUNCTION dim_fill_unused(td_dim) 677 IMPLICIT NONE 678 ! Argument 679 TYPE(TDIM), DIMENSION(:), INTENT(IN), OPTIONAL :: td_dim 680 681 ! function 682 TYPE(TDIM), DIMENSION(ip_maxdim) :: dim_fill_unused 683 684 ! local variable 685 CHARACTER(LEN=lc) :: cl_dimin 686 INTEGER(i4) , DIMENSION(1) :: il_ind ! index 687 688 TYPE(TDIM), DIMENSION(ip_maxdim) :: tl_dim 689 690 ! loop indices 691 INTEGER(i4) :: ji 692 !---------------------------------------------------------------- 693 694 IF( PRESENT(td_dim) )THEN 695 tl_dim(1:SIZE(td_dim(:)))=td_dim(:) 696 ENDIF 697 ! concatenate short nem dimension in a character string 698 cl_dimin=fct_lower(fct_concat(tl_dim(:)%c_sname)) 699 DO ji = 1, ip_maxdim 700 701 ! search missing dimension 702 IF( INDEX(cl_dimin,TRIM(fct_lower(cp_dimorder(ji:ji)))) == 0 )THEN 703 ! search first empty dimension (see dim_init) 704 il_ind(:)=MINLOC( tl_dim(:)%i_xyzt2, tl_dim(:)%i_xyzt2 == 0 ) 705 706 ! put missing dimension instead of empty one 707 tl_dim(il_ind(1))%c_sname=fct_lower(cp_dimorder(ji:ji)) 708 ! update output structure 709 tl_dim(il_ind(1))%c_name=fct_lower(cp_dimorder(ji:ji)) 710 tl_dim(il_ind(1))%i_xyzt2=ji 711 tl_dim(il_ind(1))%i_len=1 712 tl_dim(il_ind(1))%l_use=.FALSE. 713 ENDIF 714 715 ENDDO 716 717 ! save result 718 dim_fill_unused(:)=tl_dim(:) 719 720 ! clean 721 CALL dim_clean(tl_dim(:)) 722 723 END FUNCTION dim_fill_unused 529 724 !------------------------------------------------------------------- 530 725 !> @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) 726 !> This subroutine switch element of an array (4 elts) of dimension 727 !> structure 728 !> from disordered dimension to ordered dimension <br/> 729 !> 730 !> @details 731 !> Optionally you could specify dimension order to output 732 !> (default 'xyzt') 733 !> Example: (/'z','x','t','y'/) => (/'x','y','z','t'/) 734 !> 735 !> @warning this subroutine change dimension order 736 ! 737 !> @author J.Paul 738 !> @date November, 2013 - Initial Version 739 !> @date September, 2014 740 !> - allow to choose ordered dimension to be output 741 !> 742 !> @param[inout] td_dim array of dimension structure 743 !> @param[in] cd_dimorder dimension order to be output 744 !------------------------------------------------------------------- 745 SUBROUTINE dim_reorder(td_dim, cd_dimorder) 541 746 IMPLICIT NONE 542 747 ! Argument 543 TYPE(TDIM), DIMENSION(:), INTENT(IN) :: td_dim 544 545 ! function 546 LOGICAL :: dim_order 748 TYPE(TDIM) , DIMENSION(:), INTENT(INOUT) :: td_dim 749 CHARACTER(LEN=ip_maxdim) , INTENT(IN ), OPTIONAL :: cd_dimorder 547 750 548 751 ! local variable 549 CHARACTER(LEN=lc) :: cl_dimin 550 551 ! loop indices 552 !---------------------------------------------------------------- 553 ! init 554 dim_order=.FALSE. 752 INTEGER(i4) :: il_ind 753 754 CHARACTER(LEN=lc) :: cl_dimin 755 CHARACTER(LEN=lc) :: cl_dimorder 756 757 TYPE(TDIM) , DIMENSION(ip_maxdim) :: tl_dim 758 759 ! loop indices 760 INTEGER(i4) :: ji 761 !---------------------------------------------------------------- 555 762 556 763 IF( SIZE(td_dim(:)) /= ip_maxdim )THEN 557 CALL logger_error("DIM ORDER: invalid dimension of tabledimension.")764 CALL logger_error("DIM REORDER: invalid dimension of array dimension.") 558 765 ELSE 559 766 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 767 cl_dimorder=TRIM(cp_dimorder) 768 IF( PRESENT(cd_dimorder) ) cl_dimorder=TRIM(ADJUSTL(cd_dimorder)) 769 770 ! add id if dimension used and no id 610 771 DO ji=1, ip_maxdim 611 772 612 CALL logger_debug( "DIM REORDER : jj "//TRIM(fct_str(jj))//&613 & " "//TRIM(fct_str(td_dim(ji)%l_use)))614 773 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 774 IF( td_dim(ji)%i_id == 0 )THEN 775 td_dim(ji)%i_id=MAXVAL(td_dim(:)%i_id)+1 776 ENDIF 621 777 ELSE 622 778 td_dim(ji)%i_id=0 623 779 td_dim(ji)%i_xyzt2=0 780 td_dim(ji)%i_2xyzt=0 624 781 td_dim(ji)%c_sname='u' 625 782 td_dim(ji)%c_name='' … … 629 786 ENDDO 630 787 631 print *,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"632 CALL dim_print(tl_dim(:))633 634 635 788 ! fill unused dimension 636 CALL dim__fill_unused(tl_dim(:))789 tl_dim(:)=dim_fill_unused(td_dim(:)) 637 790 cl_dimin=fct_lower(fct_concat(tl_dim(:)%c_sname)) 638 791 639 print *,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"640 CALL dim_print(tl_dim(:))641 792 ! compute input id from output id (xyzt) 642 793 DO ji = 1, ip_maxdim 643 794 644 il_i d=SCAN(TRIM(cp_dimorder),TRIM(cl_dimin(ji:ji)))645 IF( il_i d /= 0 )THEN646 tl_dim(ji)%i_xyzt2=il_i d795 il_ind=SCAN(TRIM(cl_dimorder),TRIM(cl_dimin(ji:ji))) 796 IF( il_ind /= 0 )THEN 797 tl_dim(ji)%i_xyzt2=il_ind 647 798 ENDIF 648 799 … … 652 803 DO ji = 1, ip_maxdim 653 804 654 il_i d=SCAN(TRIM(cl_dimin),TRIM(cp_dimorder(ji:ji)))655 IF( il_i d /= 0 )THEN656 tl_dim(ji)%i_2xyzt=il_i d805 il_ind=SCAN(TRIM(cl_dimin),TRIM(cl_dimorder(ji:ji))) 806 IF( il_ind /= 0 )THEN 807 tl_dim(ji)%i_2xyzt=il_ind 657 808 ENDIF 658 809 … … 669 820 td_dim(:)%i_xyzt2 = tl_dim(:)%i_xyzt2 670 821 822 ! clean 823 CALL dim_clean(tl_dim(:)) 671 824 ENDIF 672 825 673 826 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/> 827 !------------------------------------------------------------------- 828 !> @brief This subroutine switch dimension array from ordered dimension ('x','y','z','t') 829 !> to disordered dimension. <br/> 830 !> @details 679 831 !> Example: (/'x','y','z','t'/) => (/'z','x','t','y'/)<br/> 680 !> This is useful to add dimension in a variable or file 681 ! 832 ! This is useful to add dimension in a variable or file. 682 833 !> @warning this subroutine change dimension order 683 834 ! 684 835 !> @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) 836 !> @date November, 2013 - Initial Version 837 ! 838 !> @param[inout] td_dim array of dimension structure 839 !------------------------------------------------------------------- 840 SUBROUTINE dim_disorder(td_dim) 692 841 IMPLICIT NONE 693 842 ! Argument … … 702 851 703 852 IF( SIZE(td_dim(:)) /= ip_maxdim )THEN 704 CALL logger_error("DIM ORDER: invalid dimension of tabledimension.")853 CALL logger_error("DIM DISORDER: invalid dimension of array dimension.") 705 854 ELSE 706 ! add dummy xyzt2 id to removed dimension855 ! add dummy xyzt2 id to unused dimension 707 856 jj=1 708 857 DO ji = 1, ip_maxdim … … 729 878 td_dim(ji)%i_xyzt2=0 730 879 td_dim(ji)%c_sname='u' 731 !td_dim(ji)%c_name='unknown'732 !td_dim(ji)%c_sname=''733 880 td_dim(ji)%c_name='' 734 881 td_dim(ji)%l_uld=.FALSE. … … 737 884 ENDIF 738 885 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/> 886 END SUBROUTINE dim_disorder 887 !------------------------------------------------------------------- 888 !> @brief This function reshape real(8) 4D array 889 !> to an ordered array, as defined by dim_reorder.<br/> 890 !> @details 801 891 !> Example: (/'z','x','t','y'/) => (/'x','y','z','t'/) 802 892 ! 803 893 !> @note you must have run dim_reorder before use this subroutine 804 894 ! 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 895 !> @warning output array dimension differ from input array dimension 896 ! 897 !> @author J.Paul 898 !> @date November, 2013 - Initial Version 899 ! 900 !> @param[in] td_dim array of dimension structure 901 !> @param[in] dd_value array of value to reshape 902 !> @return array of value reshaped 903 !------------------------------------------------------------------- 815 904 FUNCTION dim__reshape_2xyzt_dp(td_dim, dd_value) 816 905 IMPLICIT NONE … … 835 924 836 925 IF( SIZE(td_dim(:)) /= ip_maxdim )THEN 837 CALL logger_error("DIM ORDER: invalid dimension of table dimension.") 926 CALL logger_error("DIM RESHAPE 2 XYZT: invalid dimension of "//& 927 & "array dimension.") 838 928 ELSE 839 929 … … 841 931 842 932 CALL logger_fatal( & 843 & " RESHAPE to XYZT: you should have run dim_reorder&844 & before running RESHAPE" )933 & " DIM RESHAPE 2 XYZT: you should have run dim_reorder"// & 934 & " before running RESHAPE" ) 845 935 846 936 ENDIF … … 854 944 855 945 DO ji=1,ip_maxdim 856 CALL logger_debug(" RESHAPE toXYZT: dim "//&946 CALL logger_debug(" DIM RESHAPE 2 XYZT: dim "//& 857 947 & TRIM(td_dim(td_dim(ji)%i_xyzt2)%c_name)//" "//& 858 948 & TRIM(fct_str(td_dim(td_dim(ji)%i_xyzt2)%i_len))//" vs "//& 859 949 & TRIM(fct_str(il_shape(ji))) ) 860 950 ENDDO 861 CALL logger_fatal(" RESHAPE toXYZT: wrong input dimensions " )951 CALL logger_fatal(" DIM RESHAPE 2 XYZT: wrong input dimensions " ) 862 952 863 953 ELSE … … 870 960 cl_dim=TRIM(cl_dim)//TRIM(fct_str(il_shape(ip_maxdim)))//"/)" 871 961 872 CALL logger_ info(" RESHAPE toXYZT: input dimensions are "//&962 CALL logger_debug(" DIM RESHAPE 2 XYZT: input dimensions are "//& 873 963 & TRIM(cl_dim) ) 874 964 … … 879 969 cl_dim=TRIM(cl_dim)//TRIM(fct_str(td_dim(ip_maxdim)%i_len))//"/)" 880 970 881 CALL logger_ info(" RESHAPE toXYZT: ouput dimensions should be "//&971 CALL logger_debug(" DIM RESHAPE 2 XYZT: ouput dimensions should be "//& 882 972 & TRIM(cl_dim) ) 883 973 … … 897 987 898 988 END FUNCTION dim__reshape_2xyzt_dp 899 ! > @endcode900 ! -------------------------------------------------------------------901 !> @brief This subroutine reshape ordered real(8) 4D table with dimension902 !> (/'x','y','z','t'/) to a table ordered as file variable.<br/>989 !------------------------------------------------------------------- 990 !> @brief This function reshape ordered real(8) 4D array with dimension 991 !> (/'x','y','z','t'/) to an "disordered" array.<br/> 992 !> @details 903 993 !> Example: (/'x','y','z','t'/) => (/'z','x','t','y'/) 904 994 ! 905 995 !> @note you must have run dim_reorder before use this subroutine 906 996 ! 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 997 !> @warning output array dimension differ from input array dimension 998 ! 999 !> @author J.Paul 1000 !> @date November, 2013 - Initial Version 1001 ! 1002 !> @param[in] td_dim array of dimension structure 1003 !> @param[in] dd_value array of value to reshape 1004 !> @return array of value reshaped 1005 !------------------------------------------------------------------- 917 1006 FUNCTION dim__reshape_xyzt2_dp(td_dim, dd_value) 918 1007 IMPLICIT NONE … … 937 1026 938 1027 IF( SIZE(td_dim(:)) /= ip_maxdim )THEN 939 CALL logger_error("DIM ORDER: invalid dimension of table dimension.") 1028 CALL logger_error("DIM RESHAPE XYZT 2: invalid dimension of "//& 1029 & "array dimension.") 940 1030 ELSE 941 1031 … … 943 1033 944 1034 CALL logger_fatal( & 945 & " RESHAPE from XYZT: you should have run dim_reorder&946 & before running RESHAPE" )1035 & " DIM RESHAPE XYZT 2: you should have run dim_reorder"// & 1036 & " before running RESHAPE" ) 947 1037 948 1038 ENDIF … … 953 1043 954 1044 DO ji=1,ip_maxdim 955 CALL logger_ debug(" RESHAPE from XYZT: dim "//&1045 CALL logger_trace(" DIM RESHAPE XYZT 2: dim "//& 956 1046 & TRIM(td_dim(ji)%c_name)//" "//& 957 1047 & TRIM(fct_str(td_dim(ji)%i_len))//" vs "//& 958 1048 & TRIM(fct_str(il_shape(ji))) ) 959 1049 ENDDO 960 CALL logger_fatal( " RESHAPE from XYZT: wrong input dimensions ")1050 CALL logger_fatal( "DIM RESHAPE XYZT 2: wrong input dimensions ") 961 1051 962 1052 ELSE … … 969 1059 cl_dim=TRIM(cl_dim)//TRIM(fct_str(il_shape(ip_maxdim)))//"/)" 970 1060 971 CALL logger_ info(" RESHAPE from XYZT: input dimensions are "//&1061 CALL logger_debug(" DIM RESHAPE XYZT 2: input dimensions are "//& 972 1062 & TRIM(cl_dim) ) 973 1063 … … 980 1070 & TRIM(fct_str(td_dim(td_dim(ip_maxdim)%i_xyzt2)%i_len))//"/)" 981 1071 982 CALL logger_ info(" RESHAPE from XYZT: ouput dimensions should be "//&1072 CALL logger_debug(" DIM RESHAPE XYZT 2: ouput dimensions should be "//& 983 1073 & TRIM(cl_dim) ) 984 1074 985 ! reshape table1075 ! reshape array 986 1076 dim__reshape_xyzt2_dp(:,:,:,:)=RESHAPE(SOURCE=dd_value, & 987 1077 & SHAPE = (/ td_dim(td_dim(1)%i_xyzt2)%i_len, & … … 994 1084 & td_dim(4)%i_xyzt2 /)) 995 1085 996 997 1086 ENDIF 998 1087 ENDIF 999 1088 1000 1089 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'/) 1090 !------------------------------------------------------------------- 1091 !> @brief This function reordered integer(4) 1D array to be suitable 1092 !> with dimension ordered as defined in dim_reorder. 1005 1093 !> @note you must have run dim_reorder before use this subroutine 1006 1094 ! 1007 1095 !> @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) 1096 !> @date November, 2013 - Initial Version 1097 ! 1098 !> @param[in] td_dim array of dimension structure 1099 !> @param[in] id_arr array of value to reshape 1100 !> @return array of value reshaped 1101 !------------------------------------------------------------------- 1102 FUNCTION dim__reorder_2xyzt_i4(td_dim, id_arr) 1016 1103 IMPLICIT NONE 1017 1104 1018 1105 ! Argument 1019 1106 TYPE(TDIM) , DIMENSION(:), INTENT(IN) :: td_dim 1020 INTEGER(i4), DIMENSION(:), INTENT(IN) :: id_ tab1107 INTEGER(i4), DIMENSION(:), INTENT(IN) :: id_arr 1021 1108 1022 1109 ! function … … 1028 1115 1029 1116 IF( SIZE(td_dim(:)) /= ip_maxdim .OR. & 1030 & SIZE(id_ tab(:)) /= ip_maxdim )THEN1031 CALL logger_error("DIM ORDER: invalid dimension of tabledimension"//&1032 & " or of tableof value.")1117 & SIZE(id_arr(:)) /= ip_maxdim )THEN 1118 CALL logger_error("DIM REORDER 2 XYZT: invalid dimension of array dimension"//& 1119 & " or of array of value.") 1033 1120 ELSE 1034 1121 IF( ANY(td_dim(:)%i_2xyzt==0) )THEN 1035 1122 1036 1123 CALL logger_error( & 1037 & " REORDER to XYZT: you should have run dim_reorder&1038 & before running REORDER" )1124 & " DIM REORDER 2 XYZT: you should have run dim_reorder"//& 1125 & " before running REORDER" ) 1039 1126 1040 1127 ENDIF 1041 1128 1042 1129 DO ji=1,ip_maxdim 1043 dim__reorder_2xyzt_i4(ji)=id_ tab(td_dim(ji)%i_2xyzt)1130 dim__reorder_2xyzt_i4(ji)=id_arr(td_dim(ji)%i_2xyzt) 1044 1131 ENDDO 1045 1132 ENDIF 1046 1133 1047 1134 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. 1135 !------------------------------------------------------------------- 1136 !> @brief This function disordered integer(4) 1D array to be suitable with 1137 !> initial dimension order (ex: dimension read in file). 1052 1138 !> @note you must have run dim_reorder before use this subroutine 1053 1139 ! 1054 1140 !> @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) 1141 !> @date November, 2013 - Initial Version 1142 ! 1143 !> @param[in] td_dim array of dimension structure 1144 !> @param[in] id_arr array of value to reshape 1145 !> @return array of value reshaped 1146 !------------------------------------------------------------------- 1147 FUNCTION dim__reorder_xyzt2_i4(td_dim, id_arr) 1063 1148 IMPLICIT NONE 1064 1149 1065 1150 ! Argument 1066 1151 TYPE(TDIM) , DIMENSION(:), INTENT(IN) :: td_dim 1067 INTEGER(i4), DIMENSION(:), INTENT(IN) :: id_ tab1152 INTEGER(i4), DIMENSION(:), INTENT(IN) :: id_arr 1068 1153 1069 1154 ! function … … 1075 1160 1076 1161 IF( SIZE(td_dim(:)) /= ip_maxdim .OR. & 1077 & SIZE(id_ tab(:)) /= ip_maxdim )THEN1078 CALL logger_error("DIM ORDER: invalid dimension of table dimension"//&1079 & " or of tableof value.")1162 & SIZE(id_arr(:)) /= ip_maxdim )THEN 1163 CALL logger_error("DIM REORDER XYZT 2: invalid dimension of "//& 1164 & "array dimension or of array of value.") 1080 1165 ELSE 1081 1166 IF( ANY(td_dim(:)%i_xyzt2==0) )THEN 1082 1167 1083 1168 CALL logger_error( & 1084 & " REORDER from XYZT: you should have run dim_reorder&1085 & before running REORDER" )1169 & " DIM REORDER XYZT 2: you should have run dim_reorder"// & 1170 & " before running REORDER" ) 1086 1171 1087 1172 ENDIF 1088 1173 1089 1174 DO ji=1,ip_maxdim 1090 dim__reorder_xyzt2_i4(ji)=id_ tab(td_dim(ji)%i_xyzt2)1175 dim__reorder_xyzt2_i4(ji)=id_arr(td_dim(ji)%i_xyzt2) 1091 1176 ENDDO 1092 1177 ENDIF 1093 1178 1094 1179 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'/) 1180 !------------------------------------------------------------------- 1181 !> @brief This function reordered logical 1D array to be suitable 1182 !> with dimension ordered as defined in dim_reorder. 1099 1183 !> @note you must have run dim_reorder before use this subroutine 1100 1184 ! 1101 1185 !> @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) 1186 !> @date November, 2013 - Initial Version 1187 ! 1188 !> @param[in] td_dim array of dimension structure 1189 !> @param[in] ld_arr array of value to reordered 1190 !> @return array of value reordered 1191 !------------------------------------------------------------------- 1192 FUNCTION dim__reorder_2xyzt_l(td_dim, ld_arr) 1110 1193 IMPLICIT NONE 1111 1194 ! Argument 1112 1195 TYPE(TDIM) , DIMENSION(:), INTENT(IN) :: td_dim 1113 LOGICAL , DIMENSION(:), INTENT(IN) :: ld_ tab1196 LOGICAL , DIMENSION(:), INTENT(IN) :: ld_arr 1114 1197 1115 1198 ! function … … 1121 1204 1122 1205 IF( SIZE(td_dim(:)) /= ip_maxdim .OR. & 1123 & SIZE(ld_ tab(:)) /= ip_maxdim )THEN1124 CALL logger_error("DIM ORDER: invalid dimension of tabledimension"//&1125 & " or of tableof value.")1206 & SIZE(ld_arr(:)) /= ip_maxdim )THEN 1207 CALL logger_error("DIM REORDER 2 XYZT: invalid dimension of array dimension"//& 1208 & " or of array of value.") 1126 1209 ELSE 1127 1210 IF( ANY(td_dim(:)%i_2xyzt==0) )THEN 1128 1211 1129 1212 CALL logger_error( & 1130 & " REORDER to XYZT: you should have run dim_reorder&1131 & before running REORDER" )1213 & " DIM REORDER 2 XYZT: you should have run dim_reorder"// & 1214 & " before running REORDER" ) 1132 1215 1133 1216 ENDIF 1134 1217 1135 1218 DO ji=1,ip_maxdim 1136 dim__reorder_2xyzt_l(ji)=ld_ tab(td_dim(ji)%i_2xyzt)1219 dim__reorder_2xyzt_l(ji)=ld_arr(td_dim(ji)%i_2xyzt) 1137 1220 ENDDO 1138 1221 ENDIF 1139 1222 1140 1223 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. 1224 !------------------------------------------------------------------- 1225 !> @brief This function disordered logical 1D array to be suitable with 1226 !> initial dimension order (ex: dimension read in file). 1145 1227 !> @note you must have run dim_reorder before use this subroutine 1146 1228 ! 1147 1229 !> @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) 1230 !> @date November, 2013 - Initial Version 1231 ! 1232 !> @param[in] td_dim array of dimension structure 1233 !> @param[in] ld_arr array of value to reordered 1234 !> @return array of value reordered 1235 !------------------------------------------------------------------- 1236 FUNCTION dim__reorder_xyzt2_l(td_dim, ld_arr) 1156 1237 IMPLICIT NONE 1157 1238 1158 1239 ! Argument 1159 1240 TYPE(TDIM) , DIMENSION(:), INTENT(IN) :: td_dim 1160 LOGICAL , DIMENSION(:), INTENT(IN) :: ld_ tab1241 LOGICAL , DIMENSION(:), INTENT(IN) :: ld_arr 1161 1242 1162 1243 ! function … … 1168 1249 1169 1250 IF( SIZE(td_dim(:)) /= ip_maxdim .OR. & 1170 & SIZE(ld_ tab(:)) /= ip_maxdim )THEN1171 CALL logger_error("DIM ORDER: invalid dimension of tabledimension"//&1172 & " or of tableof value.")1251 & SIZE(ld_arr(:)) /= ip_maxdim )THEN 1252 CALL logger_error("DIM REORDER XYZT 2: invalid dimension of array dimension"//& 1253 & " or of array of value.") 1173 1254 ELSE 1174 1255 IF( ANY(td_dim(:)%i_xyzt2==0) )THEN 1175 1256 1176 1257 CALL logger_error( & 1177 & " REORDER from XYZT: you should have run dim_reorder&1178 & 1258 & " DIM REORDER XYZT 2: you should have run dim_reorder"//& 1259 & " before running REORDER" ) 1179 1260 1180 1261 ENDIF 1181 1262 1182 1263 DO ji=1,ip_maxdim 1183 dim__reorder_xyzt2_l(ji)=ld_ tab(td_dim(ji)%i_xyzt2)1264 dim__reorder_xyzt2_l(ji)=ld_arr(td_dim(ji)%i_xyzt2) 1184 1265 ENDDO 1185 1266 ENDIF 1186 1267 1187 1268 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'/) 1269 !------------------------------------------------------------------- 1270 !> @brief This function reordered string 1D array to be suitable 1271 !> with dimension ordered as defined in dim_reorder. 1192 1272 !> @note you must have run dim_reorder before use this subroutine 1193 1273 ! 1194 1274 !> @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) 1275 !> @date November, 2013 - Initial Version 1276 ! 1277 !> @param[in] td_dim array of dimension structure 1278 !> @param[in] cd_arr array of value to reordered 1279 !> @return array of value reordered 1280 !------------------------------------------------------------------- 1281 FUNCTION dim__reorder_2xyzt_c(td_dim, cd_arr) 1203 1282 IMPLICIT NONE 1204 1283 ! Argument 1205 1284 TYPE(TDIM), DIMENSION(:), INTENT(IN) :: td_dim 1206 CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: cd_ tab1285 CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: cd_arr 1207 1286 1208 1287 ! function … … 1214 1293 1215 1294 IF( SIZE(td_dim(:)) /= ip_maxdim .OR. & 1216 & SIZE(cd_ tab(:)) /= ip_maxdim )THEN1217 CALL logger_error("DIM ORDER: invalid dimension of tabledimension"//&1218 & " or of tableof value.")1295 & SIZE(cd_arr(:)) /= ip_maxdim )THEN 1296 CALL logger_error("DIM REORDER 2 XYZT: invalid dimension of array dimension"//& 1297 & " or of array of value.") 1219 1298 ELSE 1220 1299 IF( ANY(td_dim(:)%i_2xyzt==0) )THEN 1221 1300 1222 1301 CALL logger_error( & 1223 & " REORDER toXYZT: you should have run dim_reorder"//&1302 & " DIM REORDER 2 XYZT: you should have run dim_reorder"//& 1224 1303 & " before running REORDER" ) 1225 1304 … … 1227 1306 1228 1307 DO ji=1,ip_maxdim 1229 dim__reorder_2xyzt_c(ji)=TRIM(cd_ tab(td_dim(ji)%i_2xyzt))1308 dim__reorder_2xyzt_c(ji)=TRIM(cd_arr(td_dim(ji)%i_2xyzt)) 1230 1309 ENDDO 1231 1310 ENDIF 1232 1311 1233 1312 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. 1313 !------------------------------------------------------------------- 1314 !> @brief This function disordered string 1D array to be suitable with 1315 !> initial dimension order (ex: dimension read in file). 1238 1316 !> @note you must have run dim_reorder before use this subroutine 1239 1317 ! 1240 1318 !> @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) 1319 !> @date November, 2013 - Initial Version 1320 ! 1321 !> @param[in] td_dim array of dimension structure 1322 !> @param[in] cd_arr array of value to reordered 1323 !> @return array of value reordered 1324 !------------------------------------------------------------------- 1325 FUNCTION dim__reorder_xyzt2_c(td_dim, cd_arr) 1249 1326 IMPLICIT NONE 1250 1327 1251 1328 ! Argument 1252 1329 TYPE(TDIM), DIMENSION(:), INTENT(IN) :: td_dim 1253 CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: cd_ tab1330 CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: cd_arr 1254 1331 1255 1332 ! function … … 1261 1338 1262 1339 IF( SIZE(td_dim(:)) /= ip_maxdim .OR. & 1263 & SIZE(cd_ tab(:)) /= ip_maxdim )THEN1264 CALL logger_error("DIM ORDER: invalid dimension of tabledimension"//&1265 & " or of tableof value.")1340 & SIZE(cd_arr(:)) /= ip_maxdim )THEN 1341 CALL logger_error("DIM REORDER XYZT 2: invalid dimension of array dimension"//& 1342 & " or of array of value.") 1266 1343 ELSE 1267 1344 IF( ANY(td_dim(:)%i_xyzt2==0) )THEN 1268 1345 CALL logger_error( & 1269 & " REORDER from XYZT: you should have run dim_reorder&1270 & before running REORDER" )1346 & " DIM REORDER XYZT 2: you should have run dim_reorder"// & 1347 & " before running REORDER" ) 1271 1348 1272 1349 ENDIF 1273 1350 1274 1351 DO ji=1,ip_maxdim 1275 dim__reorder_xyzt2_c(ji)=TRIM(cd_ tab(td_dim(ji)%i_xyzt2))1352 dim__reorder_xyzt2_c(ji)=TRIM(cd_arr(td_dim(ji)%i_xyzt2)) 1276 1353 ENDDO 1277 1354 ENDIF 1278 1355 1279 1356 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 1357 !------------------------------------------------------------------- 1358 !> @brief This subroutine clean dimension structure. 1359 ! 1360 !> @author J.Paul 1361 !> @date November, 2013 - Initial Version 1362 ! 1363 !> @param[in] td_dim dimension strucutre 1364 !------------------------------------------------------------------- 1290 1365 SUBROUTINE dim__clean_unit( td_dim ) 1291 1366 IMPLICIT NONE … … 1297 1372 !---------------------------------------------------------------- 1298 1373 1299 CALL logger_ info( &1300 & " CLEAN: reset dimension "//TRIM(td_dim%c_name) )1374 CALL logger_trace( & 1375 & " DIM CLEAN: reset dimension "//TRIM(td_dim%c_name) ) 1301 1376 1302 1377 ! replace by empty structure … … 1304 1379 1305 1380 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 ) 1381 !------------------------------------------------------------------- 1382 !> @brief This subroutine clean array of dimension structure 1383 ! 1384 !> @author J.Paul 1385 !> @date November, 2013 - Initial Version 1386 ! 1387 !> @param[in] td_dim array of dimension strucutre 1388 !------------------------------------------------------------------- 1389 SUBROUTINE dim__clean_arr( td_dim ) 1317 1390 IMPLICIT NONE 1318 1391 ! Argument … … 1327 1400 ENDDO 1328 1401 1329 END SUBROUTINE dim__clean_tab 1330 !> @endcode 1402 END SUBROUTINE dim__clean_arr 1331 1403 END MODULE dim 1332 1404
Note: See TracChangeset
for help on using the changeset viewer.