- Timestamp:
- 2016-11-18T09:34:22+01:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/TOOLS/SIREN/src/dimension.f90
r5602 r7261 78 78 !> 79 79 !> 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/> 81 81 !> The dimension structure return will be:<br/> 82 82 !> tl_dim(1) => 'X', i_len=10, l_use=T, l_uld=F<br/> … … 94 94 !> - cl_neworder : character(len=4) (example: 'yxzt') 95 95 !> 96 !> to switch dimension array from ordered dimension to unordered96 !> to switch dimension array from ordered dimension to disordered 97 97 !> dimension:<br/> 98 98 !> @code 99 !> CALL dim_ unorder(tl_dim(:))99 !> CALL dim_disorder(tl_dim(:)) 100 100 !> @endcode 101 101 !> … … 111 111 !> CALL dim_reshape_2xyzt(tl_dim(:), value(:,:,:,:)) 112 112 !> @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/> 116 116 !> @code 117 117 !> CALL dim_reshape_xyzt2(tl_dim(:), value(:,:,:,:)) … … 123 123 !> CALL dim_reorder_2xyzt(tl_dim(:), tab(:)) 124 124 !> @endcode 125 !> - tab must be a 1D array with 4 elements " unordered".125 !> - tab must be a 1D array with 4 elements "disordered". 126 126 !> It could be composed of character, integer(4), or logical 127 127 !> 128 !> to reorder a 1D array of 4 elements in " unordered" dimension:<br/>128 !> to reorder a 1D array of 4 elements in "disordered" dimension:<br/> 129 129 !> @code 130 !> CALL dim_reorder_ 2xyzt(tl_dim(:), tab(:))130 !> CALL dim_reorder_xyzt2(tl_dim(:), tab(:)) 131 131 !> @endcode 132 132 !> - tab must be a 1D array with 4 elements "ordered". … … 154 154 ! REVISION HISTORY: 155 155 !> @date November, 2013 - Initial Version 156 !> @date Spetember, 2015 157 !> - manage useless (dummy) dimension 156 158 !> 157 159 !> @note Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 168 170 PUBLIC :: TDIM !< dimension structure 169 171 172 PRIVATE :: cm_dumdim !< dummy dimension array 173 170 174 ! function and subroutine 171 175 PUBLIC :: dim_init !< initialize dimension structure … … 173 177 PUBLIC :: dim_print !< print dimension information 174 178 PUBLIC :: dim_copy !< copy dimension structure 175 PUBLIC :: dim_reorder !< filled dimension structure to switch from unordered to ordered dimension176 PUBLIC :: dim_ unorder !< switch dimension array from ordered to unordered dimension179 PUBLIC :: dim_reorder !< filled dimension structure to switch from disordered to ordered dimension 180 PUBLIC :: dim_disorder !< switch dimension array from ordered to disordered dimension 177 181 PUBLIC :: dim_fill_unused !< filled dimension structure with unused dimension 178 182 PUBLIC :: dim_reshape_2xyzt !< reshape array dimension to ('x','y','z','t') … … 182 186 PUBLIC :: dim_get_index !< get dimension index in array of dimension structure 183 187 PUBLIC :: dim_get_id !< get dimension id in array of dimension structure 188 PUBLIC :: dim_get_dummy !< fill dummy dimension array 189 PUBLIC :: dim_is_dummy !< check if dimension is defined as dummy dimension 184 190 185 191 PRIVATE :: dim__reshape_2xyzt_dp ! reshape real(8) 4D array to ('x','y','z','t') … … 209 215 END TYPE 210 216 217 CHARACTER(LEN=lc), DIMENSION(ip_maxdum), SAVE :: cm_dumdim !< dummy dimension 218 211 219 INTERFACE dim_print 212 220 MODULE PROCEDURE dim__print_unit ! print information on one dimension … … 321 329 !> @author J.Paul 322 330 !> @date November, 2013 - Initial Version 323 !> @date September, 2014 - do not check if dimension used 331 !> @date September, 2014 332 !> - do not check if dimension used 324 333 !> 325 334 !> @param[in] td_dim array of dimension structure … … 502 511 !> Optionally length could be inform, as well as short name and if dimension 503 512 !> is unlimited or not.<br/> 504 !> define dimension is supposed to be used. 505 !> 506 !> @author J.Paul 507 !> @date November, 2013 - Initial Version 513 !> By default, define dimension is supposed to be used. 514 !> Optionally you could force a defined dimension to be unused. 515 !> 516 !> @author J.Paul 517 !> @date November, 2013 - Initial Version 518 !> @date February, 2015 519 !> - add optional argument to define dimension unused 520 !> @date July, 2015 521 !> - Bug fix: inform order to disorder table instead of disorder to order 522 !> table 508 523 ! 509 524 !> @param[in] cd_name dimension name … … 511 526 !> @param[in] ld_uld dimension unlimited 512 527 !> @param[in] cd_sname dimension short name 528 !> @param[in] ld_use dimension use or not 513 529 !> @return dimension structure 514 530 !------------------------------------------------------------------- 515 TYPE(TDIM) FUNCTION dim_init( cd_name, id_len, ld_uld, cd_sname )531 TYPE(TDIM) FUNCTION dim_init( cd_name, id_len, ld_uld, cd_sname, ld_use ) 516 532 IMPLICIT NONE 517 533 … … 521 537 LOGICAL, INTENT(IN), OPTIONAL :: ld_uld 522 538 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: cd_sname 539 LOGICAL, INTENT(IN), OPTIONAL :: ld_use 523 540 524 541 ! local variable … … 543 560 544 561 ! define dimension is supposed to be used 545 dim_init%l_use=.TRUE. 562 IF( PRESENT(ld_use) )THEN 563 dim_init%l_use=ld_use 564 ELSE 565 dim_init%l_use=.TRUE. 566 ENDIF 546 567 547 568 IF( PRESENT(cd_sname) )THEN … … 590 611 ENDIF 591 612 592 ! get dimension order er index593 dim_init%i_ 2xyzt=SCAN(TRIM(cp_dimorder),TRIM(dim_init%c_sname))613 ! get dimension order indices 614 dim_init%i_xyzt2=SCAN(TRIM(cp_dimorder),TRIM(dim_init%c_sname)) 594 615 595 616 END FUNCTION dim_init … … 655 676 !> @author J.Paul 656 677 !> @date November, 2013 - Initial Version 678 !> @date July, 2015 679 !> - Bug fix: use order to disorder table (see dim_init) 657 680 !> 658 681 !> @param[in] td_dim array of dimension structure … … 686 709 ! search missing dimension 687 710 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 )711 ! search first empty dimension (see dim_init) 712 il_ind(:)=MINLOC( tl_dim(:)%i_xyzt2, tl_dim(:)%i_xyzt2 == 0 ) 690 713 691 714 ! put missing dimension instead of empty one … … 693 716 ! update output structure 694 717 tl_dim(il_ind(1))%c_name=fct_lower(cp_dimorder(ji:ji)) 695 tl_dim(il_ind(1))%i_ 2xyzt=ji718 tl_dim(il_ind(1))%i_xyzt2=ji 696 719 tl_dim(il_ind(1))%i_len=1 697 720 tl_dim(il_ind(1))%l_use=.FALSE. … … 711 734 !> This subroutine switch element of an array (4 elts) of dimension 712 735 !> structure 713 !> from unordered dimension to ordered dimension <br/>736 !> from disordered dimension to ordered dimension <br/> 714 737 !> 715 738 !> @details … … 722 745 !> @author J.Paul 723 746 !> @date November, 2013 - Initial Version 724 !> @date September, 2014 - allow to choose ordered dimension to be output 747 !> @date September, 2014 748 !> - allow to choose ordered dimension to be output 725 749 !> 726 750 !> @param[inout] td_dim array of dimension structure … … 811 835 !------------------------------------------------------------------- 812 836 !> @brief This subroutine switch dimension array from ordered dimension ('x','y','z','t') 813 !> to unordered dimension. <br/>837 !> to disordered dimension. <br/> 814 838 !> @details 815 839 !> Example: (/'x','y','z','t'/) => (/'z','x','t','y'/)<br/> … … 822 846 !> @param[inout] td_dim array of dimension structure 823 847 !------------------------------------------------------------------- 824 SUBROUTINE dim_ unorder(td_dim)848 SUBROUTINE dim_disorder(td_dim) 825 849 IMPLICIT NONE 826 850 ! Argument … … 835 859 836 860 IF( SIZE(td_dim(:)) /= ip_maxdim )THEN 837 CALL logger_error("DIM UNORDER: invalid dimension of array dimension.")861 CALL logger_error("DIM DISORDER: invalid dimension of array dimension.") 838 862 ELSE 839 863 ! add dummy xyzt2 id to unused dimension … … 868 892 ENDIF 869 893 870 END SUBROUTINE dim_ unorder894 END SUBROUTINE dim_disorder 871 895 !------------------------------------------------------------------- 872 896 !> @brief This function reshape real(8) 4D array … … 908 932 909 933 IF( SIZE(td_dim(:)) /= ip_maxdim )THEN 910 CALL logger_error("DIM RESHAPE 2 XYZT: invalid dimension of array dimension.") 934 CALL logger_error("DIM RESHAPE 2 XYZT: invalid dimension of "//& 935 & "array dimension.") 911 936 ELSE 912 937 … … 914 939 915 940 CALL logger_fatal( & 916 & " DIM RESHAPE 2 XYZT: you should have run dim_reorder &917 & before running RESHAPE" )941 & " DIM RESHAPE 2 XYZT: you should have run dim_reorder"// & 942 & " before running RESHAPE" ) 918 943 919 944 ENDIF … … 972 997 !------------------------------------------------------------------- 973 998 !> @brief This function reshape ordered real(8) 4D array with dimension 974 !> (/'x','y','z','t'/) to an " unordered" array.<br/>999 !> (/'x','y','z','t'/) to an "disordered" array.<br/> 975 1000 !> @details 976 1001 !> Example: (/'x','y','z','t'/) => (/'z','x','t','y'/) … … 1009 1034 1010 1035 IF( SIZE(td_dim(:)) /= ip_maxdim )THEN 1011 CALL logger_error("DIM RESHAPE XYZT 2: invalid dimension of array dimension.") 1036 CALL logger_error("DIM RESHAPE XYZT 2: invalid dimension of "//& 1037 & "array dimension.") 1012 1038 ELSE 1013 1039 … … 1015 1041 1016 1042 CALL logger_fatal( & 1017 & " DIM RESHAPE XYZT 2: you should have run dim_reorder &1018 & before running RESHAPE" )1043 & " DIM RESHAPE XYZT 2: you should have run dim_reorder"// & 1044 & " before running RESHAPE" ) 1019 1045 1020 1046 ENDIF … … 1104 1130 1105 1131 CALL logger_error( & 1106 & " DIM REORDER 2 XYZT: you should have run dim_reorder 1107 & before running REORDER" )1132 & " DIM REORDER 2 XYZT: you should have run dim_reorder"//& 1133 & " before running REORDER" ) 1108 1134 1109 1135 ENDIF … … 1116 1142 END FUNCTION dim__reorder_2xyzt_i4 1117 1143 !------------------------------------------------------------------- 1118 !> @brief This function unordered integer(4) 1D array to be suitable with1144 !> @brief This function disordered integer(4) 1D array to be suitable with 1119 1145 !> initial dimension order (ex: dimension read in file). 1120 1146 !> @note you must have run dim_reorder before use this subroutine … … 1143 1169 IF( SIZE(td_dim(:)) /= ip_maxdim .OR. & 1144 1170 & 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.")1171 CALL logger_error("DIM REORDER XYZT 2: invalid dimension of "//& 1172 & "array dimension or of array of value.") 1147 1173 ELSE 1148 1174 IF( ANY(td_dim(:)%i_xyzt2==0) )THEN 1149 1175 1150 1176 CALL logger_error( & 1151 & " DIM REORDER XYZT 2: you should have run dim_reorder &1152 & before running REORDER" )1177 & " DIM REORDER XYZT 2: you should have run dim_reorder"// & 1178 & " before running REORDER" ) 1153 1179 1154 1180 ENDIF … … 1166 1192 ! 1167 1193 !> @author J.Paul 1168 !> @date Nov , 2013 - Initial Version1194 !> @date November, 2013 - Initial Version 1169 1195 ! 1170 1196 !> @param[in] td_dim array of dimension structure … … 1193 1219 1194 1220 CALL logger_error( & 1195 & " DIM REORDER 2 XYZT: you should have run dim_reorder &1196 & before running REORDER" )1221 & " DIM REORDER 2 XYZT: you should have run dim_reorder"// & 1222 & " before running REORDER" ) 1197 1223 1198 1224 ENDIF … … 1205 1231 END FUNCTION dim__reorder_2xyzt_l 1206 1232 !------------------------------------------------------------------- 1207 !> @brief This function unordered logical 1D array to be suitable with1233 !> @brief This function disordered logical 1D array to be suitable with 1208 1234 !> initial dimension order (ex: dimension read in file). 1209 1235 !> @note you must have run dim_reorder before use this subroutine … … 1238 1264 1239 1265 CALL logger_error( & 1240 & " DIM REORDER XYZT 2: you should have run dim_reorder 1241 & 1266 & " DIM REORDER XYZT 2: you should have run dim_reorder"//& 1267 & " before running REORDER" ) 1242 1268 1243 1269 ENDIF … … 1294 1320 END FUNCTION dim__reorder_2xyzt_c 1295 1321 !------------------------------------------------------------------- 1296 !> @brief This function unordered string 1D array to be suitable with1322 !> @brief This function disordered string 1D array to be suitable with 1297 1323 !> initial dimension order (ex: dimension read in file). 1298 1324 !> @note you must have run dim_reorder before use this subroutine 1299 1325 ! 1300 1326 !> @author J.Paul 1301 !> @date Nov , 2013 - Initial Version1327 !> @date November, 2013 - Initial Version 1302 1328 ! 1303 1329 !> @param[in] td_dim array of dimension structure … … 1326 1352 IF( ANY(td_dim(:)%i_xyzt2==0) )THEN 1327 1353 CALL logger_error( & 1328 & " DIM REORDER XYZT 2: you should have run dim_reorder &1329 & before running REORDER" )1354 & " DIM REORDER XYZT 2: you should have run dim_reorder"// & 1355 & " before running REORDER" ) 1330 1356 1331 1357 ENDIF … … 1383 1409 1384 1410 END SUBROUTINE dim__clean_arr 1411 !------------------------------------------------------------------- 1412 !> @brief This subroutine fill dummy dimension array 1413 ! 1414 !> @author J.Paul 1415 !> @date September, 2015 - Initial Version 1416 ! 1417 !> @param[in] cd_dummy dummy configuration file 1418 !------------------------------------------------------------------- 1419 SUBROUTINE dim_get_dummy( cd_dummy ) 1420 IMPLICIT NONE 1421 ! Argument 1422 CHARACTER(LEN=*), INTENT(IN) :: cd_dummy 1423 1424 ! local variable 1425 INTEGER(i4) :: il_fileid 1426 INTEGER(i4) :: il_status 1427 1428 LOGICAL :: ll_exist 1429 1430 ! loop indices 1431 ! namelist 1432 CHARACTER(LEN=lc), DIMENSION(ip_maxdum) :: cn_dumvar 1433 CHARACTER(LEN=lc), DIMENSION(ip_maxdum) :: cn_dumdim 1434 CHARACTER(LEN=lc), DIMENSION(ip_maxdum) :: cn_dumatt 1435 1436 !---------------------------------------------------------------- 1437 NAMELIST /namdum/ & !< dummy namelist 1438 & cn_dumvar, & !< variable name 1439 & cn_dumdim, & !< dimension name 1440 & cn_dumatt !< attribute name 1441 !---------------------------------------------------------------- 1442 1443 ! init 1444 cm_dumdim(:)='' 1445 1446 ! read namelist 1447 INQUIRE(FILE=TRIM(cd_dummy), EXIST=ll_exist) 1448 IF( ll_exist )THEN 1449 1450 il_fileid=fct_getunit() 1451 1452 OPEN( il_fileid, FILE=TRIM(cd_dummy), & 1453 & FORM='FORMATTED', & 1454 & ACCESS='SEQUENTIAL', & 1455 & STATUS='OLD', & 1456 & ACTION='READ', & 1457 & IOSTAT=il_status) 1458 CALL fct_err(il_status) 1459 IF( il_status /= 0 )THEN 1460 CALL logger_fatal("DIM GET DUMMY: opening "//TRIM(cd_dummy)) 1461 ENDIF 1462 1463 READ( il_fileid, NML = namdum ) 1464 cm_dumdim(:)=cn_dumdim(:) 1465 1466 CLOSE( il_fileid ) 1467 1468 ENDIF 1469 1470 END SUBROUTINE dim_get_dummy 1471 !------------------------------------------------------------------- 1472 !> @brief This function check if dimension is defined as dummy dimension 1473 !> in configuraton file 1474 !> 1475 !> @author J.Paul 1476 !> @date September, 2015 - Initial Version 1477 ! 1478 !> @param[in] td_dim dimension structure 1479 !> @return true if dimension is dummy dimension 1480 !------------------------------------------------------------------- 1481 FUNCTION dim_is_dummy(td_dim) 1482 IMPLICIT NONE 1483 1484 ! Argument 1485 TYPE(TDIM), INTENT(IN) :: td_dim 1486 1487 ! function 1488 LOGICAL :: dim_is_dummy 1489 1490 ! loop indices 1491 INTEGER(i4) :: ji 1492 !---------------------------------------------------------------- 1493 1494 dim_is_dummy=.FALSE. 1495 DO ji=1,ip_maxdum 1496 IF( fct_lower(td_dim%c_name) == fct_lower(cm_dumdim(ji)) )THEN 1497 dim_is_dummy=.TRUE. 1498 EXIT 1499 ENDIF 1500 ENDDO 1501 1502 END FUNCTION dim_is_dummy 1385 1503 END MODULE dim 1386 1504
Note: See TracChangeset
for help on using the changeset viewer.