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.
Changeset 6043 for branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/TOOLS/SIREN/src/dimension.f90 – NEMO

Ignore:
Timestamp:
2015-12-14T10:27:28+01:00 (8 years ago)
Author:
timgraham
Message:

Merged head of trunk into branch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/TOOLS/SIREN/src/dimension.f90

    r5600 r6043  
    7878!> 
    7979!>    This subroutine filled dimension structure with unused dimension,  
    80 !>    then switch from "unordered" dimension to "ordered" dimension.<br/> 
     80!>    then switch from "disordered" dimension to "ordered" dimension.<br/> 
    8181!>    The dimension structure return will be:<br/> 
    8282!>    tl_dim(1) => 'X', i_len=10, l_use=T, l_uld=F<br/> 
     
    9494!>    - cl_neworder : character(len=4) (example: 'yxzt') 
    9595!> 
    96 !>    to switch dimension array from ordered dimension to unordered 
     96!>    to switch dimension array from ordered dimension to disordered 
    9797!> dimension:<br/> 
    9898!> @code 
    99 !>    CALL dim_unorder(tl_dim(:)) 
     99!>    CALL dim_disorder(tl_dim(:)) 
    100100!> @endcode 
    101101!> 
     
    111111!>    CALL dim_reshape_2xyzt(tl_dim(:), value(:,:,:,:)) 
    112112!> @endcode 
    113 !>       - value must be a 4D array of real(8) value "unordered" 
    114 !> 
    115 !>    to reshape array of value in "unordered" dimension:<br/> 
     113!>       - value must be a 4D array of real(8) value "disordered" 
     114!> 
     115!>    to reshape array of value in "disordered" dimension:<br/> 
    116116!> @code 
    117117!>    CALL dim_reshape_xyzt2(tl_dim(:), value(:,:,:,:)) 
     
    123123!>    CALL dim_reorder_2xyzt(tl_dim(:), tab(:)) 
    124124!> @endcode 
    125 !>       - tab must be a 1D array with 4 elements "unordered". 
     125!>       - tab must be a 1D array with 4 elements "disordered". 
    126126!>       It could be composed of character, integer(4), or logical 
    127127!>  
    128 !>    to reorder a 1D array of 4 elements in "unordered" dimension:<br/> 
    129 !> @code 
    130 !>    CALL dim_reorder_2xyzt(tl_dim(:), tab(:)) 
     128!>    to reorder a 1D array of 4 elements in "disordered" dimension:<br/> 
     129!> @code 
     130!>    CALL dim_reorder_xyzt2(tl_dim(:), tab(:)) 
    131131!> @endcode 
    132132!>       - tab must be a 1D array with 4 elements "ordered". 
     
    173173   PUBLIC :: dim_print         !< print dimension information 
    174174   PUBLIC :: dim_copy          !< copy dimension structure 
    175    PUBLIC :: dim_reorder       !< filled dimension structure to switch from unordered to ordered dimension 
    176    PUBLIC :: dim_unorder       !< switch dimension array from ordered to unordered dimension 
     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 
    177177   PUBLIC :: dim_fill_unused   !< filled dimension structure with unused dimension  
    178178   PUBLIC :: dim_reshape_2xyzt !< reshape array dimension to ('x','y','z','t') 
     
    321321   !> @author J.Paul 
    322322   !> @date November, 2013 - Initial Version 
    323    !> @date September, 2014 - do not check if dimension used 
     323   !> @date September, 2014  
     324   !> - do not check if dimension used 
    324325   !> 
    325326   !> @param[in] td_dim    array of dimension structure 
     
    502503   !> Optionally length could be inform, as well as short name and if dimension 
    503504   !> is unlimited or not.<br/> 
    504    !> define dimension is supposed to be used. 
    505    !> 
    506    !> @author J.Paul 
    507    !> @date November, 2013 - Initial Version 
     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 
    508515   ! 
    509516   !> @param[in] cd_name   dimension name 
     
    511518   !> @param[in] ld_uld    dimension unlimited 
    512519   !> @param[in] cd_sname  dimension short name 
     520   !> @param[in] ld_uld    dimension use or not 
    513521   !> @return dimension structure 
    514522   !------------------------------------------------------------------- 
    515    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) 
    516524      IMPLICIT NONE 
    517525 
     
    521529      LOGICAL,          INTENT(IN), OPTIONAL :: ld_uld 
    522530      CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: cd_sname 
     531      LOGICAL,          INTENT(IN), OPTIONAL :: ld_use 
    523532 
    524533      ! local variable 
     
    543552 
    544553      ! define dimension is supposed to be used 
    545       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 
    546559 
    547560      IF( PRESENT(cd_sname) )THEN 
     
    590603      ENDIF 
    591604       
    592       ! get dimension orderer index 
    593       dim_init%i_2xyzt=SCAN(TRIM(cp_dimorder),TRIM(dim_init%c_sname)) 
     605      ! get dimension order indices 
     606      dim_init%i_xyzt2=SCAN(TRIM(cp_dimorder),TRIM(dim_init%c_sname)) 
    594607 
    595608   END FUNCTION dim_init 
     
    655668   !> @author J.Paul 
    656669   !> @date November, 2013 - Initial Version 
     670   !> @date July, 2015  
     671   !> - Bug fix: use order to disorder table (see dim_init) 
    657672   !> 
    658673   !> @param[in] td_dim array of dimension structure 
     
    686701         ! search missing dimension 
    687702         IF( INDEX(cl_dimin,TRIM(fct_lower(cp_dimorder(ji:ji)))) == 0 )THEN 
    688             ! search first empty dimension 
    689             il_ind(:)=MINLOC( tl_dim(:)%i_2xyzt, tl_dim(:)%i_2xyzt == 0 ) 
     703            ! search first empty dimension (see dim_init) 
     704            il_ind(:)=MINLOC( tl_dim(:)%i_xyzt2, tl_dim(:)%i_xyzt2 == 0 ) 
    690705 
    691706            ! put missing dimension instead of empty one 
     
    693708            ! update output structure 
    694709            tl_dim(il_ind(1))%c_name=fct_lower(cp_dimorder(ji:ji)) 
    695             tl_dim(il_ind(1))%i_2xyzt=ji 
     710            tl_dim(il_ind(1))%i_xyzt2=ji 
    696711            tl_dim(il_ind(1))%i_len=1 
    697712            tl_dim(il_ind(1))%l_use=.FALSE. 
     
    711726   !> This subroutine switch element of an array (4 elts) of dimension  
    712727   !> structure  
    713    !> from unordered dimension to ordered dimension <br/> 
     728   !> from disordered dimension to ordered dimension <br/> 
    714729   !> 
    715730   !> @details 
     
    722737   !> @author J.Paul 
    723738   !> @date November, 2013 - Initial Version 
    724    !> @date September, 2014 - allow to choose ordered dimension to be output 
     739   !> @date September, 2014  
     740   !> - allow to choose ordered dimension to be output 
    725741   !> 
    726742   !> @param[inout] td_dim    array of dimension structure 
     
    811827   !------------------------------------------------------------------- 
    812828   !> @brief This subroutine switch dimension array from ordered dimension ('x','y','z','t') 
    813    !> to unordered dimension. <br/> 
     829   !> to disordered dimension. <br/> 
    814830   !> @details 
    815831   !> Example: (/'x','y','z','t'/) => (/'z','x','t','y'/)<br/> 
     
    822838   !> @param[inout] td_dim array of dimension structure 
    823839   !------------------------------------------------------------------- 
    824    SUBROUTINE dim_unorder(td_dim) 
     840   SUBROUTINE dim_disorder(td_dim) 
    825841      IMPLICIT NONE 
    826842      ! Argument       
     
    835851 
    836852      IF( SIZE(td_dim(:)) /= ip_maxdim )THEN 
    837          CALL logger_error("DIM UNORDER: invalid dimension of array dimension.") 
     853         CALL logger_error("DIM DISORDER: invalid dimension of array dimension.") 
    838854      ELSE       
    839855         ! add dummy xyzt2 id to unused dimension 
     
    868884      ENDIF 
    869885 
    870    END SUBROUTINE dim_unorder 
     886   END SUBROUTINE dim_disorder 
    871887   !------------------------------------------------------------------- 
    872888   !> @brief This function reshape real(8) 4D array    
     
    908924 
    909925      IF( SIZE(td_dim(:)) /= ip_maxdim )THEN 
    910          CALL logger_error("DIM RESHAPE 2 XYZT: invalid dimension of array dimension.") 
     926         CALL logger_error("DIM RESHAPE 2 XYZT: invalid dimension of "//& 
     927            &  "array dimension.") 
    911928      ELSE       
    912929 
     
    914931 
    915932            CALL logger_fatal( & 
    916             &  "  DIM RESHAPE 2 XYZT: you should have run dim_reorder & 
    917             &     before running RESHAPE" ) 
     933            &  "  DIM RESHAPE 2 XYZT: you should have run dim_reorder"// & 
     934            &  "   before running RESHAPE" ) 
    918935 
    919936         ENDIF 
     
    972989   !------------------------------------------------------------------- 
    973990   !> @brief This function reshape ordered real(8) 4D array with dimension  
    974    !> (/'x','y','z','t'/) to an "unordered" array.<br/> 
     991   !> (/'x','y','z','t'/) to an "disordered" array.<br/> 
    975992   !> @details 
    976993   !> Example: (/'x','y','z','t'/) => (/'z','x','t','y'/) 
     
    10091026 
    10101027      IF( SIZE(td_dim(:)) /= ip_maxdim )THEN 
    1011          CALL logger_error("DIM RESHAPE XYZT 2: invalid dimension of array dimension.") 
     1028         CALL logger_error("DIM RESHAPE XYZT 2: invalid dimension of "//& 
     1029            &  "array dimension.") 
    10121030      ELSE 
    10131031 
     
    10151033 
    10161034            CALL logger_fatal( & 
    1017             &  "  DIM RESHAPE XYZT 2: you should have run dim_reorder & 
    1018             &     before running RESHAPE" ) 
     1035            &  "  DIM RESHAPE XYZT 2: you should have run dim_reorder"// & 
     1036            &  "   before running RESHAPE" ) 
    10191037 
    10201038         ENDIF         
     
    11041122 
    11051123            CALL logger_error( & 
    1106             &  "  DIM REORDER 2 XYZT: you should have run dim_reorder & 
    1107             &     before running REORDER" ) 
     1124            &  "  DIM REORDER 2 XYZT: you should have run dim_reorder"//& 
     1125            &  "   before running REORDER" ) 
    11081126 
    11091127         ENDIF         
     
    11161134   END FUNCTION dim__reorder_2xyzt_i4 
    11171135   !------------------------------------------------------------------- 
    1118    !> @brief This function unordered integer(4) 1D array to be suitable with 
     1136   !> @brief This function disordered integer(4) 1D array to be suitable with 
    11191137   !> initial dimension order (ex: dimension read in file). 
    11201138   !> @note you must have run dim_reorder before use this subroutine 
     
    11431161      IF( SIZE(td_dim(:)) /= ip_maxdim .OR. & 
    11441162      &   SIZE(id_arr(:)) /= ip_maxdim )THEN 
    1145          CALL logger_error("DIM REORDER XYZT 2: invalid dimension of array dimension"//& 
    1146          &              " or of array of value.") 
     1163         CALL logger_error("DIM REORDER XYZT 2: invalid dimension of "//& 
     1164            &  "array dimension or of array of value.") 
    11471165      ELSE       
    11481166         IF( ANY(td_dim(:)%i_xyzt2==0) )THEN 
    11491167 
    11501168            CALL logger_error( & 
    1151             &  "  DIM REORDER XYZT 2: you should have run dim_reorder & 
    1152             &     before running REORDER" ) 
     1169            &  "  DIM REORDER XYZT 2: you should have run dim_reorder"// & 
     1170            &  "   before running REORDER" ) 
    11531171 
    11541172         ENDIF         
     
    11661184   ! 
    11671185   !> @author J.Paul 
    1168    !> @date Nov, 2013 - Initial Version 
     1186   !> @date November, 2013 - Initial Version 
    11691187   ! 
    11701188   !> @param[in] td_dim array of dimension structure 
     
    11931211 
    11941212            CALL logger_error( & 
    1195             &  "  DIM REORDER 2 XYZT: you should have run dim_reorder & 
    1196             &     before running REORDER" ) 
     1213            &  "  DIM REORDER 2 XYZT: you should have run dim_reorder"// & 
     1214            &  "   before running REORDER" ) 
    11971215 
    11981216         ENDIF         
     
    12051223   END FUNCTION dim__reorder_2xyzt_l 
    12061224   !------------------------------------------------------------------- 
    1207    !> @brief This function unordered logical 1D array to be suitable with 
     1225   !> @brief This function disordered logical 1D array to be suitable with 
    12081226   !> initial dimension order (ex: dimension read in file). 
    12091227   !> @note you must have run dim_reorder before use this subroutine 
     
    12381256 
    12391257            CALL logger_error( & 
    1240             &  "  DIM REORDER XYZT 2: you should have run dim_reorder & 
    1241             &     before running REORDER" ) 
     1258            &  "  DIM REORDER XYZT 2: you should have run dim_reorder"//& 
     1259            &  "  before running REORDER" ) 
    12421260 
    12431261         ENDIF         
     
    12941312   END FUNCTION dim__reorder_2xyzt_c 
    12951313   !------------------------------------------------------------------- 
    1296    !> @brief This function unordered string 1D array to be suitable with 
     1314   !> @brief This function disordered string 1D array to be suitable with 
    12971315   !> initial dimension order (ex: dimension read in file). 
    12981316   !> @note you must have run dim_reorder before use this subroutine 
    12991317   ! 
    13001318   !> @author J.Paul 
    1301    !> @date Nov, 2013 - Initial Version 
     1319   !> @date November, 2013 - Initial Version 
    13021320   ! 
    13031321   !> @param[in] td_dim array of dimension structure 
     
    13261344         IF( ANY(td_dim(:)%i_xyzt2==0) )THEN 
    13271345            CALL logger_error( & 
    1328             &  "  DIM REORDER XYZT 2: you should have run dim_reorder & 
    1329             &     before running REORDER" ) 
     1346            &  "  DIM REORDER XYZT 2: you should have run dim_reorder"// & 
     1347            &  "   before running REORDER" ) 
    13301348 
    13311349         ENDIF         
Note: See TracChangeset for help on using the changeset viewer.